diff --git a/.gitignore b/.gitignore index ec0bf1a9e..cdffa634d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,8 @@ resources/3rdparty/log4cplus-1.1.3-rc1/ resources/3rdparty/gtest-1.7.0/ resources/3rdparty/eigen/ resources/3rdparty/gmm-4.2/ -resources/3rdparty/cudd-2.5.0/ +resources/3rdparty/cudd-3.0.0/ +resources/3rdparty/carl/ resources/3rdparty/xercesc-3.1.2/ #Visual Studio files *.[Oo]bj @@ -49,4 +50,4 @@ src/utility/storm-version.cpp nbproject/ .DS_Store .idea -*.out \ No newline at end of file +*.out diff --git a/CMakeLists.txt b/CMakeLists.txt index aadfb72fa..190f72228 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,13 +30,14 @@ option(STORM_USE_COTIRE "Sets whether Cotire should be used (for building precom option(LINK_LIBCXXABI "Sets whether libc++abi should be linked." OFF) option(USE_LIBCXX "Sets whether the standard library is libc++." OFF) option(USE_CARL "Sets whether carl should be included." ON) -option(USE_XERCES "Sets whether xerces should be used." OFF) +option(XML_SUPPORT "Sets whether xml based format parsing should be included." ON) option(FORCE_COLOR "Force color output" OFF) mark_as_advanced(FORCE_COLOR) option(STORM_PYTHON "Builds the API for Python" OFF) option(STORM_COMPILE_WITH_CCACHE "Compile using CCache [if found]" ON) mark_as_advanced(STORM_COMPILE_WITH_CCACHE) option(STORM_LOG_DISABLE_DEBUG "Disable log and trace message support" OFF) +option(STORM_USE_CLN_NUMBERS "Sets whether CLN or GMP numbers should be used" ON) set(BOOST_ROOT "" CACHE STRING "A hint to the root directory of Boost (optional).") set(GUROBI_ROOT "" CACHE STRING "A hint to the root directory of Gurobi (optional).") set(Z3_ROOT "" CACHE STRING "A hint to the root directory of Z3 (optional).") @@ -44,6 +45,8 @@ set(CUDA_ROOT "" CACHE STRING "The hint to the root directory of CUDA (optional) set(MSAT_ROOT "" CACHE STRING "The hint to the root directory of MathSAT (optional).") set(ADDITIONAL_INCLUDE_DIRS "" CACHE STRING "Additional directories added to the include directories.") set(ADDITIONAL_LINK_DIRS "" CACHE STRING "Additional directories added to the link directories.") +set(USE_XERCES ${XML_SUPPORT}) +mark_as_advanced(USE_XERCES) # Set some CMAKE Variables as advanced mark_as_advanced(CMAKE_OSX_ARCHITECTURES) diff --git a/examples/dtmc/die/die.pm b/examples/dtmc/die/die.pm index dacde8a79..c5634bf4f 100644 --- a/examples/dtmc/die/die.pm +++ b/examples/dtmc/die/die.pm @@ -29,3 +29,4 @@ label "three" = s=7&d=3; label "four" = s=7&d=4; label "five" = s=7&d=5; label "six" = s=7&d=6; +label "end" = s=7; diff --git a/examples/gspn/HypercubeGrid/hc3k4p4b12.pnml b/examples/gspn/HypercubeGrid/hc3k4p4b12.pnml new file mode 100755 index 000000000..0a3d16271 --- /dev/null +++ b/examples/gspn/HypercubeGrid/hc3k4p4b12.pnml @@ -0,0 +1,41034 @@ + + + + + HypercubeGrid-PT-C3K4P4B12 + + + + + pb.d1.n1.1.1.1 + + + 4 + + + + + pb.d1.n1.1.1.2 + + + 4 + + + + + pb.d1.n1.1.1.3 + + + 4 + + + + + pb.d1.n1.1.1.4 + + + 4 + + + + + pb.d1.n1.1.2.1 + + + 4 + + + + + pb.d1.n1.1.2.2 + + + 4 + + + + + pb.d1.n1.1.2.3 + + + 4 + + + + + pb.d1.n1.1.2.4 + + + 4 + + + + + pb.d1.n1.1.3.1 + + + 4 + + + + + pb.d1.n1.1.3.2 + + + 4 + + + + + pb.d1.n1.1.3.3 + + + 4 + + + + + pb.d1.n1.1.3.4 + + + 4 + + + + + pb.d1.n1.1.4.1 + + + 4 + + + + + pb.d1.n1.1.4.2 + + + 4 + + + + + pb.d1.n1.1.4.3 + + + 4 + + + + + pb.d1.n1.1.4.4 + + + 4 + + + + + pb.d1.n1.2.1.1 + + + 4 + + + + + pb.d1.n1.2.1.2 + + + 4 + + + + + pb.d1.n1.2.1.3 + + + 4 + + + + + pb.d1.n1.2.1.4 + + + 4 + + + + + pb.d1.n1.2.2.1 + + + 4 + + + + + pb.d1.n1.2.2.2 + + + 4 + + + + + pb.d1.n1.2.2.3 + + + 4 + + + + + pb.d1.n1.2.2.4 + + + 4 + + + + + pb.d1.n1.2.3.1 + + + 4 + + + + + pb.d1.n1.2.3.2 + + + 4 + + + + + pb.d1.n1.2.3.3 + + + 4 + + + + + pb.d1.n1.2.3.4 + + + 4 + + + + + pb.d1.n1.2.4.1 + + + 4 + + + + + pb.d1.n1.2.4.2 + + + 4 + + + + + pb.d1.n1.2.4.3 + + + 4 + + + + + pb.d1.n1.2.4.4 + + + 4 + + + + + pb.d1.n1.3.1.1 + + + 4 + + + + + pb.d1.n1.3.1.2 + + + 4 + + + + + pb.d1.n1.3.1.3 + + + 4 + + + + + pb.d1.n1.3.1.4 + + + 4 + + + + + pb.d1.n1.3.2.1 + + + 4 + + + + + pb.d1.n1.3.2.2 + + + 4 + + + + + pb.d1.n1.3.2.3 + + + 4 + + + + + pb.d1.n1.3.2.4 + + + 4 + + + + + pb.d1.n1.3.3.1 + + + 4 + + + + + pb.d1.n1.3.3.2 + + + 4 + + + + + pb.d1.n1.3.3.3 + + + 4 + + + + + pb.d1.n1.3.3.4 + + + 4 + + + + + pb.d1.n1.3.4.1 + + + 4 + + + + + pb.d1.n1.3.4.2 + + + 4 + + + + + pb.d1.n1.3.4.3 + + + 4 + + + + + pb.d1.n1.3.4.4 + + + 4 + + + + + pb.d1.n1.4.1.1 + + + 4 + + + + + pb.d1.n1.4.1.2 + + + 4 + + + + + pb.d1.n1.4.1.3 + + + 4 + + + + + pb.d1.n1.4.1.4 + + + 4 + + + + + pb.d1.n1.4.2.1 + + + 4 + + + + + pb.d1.n1.4.2.2 + + + 4 + + + + + pb.d1.n1.4.2.3 + + + 4 + + + + + pb.d1.n1.4.2.4 + + + 4 + + + + + pb.d1.n1.4.3.1 + + + 4 + + + + + pb.d1.n1.4.3.2 + + + 4 + + + + + pb.d1.n1.4.3.3 + + + 4 + + + + + pb.d1.n1.4.3.4 + + + 4 + + + + + pb.d1.n1.4.4.1 + + + 4 + + + + + pb.d1.n1.4.4.2 + + + 4 + + + + + pb.d1.n1.4.4.3 + + + 4 + + + + + pb.d1.n1.4.4.4 + + + 4 + + + + + pb.d1.n2.1.1.1 + + + 4 + + + + + pb.d1.n2.1.1.2 + + + 4 + + + + + pb.d1.n2.1.1.3 + + + 4 + + + + + pb.d1.n2.1.1.4 + + + 4 + + + + + pb.d1.n2.1.2.1 + + + 4 + + + + + pb.d1.n2.1.2.2 + + + 4 + + + + + pb.d1.n2.1.2.3 + + + 4 + + + + + pb.d1.n2.1.2.4 + + + 4 + + + + + pb.d1.n2.1.3.1 + + + 4 + + + + + pb.d1.n2.1.3.2 + + + 4 + + + + + pb.d1.n2.1.3.3 + + + 4 + + + + + pb.d1.n2.1.3.4 + + + 4 + + + + + pb.d1.n2.1.4.1 + + + 4 + + + + + pb.d1.n2.1.4.2 + + + 4 + + + + + pb.d1.n2.1.4.3 + + + 4 + + + + + pb.d1.n2.1.4.4 + + + 4 + + + + + pb.d1.n2.2.1.1 + + + 4 + + + + + pb.d1.n2.2.1.2 + + + 4 + + + + + pb.d1.n2.2.1.3 + + + 4 + + + + + pb.d1.n2.2.1.4 + + + 4 + + + + + pb.d1.n2.2.2.1 + + + 4 + + + + + pb.d1.n2.2.2.2 + + + 4 + + + + + pb.d1.n2.2.2.3 + + + 4 + + + + + pb.d1.n2.2.2.4 + + + 4 + + + + + pb.d1.n2.2.3.1 + + + 4 + + + + + pb.d1.n2.2.3.2 + + + 4 + + + + + pb.d1.n2.2.3.3 + + + 4 + + + + + pb.d1.n2.2.3.4 + + + 4 + + + + + pb.d1.n2.2.4.1 + + + 4 + + + + + pb.d1.n2.2.4.2 + + + 4 + + + + + pb.d1.n2.2.4.3 + + + 4 + + + + + pb.d1.n2.2.4.4 + + + 4 + + + + + pb.d1.n2.3.1.1 + + + 4 + + + + + pb.d1.n2.3.1.2 + + + 4 + + + + + pb.d1.n2.3.1.3 + + + 4 + + + + + pb.d1.n2.3.1.4 + + + 4 + + + + + pb.d1.n2.3.2.1 + + + 4 + + + + + pb.d1.n2.3.2.2 + + + 4 + + + + + pb.d1.n2.3.2.3 + + + 4 + + + + + pb.d1.n2.3.2.4 + + + 4 + + + + + pb.d1.n2.3.3.1 + + + 4 + + + + + pb.d1.n2.3.3.2 + + + 4 + + + + + pb.d1.n2.3.3.3 + + + 4 + + + + + pb.d1.n2.3.3.4 + + + 4 + + + + + pb.d1.n2.3.4.1 + + + 4 + + + + + pb.d1.n2.3.4.2 + + + 4 + + + + + pb.d1.n2.3.4.3 + + + 4 + + + + + pb.d1.n2.3.4.4 + + + 4 + + + + + pb.d1.n2.4.1.1 + + + 4 + + + + + pb.d1.n2.4.1.2 + + + 4 + + + + + pb.d1.n2.4.1.3 + + + 4 + + + + + pb.d1.n2.4.1.4 + + + 4 + + + + + pb.d1.n2.4.2.1 + + + 4 + + + + + pb.d1.n2.4.2.2 + + + 4 + + + + + pb.d1.n2.4.2.3 + + + 4 + + + + + pb.d1.n2.4.2.4 + + + 4 + + + + + pb.d1.n2.4.3.1 + + + 4 + + + + + pb.d1.n2.4.3.2 + + + 4 + + + + + pb.d1.n2.4.3.3 + + + 4 + + + + + pb.d1.n2.4.3.4 + + + 4 + + + + + pb.d1.n2.4.4.1 + + + 4 + + + + + pb.d1.n2.4.4.2 + + + 4 + + + + + pb.d1.n2.4.4.3 + + + 4 + + + + + pb.d1.n2.4.4.4 + + + 4 + + + + + pb.d2.n1.1.1.1 + + + 4 + + + + + pb.d2.n1.1.1.2 + + + 4 + + + + + pb.d2.n1.1.1.3 + + + 4 + + + + + pb.d2.n1.1.1.4 + + + 4 + + + + + pb.d2.n1.1.2.1 + + + 4 + + + + + pb.d2.n1.1.2.2 + + + 4 + + + + + pb.d2.n1.1.2.3 + + + 4 + + + + + pb.d2.n1.1.2.4 + + + 4 + + + + + pb.d2.n1.1.3.1 + + + 4 + + + + + pb.d2.n1.1.3.2 + + + 4 + + + + + pb.d2.n1.1.3.3 + + + 4 + + + + + pb.d2.n1.1.3.4 + + + 4 + + + + + pb.d2.n1.1.4.1 + + + 4 + + + + + pb.d2.n1.1.4.2 + + + 4 + + + + + pb.d2.n1.1.4.3 + + + 4 + + + + + pb.d2.n1.1.4.4 + + + 4 + + + + + pb.d2.n1.2.1.1 + + + 4 + + + + + pb.d2.n1.2.1.2 + + + 4 + + + + + pb.d2.n1.2.1.3 + + + 4 + + + + + pb.d2.n1.2.1.4 + + + 4 + + + + + pb.d2.n1.2.2.1 + + + 4 + + + + + pb.d2.n1.2.2.2 + + + 4 + + + + + pb.d2.n1.2.2.3 + + + 4 + + + + + pb.d2.n1.2.2.4 + + + 4 + + + + + pb.d2.n1.2.3.1 + + + 4 + + + + + pb.d2.n1.2.3.2 + + + 4 + + + + + pb.d2.n1.2.3.3 + + + 4 + + + + + pb.d2.n1.2.3.4 + + + 4 + + + + + pb.d2.n1.2.4.1 + + + 4 + + + + + pb.d2.n1.2.4.2 + + + 4 + + + + + pb.d2.n1.2.4.3 + + + 4 + + + + + pb.d2.n1.2.4.4 + + + 4 + + + + + pb.d2.n1.3.1.1 + + + 4 + + + + + pb.d2.n1.3.1.2 + + + 4 + + + + + pb.d2.n1.3.1.3 + + + 4 + + + + + pb.d2.n1.3.1.4 + + + 4 + + + + + pb.d2.n1.3.2.1 + + + 4 + + + + + pb.d2.n1.3.2.2 + + + 4 + + + + + pb.d2.n1.3.2.3 + + + 4 + + + + + pb.d2.n1.3.2.4 + + + 4 + + + + + pb.d2.n1.3.3.1 + + + 4 + + + + + pb.d2.n1.3.3.2 + + + 4 + + + + + pb.d2.n1.3.3.3 + + + 4 + + + + + pb.d2.n1.3.3.4 + + + 4 + + + + + pb.d2.n1.3.4.1 + + + 4 + + + + + pb.d2.n1.3.4.2 + + + 4 + + + + + pb.d2.n1.3.4.3 + + + 4 + + + + + pb.d2.n1.3.4.4 + + + 4 + + + + + pb.d2.n1.4.1.1 + + + 4 + + + + + pb.d2.n1.4.1.2 + + + 4 + + + + + pb.d2.n1.4.1.3 + + + 4 + + + + + pb.d2.n1.4.1.4 + + + 4 + + + + + pb.d2.n1.4.2.1 + + + 4 + + + + + pb.d2.n1.4.2.2 + + + 4 + + + + + pb.d2.n1.4.2.3 + + + 4 + + + + + pb.d2.n1.4.2.4 + + + 4 + + + + + pb.d2.n1.4.3.1 + + + 4 + + + + + pb.d2.n1.4.3.2 + + + 4 + + + + + pb.d2.n1.4.3.3 + + + 4 + + + + + pb.d2.n1.4.3.4 + + + 4 + + + + + pb.d2.n1.4.4.1 + + + 4 + + + + + pb.d2.n1.4.4.2 + + + 4 + + + + + pb.d2.n1.4.4.3 + + + 4 + + + + + pb.d2.n1.4.4.4 + + + 4 + + + + + pb.d2.n2.1.1.1 + + + 4 + + + + + pb.d2.n2.1.1.2 + + + 4 + + + + + pb.d2.n2.1.1.3 + + + 4 + + + + + pb.d2.n2.1.1.4 + + + 4 + + + + + pb.d2.n2.1.2.1 + + + 4 + + + + + pb.d2.n2.1.2.2 + + + 4 + + + + + pb.d2.n2.1.2.3 + + + 4 + + + + + pb.d2.n2.1.2.4 + + + 4 + + + + + pb.d2.n2.1.3.1 + + + 4 + + + + + pb.d2.n2.1.3.2 + + + 4 + + + + + pb.d2.n2.1.3.3 + + + 4 + + + + + pb.d2.n2.1.3.4 + + + 4 + + + + + pb.d2.n2.1.4.1 + + + 4 + + + + + pb.d2.n2.1.4.2 + + + 4 + + + + + pb.d2.n2.1.4.3 + + + 4 + + + + + pb.d2.n2.1.4.4 + + + 4 + + + + + pb.d2.n2.2.1.1 + + + 4 + + + + + pb.d2.n2.2.1.2 + + + 4 + + + + + pb.d2.n2.2.1.3 + + + 4 + + + + + pb.d2.n2.2.1.4 + + + 4 + + + + + pb.d2.n2.2.2.1 + + + 4 + + + + + pb.d2.n2.2.2.2 + + + 4 + + + + + pb.d2.n2.2.2.3 + + + 4 + + + + + pb.d2.n2.2.2.4 + + + 4 + + + + + pb.d2.n2.2.3.1 + + + 4 + + + + + pb.d2.n2.2.3.2 + + + 4 + + + + + pb.d2.n2.2.3.3 + + + 4 + + + + + pb.d2.n2.2.3.4 + + + 4 + + + + + pb.d2.n2.2.4.1 + + + 4 + + + + + pb.d2.n2.2.4.2 + + + 4 + + + + + pb.d2.n2.2.4.3 + + + 4 + + + + + pb.d2.n2.2.4.4 + + + 4 + + + + + pb.d2.n2.3.1.1 + + + 4 + + + + + pb.d2.n2.3.1.2 + + + 4 + + + + + pb.d2.n2.3.1.3 + + + 4 + + + + + pb.d2.n2.3.1.4 + + + 4 + + + + + pb.d2.n2.3.2.1 + + + 4 + + + + + pb.d2.n2.3.2.2 + + + 4 + + + + + pb.d2.n2.3.2.3 + + + 4 + + + + + pb.d2.n2.3.2.4 + + + 4 + + + + + pb.d2.n2.3.3.1 + + + 4 + + + + + pb.d2.n2.3.3.2 + + + 4 + + + + + pb.d2.n2.3.3.3 + + + 4 + + + + + pb.d2.n2.3.3.4 + + + 4 + + + + + pb.d2.n2.3.4.1 + + + 4 + + + + + pb.d2.n2.3.4.2 + + + 4 + + + + + pb.d2.n2.3.4.3 + + + 4 + + + + + pb.d2.n2.3.4.4 + + + 4 + + + + + pb.d2.n2.4.1.1 + + + 4 + + + + + pb.d2.n2.4.1.2 + + + 4 + + + + + pb.d2.n2.4.1.3 + + + 4 + + + + + pb.d2.n2.4.1.4 + + + 4 + + + + + pb.d2.n2.4.2.1 + + + 4 + + + + + pb.d2.n2.4.2.2 + + + 4 + + + + + pb.d2.n2.4.2.3 + + + 4 + + + + + pb.d2.n2.4.2.4 + + + 4 + + + + + pb.d2.n2.4.3.1 + + + 4 + + + + + pb.d2.n2.4.3.2 + + + 4 + + + + + pb.d2.n2.4.3.3 + + + 4 + + + + + pb.d2.n2.4.3.4 + + + 4 + + + + + pb.d2.n2.4.4.1 + + + 4 + + + + + pb.d2.n2.4.4.2 + + + 4 + + + + + pb.d2.n2.4.4.3 + + + 4 + + + + + pb.d2.n2.4.4.4 + + + 4 + + + + + pb.d3.n1.1.1.1 + + + 4 + + + + + pb.d3.n1.1.1.2 + + + 4 + + + + + pb.d3.n1.1.1.3 + + + 4 + + + + + pb.d3.n1.1.1.4 + + + 4 + + + + + pb.d3.n1.1.2.1 + + + 4 + + + + + pb.d3.n1.1.2.2 + + + 4 + + + + + pb.d3.n1.1.2.3 + + + 4 + + + + + pb.d3.n1.1.2.4 + + + 4 + + + + + pb.d3.n1.1.3.1 + + + 4 + + + + + pb.d3.n1.1.3.2 + + + 4 + + + + + pb.d3.n1.1.3.3 + + + 4 + + + + + pb.d3.n1.1.3.4 + + + 4 + + + + + pb.d3.n1.1.4.1 + + + 4 + + + + + pb.d3.n1.1.4.2 + + + 4 + + + + + pb.d3.n1.1.4.3 + + + 4 + + + + + pb.d3.n1.1.4.4 + + + 4 + + + + + pb.d3.n1.2.1.1 + + + 4 + + + + + pb.d3.n1.2.1.2 + + + 4 + + + + + pb.d3.n1.2.1.3 + + + 4 + + + + + pb.d3.n1.2.1.4 + + + 4 + + + + + pb.d3.n1.2.2.1 + + + 4 + + + + + pb.d3.n1.2.2.2 + + + 4 + + + + + pb.d3.n1.2.2.3 + + + 4 + + + + + pb.d3.n1.2.2.4 + + + 4 + + + + + pb.d3.n1.2.3.1 + + + 4 + + + + + pb.d3.n1.2.3.2 + + + 4 + + + + + pb.d3.n1.2.3.3 + + + 4 + + + + + pb.d3.n1.2.3.4 + + + 4 + + + + + pb.d3.n1.2.4.1 + + + 4 + + + + + pb.d3.n1.2.4.2 + + + 4 + + + + + pb.d3.n1.2.4.3 + + + 4 + + + + + pb.d3.n1.2.4.4 + + + 4 + + + + + pb.d3.n1.3.1.1 + + + 4 + + + + + pb.d3.n1.3.1.2 + + + 4 + + + + + pb.d3.n1.3.1.3 + + + 4 + + + + + pb.d3.n1.3.1.4 + + + 4 + + + + + pb.d3.n1.3.2.1 + + + 4 + + + + + pb.d3.n1.3.2.2 + + + 4 + + + + + pb.d3.n1.3.2.3 + + + 4 + + + + + pb.d3.n1.3.2.4 + + + 4 + + + + + pb.d3.n1.3.3.1 + + + 4 + + + + + pb.d3.n1.3.3.2 + + + 4 + + + + + pb.d3.n1.3.3.3 + + + 4 + + + + + pb.d3.n1.3.3.4 + + + 4 + + + + + pb.d3.n1.3.4.1 + + + 4 + + + + + pb.d3.n1.3.4.2 + + + 4 + + + + + pb.d3.n1.3.4.3 + + + 4 + + + + + pb.d3.n1.3.4.4 + + + 4 + + + + + pb.d3.n1.4.1.1 + + + 4 + + + + + pb.d3.n1.4.1.2 + + + 4 + + + + + pb.d3.n1.4.1.3 + + + 4 + + + + + pb.d3.n1.4.1.4 + + + 4 + + + + + pb.d3.n1.4.2.1 + + + 4 + + + + + pb.d3.n1.4.2.2 + + + 4 + + + + + pb.d3.n1.4.2.3 + + + 4 + + + + + pb.d3.n1.4.2.4 + + + 4 + + + + + pb.d3.n1.4.3.1 + + + 4 + + + + + pb.d3.n1.4.3.2 + + + 4 + + + + + pb.d3.n1.4.3.3 + + + 4 + + + + + pb.d3.n1.4.3.4 + + + 4 + + + + + pb.d3.n1.4.4.1 + + + 4 + + + + + pb.d3.n1.4.4.2 + + + 4 + + + + + pb.d3.n1.4.4.3 + + + 4 + + + + + pb.d3.n1.4.4.4 + + + 4 + + + + + pb.d3.n2.1.1.1 + + + 4 + + + + + pb.d3.n2.1.1.2 + + + 4 + + + + + pb.d3.n2.1.1.3 + + + 4 + + + + + pb.d3.n2.1.1.4 + + + 4 + + + + + pb.d3.n2.1.2.1 + + + 4 + + + + + pb.d3.n2.1.2.2 + + + 4 + + + + + pb.d3.n2.1.2.3 + + + 4 + + + + + pb.d3.n2.1.2.4 + + + 4 + + + + + pb.d3.n2.1.3.1 + + + 4 + + + + + pb.d3.n2.1.3.2 + + + 4 + + + + + pb.d3.n2.1.3.3 + + + 4 + + + + + pb.d3.n2.1.3.4 + + + 4 + + + + + pb.d3.n2.1.4.1 + + + 4 + + + + + pb.d3.n2.1.4.2 + + + 4 + + + + + pb.d3.n2.1.4.3 + + + 4 + + + + + pb.d3.n2.1.4.4 + + + 4 + + + + + pb.d3.n2.2.1.1 + + + 4 + + + + + pb.d3.n2.2.1.2 + + + 4 + + + + + pb.d3.n2.2.1.3 + + + 4 + + + + + pb.d3.n2.2.1.4 + + + 4 + + + + + pb.d3.n2.2.2.1 + + + 4 + + + + + pb.d3.n2.2.2.2 + + + 4 + + + + + pb.d3.n2.2.2.3 + + + 4 + + + + + pb.d3.n2.2.2.4 + + + 4 + + + + + pb.d3.n2.2.3.1 + + + 4 + + + + + pb.d3.n2.2.3.2 + + + 4 + + + + + pb.d3.n2.2.3.3 + + + 4 + + + + + pb.d3.n2.2.3.4 + + + 4 + + + + + pb.d3.n2.2.4.1 + + + 4 + + + + + pb.d3.n2.2.4.2 + + + 4 + + + + + pb.d3.n2.2.4.3 + + + 4 + + + + + pb.d3.n2.2.4.4 + + + 4 + + + + + pb.d3.n2.3.1.1 + + + 4 + + + + + pb.d3.n2.3.1.2 + + + 4 + + + + + pb.d3.n2.3.1.3 + + + 4 + + + + + pb.d3.n2.3.1.4 + + + 4 + + + + + pb.d3.n2.3.2.1 + + + 4 + + + + + pb.d3.n2.3.2.2 + + + 4 + + + + + pb.d3.n2.3.2.3 + + + 4 + + + + + pb.d3.n2.3.2.4 + + + 4 + + + + + pb.d3.n2.3.3.1 + + + 4 + + + + + pb.d3.n2.3.3.2 + + + 4 + + + + + pb.d3.n2.3.3.3 + + + 4 + + + + + pb.d3.n2.3.3.4 + + + 4 + + + + + pb.d3.n2.3.4.1 + + + 4 + + + + + pb.d3.n2.3.4.2 + + + 4 + + + + + pb.d3.n2.3.4.3 + + + 4 + + + + + pb.d3.n2.3.4.4 + + + 4 + + + + + pb.d3.n2.4.1.1 + + + 4 + + + + + pb.d3.n2.4.1.2 + + + 4 + + + + + pb.d3.n2.4.1.3 + + + 4 + + + + + pb.d3.n2.4.1.4 + + + 4 + + + + + pb.d3.n2.4.2.1 + + + 4 + + + + + pb.d3.n2.4.2.2 + + + 4 + + + + + pb.d3.n2.4.2.3 + + + 4 + + + + + pb.d3.n2.4.2.4 + + + 4 + + + + + pb.d3.n2.4.3.1 + + + 4 + + + + + pb.d3.n2.4.3.2 + + + 4 + + + + + pb.d3.n2.4.3.3 + + + 4 + + + + + pb.d3.n2.4.3.4 + + + 4 + + + + + pb.d3.n2.4.4.1 + + + 4 + + + + + pb.d3.n2.4.4.2 + + + 4 + + + + + pb.d3.n2.4.4.3 + + + 4 + + + + + pb.d3.n2.4.4.4 + + + 4 + + + + + pbl.1.1.1 + + + 12 + + + + + pbl.1.1.2 + + + 12 + + + + + pbl.1.1.3 + + + 12 + + + + + pbl.1.1.4 + + + 12 + + + + + pbl.1.2.1 + + + 12 + + + + + pbl.1.2.2 + + + 12 + + + + + pbl.1.2.3 + + + 12 + + + + + pbl.1.2.4 + + + 12 + + + + + pbl.1.3.1 + + + 12 + + + + + pbl.1.3.2 + + + 12 + + + + + pbl.1.3.3 + + + 12 + + + + + pbl.1.3.4 + + + 12 + + + + + pbl.1.4.1 + + + 12 + + + + + pbl.1.4.2 + + + 12 + + + + + pbl.1.4.3 + + + 12 + + + + + pbl.1.4.4 + + + 12 + + + + + pbl.2.1.1 + + + 12 + + + + + pbl.2.1.2 + + + 12 + + + + + pbl.2.1.3 + + + 12 + + + + + pbl.2.1.4 + + + 12 + + + + + pbl.2.2.1 + + + 12 + + + + + pbl.2.2.2 + + + 12 + + + + + pbl.2.2.3 + + + 12 + + + + + pbl.2.2.4 + + + 12 + + + + + pbl.2.3.1 + + + 12 + + + + + pbl.2.3.2 + + + 12 + + + + + pbl.2.3.3 + + + 12 + + + + + pbl.2.3.4 + + + 12 + + + + + pbl.2.4.1 + + + 12 + + + + + pbl.2.4.2 + + + 12 + + + + + pbl.2.4.3 + + + 12 + + + + + pbl.2.4.4 + + + 12 + + + + + pbl.3.1.1 + + + 12 + + + + + pbl.3.1.2 + + + 12 + + + + + pbl.3.1.3 + + + 12 + + + + + pbl.3.1.4 + + + 12 + + + + + pbl.3.2.1 + + + 12 + + + + + pbl.3.2.2 + + + 12 + + + + + pbl.3.2.3 + + + 12 + + + + + pbl.3.2.4 + + + 12 + + + + + pbl.3.3.1 + + + 12 + + + + + pbl.3.3.2 + + + 12 + + + + + pbl.3.3.3 + + + 12 + + + + + pbl.3.3.4 + + + 12 + + + + + pbl.3.4.1 + + + 12 + + + + + pbl.3.4.2 + + + 12 + + + + + pbl.3.4.3 + + + 12 + + + + + pbl.3.4.4 + + + 12 + + + + + pbl.4.1.1 + + + 12 + + + + + pbl.4.1.2 + + + 12 + + + + + pbl.4.1.3 + + + 12 + + + + + pbl.4.1.4 + + + 12 + + + + + pbl.4.2.1 + + + 12 + + + + + pbl.4.2.2 + + + 12 + + + + + pbl.4.2.3 + + + 12 + + + + + pbl.4.2.4 + + + 12 + + + + + pbl.4.3.1 + + + 12 + + + + + pbl.4.3.2 + + + 12 + + + + + pbl.4.3.3 + + + 12 + + + + + pbl.4.3.4 + + + 12 + + + + + pbl.4.4.1 + + + 12 + + + + + pbl.4.4.2 + + + 12 + + + + + pbl.4.4.3 + + + 12 + + + + + pbl.4.4.4 + + + 12 + + + + + pi.d1.n1.1.1.1 + + + + + pi.d1.n1.1.1.2 + + + + + pi.d1.n1.1.1.3 + + + + + pi.d1.n1.1.1.4 + + + + + pi.d1.n1.1.2.1 + + + + + pi.d1.n1.1.2.2 + + + + + pi.d1.n1.1.2.3 + + + + + pi.d1.n1.1.2.4 + + + + + pi.d1.n1.1.3.1 + + + + + pi.d1.n1.1.3.2 + + + + + pi.d1.n1.1.3.3 + + + + + pi.d1.n1.1.3.4 + + + + + pi.d1.n1.1.4.1 + + + + + pi.d1.n1.1.4.2 + + + + + pi.d1.n1.1.4.3 + + + + + pi.d1.n1.1.4.4 + + + + + pi.d1.n1.2.1.1 + + + + + pi.d1.n1.2.1.2 + + + + + pi.d1.n1.2.1.3 + + + + + pi.d1.n1.2.1.4 + + + + + pi.d1.n1.2.2.1 + + + + + pi.d1.n1.2.2.2 + + + + + pi.d1.n1.2.2.3 + + + + + pi.d1.n1.2.2.4 + + + + + pi.d1.n1.2.3.1 + + + + + pi.d1.n1.2.3.2 + + + + + pi.d1.n1.2.3.3 + + + + + pi.d1.n1.2.3.4 + + + + + pi.d1.n1.2.4.1 + + + + + pi.d1.n1.2.4.2 + + + + + pi.d1.n1.2.4.3 + + + + + pi.d1.n1.2.4.4 + + + + + pi.d1.n1.3.1.1 + + + + + pi.d1.n1.3.1.2 + + + + + pi.d1.n1.3.1.3 + + + + + pi.d1.n1.3.1.4 + + + + + pi.d1.n1.3.2.1 + + + + + pi.d1.n1.3.2.2 + + + + + pi.d1.n1.3.2.3 + + + + + pi.d1.n1.3.2.4 + + + + + pi.d1.n1.3.3.1 + + + + + pi.d1.n1.3.3.2 + + + + + pi.d1.n1.3.3.3 + + + + + pi.d1.n1.3.3.4 + + + + + pi.d1.n1.3.4.1 + + + + + pi.d1.n1.3.4.2 + + + + + pi.d1.n1.3.4.3 + + + + + pi.d1.n1.3.4.4 + + + + + pi.d1.n1.4.1.1 + + + + + pi.d1.n1.4.1.2 + + + + + pi.d1.n1.4.1.3 + + + + + pi.d1.n1.4.1.4 + + + + + pi.d1.n1.4.2.1 + + + + + pi.d1.n1.4.2.2 + + + + + pi.d1.n1.4.2.3 + + + + + pi.d1.n1.4.2.4 + + + + + pi.d1.n1.4.3.1 + + + + + pi.d1.n1.4.3.2 + + + + + pi.d1.n1.4.3.3 + + + + + pi.d1.n1.4.3.4 + + + + + pi.d1.n1.4.4.1 + + + + + pi.d1.n1.4.4.2 + + + + + pi.d1.n1.4.4.3 + + + + + pi.d1.n1.4.4.4 + + + + + pi.d1.n1.5.1.1 + + + + + pi.d1.n1.5.1.2 + + + + + pi.d1.n1.5.1.3 + + + + + pi.d1.n1.5.1.4 + + + + + pi.d1.n1.5.2.1 + + + + + pi.d1.n1.5.2.2 + + + + + pi.d1.n1.5.2.3 + + + + + pi.d1.n1.5.2.4 + + + + + pi.d1.n1.5.3.1 + + + + + pi.d1.n1.5.3.2 + + + + + pi.d1.n1.5.3.3 + + + + + pi.d1.n1.5.3.4 + + + + + pi.d1.n1.5.4.1 + + + + + pi.d1.n1.5.4.2 + + + + + pi.d1.n1.5.4.3 + + + + + pi.d1.n1.5.4.4 + + + + + pi.d2.n1.1.1.1 + + + + + pi.d2.n1.1.1.2 + + + + + pi.d2.n1.1.1.3 + + + + + pi.d2.n1.1.1.4 + + + + + pi.d2.n1.1.2.1 + + + + + pi.d2.n1.1.2.2 + + + + + pi.d2.n1.1.2.3 + + + + + pi.d2.n1.1.2.4 + + + + + pi.d2.n1.1.3.1 + + + + + pi.d2.n1.1.3.2 + + + + + pi.d2.n1.1.3.3 + + + + + pi.d2.n1.1.3.4 + + + + + pi.d2.n1.1.4.1 + + + + + pi.d2.n1.1.4.2 + + + + + pi.d2.n1.1.4.3 + + + + + pi.d2.n1.1.4.4 + + + + + pi.d2.n1.1.5.1 + + + + + pi.d2.n1.1.5.2 + + + + + pi.d2.n1.1.5.3 + + + + + pi.d2.n1.1.5.4 + + + + + pi.d2.n1.2.1.1 + + + + + pi.d2.n1.2.1.2 + + + + + pi.d2.n1.2.1.3 + + + + + pi.d2.n1.2.1.4 + + + + + pi.d2.n1.2.2.1 + + + + + pi.d2.n1.2.2.2 + + + + + pi.d2.n1.2.2.3 + + + + + pi.d2.n1.2.2.4 + + + + + pi.d2.n1.2.3.1 + + + + + pi.d2.n1.2.3.2 + + + + + pi.d2.n1.2.3.3 + + + + + pi.d2.n1.2.3.4 + + + + + pi.d2.n1.2.4.1 + + + + + pi.d2.n1.2.4.2 + + + + + pi.d2.n1.2.4.3 + + + + + pi.d2.n1.2.4.4 + + + + + pi.d2.n1.2.5.1 + + + + + pi.d2.n1.2.5.2 + + + + + pi.d2.n1.2.5.3 + + + + + pi.d2.n1.2.5.4 + + + + + pi.d2.n1.3.1.1 + + + + + pi.d2.n1.3.1.2 + + + + + pi.d2.n1.3.1.3 + + + + + pi.d2.n1.3.1.4 + + + + + pi.d2.n1.3.2.1 + + + + + pi.d2.n1.3.2.2 + + + + + pi.d2.n1.3.2.3 + + + + + pi.d2.n1.3.2.4 + + + + + pi.d2.n1.3.3.1 + + + + + pi.d2.n1.3.3.2 + + + + + pi.d2.n1.3.3.3 + + + + + pi.d2.n1.3.3.4 + + + + + pi.d2.n1.3.4.1 + + + + + pi.d2.n1.3.4.2 + + + + + pi.d2.n1.3.4.3 + + + + + pi.d2.n1.3.4.4 + + + + + pi.d2.n1.3.5.1 + + + + + pi.d2.n1.3.5.2 + + + + + pi.d2.n1.3.5.3 + + + + + pi.d2.n1.3.5.4 + + + + + pi.d2.n1.4.1.1 + + + + + pi.d2.n1.4.1.2 + + + + + pi.d2.n1.4.1.3 + + + + + pi.d2.n1.4.1.4 + + + + + pi.d2.n1.4.2.1 + + + + + pi.d2.n1.4.2.2 + + + + + pi.d2.n1.4.2.3 + + + + + pi.d2.n1.4.2.4 + + + + + pi.d2.n1.4.3.1 + + + + + pi.d2.n1.4.3.2 + + + + + pi.d2.n1.4.3.3 + + + + + pi.d2.n1.4.3.4 + + + + + pi.d2.n1.4.4.1 + + + + + pi.d2.n1.4.4.2 + + + + + pi.d2.n1.4.4.3 + + + + + pi.d2.n1.4.4.4 + + + + + pi.d2.n1.4.5.1 + + + + + pi.d2.n1.4.5.2 + + + + + pi.d2.n1.4.5.3 + + + + + pi.d2.n1.4.5.4 + + + + + pi.d3.n1.1.1.1 + + + + + pi.d3.n1.1.1.2 + + + + + pi.d3.n1.1.1.3 + + + + + pi.d3.n1.1.1.4 + + + + + pi.d3.n1.1.1.5 + + + + + pi.d3.n1.1.2.1 + + + + + pi.d3.n1.1.2.2 + + + + + pi.d3.n1.1.2.3 + + + + + pi.d3.n1.1.2.4 + + + + + pi.d3.n1.1.2.5 + + + + + pi.d3.n1.1.3.1 + + + + + pi.d3.n1.1.3.2 + + + + + pi.d3.n1.1.3.3 + + + + + pi.d3.n1.1.3.4 + + + + + pi.d3.n1.1.3.5 + + + + + pi.d3.n1.1.4.1 + + + + + pi.d3.n1.1.4.2 + + + + + pi.d3.n1.1.4.3 + + + + + pi.d3.n1.1.4.4 + + + + + pi.d3.n1.1.4.5 + + + + + pi.d3.n1.2.1.1 + + + + + pi.d3.n1.2.1.2 + + + + + pi.d3.n1.2.1.3 + + + + + pi.d3.n1.2.1.4 + + + + + pi.d3.n1.2.1.5 + + + + + pi.d3.n1.2.2.1 + + + + + pi.d3.n1.2.2.2 + + + + + pi.d3.n1.2.2.3 + + + + + pi.d3.n1.2.2.4 + + + + + pi.d3.n1.2.2.5 + + + + + pi.d3.n1.2.3.1 + + + + + pi.d3.n1.2.3.2 + + + + + pi.d3.n1.2.3.3 + + + + + pi.d3.n1.2.3.4 + + + + + pi.d3.n1.2.3.5 + + + + + pi.d3.n1.2.4.1 + + + + + pi.d3.n1.2.4.2 + + + + + pi.d3.n1.2.4.3 + + + + + pi.d3.n1.2.4.4 + + + + + pi.d3.n1.2.4.5 + + + + + pi.d3.n1.3.1.1 + + + + + pi.d3.n1.3.1.2 + + + + + pi.d3.n1.3.1.3 + + + + + pi.d3.n1.3.1.4 + + + + + pi.d3.n1.3.1.5 + + + + + pi.d3.n1.3.2.1 + + + + + pi.d3.n1.3.2.2 + + + + + pi.d3.n1.3.2.3 + + + + + pi.d3.n1.3.2.4 + + + + + pi.d3.n1.3.2.5 + + + + + pi.d3.n1.3.3.1 + + + + + pi.d3.n1.3.3.2 + + + + + pi.d3.n1.3.3.3 + + + + + pi.d3.n1.3.3.4 + + + + + pi.d3.n1.3.3.5 + + + + + pi.d3.n1.3.4.1 + + + + + pi.d3.n1.3.4.2 + + + + + pi.d3.n1.3.4.3 + + + + + pi.d3.n1.3.4.4 + + + + + pi.d3.n1.3.4.5 + + + + + pi.d3.n1.4.1.1 + + + + + pi.d3.n1.4.1.2 + + + + + pi.d3.n1.4.1.3 + + + + + pi.d3.n1.4.1.4 + + + + + pi.d3.n1.4.1.5 + + + + + pi.d3.n1.4.2.1 + + + + + pi.d3.n1.4.2.2 + + + + + pi.d3.n1.4.2.3 + + + + + pi.d3.n1.4.2.4 + + + + + pi.d3.n1.4.2.5 + + + + + pi.d3.n1.4.3.1 + + + + + pi.d3.n1.4.3.2 + + + + + pi.d3.n1.4.3.3 + + + + + pi.d3.n1.4.3.4 + + + + + pi.d3.n1.4.3.5 + + + + + pi.d3.n1.4.4.1 + + + + + pi.d3.n1.4.4.2 + + + + + pi.d3.n1.4.4.3 + + + + + pi.d3.n1.4.4.4 + + + + + pi.d3.n1.4.4.5 + + + + + pil.d1.n1.1.1.1 + + + 1 + + + + + pil.d1.n1.1.1.2 + + + 1 + + + + + pil.d1.n1.1.1.3 + + + 1 + + + + + pil.d1.n1.1.1.4 + + + 1 + + + + + pil.d1.n1.1.2.1 + + + 1 + + + + + pil.d1.n1.1.2.2 + + + 1 + + + + + pil.d1.n1.1.2.3 + + + 1 + + + + + pil.d1.n1.1.2.4 + + + 1 + + + + + pil.d1.n1.1.3.1 + + + 1 + + + + + pil.d1.n1.1.3.2 + + + 1 + + + + + pil.d1.n1.1.3.3 + + + 1 + + + + + pil.d1.n1.1.3.4 + + + 1 + + + + + pil.d1.n1.1.4.1 + + + 1 + + + + + pil.d1.n1.1.4.2 + + + 1 + + + + + pil.d1.n1.1.4.3 + + + 1 + + + + + pil.d1.n1.1.4.4 + + + 1 + + + + + pil.d1.n1.2.1.1 + + + 1 + + + + + pil.d1.n1.2.1.2 + + + 1 + + + + + pil.d1.n1.2.1.3 + + + 1 + + + + + pil.d1.n1.2.1.4 + + + 1 + + + + + pil.d1.n1.2.2.1 + + + 1 + + + + + pil.d1.n1.2.2.2 + + + 1 + + + + + pil.d1.n1.2.2.3 + + + 1 + + + + + pil.d1.n1.2.2.4 + + + 1 + + + + + pil.d1.n1.2.3.1 + + + 1 + + + + + pil.d1.n1.2.3.2 + + + 1 + + + + + pil.d1.n1.2.3.3 + + + 1 + + + + + pil.d1.n1.2.3.4 + + + 1 + + + + + pil.d1.n1.2.4.1 + + + 1 + + + + + pil.d1.n1.2.4.2 + + + 1 + + + + + pil.d1.n1.2.4.3 + + + 1 + + + + + pil.d1.n1.2.4.4 + + + 1 + + + + + pil.d1.n1.3.1.1 + + + 1 + + + + + pil.d1.n1.3.1.2 + + + 1 + + + + + pil.d1.n1.3.1.3 + + + 1 + + + + + pil.d1.n1.3.1.4 + + + 1 + + + + + pil.d1.n1.3.2.1 + + + 1 + + + + + pil.d1.n1.3.2.2 + + + 1 + + + + + pil.d1.n1.3.2.3 + + + 1 + + + + + pil.d1.n1.3.2.4 + + + 1 + + + + + pil.d1.n1.3.3.1 + + + 1 + + + + + pil.d1.n1.3.3.2 + + + 1 + + + + + pil.d1.n1.3.3.3 + + + 1 + + + + + pil.d1.n1.3.3.4 + + + 1 + + + + + pil.d1.n1.3.4.1 + + + 1 + + + + + pil.d1.n1.3.4.2 + + + 1 + + + + + pil.d1.n1.3.4.3 + + + 1 + + + + + pil.d1.n1.3.4.4 + + + 1 + + + + + pil.d1.n1.4.1.1 + + + 1 + + + + + pil.d1.n1.4.1.2 + + + 1 + + + + + pil.d1.n1.4.1.3 + + + 1 + + + + + pil.d1.n1.4.1.4 + + + 1 + + + + + pil.d1.n1.4.2.1 + + + 1 + + + + + pil.d1.n1.4.2.2 + + + 1 + + + + + pil.d1.n1.4.2.3 + + + 1 + + + + + pil.d1.n1.4.2.4 + + + 1 + + + + + pil.d1.n1.4.3.1 + + + 1 + + + + + pil.d1.n1.4.3.2 + + + 1 + + + + + pil.d1.n1.4.3.3 + + + 1 + + + + + pil.d1.n1.4.3.4 + + + 1 + + + + + pil.d1.n1.4.4.1 + + + 1 + + + + + pil.d1.n1.4.4.2 + + + 1 + + + + + pil.d1.n1.4.4.3 + + + 1 + + + + + pil.d1.n1.4.4.4 + + + 1 + + + + + pil.d1.n1.5.1.1 + + + 1 + + + + + pil.d1.n1.5.1.2 + + + 1 + + + + + pil.d1.n1.5.1.3 + + + 1 + + + + + pil.d1.n1.5.1.4 + + + 1 + + + + + pil.d1.n1.5.2.1 + + + 1 + + + + + pil.d1.n1.5.2.2 + + + 1 + + + + + pil.d1.n1.5.2.3 + + + 1 + + + + + pil.d1.n1.5.2.4 + + + 1 + + + + + pil.d1.n1.5.3.1 + + + 1 + + + + + pil.d1.n1.5.3.2 + + + 1 + + + + + pil.d1.n1.5.3.3 + + + 1 + + + + + pil.d1.n1.5.3.4 + + + 1 + + + + + pil.d1.n1.5.4.1 + + + 1 + + + + + pil.d1.n1.5.4.2 + + + 1 + + + + + pil.d1.n1.5.4.3 + + + 1 + + + + + pil.d1.n1.5.4.4 + + + 1 + + + + + pil.d2.n1.1.1.1 + + + 1 + + + + + pil.d2.n1.1.1.2 + + + 1 + + + + + pil.d2.n1.1.1.3 + + + 1 + + + + + pil.d2.n1.1.1.4 + + + 1 + + + + + pil.d2.n1.1.2.1 + + + 1 + + + + + pil.d2.n1.1.2.2 + + + 1 + + + + + pil.d2.n1.1.2.3 + + + 1 + + + + + pil.d2.n1.1.2.4 + + + 1 + + + + + pil.d2.n1.1.3.1 + + + 1 + + + + + pil.d2.n1.1.3.2 + + + 1 + + + + + pil.d2.n1.1.3.3 + + + 1 + + + + + pil.d2.n1.1.3.4 + + + 1 + + + + + pil.d2.n1.1.4.1 + + + 1 + + + + + pil.d2.n1.1.4.2 + + + 1 + + + + + pil.d2.n1.1.4.3 + + + 1 + + + + + pil.d2.n1.1.4.4 + + + 1 + + + + + pil.d2.n1.1.5.1 + + + 1 + + + + + pil.d2.n1.1.5.2 + + + 1 + + + + + pil.d2.n1.1.5.3 + + + 1 + + + + + pil.d2.n1.1.5.4 + + + 1 + + + + + pil.d2.n1.2.1.1 + + + 1 + + + + + pil.d2.n1.2.1.2 + + + 1 + + + + + pil.d2.n1.2.1.3 + + + 1 + + + + + pil.d2.n1.2.1.4 + + + 1 + + + + + pil.d2.n1.2.2.1 + + + 1 + + + + + pil.d2.n1.2.2.2 + + + 1 + + + + + pil.d2.n1.2.2.3 + + + 1 + + + + + pil.d2.n1.2.2.4 + + + 1 + + + + + pil.d2.n1.2.3.1 + + + 1 + + + + + pil.d2.n1.2.3.2 + + + 1 + + + + + pil.d2.n1.2.3.3 + + + 1 + + + + + pil.d2.n1.2.3.4 + + + 1 + + + + + pil.d2.n1.2.4.1 + + + 1 + + + + + pil.d2.n1.2.4.2 + + + 1 + + + + + pil.d2.n1.2.4.3 + + + 1 + + + + + pil.d2.n1.2.4.4 + + + 1 + + + + + pil.d2.n1.2.5.1 + + + 1 + + + + + pil.d2.n1.2.5.2 + + + 1 + + + + + pil.d2.n1.2.5.3 + + + 1 + + + + + pil.d2.n1.2.5.4 + + + 1 + + + + + pil.d2.n1.3.1.1 + + + 1 + + + + + pil.d2.n1.3.1.2 + + + 1 + + + + + pil.d2.n1.3.1.3 + + + 1 + + + + + pil.d2.n1.3.1.4 + + + 1 + + + + + pil.d2.n1.3.2.1 + + + 1 + + + + + pil.d2.n1.3.2.2 + + + 1 + + + + + pil.d2.n1.3.2.3 + + + 1 + + + + + pil.d2.n1.3.2.4 + + + 1 + + + + + pil.d2.n1.3.3.1 + + + 1 + + + + + pil.d2.n1.3.3.2 + + + 1 + + + + + pil.d2.n1.3.3.3 + + + 1 + + + + + pil.d2.n1.3.3.4 + + + 1 + + + + + pil.d2.n1.3.4.1 + + + 1 + + + + + pil.d2.n1.3.4.2 + + + 1 + + + + + pil.d2.n1.3.4.3 + + + 1 + + + + + pil.d2.n1.3.4.4 + + + 1 + + + + + pil.d2.n1.3.5.1 + + + 1 + + + + + pil.d2.n1.3.5.2 + + + 1 + + + + + pil.d2.n1.3.5.3 + + + 1 + + + + + pil.d2.n1.3.5.4 + + + 1 + + + + + pil.d2.n1.4.1.1 + + + 1 + + + + + pil.d2.n1.4.1.2 + + + 1 + + + + + pil.d2.n1.4.1.3 + + + 1 + + + + + pil.d2.n1.4.1.4 + + + 1 + + + + + pil.d2.n1.4.2.1 + + + 1 + + + + + pil.d2.n1.4.2.2 + + + 1 + + + + + pil.d2.n1.4.2.3 + + + 1 + + + + + pil.d2.n1.4.2.4 + + + 1 + + + + + pil.d2.n1.4.3.1 + + + 1 + + + + + pil.d2.n1.4.3.2 + + + 1 + + + + + pil.d2.n1.4.3.3 + + + 1 + + + + + pil.d2.n1.4.3.4 + + + 1 + + + + + pil.d2.n1.4.4.1 + + + 1 + + + + + pil.d2.n1.4.4.2 + + + 1 + + + + + pil.d2.n1.4.4.3 + + + 1 + + + + + pil.d2.n1.4.4.4 + + + 1 + + + + + pil.d2.n1.4.5.1 + + + 1 + + + + + pil.d2.n1.4.5.2 + + + 1 + + + + + pil.d2.n1.4.5.3 + + + 1 + + + + + pil.d2.n1.4.5.4 + + + 1 + + + + + pil.d3.n1.1.1.1 + + + 1 + + + + + pil.d3.n1.1.1.2 + + + 1 + + + + + pil.d3.n1.1.1.3 + + + 1 + + + + + pil.d3.n1.1.1.4 + + + 1 + + + + + pil.d3.n1.1.1.5 + + + 1 + + + + + pil.d3.n1.1.2.1 + + + 1 + + + + + pil.d3.n1.1.2.2 + + + 1 + + + + + pil.d3.n1.1.2.3 + + + 1 + + + + + pil.d3.n1.1.2.4 + + + 1 + + + + + pil.d3.n1.1.2.5 + + + 1 + + + + + pil.d3.n1.1.3.1 + + + 1 + + + + + pil.d3.n1.1.3.2 + + + 1 + + + + + pil.d3.n1.1.3.3 + + + 1 + + + + + pil.d3.n1.1.3.4 + + + 1 + + + + + pil.d3.n1.1.3.5 + + + 1 + + + + + pil.d3.n1.1.4.1 + + + 1 + + + + + pil.d3.n1.1.4.2 + + + 1 + + + + + pil.d3.n1.1.4.3 + + + 1 + + + + + pil.d3.n1.1.4.4 + + + 1 + + + + + pil.d3.n1.1.4.5 + + + 1 + + + + + pil.d3.n1.2.1.1 + + + 1 + + + + + pil.d3.n1.2.1.2 + + + 1 + + + + + pil.d3.n1.2.1.3 + + + 1 + + + + + pil.d3.n1.2.1.4 + + + 1 + + + + + pil.d3.n1.2.1.5 + + + 1 + + + + + pil.d3.n1.2.2.1 + + + 1 + + + + + pil.d3.n1.2.2.2 + + + 1 + + + + + pil.d3.n1.2.2.3 + + + 1 + + + + + pil.d3.n1.2.2.4 + + + 1 + + + + + pil.d3.n1.2.2.5 + + + 1 + + + + + pil.d3.n1.2.3.1 + + + 1 + + + + + pil.d3.n1.2.3.2 + + + 1 + + + + + pil.d3.n1.2.3.3 + + + 1 + + + + + pil.d3.n1.2.3.4 + + + 1 + + + + + pil.d3.n1.2.3.5 + + + 1 + + + + + pil.d3.n1.2.4.1 + + + 1 + + + + + pil.d3.n1.2.4.2 + + + 1 + + + + + pil.d3.n1.2.4.3 + + + 1 + + + + + pil.d3.n1.2.4.4 + + + 1 + + + + + pil.d3.n1.2.4.5 + + + 1 + + + + + pil.d3.n1.3.1.1 + + + 1 + + + + + pil.d3.n1.3.1.2 + + + 1 + + + + + pil.d3.n1.3.1.3 + + + 1 + + + + + pil.d3.n1.3.1.4 + + + 1 + + + + + pil.d3.n1.3.1.5 + + + 1 + + + + + pil.d3.n1.3.2.1 + + + 1 + + + + + pil.d3.n1.3.2.2 + + + 1 + + + + + pil.d3.n1.3.2.3 + + + 1 + + + + + pil.d3.n1.3.2.4 + + + 1 + + + + + pil.d3.n1.3.2.5 + + + 1 + + + + + pil.d3.n1.3.3.1 + + + 1 + + + + + pil.d3.n1.3.3.2 + + + 1 + + + + + pil.d3.n1.3.3.3 + + + 1 + + + + + pil.d3.n1.3.3.4 + + + 1 + + + + + pil.d3.n1.3.3.5 + + + 1 + + + + + pil.d3.n1.3.4.1 + + + 1 + + + + + pil.d3.n1.3.4.2 + + + 1 + + + + + pil.d3.n1.3.4.3 + + + 1 + + + + + pil.d3.n1.3.4.4 + + + 1 + + + + + pil.d3.n1.3.4.5 + + + 1 + + + + + pil.d3.n1.4.1.1 + + + 1 + + + + + pil.d3.n1.4.1.2 + + + 1 + + + + + pil.d3.n1.4.1.3 + + + 1 + + + + + pil.d3.n1.4.1.4 + + + 1 + + + + + pil.d3.n1.4.1.5 + + + 1 + + + + + pil.d3.n1.4.2.1 + + + 1 + + + + + pil.d3.n1.4.2.2 + + + 1 + + + + + pil.d3.n1.4.2.3 + + + 1 + + + + + pil.d3.n1.4.2.4 + + + 1 + + + + + pil.d3.n1.4.2.5 + + + 1 + + + + + pil.d3.n1.4.3.1 + + + 1 + + + + + pil.d3.n1.4.3.2 + + + 1 + + + + + pil.d3.n1.4.3.3 + + + 1 + + + + + pil.d3.n1.4.3.4 + + + 1 + + + + + pil.d3.n1.4.3.5 + + + 1 + + + + + pil.d3.n1.4.4.1 + + + 1 + + + + + pil.d3.n1.4.4.2 + + + 1 + + + + + pil.d3.n1.4.4.3 + + + 1 + + + + + pil.d3.n1.4.4.4 + + + 1 + + + + + pil.d3.n1.4.4.5 + + + 1 + + + + + po.d1.n1.1.1.1 + + + + + po.d1.n1.1.1.2 + + + + + po.d1.n1.1.1.3 + + + + + po.d1.n1.1.1.4 + + + + + po.d1.n1.1.2.1 + + + + + po.d1.n1.1.2.2 + + + + + po.d1.n1.1.2.3 + + + + + po.d1.n1.1.2.4 + + + + + po.d1.n1.1.3.1 + + + + + po.d1.n1.1.3.2 + + + + + po.d1.n1.1.3.3 + + + + + po.d1.n1.1.3.4 + + + + + po.d1.n1.1.4.1 + + + + + po.d1.n1.1.4.2 + + + + + po.d1.n1.1.4.3 + + + + + po.d1.n1.1.4.4 + + + + + po.d1.n1.2.1.1 + + + + + po.d1.n1.2.1.2 + + + + + po.d1.n1.2.1.3 + + + + + po.d1.n1.2.1.4 + + + + + po.d1.n1.2.2.1 + + + + + po.d1.n1.2.2.2 + + + + + po.d1.n1.2.2.3 + + + + + po.d1.n1.2.2.4 + + + + + po.d1.n1.2.3.1 + + + + + po.d1.n1.2.3.2 + + + + + po.d1.n1.2.3.3 + + + + + po.d1.n1.2.3.4 + + + + + po.d1.n1.2.4.1 + + + + + po.d1.n1.2.4.2 + + + + + po.d1.n1.2.4.3 + + + + + po.d1.n1.2.4.4 + + + + + po.d1.n1.3.1.1 + + + + + po.d1.n1.3.1.2 + + + + + po.d1.n1.3.1.3 + + + + + po.d1.n1.3.1.4 + + + + + po.d1.n1.3.2.1 + + + + + po.d1.n1.3.2.2 + + + + + po.d1.n1.3.2.3 + + + + + po.d1.n1.3.2.4 + + + + + po.d1.n1.3.3.1 + + + + + po.d1.n1.3.3.2 + + + + + po.d1.n1.3.3.3 + + + + + po.d1.n1.3.3.4 + + + + + po.d1.n1.3.4.1 + + + + + po.d1.n1.3.4.2 + + + + + po.d1.n1.3.4.3 + + + + + po.d1.n1.3.4.4 + + + + + po.d1.n1.4.1.1 + + + + + po.d1.n1.4.1.2 + + + + + po.d1.n1.4.1.3 + + + + + po.d1.n1.4.1.4 + + + + + po.d1.n1.4.2.1 + + + + + po.d1.n1.4.2.2 + + + + + po.d1.n1.4.2.3 + + + + + po.d1.n1.4.2.4 + + + + + po.d1.n1.4.3.1 + + + + + po.d1.n1.4.3.2 + + + + + po.d1.n1.4.3.3 + + + + + po.d1.n1.4.3.4 + + + + + po.d1.n1.4.4.1 + + + + + po.d1.n1.4.4.2 + + + + + po.d1.n1.4.4.3 + + + + + po.d1.n1.4.4.4 + + + + + po.d1.n1.5.1.1 + + + + + po.d1.n1.5.1.2 + + + + + po.d1.n1.5.1.3 + + + + + po.d1.n1.5.1.4 + + + + + po.d1.n1.5.2.1 + + + + + po.d1.n1.5.2.2 + + + + + po.d1.n1.5.2.3 + + + + + po.d1.n1.5.2.4 + + + + + po.d1.n1.5.3.1 + + + + + po.d1.n1.5.3.2 + + + + + po.d1.n1.5.3.3 + + + + + po.d1.n1.5.3.4 + + + + + po.d1.n1.5.4.1 + + + + + po.d1.n1.5.4.2 + + + + + po.d1.n1.5.4.3 + + + + + po.d1.n1.5.4.4 + + + + + po.d2.n1.1.1.1 + + + + + po.d2.n1.1.1.2 + + + + + po.d2.n1.1.1.3 + + + + + po.d2.n1.1.1.4 + + + + + po.d2.n1.1.2.1 + + + + + po.d2.n1.1.2.2 + + + + + po.d2.n1.1.2.3 + + + + + po.d2.n1.1.2.4 + + + + + po.d2.n1.1.3.1 + + + + + po.d2.n1.1.3.2 + + + + + po.d2.n1.1.3.3 + + + + + po.d2.n1.1.3.4 + + + + + po.d2.n1.1.4.1 + + + + + po.d2.n1.1.4.2 + + + + + po.d2.n1.1.4.3 + + + + + po.d2.n1.1.4.4 + + + + + po.d2.n1.1.5.1 + + + + + po.d2.n1.1.5.2 + + + + + po.d2.n1.1.5.3 + + + + + po.d2.n1.1.5.4 + + + + + po.d2.n1.2.1.1 + + + + + po.d2.n1.2.1.2 + + + + + po.d2.n1.2.1.3 + + + + + po.d2.n1.2.1.4 + + + + + po.d2.n1.2.2.1 + + + + + po.d2.n1.2.2.2 + + + + + po.d2.n1.2.2.3 + + + + + po.d2.n1.2.2.4 + + + + + po.d2.n1.2.3.1 + + + + + po.d2.n1.2.3.2 + + + + + po.d2.n1.2.3.3 + + + + + po.d2.n1.2.3.4 + + + + + po.d2.n1.2.4.1 + + + + + po.d2.n1.2.4.2 + + + + + po.d2.n1.2.4.3 + + + + + po.d2.n1.2.4.4 + + + + + po.d2.n1.2.5.1 + + + + + po.d2.n1.2.5.2 + + + + + po.d2.n1.2.5.3 + + + + + po.d2.n1.2.5.4 + + + + + po.d2.n1.3.1.1 + + + + + po.d2.n1.3.1.2 + + + + + po.d2.n1.3.1.3 + + + + + po.d2.n1.3.1.4 + + + + + po.d2.n1.3.2.1 + + + + + po.d2.n1.3.2.2 + + + + + po.d2.n1.3.2.3 + + + + + po.d2.n1.3.2.4 + + + + + po.d2.n1.3.3.1 + + + + + po.d2.n1.3.3.2 + + + + + po.d2.n1.3.3.3 + + + + + po.d2.n1.3.3.4 + + + + + po.d2.n1.3.4.1 + + + + + po.d2.n1.3.4.2 + + + + + po.d2.n1.3.4.3 + + + + + po.d2.n1.3.4.4 + + + + + po.d2.n1.3.5.1 + + + + + po.d2.n1.3.5.2 + + + + + po.d2.n1.3.5.3 + + + + + po.d2.n1.3.5.4 + + + + + po.d2.n1.4.1.1 + + + + + po.d2.n1.4.1.2 + + + + + po.d2.n1.4.1.3 + + + + + po.d2.n1.4.1.4 + + + + + po.d2.n1.4.2.1 + + + + + po.d2.n1.4.2.2 + + + + + po.d2.n1.4.2.3 + + + + + po.d2.n1.4.2.4 + + + + + po.d2.n1.4.3.1 + + + + + po.d2.n1.4.3.2 + + + + + po.d2.n1.4.3.3 + + + + + po.d2.n1.4.3.4 + + + + + po.d2.n1.4.4.1 + + + + + po.d2.n1.4.4.2 + + + + + po.d2.n1.4.4.3 + + + + + po.d2.n1.4.4.4 + + + + + po.d2.n1.4.5.1 + + + + + po.d2.n1.4.5.2 + + + + + po.d2.n1.4.5.3 + + + + + po.d2.n1.4.5.4 + + + + + po.d3.n1.1.1.1 + + + + + po.d3.n1.1.1.2 + + + + + po.d3.n1.1.1.3 + + + + + po.d3.n1.1.1.4 + + + + + po.d3.n1.1.1.5 + + + + + po.d3.n1.1.2.1 + + + + + po.d3.n1.1.2.2 + + + + + po.d3.n1.1.2.3 + + + + + po.d3.n1.1.2.4 + + + + + po.d3.n1.1.2.5 + + + + + po.d3.n1.1.3.1 + + + + + po.d3.n1.1.3.2 + + + + + po.d3.n1.1.3.3 + + + + + po.d3.n1.1.3.4 + + + + + po.d3.n1.1.3.5 + + + + + po.d3.n1.1.4.1 + + + + + po.d3.n1.1.4.2 + + + + + po.d3.n1.1.4.3 + + + + + po.d3.n1.1.4.4 + + + + + po.d3.n1.1.4.5 + + + + + po.d3.n1.2.1.1 + + + + + po.d3.n1.2.1.2 + + + + + po.d3.n1.2.1.3 + + + + + po.d3.n1.2.1.4 + + + + + po.d3.n1.2.1.5 + + + + + po.d3.n1.2.2.1 + + + + + po.d3.n1.2.2.2 + + + + + po.d3.n1.2.2.3 + + + + + po.d3.n1.2.2.4 + + + + + po.d3.n1.2.2.5 + + + + + po.d3.n1.2.3.1 + + + + + po.d3.n1.2.3.2 + + + + + po.d3.n1.2.3.3 + + + + + po.d3.n1.2.3.4 + + + + + po.d3.n1.2.3.5 + + + + + po.d3.n1.2.4.1 + + + + + po.d3.n1.2.4.2 + + + + + po.d3.n1.2.4.3 + + + + + po.d3.n1.2.4.4 + + + + + po.d3.n1.2.4.5 + + + + + po.d3.n1.3.1.1 + + + + + po.d3.n1.3.1.2 + + + + + po.d3.n1.3.1.3 + + + + + po.d3.n1.3.1.4 + + + + + po.d3.n1.3.1.5 + + + + + po.d3.n1.3.2.1 + + + + + po.d3.n1.3.2.2 + + + + + po.d3.n1.3.2.3 + + + + + po.d3.n1.3.2.4 + + + + + po.d3.n1.3.2.5 + + + + + po.d3.n1.3.3.1 + + + + + po.d3.n1.3.3.2 + + + + + po.d3.n1.3.3.3 + + + + + po.d3.n1.3.3.4 + + + + + po.d3.n1.3.3.5 + + + + + po.d3.n1.3.4.1 + + + + + po.d3.n1.3.4.2 + + + + + po.d3.n1.3.4.3 + + + + + po.d3.n1.3.4.4 + + + + + po.d3.n1.3.4.5 + + + + + po.d3.n1.4.1.1 + + + + + po.d3.n1.4.1.2 + + + + + po.d3.n1.4.1.3 + + + + + po.d3.n1.4.1.4 + + + + + po.d3.n1.4.1.5 + + + + + po.d3.n1.4.2.1 + + + + + po.d3.n1.4.2.2 + + + + + po.d3.n1.4.2.3 + + + + + po.d3.n1.4.2.4 + + + + + po.d3.n1.4.2.5 + + + + + po.d3.n1.4.3.1 + + + + + po.d3.n1.4.3.2 + + + + + po.d3.n1.4.3.3 + + + + + po.d3.n1.4.3.4 + + + + + po.d3.n1.4.3.5 + + + + + po.d3.n1.4.4.1 + + + + + po.d3.n1.4.4.2 + + + + + po.d3.n1.4.4.3 + + + + + po.d3.n1.4.4.4 + + + + + po.d3.n1.4.4.5 + + + + + pol.d1.n1.1.1.1 + + + 1 + + + + + pol.d1.n1.1.1.2 + + + 1 + + + + + pol.d1.n1.1.1.3 + + + 1 + + + + + pol.d1.n1.1.1.4 + + + 1 + + + + + pol.d1.n1.1.2.1 + + + 1 + + + + + pol.d1.n1.1.2.2 + + + 1 + + + + + pol.d1.n1.1.2.3 + + + 1 + + + + + pol.d1.n1.1.2.4 + + + 1 + + + + + pol.d1.n1.1.3.1 + + + 1 + + + + + pol.d1.n1.1.3.2 + + + 1 + + + + + pol.d1.n1.1.3.3 + + + 1 + + + + + pol.d1.n1.1.3.4 + + + 1 + + + + + pol.d1.n1.1.4.1 + + + 1 + + + + + pol.d1.n1.1.4.2 + + + 1 + + + + + pol.d1.n1.1.4.3 + + + 1 + + + + + pol.d1.n1.1.4.4 + + + 1 + + + + + pol.d1.n1.2.1.1 + + + 1 + + + + + pol.d1.n1.2.1.2 + + + 1 + + + + + pol.d1.n1.2.1.3 + + + 1 + + + + + pol.d1.n1.2.1.4 + + + 1 + + + + + pol.d1.n1.2.2.1 + + + 1 + + + + + pol.d1.n1.2.2.2 + + + 1 + + + + + pol.d1.n1.2.2.3 + + + 1 + + + + + pol.d1.n1.2.2.4 + + + 1 + + + + + pol.d1.n1.2.3.1 + + + 1 + + + + + pol.d1.n1.2.3.2 + + + 1 + + + + + pol.d1.n1.2.3.3 + + + 1 + + + + + pol.d1.n1.2.3.4 + + + 1 + + + + + pol.d1.n1.2.4.1 + + + 1 + + + + + pol.d1.n1.2.4.2 + + + 1 + + + + + pol.d1.n1.2.4.3 + + + 1 + + + + + pol.d1.n1.2.4.4 + + + 1 + + + + + pol.d1.n1.3.1.1 + + + 1 + + + + + pol.d1.n1.3.1.2 + + + 1 + + + + + pol.d1.n1.3.1.3 + + + 1 + + + + + pol.d1.n1.3.1.4 + + + 1 + + + + + pol.d1.n1.3.2.1 + + + 1 + + + + + pol.d1.n1.3.2.2 + + + 1 + + + + + pol.d1.n1.3.2.3 + + + 1 + + + + + pol.d1.n1.3.2.4 + + + 1 + + + + + pol.d1.n1.3.3.1 + + + 1 + + + + + pol.d1.n1.3.3.2 + + + 1 + + + + + pol.d1.n1.3.3.3 + + + 1 + + + + + pol.d1.n1.3.3.4 + + + 1 + + + + + pol.d1.n1.3.4.1 + + + 1 + + + + + pol.d1.n1.3.4.2 + + + 1 + + + + + pol.d1.n1.3.4.3 + + + 1 + + + + + pol.d1.n1.3.4.4 + + + 1 + + + + + pol.d1.n1.4.1.1 + + + 1 + + + + + pol.d1.n1.4.1.2 + + + 1 + + + + + pol.d1.n1.4.1.3 + + + 1 + + + + + pol.d1.n1.4.1.4 + + + 1 + + + + + pol.d1.n1.4.2.1 + + + 1 + + + + + pol.d1.n1.4.2.2 + + + 1 + + + + + pol.d1.n1.4.2.3 + + + 1 + + + + + pol.d1.n1.4.2.4 + + + 1 + + + + + pol.d1.n1.4.3.1 + + + 1 + + + + + pol.d1.n1.4.3.2 + + + 1 + + + + + pol.d1.n1.4.3.3 + + + 1 + + + + + pol.d1.n1.4.3.4 + + + 1 + + + + + pol.d1.n1.4.4.1 + + + 1 + + + + + pol.d1.n1.4.4.2 + + + 1 + + + + + pol.d1.n1.4.4.3 + + + 1 + + + + + pol.d1.n1.4.4.4 + + + 1 + + + + + pol.d1.n1.5.1.1 + + + 1 + + + + + pol.d1.n1.5.1.2 + + + 1 + + + + + pol.d1.n1.5.1.3 + + + 1 + + + + + pol.d1.n1.5.1.4 + + + 1 + + + + + pol.d1.n1.5.2.1 + + + 1 + + + + + pol.d1.n1.5.2.2 + + + 1 + + + + + pol.d1.n1.5.2.3 + + + 1 + + + + + pol.d1.n1.5.2.4 + + + 1 + + + + + pol.d1.n1.5.3.1 + + + 1 + + + + + pol.d1.n1.5.3.2 + + + 1 + + + + + pol.d1.n1.5.3.3 + + + 1 + + + + + pol.d1.n1.5.3.4 + + + 1 + + + + + pol.d1.n1.5.4.1 + + + 1 + + + + + pol.d1.n1.5.4.2 + + + 1 + + + + + pol.d1.n1.5.4.3 + + + 1 + + + + + pol.d1.n1.5.4.4 + + + 1 + + + + + pol.d2.n1.1.1.1 + + + 1 + + + + + pol.d2.n1.1.1.2 + + + 1 + + + + + pol.d2.n1.1.1.3 + + + 1 + + + + + pol.d2.n1.1.1.4 + + + 1 + + + + + pol.d2.n1.1.2.1 + + + 1 + + + + + pol.d2.n1.1.2.2 + + + 1 + + + + + pol.d2.n1.1.2.3 + + + 1 + + + + + pol.d2.n1.1.2.4 + + + 1 + + + + + pol.d2.n1.1.3.1 + + + 1 + + + + + pol.d2.n1.1.3.2 + + + 1 + + + + + pol.d2.n1.1.3.3 + + + 1 + + + + + pol.d2.n1.1.3.4 + + + 1 + + + + + pol.d2.n1.1.4.1 + + + 1 + + + + + pol.d2.n1.1.4.2 + + + 1 + + + + + pol.d2.n1.1.4.3 + + + 1 + + + + + pol.d2.n1.1.4.4 + + + 1 + + + + + pol.d2.n1.1.5.1 + + + 1 + + + + + pol.d2.n1.1.5.2 + + + 1 + + + + + pol.d2.n1.1.5.3 + + + 1 + + + + + pol.d2.n1.1.5.4 + + + 1 + + + + + pol.d2.n1.2.1.1 + + + 1 + + + + + pol.d2.n1.2.1.2 + + + 1 + + + + + pol.d2.n1.2.1.3 + + + 1 + + + + + pol.d2.n1.2.1.4 + + + 1 + + + + + pol.d2.n1.2.2.1 + + + 1 + + + + + pol.d2.n1.2.2.2 + + + 1 + + + + + pol.d2.n1.2.2.3 + + + 1 + + + + + pol.d2.n1.2.2.4 + + + 1 + + + + + pol.d2.n1.2.3.1 + + + 1 + + + + + pol.d2.n1.2.3.2 + + + 1 + + + + + pol.d2.n1.2.3.3 + + + 1 + + + + + pol.d2.n1.2.3.4 + + + 1 + + + + + pol.d2.n1.2.4.1 + + + 1 + + + + + pol.d2.n1.2.4.2 + + + 1 + + + + + pol.d2.n1.2.4.3 + + + 1 + + + + + pol.d2.n1.2.4.4 + + + 1 + + + + + pol.d2.n1.2.5.1 + + + 1 + + + + + pol.d2.n1.2.5.2 + + + 1 + + + + + pol.d2.n1.2.5.3 + + + 1 + + + + + pol.d2.n1.2.5.4 + + + 1 + + + + + pol.d2.n1.3.1.1 + + + 1 + + + + + pol.d2.n1.3.1.2 + + + 1 + + + + + pol.d2.n1.3.1.3 + + + 1 + + + + + pol.d2.n1.3.1.4 + + + 1 + + + + + pol.d2.n1.3.2.1 + + + 1 + + + + + pol.d2.n1.3.2.2 + + + 1 + + + + + pol.d2.n1.3.2.3 + + + 1 + + + + + pol.d2.n1.3.2.4 + + + 1 + + + + + pol.d2.n1.3.3.1 + + + 1 + + + + + pol.d2.n1.3.3.2 + + + 1 + + + + + pol.d2.n1.3.3.3 + + + 1 + + + + + pol.d2.n1.3.3.4 + + + 1 + + + + + pol.d2.n1.3.4.1 + + + 1 + + + + + pol.d2.n1.3.4.2 + + + 1 + + + + + pol.d2.n1.3.4.3 + + + 1 + + + + + pol.d2.n1.3.4.4 + + + 1 + + + + + pol.d2.n1.3.5.1 + + + 1 + + + + + pol.d2.n1.3.5.2 + + + 1 + + + + + pol.d2.n1.3.5.3 + + + 1 + + + + + pol.d2.n1.3.5.4 + + + 1 + + + + + pol.d2.n1.4.1.1 + + + 1 + + + + + pol.d2.n1.4.1.2 + + + 1 + + + + + pol.d2.n1.4.1.3 + + + 1 + + + + + pol.d2.n1.4.1.4 + + + 1 + + + + + pol.d2.n1.4.2.1 + + + 1 + + + + + pol.d2.n1.4.2.2 + + + 1 + + + + + pol.d2.n1.4.2.3 + + + 1 + + + + + pol.d2.n1.4.2.4 + + + 1 + + + + + pol.d2.n1.4.3.1 + + + 1 + + + + + pol.d2.n1.4.3.2 + + + 1 + + + + + pol.d2.n1.4.3.3 + + + 1 + + + + + pol.d2.n1.4.3.4 + + + 1 + + + + + pol.d2.n1.4.4.1 + + + 1 + + + + + pol.d2.n1.4.4.2 + + + 1 + + + + + pol.d2.n1.4.4.3 + + + 1 + + + + + pol.d2.n1.4.4.4 + + + 1 + + + + + pol.d2.n1.4.5.1 + + + 1 + + + + + pol.d2.n1.4.5.2 + + + 1 + + + + + pol.d2.n1.4.5.3 + + + 1 + + + + + pol.d2.n1.4.5.4 + + + 1 + + + + + pol.d3.n1.1.1.1 + + + 1 + + + + + pol.d3.n1.1.1.2 + + + 1 + + + + + pol.d3.n1.1.1.3 + + + 1 + + + + + pol.d3.n1.1.1.4 + + + 1 + + + + + pol.d3.n1.1.1.5 + + + 1 + + + + + pol.d3.n1.1.2.1 + + + 1 + + + + + pol.d3.n1.1.2.2 + + + 1 + + + + + pol.d3.n1.1.2.3 + + + 1 + + + + + pol.d3.n1.1.2.4 + + + 1 + + + + + pol.d3.n1.1.2.5 + + + 1 + + + + + pol.d3.n1.1.3.1 + + + 1 + + + + + pol.d3.n1.1.3.2 + + + 1 + + + + + pol.d3.n1.1.3.3 + + + 1 + + + + + pol.d3.n1.1.3.4 + + + 1 + + + + + pol.d3.n1.1.3.5 + + + 1 + + + + + pol.d3.n1.1.4.1 + + + 1 + + + + + pol.d3.n1.1.4.2 + + + 1 + + + + + pol.d3.n1.1.4.3 + + + 1 + + + + + pol.d3.n1.1.4.4 + + + 1 + + + + + pol.d3.n1.1.4.5 + + + 1 + + + + + pol.d3.n1.2.1.1 + + + 1 + + + + + pol.d3.n1.2.1.2 + + + 1 + + + + + pol.d3.n1.2.1.3 + + + 1 + + + + + pol.d3.n1.2.1.4 + + + 1 + + + + + pol.d3.n1.2.1.5 + + + 1 + + + + + pol.d3.n1.2.2.1 + + + 1 + + + + + pol.d3.n1.2.2.2 + + + 1 + + + + + pol.d3.n1.2.2.3 + + + 1 + + + + + pol.d3.n1.2.2.4 + + + 1 + + + + + pol.d3.n1.2.2.5 + + + 1 + + + + + pol.d3.n1.2.3.1 + + + 1 + + + + + pol.d3.n1.2.3.2 + + + 1 + + + + + pol.d3.n1.2.3.3 + + + 1 + + + + + pol.d3.n1.2.3.4 + + + 1 + + + + + pol.d3.n1.2.3.5 + + + 1 + + + + + pol.d3.n1.2.4.1 + + + 1 + + + + + pol.d3.n1.2.4.2 + + + 1 + + + + + pol.d3.n1.2.4.3 + + + 1 + + + + + pol.d3.n1.2.4.4 + + + 1 + + + + + pol.d3.n1.2.4.5 + + + 1 + + + + + pol.d3.n1.3.1.1 + + + 1 + + + + + pol.d3.n1.3.1.2 + + + 1 + + + + + pol.d3.n1.3.1.3 + + + 1 + + + + + pol.d3.n1.3.1.4 + + + 1 + + + + + pol.d3.n1.3.1.5 + + + 1 + + + + + pol.d3.n1.3.2.1 + + + 1 + + + + + pol.d3.n1.3.2.2 + + + 1 + + + + + pol.d3.n1.3.2.3 + + + 1 + + + + + pol.d3.n1.3.2.4 + + + 1 + + + + + pol.d3.n1.3.2.5 + + + 1 + + + + + pol.d3.n1.3.3.1 + + + 1 + + + + + pol.d3.n1.3.3.2 + + + 1 + + + + + pol.d3.n1.3.3.3 + + + 1 + + + + + pol.d3.n1.3.3.4 + + + 1 + + + + + pol.d3.n1.3.3.5 + + + 1 + + + + + pol.d3.n1.3.4.1 + + + 1 + + + + + pol.d3.n1.3.4.2 + + + 1 + + + + + pol.d3.n1.3.4.3 + + + 1 + + + + + pol.d3.n1.3.4.4 + + + 1 + + + + + pol.d3.n1.3.4.5 + + + 1 + + + + + pol.d3.n1.4.1.1 + + + 1 + + + + + pol.d3.n1.4.1.2 + + + 1 + + + + + pol.d3.n1.4.1.3 + + + 1 + + + + + pol.d3.n1.4.1.4 + + + 1 + + + + + pol.d3.n1.4.1.5 + + + 1 + + + + + pol.d3.n1.4.2.1 + + + 1 + + + + + pol.d3.n1.4.2.2 + + + 1 + + + + + pol.d3.n1.4.2.3 + + + 1 + + + + + pol.d3.n1.4.2.4 + + + 1 + + + + + pol.d3.n1.4.2.5 + + + 1 + + + + + pol.d3.n1.4.3.1 + + + 1 + + + + + pol.d3.n1.4.3.2 + + + 1 + + + + + pol.d3.n1.4.3.3 + + + 1 + + + + + pol.d3.n1.4.3.4 + + + 1 + + + + + pol.d3.n1.4.3.5 + + + 1 + + + + + pol.d3.n1.4.4.1 + + + 1 + + + + + pol.d3.n1.4.4.2 + + + 1 + + + + + pol.d3.n1.4.4.3 + + + 1 + + + + + pol.d3.n1.4.4.4 + + + 1 + + + + + pol.d3.n1.4.4.5 + + + 1 + + + + + ti.d1.n1.d1.n2.1.1.1 + + + + + ti.d1.n1.d1.n2.1.1.2 + + + + + ti.d1.n1.d1.n2.1.1.3 + + + + + ti.d1.n1.d1.n2.1.1.4 + + + + + ti.d1.n1.d1.n2.1.2.1 + + + + + ti.d1.n1.d1.n2.1.2.2 + + + + + ti.d1.n1.d1.n2.1.2.3 + + + + + ti.d1.n1.d1.n2.1.2.4 + + + + + ti.d1.n1.d1.n2.1.3.1 + + + + + ti.d1.n1.d1.n2.1.3.2 + + + + + ti.d1.n1.d1.n2.1.3.3 + + + + + ti.d1.n1.d1.n2.1.3.4 + + + + + ti.d1.n1.d1.n2.1.4.1 + + + + + ti.d1.n1.d1.n2.1.4.2 + + + + + ti.d1.n1.d1.n2.1.4.3 + + + + + ti.d1.n1.d1.n2.1.4.4 + + + + + ti.d1.n1.d1.n2.2.1.1 + + + + + ti.d1.n1.d1.n2.2.1.2 + + + + + ti.d1.n1.d1.n2.2.1.3 + + + + + ti.d1.n1.d1.n2.2.1.4 + + + + + ti.d1.n1.d1.n2.2.2.1 + + + + + ti.d1.n1.d1.n2.2.2.2 + + + + + ti.d1.n1.d1.n2.2.2.3 + + + + + ti.d1.n1.d1.n2.2.2.4 + + + + + ti.d1.n1.d1.n2.2.3.1 + + + + + ti.d1.n1.d1.n2.2.3.2 + + + + + ti.d1.n1.d1.n2.2.3.3 + + + + + ti.d1.n1.d1.n2.2.3.4 + + + + + ti.d1.n1.d1.n2.2.4.1 + + + + + ti.d1.n1.d1.n2.2.4.2 + + + + + ti.d1.n1.d1.n2.2.4.3 + + + + + ti.d1.n1.d1.n2.2.4.4 + + + + + ti.d1.n1.d1.n2.3.1.1 + + + + + ti.d1.n1.d1.n2.3.1.2 + + + + + ti.d1.n1.d1.n2.3.1.3 + + + + + ti.d1.n1.d1.n2.3.1.4 + + + + + ti.d1.n1.d1.n2.3.2.1 + + + + + ti.d1.n1.d1.n2.3.2.2 + + + + + ti.d1.n1.d1.n2.3.2.3 + + + + + ti.d1.n1.d1.n2.3.2.4 + + + + + ti.d1.n1.d1.n2.3.3.1 + + + + + ti.d1.n1.d1.n2.3.3.2 + + + + + ti.d1.n1.d1.n2.3.3.3 + + + + + ti.d1.n1.d1.n2.3.3.4 + + + + + ti.d1.n1.d1.n2.3.4.1 + + + + + ti.d1.n1.d1.n2.3.4.2 + + + + + ti.d1.n1.d1.n2.3.4.3 + + + + + ti.d1.n1.d1.n2.3.4.4 + + + + + ti.d1.n1.d1.n2.4.1.1 + + + + + ti.d1.n1.d1.n2.4.1.2 + + + + + ti.d1.n1.d1.n2.4.1.3 + + + + + ti.d1.n1.d1.n2.4.1.4 + + + + + ti.d1.n1.d1.n2.4.2.1 + + + + + ti.d1.n1.d1.n2.4.2.2 + + + + + ti.d1.n1.d1.n2.4.2.3 + + + + + ti.d1.n1.d1.n2.4.2.4 + + + + + ti.d1.n1.d1.n2.4.3.1 + + + + + ti.d1.n1.d1.n2.4.3.2 + + + + + ti.d1.n1.d1.n2.4.3.3 + + + + + ti.d1.n1.d1.n2.4.3.4 + + + + + ti.d1.n1.d1.n2.4.4.1 + + + + + ti.d1.n1.d1.n2.4.4.2 + + + + + ti.d1.n1.d1.n2.4.4.3 + + + + + ti.d1.n1.d1.n2.4.4.4 + + + + + ti.d1.n1.d2.n1.1.1.1 + + + + + ti.d1.n1.d2.n1.1.1.2 + + + + + ti.d1.n1.d2.n1.1.1.3 + + + + + ti.d1.n1.d2.n1.1.1.4 + + + + + ti.d1.n1.d2.n1.1.2.1 + + + + + ti.d1.n1.d2.n1.1.2.2 + + + + + ti.d1.n1.d2.n1.1.2.3 + + + + + ti.d1.n1.d2.n1.1.2.4 + + + + + ti.d1.n1.d2.n1.1.3.1 + + + + + ti.d1.n1.d2.n1.1.3.2 + + + + + ti.d1.n1.d2.n1.1.3.3 + + + + + ti.d1.n1.d2.n1.1.3.4 + + + + + ti.d1.n1.d2.n1.1.4.1 + + + + + ti.d1.n1.d2.n1.1.4.2 + + + + + ti.d1.n1.d2.n1.1.4.3 + + + + + ti.d1.n1.d2.n1.1.4.4 + + + + + ti.d1.n1.d2.n1.2.1.1 + + + + + ti.d1.n1.d2.n1.2.1.2 + + + + + ti.d1.n1.d2.n1.2.1.3 + + + + + ti.d1.n1.d2.n1.2.1.4 + + + + + ti.d1.n1.d2.n1.2.2.1 + + + + + ti.d1.n1.d2.n1.2.2.2 + + + + + ti.d1.n1.d2.n1.2.2.3 + + + + + ti.d1.n1.d2.n1.2.2.4 + + + + + ti.d1.n1.d2.n1.2.3.1 + + + + + ti.d1.n1.d2.n1.2.3.2 + + + + + ti.d1.n1.d2.n1.2.3.3 + + + + + ti.d1.n1.d2.n1.2.3.4 + + + + + ti.d1.n1.d2.n1.2.4.1 + + + + + ti.d1.n1.d2.n1.2.4.2 + + + + + ti.d1.n1.d2.n1.2.4.3 + + + + + ti.d1.n1.d2.n1.2.4.4 + + + + + ti.d1.n1.d2.n1.3.1.1 + + + + + ti.d1.n1.d2.n1.3.1.2 + + + + + ti.d1.n1.d2.n1.3.1.3 + + + + + ti.d1.n1.d2.n1.3.1.4 + + + + + ti.d1.n1.d2.n1.3.2.1 + + + + + ti.d1.n1.d2.n1.3.2.2 + + + + + ti.d1.n1.d2.n1.3.2.3 + + + + + ti.d1.n1.d2.n1.3.2.4 + + + + + ti.d1.n1.d2.n1.3.3.1 + + + + + ti.d1.n1.d2.n1.3.3.2 + + + + + ti.d1.n1.d2.n1.3.3.3 + + + + + ti.d1.n1.d2.n1.3.3.4 + + + + + ti.d1.n1.d2.n1.3.4.1 + + + + + ti.d1.n1.d2.n1.3.4.2 + + + + + ti.d1.n1.d2.n1.3.4.3 + + + + + ti.d1.n1.d2.n1.3.4.4 + + + + + ti.d1.n1.d2.n1.4.1.1 + + + + + ti.d1.n1.d2.n1.4.1.2 + + + + + ti.d1.n1.d2.n1.4.1.3 + + + + + ti.d1.n1.d2.n1.4.1.4 + + + + + ti.d1.n1.d2.n1.4.2.1 + + + + + ti.d1.n1.d2.n1.4.2.2 + + + + + ti.d1.n1.d2.n1.4.2.3 + + + + + ti.d1.n1.d2.n1.4.2.4 + + + + + ti.d1.n1.d2.n1.4.3.1 + + + + + ti.d1.n1.d2.n1.4.3.2 + + + + + ti.d1.n1.d2.n1.4.3.3 + + + + + ti.d1.n1.d2.n1.4.3.4 + + + + + ti.d1.n1.d2.n1.4.4.1 + + + + + ti.d1.n1.d2.n1.4.4.2 + + + + + ti.d1.n1.d2.n1.4.4.3 + + + + + ti.d1.n1.d2.n1.4.4.4 + + + + + ti.d1.n1.d2.n2.1.1.1 + + + + + ti.d1.n1.d2.n2.1.1.2 + + + + + ti.d1.n1.d2.n2.1.1.3 + + + + + ti.d1.n1.d2.n2.1.1.4 + + + + + ti.d1.n1.d2.n2.1.2.1 + + + + + ti.d1.n1.d2.n2.1.2.2 + + + + + ti.d1.n1.d2.n2.1.2.3 + + + + + ti.d1.n1.d2.n2.1.2.4 + + + + + ti.d1.n1.d2.n2.1.3.1 + + + + + ti.d1.n1.d2.n2.1.3.2 + + + + + ti.d1.n1.d2.n2.1.3.3 + + + + + ti.d1.n1.d2.n2.1.3.4 + + + + + ti.d1.n1.d2.n2.1.4.1 + + + + + ti.d1.n1.d2.n2.1.4.2 + + + + + ti.d1.n1.d2.n2.1.4.3 + + + + + ti.d1.n1.d2.n2.1.4.4 + + + + + ti.d1.n1.d2.n2.2.1.1 + + + + + ti.d1.n1.d2.n2.2.1.2 + + + + + ti.d1.n1.d2.n2.2.1.3 + + + + + ti.d1.n1.d2.n2.2.1.4 + + + + + ti.d1.n1.d2.n2.2.2.1 + + + + + ti.d1.n1.d2.n2.2.2.2 + + + + + ti.d1.n1.d2.n2.2.2.3 + + + + + ti.d1.n1.d2.n2.2.2.4 + + + + + ti.d1.n1.d2.n2.2.3.1 + + + + + ti.d1.n1.d2.n2.2.3.2 + + + + + ti.d1.n1.d2.n2.2.3.3 + + + + + ti.d1.n1.d2.n2.2.3.4 + + + + + ti.d1.n1.d2.n2.2.4.1 + + + + + ti.d1.n1.d2.n2.2.4.2 + + + + + ti.d1.n1.d2.n2.2.4.3 + + + + + ti.d1.n1.d2.n2.2.4.4 + + + + + ti.d1.n1.d2.n2.3.1.1 + + + + + ti.d1.n1.d2.n2.3.1.2 + + + + + ti.d1.n1.d2.n2.3.1.3 + + + + + ti.d1.n1.d2.n2.3.1.4 + + + + + ti.d1.n1.d2.n2.3.2.1 + + + + + ti.d1.n1.d2.n2.3.2.2 + + + + + ti.d1.n1.d2.n2.3.2.3 + + + + + ti.d1.n1.d2.n2.3.2.4 + + + + + ti.d1.n1.d2.n2.3.3.1 + + + + + ti.d1.n1.d2.n2.3.3.2 + + + + + ti.d1.n1.d2.n2.3.3.3 + + + + + ti.d1.n1.d2.n2.3.3.4 + + + + + ti.d1.n1.d2.n2.3.4.1 + + + + + ti.d1.n1.d2.n2.3.4.2 + + + + + ti.d1.n1.d2.n2.3.4.3 + + + + + ti.d1.n1.d2.n2.3.4.4 + + + + + ti.d1.n1.d2.n2.4.1.1 + + + + + ti.d1.n1.d2.n2.4.1.2 + + + + + ti.d1.n1.d2.n2.4.1.3 + + + + + ti.d1.n1.d2.n2.4.1.4 + + + + + ti.d1.n1.d2.n2.4.2.1 + + + + + ti.d1.n1.d2.n2.4.2.2 + + + + + ti.d1.n1.d2.n2.4.2.3 + + + + + ti.d1.n1.d2.n2.4.2.4 + + + + + ti.d1.n1.d2.n2.4.3.1 + + + + + ti.d1.n1.d2.n2.4.3.2 + + + + + ti.d1.n1.d2.n2.4.3.3 + + + + + ti.d1.n1.d2.n2.4.3.4 + + + + + ti.d1.n1.d2.n2.4.4.1 + + + + + ti.d1.n1.d2.n2.4.4.2 + + + + + ti.d1.n1.d2.n2.4.4.3 + + + + + ti.d1.n1.d2.n2.4.4.4 + + + + + ti.d1.n1.d3.n1.1.1.1 + + + + + ti.d1.n1.d3.n1.1.1.2 + + + + + ti.d1.n1.d3.n1.1.1.3 + + + + + ti.d1.n1.d3.n1.1.1.4 + + + + + ti.d1.n1.d3.n1.1.2.1 + + + + + ti.d1.n1.d3.n1.1.2.2 + + + + + ti.d1.n1.d3.n1.1.2.3 + + + + + ti.d1.n1.d3.n1.1.2.4 + + + + + ti.d1.n1.d3.n1.1.3.1 + + + + + ti.d1.n1.d3.n1.1.3.2 + + + + + ti.d1.n1.d3.n1.1.3.3 + + + + + ti.d1.n1.d3.n1.1.3.4 + + + + + ti.d1.n1.d3.n1.1.4.1 + + + + + ti.d1.n1.d3.n1.1.4.2 + + + + + ti.d1.n1.d3.n1.1.4.3 + + + + + ti.d1.n1.d3.n1.1.4.4 + + + + + ti.d1.n1.d3.n1.2.1.1 + + + + + ti.d1.n1.d3.n1.2.1.2 + + + + + ti.d1.n1.d3.n1.2.1.3 + + + + + ti.d1.n1.d3.n1.2.1.4 + + + + + ti.d1.n1.d3.n1.2.2.1 + + + + + ti.d1.n1.d3.n1.2.2.2 + + + + + ti.d1.n1.d3.n1.2.2.3 + + + + + ti.d1.n1.d3.n1.2.2.4 + + + + + ti.d1.n1.d3.n1.2.3.1 + + + + + ti.d1.n1.d3.n1.2.3.2 + + + + + ti.d1.n1.d3.n1.2.3.3 + + + + + ti.d1.n1.d3.n1.2.3.4 + + + + + ti.d1.n1.d3.n1.2.4.1 + + + + + ti.d1.n1.d3.n1.2.4.2 + + + + + ti.d1.n1.d3.n1.2.4.3 + + + + + ti.d1.n1.d3.n1.2.4.4 + + + + + ti.d1.n1.d3.n1.3.1.1 + + + + + ti.d1.n1.d3.n1.3.1.2 + + + + + ti.d1.n1.d3.n1.3.1.3 + + + + + ti.d1.n1.d3.n1.3.1.4 + + + + + ti.d1.n1.d3.n1.3.2.1 + + + + + ti.d1.n1.d3.n1.3.2.2 + + + + + ti.d1.n1.d3.n1.3.2.3 + + + + + ti.d1.n1.d3.n1.3.2.4 + + + + + ti.d1.n1.d3.n1.3.3.1 + + + + + ti.d1.n1.d3.n1.3.3.2 + + + + + ti.d1.n1.d3.n1.3.3.3 + + + + + ti.d1.n1.d3.n1.3.3.4 + + + + + ti.d1.n1.d3.n1.3.4.1 + + + + + ti.d1.n1.d3.n1.3.4.2 + + + + + ti.d1.n1.d3.n1.3.4.3 + + + + + ti.d1.n1.d3.n1.3.4.4 + + + + + ti.d1.n1.d3.n1.4.1.1 + + + + + ti.d1.n1.d3.n1.4.1.2 + + + + + ti.d1.n1.d3.n1.4.1.3 + + + + + ti.d1.n1.d3.n1.4.1.4 + + + + + ti.d1.n1.d3.n1.4.2.1 + + + + + ti.d1.n1.d3.n1.4.2.2 + + + + + ti.d1.n1.d3.n1.4.2.3 + + + + + ti.d1.n1.d3.n1.4.2.4 + + + + + ti.d1.n1.d3.n1.4.3.1 + + + + + ti.d1.n1.d3.n1.4.3.2 + + + + + ti.d1.n1.d3.n1.4.3.3 + + + + + ti.d1.n1.d3.n1.4.3.4 + + + + + ti.d1.n1.d3.n1.4.4.1 + + + + + ti.d1.n1.d3.n1.4.4.2 + + + + + ti.d1.n1.d3.n1.4.4.3 + + + + + ti.d1.n1.d3.n1.4.4.4 + + + + + ti.d1.n1.d3.n2.1.1.1 + + + + + ti.d1.n1.d3.n2.1.1.2 + + + + + ti.d1.n1.d3.n2.1.1.3 + + + + + ti.d1.n1.d3.n2.1.1.4 + + + + + ti.d1.n1.d3.n2.1.2.1 + + + + + ti.d1.n1.d3.n2.1.2.2 + + + + + ti.d1.n1.d3.n2.1.2.3 + + + + + ti.d1.n1.d3.n2.1.2.4 + + + + + ti.d1.n1.d3.n2.1.3.1 + + + + + ti.d1.n1.d3.n2.1.3.2 + + + + + ti.d1.n1.d3.n2.1.3.3 + + + + + ti.d1.n1.d3.n2.1.3.4 + + + + + ti.d1.n1.d3.n2.1.4.1 + + + + + ti.d1.n1.d3.n2.1.4.2 + + + + + ti.d1.n1.d3.n2.1.4.3 + + + + + ti.d1.n1.d3.n2.1.4.4 + + + + + ti.d1.n1.d3.n2.2.1.1 + + + + + ti.d1.n1.d3.n2.2.1.2 + + + + + ti.d1.n1.d3.n2.2.1.3 + + + + + ti.d1.n1.d3.n2.2.1.4 + + + + + ti.d1.n1.d3.n2.2.2.1 + + + + + ti.d1.n1.d3.n2.2.2.2 + + + + + ti.d1.n1.d3.n2.2.2.3 + + + + + ti.d1.n1.d3.n2.2.2.4 + + + + + ti.d1.n1.d3.n2.2.3.1 + + + + + ti.d1.n1.d3.n2.2.3.2 + + + + + ti.d1.n1.d3.n2.2.3.3 + + + + + ti.d1.n1.d3.n2.2.3.4 + + + + + ti.d1.n1.d3.n2.2.4.1 + + + + + ti.d1.n1.d3.n2.2.4.2 + + + + + ti.d1.n1.d3.n2.2.4.3 + + + + + ti.d1.n1.d3.n2.2.4.4 + + + + + ti.d1.n1.d3.n2.3.1.1 + + + + + ti.d1.n1.d3.n2.3.1.2 + + + + + ti.d1.n1.d3.n2.3.1.3 + + + + + ti.d1.n1.d3.n2.3.1.4 + + + + + ti.d1.n1.d3.n2.3.2.1 + + + + + ti.d1.n1.d3.n2.3.2.2 + + + + + ti.d1.n1.d3.n2.3.2.3 + + + + + ti.d1.n1.d3.n2.3.2.4 + + + + + ti.d1.n1.d3.n2.3.3.1 + + + + + ti.d1.n1.d3.n2.3.3.2 + + + + + ti.d1.n1.d3.n2.3.3.3 + + + + + ti.d1.n1.d3.n2.3.3.4 + + + + + ti.d1.n1.d3.n2.3.4.1 + + + + + ti.d1.n1.d3.n2.3.4.2 + + + + + ti.d1.n1.d3.n2.3.4.3 + + + + + ti.d1.n1.d3.n2.3.4.4 + + + + + ti.d1.n1.d3.n2.4.1.1 + + + + + ti.d1.n1.d3.n2.4.1.2 + + + + + ti.d1.n1.d3.n2.4.1.3 + + + + + ti.d1.n1.d3.n2.4.1.4 + + + + + ti.d1.n1.d3.n2.4.2.1 + + + + + ti.d1.n1.d3.n2.4.2.2 + + + + + ti.d1.n1.d3.n2.4.2.3 + + + + + ti.d1.n1.d3.n2.4.2.4 + + + + + ti.d1.n1.d3.n2.4.3.1 + + + + + ti.d1.n1.d3.n2.4.3.2 + + + + + ti.d1.n1.d3.n2.4.3.3 + + + + + ti.d1.n1.d3.n2.4.3.4 + + + + + ti.d1.n1.d3.n2.4.4.1 + + + + + ti.d1.n1.d3.n2.4.4.2 + + + + + ti.d1.n1.d3.n2.4.4.3 + + + + + ti.d1.n1.d3.n2.4.4.4 + + + + + ti.d1.n2.d1.n1.1.1.1 + + + + + ti.d1.n2.d1.n1.1.1.2 + + + + + ti.d1.n2.d1.n1.1.1.3 + + + + + ti.d1.n2.d1.n1.1.1.4 + + + + + ti.d1.n2.d1.n1.1.2.1 + + + + + ti.d1.n2.d1.n1.1.2.2 + + + + + ti.d1.n2.d1.n1.1.2.3 + + + + + ti.d1.n2.d1.n1.1.2.4 + + + + + ti.d1.n2.d1.n1.1.3.1 + + + + + ti.d1.n2.d1.n1.1.3.2 + + + + + ti.d1.n2.d1.n1.1.3.3 + + + + + ti.d1.n2.d1.n1.1.3.4 + + + + + ti.d1.n2.d1.n1.1.4.1 + + + + + ti.d1.n2.d1.n1.1.4.2 + + + + + ti.d1.n2.d1.n1.1.4.3 + + + + + ti.d1.n2.d1.n1.1.4.4 + + + + + ti.d1.n2.d1.n1.2.1.1 + + + + + ti.d1.n2.d1.n1.2.1.2 + + + + + ti.d1.n2.d1.n1.2.1.3 + + + + + ti.d1.n2.d1.n1.2.1.4 + + + + + ti.d1.n2.d1.n1.2.2.1 + + + + + ti.d1.n2.d1.n1.2.2.2 + + + + + ti.d1.n2.d1.n1.2.2.3 + + + + + ti.d1.n2.d1.n1.2.2.4 + + + + + ti.d1.n2.d1.n1.2.3.1 + + + + + ti.d1.n2.d1.n1.2.3.2 + + + + + ti.d1.n2.d1.n1.2.3.3 + + + + + ti.d1.n2.d1.n1.2.3.4 + + + + + ti.d1.n2.d1.n1.2.4.1 + + + + + ti.d1.n2.d1.n1.2.4.2 + + + + + ti.d1.n2.d1.n1.2.4.3 + + + + + ti.d1.n2.d1.n1.2.4.4 + + + + + ti.d1.n2.d1.n1.3.1.1 + + + + + ti.d1.n2.d1.n1.3.1.2 + + + + + ti.d1.n2.d1.n1.3.1.3 + + + + + ti.d1.n2.d1.n1.3.1.4 + + + + + ti.d1.n2.d1.n1.3.2.1 + + + + + ti.d1.n2.d1.n1.3.2.2 + + + + + ti.d1.n2.d1.n1.3.2.3 + + + + + ti.d1.n2.d1.n1.3.2.4 + + + + + ti.d1.n2.d1.n1.3.3.1 + + + + + ti.d1.n2.d1.n1.3.3.2 + + + + + ti.d1.n2.d1.n1.3.3.3 + + + + + ti.d1.n2.d1.n1.3.3.4 + + + + + ti.d1.n2.d1.n1.3.4.1 + + + + + ti.d1.n2.d1.n1.3.4.2 + + + + + ti.d1.n2.d1.n1.3.4.3 + + + + + ti.d1.n2.d1.n1.3.4.4 + + + + + ti.d1.n2.d1.n1.4.1.1 + + + + + ti.d1.n2.d1.n1.4.1.2 + + + + + ti.d1.n2.d1.n1.4.1.3 + + + + + ti.d1.n2.d1.n1.4.1.4 + + + + + ti.d1.n2.d1.n1.4.2.1 + + + + + ti.d1.n2.d1.n1.4.2.2 + + + + + ti.d1.n2.d1.n1.4.2.3 + + + + + ti.d1.n2.d1.n1.4.2.4 + + + + + ti.d1.n2.d1.n1.4.3.1 + + + + + ti.d1.n2.d1.n1.4.3.2 + + + + + ti.d1.n2.d1.n1.4.3.3 + + + + + ti.d1.n2.d1.n1.4.3.4 + + + + + ti.d1.n2.d1.n1.4.4.1 + + + + + ti.d1.n2.d1.n1.4.4.2 + + + + + ti.d1.n2.d1.n1.4.4.3 + + + + + ti.d1.n2.d1.n1.4.4.4 + + + + + ti.d1.n2.d2.n1.1.1.1 + + + + + ti.d1.n2.d2.n1.1.1.2 + + + + + ti.d1.n2.d2.n1.1.1.3 + + + + + ti.d1.n2.d2.n1.1.1.4 + + + + + ti.d1.n2.d2.n1.1.2.1 + + + + + ti.d1.n2.d2.n1.1.2.2 + + + + + ti.d1.n2.d2.n1.1.2.3 + + + + + ti.d1.n2.d2.n1.1.2.4 + + + + + ti.d1.n2.d2.n1.1.3.1 + + + + + ti.d1.n2.d2.n1.1.3.2 + + + + + ti.d1.n2.d2.n1.1.3.3 + + + + + ti.d1.n2.d2.n1.1.3.4 + + + + + ti.d1.n2.d2.n1.1.4.1 + + + + + ti.d1.n2.d2.n1.1.4.2 + + + + + ti.d1.n2.d2.n1.1.4.3 + + + + + ti.d1.n2.d2.n1.1.4.4 + + + + + ti.d1.n2.d2.n1.2.1.1 + + + + + ti.d1.n2.d2.n1.2.1.2 + + + + + ti.d1.n2.d2.n1.2.1.3 + + + + + ti.d1.n2.d2.n1.2.1.4 + + + + + ti.d1.n2.d2.n1.2.2.1 + + + + + ti.d1.n2.d2.n1.2.2.2 + + + + + ti.d1.n2.d2.n1.2.2.3 + + + + + ti.d1.n2.d2.n1.2.2.4 + + + + + ti.d1.n2.d2.n1.2.3.1 + + + + + ti.d1.n2.d2.n1.2.3.2 + + + + + ti.d1.n2.d2.n1.2.3.3 + + + + + ti.d1.n2.d2.n1.2.3.4 + + + + + ti.d1.n2.d2.n1.2.4.1 + + + + + ti.d1.n2.d2.n1.2.4.2 + + + + + ti.d1.n2.d2.n1.2.4.3 + + + + + ti.d1.n2.d2.n1.2.4.4 + + + + + ti.d1.n2.d2.n1.3.1.1 + + + + + ti.d1.n2.d2.n1.3.1.2 + + + + + ti.d1.n2.d2.n1.3.1.3 + + + + + ti.d1.n2.d2.n1.3.1.4 + + + + + ti.d1.n2.d2.n1.3.2.1 + + + + + ti.d1.n2.d2.n1.3.2.2 + + + + + ti.d1.n2.d2.n1.3.2.3 + + + + + ti.d1.n2.d2.n1.3.2.4 + + + + + ti.d1.n2.d2.n1.3.3.1 + + + + + ti.d1.n2.d2.n1.3.3.2 + + + + + ti.d1.n2.d2.n1.3.3.3 + + + + + ti.d1.n2.d2.n1.3.3.4 + + + + + ti.d1.n2.d2.n1.3.4.1 + + + + + ti.d1.n2.d2.n1.3.4.2 + + + + + ti.d1.n2.d2.n1.3.4.3 + + + + + ti.d1.n2.d2.n1.3.4.4 + + + + + ti.d1.n2.d2.n1.4.1.1 + + + + + ti.d1.n2.d2.n1.4.1.2 + + + + + ti.d1.n2.d2.n1.4.1.3 + + + + + ti.d1.n2.d2.n1.4.1.4 + + + + + ti.d1.n2.d2.n1.4.2.1 + + + + + ti.d1.n2.d2.n1.4.2.2 + + + + + ti.d1.n2.d2.n1.4.2.3 + + + + + ti.d1.n2.d2.n1.4.2.4 + + + + + ti.d1.n2.d2.n1.4.3.1 + + + + + ti.d1.n2.d2.n1.4.3.2 + + + + + ti.d1.n2.d2.n1.4.3.3 + + + + + ti.d1.n2.d2.n1.4.3.4 + + + + + ti.d1.n2.d2.n1.4.4.1 + + + + + ti.d1.n2.d2.n1.4.4.2 + + + + + ti.d1.n2.d2.n1.4.4.3 + + + + + ti.d1.n2.d2.n1.4.4.4 + + + + + ti.d1.n2.d2.n2.1.1.1 + + + + + ti.d1.n2.d2.n2.1.1.2 + + + + + ti.d1.n2.d2.n2.1.1.3 + + + + + ti.d1.n2.d2.n2.1.1.4 + + + + + ti.d1.n2.d2.n2.1.2.1 + + + + + ti.d1.n2.d2.n2.1.2.2 + + + + + ti.d1.n2.d2.n2.1.2.3 + + + + + ti.d1.n2.d2.n2.1.2.4 + + + + + ti.d1.n2.d2.n2.1.3.1 + + + + + ti.d1.n2.d2.n2.1.3.2 + + + + + ti.d1.n2.d2.n2.1.3.3 + + + + + ti.d1.n2.d2.n2.1.3.4 + + + + + ti.d1.n2.d2.n2.1.4.1 + + + + + ti.d1.n2.d2.n2.1.4.2 + + + + + ti.d1.n2.d2.n2.1.4.3 + + + + + ti.d1.n2.d2.n2.1.4.4 + + + + + ti.d1.n2.d2.n2.2.1.1 + + + + + ti.d1.n2.d2.n2.2.1.2 + + + + + ti.d1.n2.d2.n2.2.1.3 + + + + + ti.d1.n2.d2.n2.2.1.4 + + + + + ti.d1.n2.d2.n2.2.2.1 + + + + + ti.d1.n2.d2.n2.2.2.2 + + + + + ti.d1.n2.d2.n2.2.2.3 + + + + + ti.d1.n2.d2.n2.2.2.4 + + + + + ti.d1.n2.d2.n2.2.3.1 + + + + + ti.d1.n2.d2.n2.2.3.2 + + + + + ti.d1.n2.d2.n2.2.3.3 + + + + + ti.d1.n2.d2.n2.2.3.4 + + + + + ti.d1.n2.d2.n2.2.4.1 + + + + + ti.d1.n2.d2.n2.2.4.2 + + + + + ti.d1.n2.d2.n2.2.4.3 + + + + + ti.d1.n2.d2.n2.2.4.4 + + + + + ti.d1.n2.d2.n2.3.1.1 + + + + + ti.d1.n2.d2.n2.3.1.2 + + + + + ti.d1.n2.d2.n2.3.1.3 + + + + + ti.d1.n2.d2.n2.3.1.4 + + + + + ti.d1.n2.d2.n2.3.2.1 + + + + + ti.d1.n2.d2.n2.3.2.2 + + + + + ti.d1.n2.d2.n2.3.2.3 + + + + + ti.d1.n2.d2.n2.3.2.4 + + + + + ti.d1.n2.d2.n2.3.3.1 + + + + + ti.d1.n2.d2.n2.3.3.2 + + + + + ti.d1.n2.d2.n2.3.3.3 + + + + + ti.d1.n2.d2.n2.3.3.4 + + + + + ti.d1.n2.d2.n2.3.4.1 + + + + + ti.d1.n2.d2.n2.3.4.2 + + + + + ti.d1.n2.d2.n2.3.4.3 + + + + + ti.d1.n2.d2.n2.3.4.4 + + + + + ti.d1.n2.d2.n2.4.1.1 + + + + + ti.d1.n2.d2.n2.4.1.2 + + + + + ti.d1.n2.d2.n2.4.1.3 + + + + + ti.d1.n2.d2.n2.4.1.4 + + + + + ti.d1.n2.d2.n2.4.2.1 + + + + + ti.d1.n2.d2.n2.4.2.2 + + + + + ti.d1.n2.d2.n2.4.2.3 + + + + + ti.d1.n2.d2.n2.4.2.4 + + + + + ti.d1.n2.d2.n2.4.3.1 + + + + + ti.d1.n2.d2.n2.4.3.2 + + + + + ti.d1.n2.d2.n2.4.3.3 + + + + + ti.d1.n2.d2.n2.4.3.4 + + + + + ti.d1.n2.d2.n2.4.4.1 + + + + + ti.d1.n2.d2.n2.4.4.2 + + + + + ti.d1.n2.d2.n2.4.4.3 + + + + + ti.d1.n2.d2.n2.4.4.4 + + + + + ti.d1.n2.d3.n1.1.1.1 + + + + + ti.d1.n2.d3.n1.1.1.2 + + + + + ti.d1.n2.d3.n1.1.1.3 + + + + + ti.d1.n2.d3.n1.1.1.4 + + + + + ti.d1.n2.d3.n1.1.2.1 + + + + + ti.d1.n2.d3.n1.1.2.2 + + + + + ti.d1.n2.d3.n1.1.2.3 + + + + + ti.d1.n2.d3.n1.1.2.4 + + + + + ti.d1.n2.d3.n1.1.3.1 + + + + + ti.d1.n2.d3.n1.1.3.2 + + + + + ti.d1.n2.d3.n1.1.3.3 + + + + + ti.d1.n2.d3.n1.1.3.4 + + + + + ti.d1.n2.d3.n1.1.4.1 + + + + + ti.d1.n2.d3.n1.1.4.2 + + + + + ti.d1.n2.d3.n1.1.4.3 + + + + + ti.d1.n2.d3.n1.1.4.4 + + + + + ti.d1.n2.d3.n1.2.1.1 + + + + + ti.d1.n2.d3.n1.2.1.2 + + + + + ti.d1.n2.d3.n1.2.1.3 + + + + + ti.d1.n2.d3.n1.2.1.4 + + + + + ti.d1.n2.d3.n1.2.2.1 + + + + + ti.d1.n2.d3.n1.2.2.2 + + + + + ti.d1.n2.d3.n1.2.2.3 + + + + + ti.d1.n2.d3.n1.2.2.4 + + + + + ti.d1.n2.d3.n1.2.3.1 + + + + + ti.d1.n2.d3.n1.2.3.2 + + + + + ti.d1.n2.d3.n1.2.3.3 + + + + + ti.d1.n2.d3.n1.2.3.4 + + + + + ti.d1.n2.d3.n1.2.4.1 + + + + + ti.d1.n2.d3.n1.2.4.2 + + + + + ti.d1.n2.d3.n1.2.4.3 + + + + + ti.d1.n2.d3.n1.2.4.4 + + + + + ti.d1.n2.d3.n1.3.1.1 + + + + + ti.d1.n2.d3.n1.3.1.2 + + + + + ti.d1.n2.d3.n1.3.1.3 + + + + + ti.d1.n2.d3.n1.3.1.4 + + + + + ti.d1.n2.d3.n1.3.2.1 + + + + + ti.d1.n2.d3.n1.3.2.2 + + + + + ti.d1.n2.d3.n1.3.2.3 + + + + + ti.d1.n2.d3.n1.3.2.4 + + + + + ti.d1.n2.d3.n1.3.3.1 + + + + + ti.d1.n2.d3.n1.3.3.2 + + + + + ti.d1.n2.d3.n1.3.3.3 + + + + + ti.d1.n2.d3.n1.3.3.4 + + + + + ti.d1.n2.d3.n1.3.4.1 + + + + + ti.d1.n2.d3.n1.3.4.2 + + + + + ti.d1.n2.d3.n1.3.4.3 + + + + + ti.d1.n2.d3.n1.3.4.4 + + + + + ti.d1.n2.d3.n1.4.1.1 + + + + + ti.d1.n2.d3.n1.4.1.2 + + + + + ti.d1.n2.d3.n1.4.1.3 + + + + + ti.d1.n2.d3.n1.4.1.4 + + + + + ti.d1.n2.d3.n1.4.2.1 + + + + + ti.d1.n2.d3.n1.4.2.2 + + + + + ti.d1.n2.d3.n1.4.2.3 + + + + + ti.d1.n2.d3.n1.4.2.4 + + + + + ti.d1.n2.d3.n1.4.3.1 + + + + + ti.d1.n2.d3.n1.4.3.2 + + + + + ti.d1.n2.d3.n1.4.3.3 + + + + + ti.d1.n2.d3.n1.4.3.4 + + + + + ti.d1.n2.d3.n1.4.4.1 + + + + + ti.d1.n2.d3.n1.4.4.2 + + + + + ti.d1.n2.d3.n1.4.4.3 + + + + + ti.d1.n2.d3.n1.4.4.4 + + + + + ti.d1.n2.d3.n2.1.1.1 + + + + + ti.d1.n2.d3.n2.1.1.2 + + + + + ti.d1.n2.d3.n2.1.1.3 + + + + + ti.d1.n2.d3.n2.1.1.4 + + + + + ti.d1.n2.d3.n2.1.2.1 + + + + + ti.d1.n2.d3.n2.1.2.2 + + + + + ti.d1.n2.d3.n2.1.2.3 + + + + + ti.d1.n2.d3.n2.1.2.4 + + + + + ti.d1.n2.d3.n2.1.3.1 + + + + + ti.d1.n2.d3.n2.1.3.2 + + + + + ti.d1.n2.d3.n2.1.3.3 + + + + + ti.d1.n2.d3.n2.1.3.4 + + + + + ti.d1.n2.d3.n2.1.4.1 + + + + + ti.d1.n2.d3.n2.1.4.2 + + + + + ti.d1.n2.d3.n2.1.4.3 + + + + + ti.d1.n2.d3.n2.1.4.4 + + + + + ti.d1.n2.d3.n2.2.1.1 + + + + + ti.d1.n2.d3.n2.2.1.2 + + + + + ti.d1.n2.d3.n2.2.1.3 + + + + + ti.d1.n2.d3.n2.2.1.4 + + + + + ti.d1.n2.d3.n2.2.2.1 + + + + + ti.d1.n2.d3.n2.2.2.2 + + + + + ti.d1.n2.d3.n2.2.2.3 + + + + + ti.d1.n2.d3.n2.2.2.4 + + + + + ti.d1.n2.d3.n2.2.3.1 + + + + + ti.d1.n2.d3.n2.2.3.2 + + + + + ti.d1.n2.d3.n2.2.3.3 + + + + + ti.d1.n2.d3.n2.2.3.4 + + + + + ti.d1.n2.d3.n2.2.4.1 + + + + + ti.d1.n2.d3.n2.2.4.2 + + + + + ti.d1.n2.d3.n2.2.4.3 + + + + + ti.d1.n2.d3.n2.2.4.4 + + + + + ti.d1.n2.d3.n2.3.1.1 + + + + + ti.d1.n2.d3.n2.3.1.2 + + + + + ti.d1.n2.d3.n2.3.1.3 + + + + + ti.d1.n2.d3.n2.3.1.4 + + + + + ti.d1.n2.d3.n2.3.2.1 + + + + + ti.d1.n2.d3.n2.3.2.2 + + + + + ti.d1.n2.d3.n2.3.2.3 + + + + + ti.d1.n2.d3.n2.3.2.4 + + + + + ti.d1.n2.d3.n2.3.3.1 + + + + + ti.d1.n2.d3.n2.3.3.2 + + + + + ti.d1.n2.d3.n2.3.3.3 + + + + + ti.d1.n2.d3.n2.3.3.4 + + + + + ti.d1.n2.d3.n2.3.4.1 + + + + + ti.d1.n2.d3.n2.3.4.2 + + + + + ti.d1.n2.d3.n2.3.4.3 + + + + + ti.d1.n2.d3.n2.3.4.4 + + + + + ti.d1.n2.d3.n2.4.1.1 + + + + + ti.d1.n2.d3.n2.4.1.2 + + + + + ti.d1.n2.d3.n2.4.1.3 + + + + + ti.d1.n2.d3.n2.4.1.4 + + + + + ti.d1.n2.d3.n2.4.2.1 + + + + + ti.d1.n2.d3.n2.4.2.2 + + + + + ti.d1.n2.d3.n2.4.2.3 + + + + + ti.d1.n2.d3.n2.4.2.4 + + + + + ti.d1.n2.d3.n2.4.3.1 + + + + + ti.d1.n2.d3.n2.4.3.2 + + + + + ti.d1.n2.d3.n2.4.3.3 + + + + + ti.d1.n2.d3.n2.4.3.4 + + + + + ti.d1.n2.d3.n2.4.4.1 + + + + + ti.d1.n2.d3.n2.4.4.2 + + + + + ti.d1.n2.d3.n2.4.4.3 + + + + + ti.d1.n2.d3.n2.4.4.4 + + + + + ti.d2.n1.d1.n1.1.1.1 + + + + + ti.d2.n1.d1.n1.1.1.2 + + + + + ti.d2.n1.d1.n1.1.1.3 + + + + + ti.d2.n1.d1.n1.1.1.4 + + + + + ti.d2.n1.d1.n1.1.2.1 + + + + + ti.d2.n1.d1.n1.1.2.2 + + + + + ti.d2.n1.d1.n1.1.2.3 + + + + + ti.d2.n1.d1.n1.1.2.4 + + + + + ti.d2.n1.d1.n1.1.3.1 + + + + + ti.d2.n1.d1.n1.1.3.2 + + + + + ti.d2.n1.d1.n1.1.3.3 + + + + + ti.d2.n1.d1.n1.1.3.4 + + + + + ti.d2.n1.d1.n1.1.4.1 + + + + + ti.d2.n1.d1.n1.1.4.2 + + + + + ti.d2.n1.d1.n1.1.4.3 + + + + + ti.d2.n1.d1.n1.1.4.4 + + + + + ti.d2.n1.d1.n1.2.1.1 + + + + + ti.d2.n1.d1.n1.2.1.2 + + + + + ti.d2.n1.d1.n1.2.1.3 + + + + + ti.d2.n1.d1.n1.2.1.4 + + + + + ti.d2.n1.d1.n1.2.2.1 + + + + + ti.d2.n1.d1.n1.2.2.2 + + + + + ti.d2.n1.d1.n1.2.2.3 + + + + + ti.d2.n1.d1.n1.2.2.4 + + + + + ti.d2.n1.d1.n1.2.3.1 + + + + + ti.d2.n1.d1.n1.2.3.2 + + + + + ti.d2.n1.d1.n1.2.3.3 + + + + + ti.d2.n1.d1.n1.2.3.4 + + + + + ti.d2.n1.d1.n1.2.4.1 + + + + + ti.d2.n1.d1.n1.2.4.2 + + + + + ti.d2.n1.d1.n1.2.4.3 + + + + + ti.d2.n1.d1.n1.2.4.4 + + + + + ti.d2.n1.d1.n1.3.1.1 + + + + + ti.d2.n1.d1.n1.3.1.2 + + + + + ti.d2.n1.d1.n1.3.1.3 + + + + + ti.d2.n1.d1.n1.3.1.4 + + + + + ti.d2.n1.d1.n1.3.2.1 + + + + + ti.d2.n1.d1.n1.3.2.2 + + + + + ti.d2.n1.d1.n1.3.2.3 + + + + + ti.d2.n1.d1.n1.3.2.4 + + + + + ti.d2.n1.d1.n1.3.3.1 + + + + + ti.d2.n1.d1.n1.3.3.2 + + + + + ti.d2.n1.d1.n1.3.3.3 + + + + + ti.d2.n1.d1.n1.3.3.4 + + + + + ti.d2.n1.d1.n1.3.4.1 + + + + + ti.d2.n1.d1.n1.3.4.2 + + + + + ti.d2.n1.d1.n1.3.4.3 + + + + + ti.d2.n1.d1.n1.3.4.4 + + + + + ti.d2.n1.d1.n1.4.1.1 + + + + + ti.d2.n1.d1.n1.4.1.2 + + + + + ti.d2.n1.d1.n1.4.1.3 + + + + + ti.d2.n1.d1.n1.4.1.4 + + + + + ti.d2.n1.d1.n1.4.2.1 + + + + + ti.d2.n1.d1.n1.4.2.2 + + + + + ti.d2.n1.d1.n1.4.2.3 + + + + + ti.d2.n1.d1.n1.4.2.4 + + + + + ti.d2.n1.d1.n1.4.3.1 + + + + + ti.d2.n1.d1.n1.4.3.2 + + + + + ti.d2.n1.d1.n1.4.3.3 + + + + + ti.d2.n1.d1.n1.4.3.4 + + + + + ti.d2.n1.d1.n1.4.4.1 + + + + + ti.d2.n1.d1.n1.4.4.2 + + + + + ti.d2.n1.d1.n1.4.4.3 + + + + + ti.d2.n1.d1.n1.4.4.4 + + + + + ti.d2.n1.d1.n2.1.1.1 + + + + + ti.d2.n1.d1.n2.1.1.2 + + + + + ti.d2.n1.d1.n2.1.1.3 + + + + + ti.d2.n1.d1.n2.1.1.4 + + + + + ti.d2.n1.d1.n2.1.2.1 + + + + + ti.d2.n1.d1.n2.1.2.2 + + + + + ti.d2.n1.d1.n2.1.2.3 + + + + + ti.d2.n1.d1.n2.1.2.4 + + + + + ti.d2.n1.d1.n2.1.3.1 + + + + + ti.d2.n1.d1.n2.1.3.2 + + + + + ti.d2.n1.d1.n2.1.3.3 + + + + + ti.d2.n1.d1.n2.1.3.4 + + + + + ti.d2.n1.d1.n2.1.4.1 + + + + + ti.d2.n1.d1.n2.1.4.2 + + + + + ti.d2.n1.d1.n2.1.4.3 + + + + + ti.d2.n1.d1.n2.1.4.4 + + + + + ti.d2.n1.d1.n2.2.1.1 + + + + + ti.d2.n1.d1.n2.2.1.2 + + + + + ti.d2.n1.d1.n2.2.1.3 + + + + + ti.d2.n1.d1.n2.2.1.4 + + + + + ti.d2.n1.d1.n2.2.2.1 + + + + + ti.d2.n1.d1.n2.2.2.2 + + + + + ti.d2.n1.d1.n2.2.2.3 + + + + + ti.d2.n1.d1.n2.2.2.4 + + + + + ti.d2.n1.d1.n2.2.3.1 + + + + + ti.d2.n1.d1.n2.2.3.2 + + + + + ti.d2.n1.d1.n2.2.3.3 + + + + + ti.d2.n1.d1.n2.2.3.4 + + + + + ti.d2.n1.d1.n2.2.4.1 + + + + + ti.d2.n1.d1.n2.2.4.2 + + + + + ti.d2.n1.d1.n2.2.4.3 + + + + + ti.d2.n1.d1.n2.2.4.4 + + + + + ti.d2.n1.d1.n2.3.1.1 + + + + + ti.d2.n1.d1.n2.3.1.2 + + + + + ti.d2.n1.d1.n2.3.1.3 + + + + + ti.d2.n1.d1.n2.3.1.4 + + + + + ti.d2.n1.d1.n2.3.2.1 + + + + + ti.d2.n1.d1.n2.3.2.2 + + + + + ti.d2.n1.d1.n2.3.2.3 + + + + + ti.d2.n1.d1.n2.3.2.4 + + + + + ti.d2.n1.d1.n2.3.3.1 + + + + + ti.d2.n1.d1.n2.3.3.2 + + + + + ti.d2.n1.d1.n2.3.3.3 + + + + + ti.d2.n1.d1.n2.3.3.4 + + + + + ti.d2.n1.d1.n2.3.4.1 + + + + + ti.d2.n1.d1.n2.3.4.2 + + + + + ti.d2.n1.d1.n2.3.4.3 + + + + + ti.d2.n1.d1.n2.3.4.4 + + + + + ti.d2.n1.d1.n2.4.1.1 + + + + + ti.d2.n1.d1.n2.4.1.2 + + + + + ti.d2.n1.d1.n2.4.1.3 + + + + + ti.d2.n1.d1.n2.4.1.4 + + + + + ti.d2.n1.d1.n2.4.2.1 + + + + + ti.d2.n1.d1.n2.4.2.2 + + + + + ti.d2.n1.d1.n2.4.2.3 + + + + + ti.d2.n1.d1.n2.4.2.4 + + + + + ti.d2.n1.d1.n2.4.3.1 + + + + + ti.d2.n1.d1.n2.4.3.2 + + + + + ti.d2.n1.d1.n2.4.3.3 + + + + + ti.d2.n1.d1.n2.4.3.4 + + + + + ti.d2.n1.d1.n2.4.4.1 + + + + + ti.d2.n1.d1.n2.4.4.2 + + + + + ti.d2.n1.d1.n2.4.4.3 + + + + + ti.d2.n1.d1.n2.4.4.4 + + + + + ti.d2.n1.d2.n2.1.1.1 + + + + + ti.d2.n1.d2.n2.1.1.2 + + + + + ti.d2.n1.d2.n2.1.1.3 + + + + + ti.d2.n1.d2.n2.1.1.4 + + + + + ti.d2.n1.d2.n2.1.2.1 + + + + + ti.d2.n1.d2.n2.1.2.2 + + + + + ti.d2.n1.d2.n2.1.2.3 + + + + + ti.d2.n1.d2.n2.1.2.4 + + + + + ti.d2.n1.d2.n2.1.3.1 + + + + + ti.d2.n1.d2.n2.1.3.2 + + + + + ti.d2.n1.d2.n2.1.3.3 + + + + + ti.d2.n1.d2.n2.1.3.4 + + + + + ti.d2.n1.d2.n2.1.4.1 + + + + + ti.d2.n1.d2.n2.1.4.2 + + + + + ti.d2.n1.d2.n2.1.4.3 + + + + + ti.d2.n1.d2.n2.1.4.4 + + + + + ti.d2.n1.d2.n2.2.1.1 + + + + + ti.d2.n1.d2.n2.2.1.2 + + + + + ti.d2.n1.d2.n2.2.1.3 + + + + + ti.d2.n1.d2.n2.2.1.4 + + + + + ti.d2.n1.d2.n2.2.2.1 + + + + + ti.d2.n1.d2.n2.2.2.2 + + + + + ti.d2.n1.d2.n2.2.2.3 + + + + + ti.d2.n1.d2.n2.2.2.4 + + + + + ti.d2.n1.d2.n2.2.3.1 + + + + + ti.d2.n1.d2.n2.2.3.2 + + + + + ti.d2.n1.d2.n2.2.3.3 + + + + + ti.d2.n1.d2.n2.2.3.4 + + + + + ti.d2.n1.d2.n2.2.4.1 + + + + + ti.d2.n1.d2.n2.2.4.2 + + + + + ti.d2.n1.d2.n2.2.4.3 + + + + + ti.d2.n1.d2.n2.2.4.4 + + + + + ti.d2.n1.d2.n2.3.1.1 + + + + + ti.d2.n1.d2.n2.3.1.2 + + + + + ti.d2.n1.d2.n2.3.1.3 + + + + + ti.d2.n1.d2.n2.3.1.4 + + + + + ti.d2.n1.d2.n2.3.2.1 + + + + + ti.d2.n1.d2.n2.3.2.2 + + + + + ti.d2.n1.d2.n2.3.2.3 + + + + + ti.d2.n1.d2.n2.3.2.4 + + + + + ti.d2.n1.d2.n2.3.3.1 + + + + + ti.d2.n1.d2.n2.3.3.2 + + + + + ti.d2.n1.d2.n2.3.3.3 + + + + + ti.d2.n1.d2.n2.3.3.4 + + + + + ti.d2.n1.d2.n2.3.4.1 + + + + + ti.d2.n1.d2.n2.3.4.2 + + + + + ti.d2.n1.d2.n2.3.4.3 + + + + + ti.d2.n1.d2.n2.3.4.4 + + + + + ti.d2.n1.d2.n2.4.1.1 + + + + + ti.d2.n1.d2.n2.4.1.2 + + + + + ti.d2.n1.d2.n2.4.1.3 + + + + + ti.d2.n1.d2.n2.4.1.4 + + + + + ti.d2.n1.d2.n2.4.2.1 + + + + + ti.d2.n1.d2.n2.4.2.2 + + + + + ti.d2.n1.d2.n2.4.2.3 + + + + + ti.d2.n1.d2.n2.4.2.4 + + + + + ti.d2.n1.d2.n2.4.3.1 + + + + + ti.d2.n1.d2.n2.4.3.2 + + + + + ti.d2.n1.d2.n2.4.3.3 + + + + + ti.d2.n1.d2.n2.4.3.4 + + + + + ti.d2.n1.d2.n2.4.4.1 + + + + + ti.d2.n1.d2.n2.4.4.2 + + + + + ti.d2.n1.d2.n2.4.4.3 + + + + + ti.d2.n1.d2.n2.4.4.4 + + + + + ti.d2.n1.d3.n1.1.1.1 + + + + + ti.d2.n1.d3.n1.1.1.2 + + + + + ti.d2.n1.d3.n1.1.1.3 + + + + + ti.d2.n1.d3.n1.1.1.4 + + + + + ti.d2.n1.d3.n1.1.2.1 + + + + + ti.d2.n1.d3.n1.1.2.2 + + + + + ti.d2.n1.d3.n1.1.2.3 + + + + + ti.d2.n1.d3.n1.1.2.4 + + + + + ti.d2.n1.d3.n1.1.3.1 + + + + + ti.d2.n1.d3.n1.1.3.2 + + + + + ti.d2.n1.d3.n1.1.3.3 + + + + + ti.d2.n1.d3.n1.1.3.4 + + + + + ti.d2.n1.d3.n1.1.4.1 + + + + + ti.d2.n1.d3.n1.1.4.2 + + + + + ti.d2.n1.d3.n1.1.4.3 + + + + + ti.d2.n1.d3.n1.1.4.4 + + + + + ti.d2.n1.d3.n1.2.1.1 + + + + + ti.d2.n1.d3.n1.2.1.2 + + + + + ti.d2.n1.d3.n1.2.1.3 + + + + + ti.d2.n1.d3.n1.2.1.4 + + + + + ti.d2.n1.d3.n1.2.2.1 + + + + + ti.d2.n1.d3.n1.2.2.2 + + + + + ti.d2.n1.d3.n1.2.2.3 + + + + + ti.d2.n1.d3.n1.2.2.4 + + + + + ti.d2.n1.d3.n1.2.3.1 + + + + + ti.d2.n1.d3.n1.2.3.2 + + + + + ti.d2.n1.d3.n1.2.3.3 + + + + + ti.d2.n1.d3.n1.2.3.4 + + + + + ti.d2.n1.d3.n1.2.4.1 + + + + + ti.d2.n1.d3.n1.2.4.2 + + + + + ti.d2.n1.d3.n1.2.4.3 + + + + + ti.d2.n1.d3.n1.2.4.4 + + + + + ti.d2.n1.d3.n1.3.1.1 + + + + + ti.d2.n1.d3.n1.3.1.2 + + + + + ti.d2.n1.d3.n1.3.1.3 + + + + + ti.d2.n1.d3.n1.3.1.4 + + + + + ti.d2.n1.d3.n1.3.2.1 + + + + + ti.d2.n1.d3.n1.3.2.2 + + + + + ti.d2.n1.d3.n1.3.2.3 + + + + + ti.d2.n1.d3.n1.3.2.4 + + + + + ti.d2.n1.d3.n1.3.3.1 + + + + + ti.d2.n1.d3.n1.3.3.2 + + + + + ti.d2.n1.d3.n1.3.3.3 + + + + + ti.d2.n1.d3.n1.3.3.4 + + + + + ti.d2.n1.d3.n1.3.4.1 + + + + + ti.d2.n1.d3.n1.3.4.2 + + + + + ti.d2.n1.d3.n1.3.4.3 + + + + + ti.d2.n1.d3.n1.3.4.4 + + + + + ti.d2.n1.d3.n1.4.1.1 + + + + + ti.d2.n1.d3.n1.4.1.2 + + + + + ti.d2.n1.d3.n1.4.1.3 + + + + + ti.d2.n1.d3.n1.4.1.4 + + + + + ti.d2.n1.d3.n1.4.2.1 + + + + + ti.d2.n1.d3.n1.4.2.2 + + + + + ti.d2.n1.d3.n1.4.2.3 + + + + + ti.d2.n1.d3.n1.4.2.4 + + + + + ti.d2.n1.d3.n1.4.3.1 + + + + + ti.d2.n1.d3.n1.4.3.2 + + + + + ti.d2.n1.d3.n1.4.3.3 + + + + + ti.d2.n1.d3.n1.4.3.4 + + + + + ti.d2.n1.d3.n1.4.4.1 + + + + + ti.d2.n1.d3.n1.4.4.2 + + + + + ti.d2.n1.d3.n1.4.4.3 + + + + + ti.d2.n1.d3.n1.4.4.4 + + + + + ti.d2.n1.d3.n2.1.1.1 + + + + + ti.d2.n1.d3.n2.1.1.2 + + + + + ti.d2.n1.d3.n2.1.1.3 + + + + + ti.d2.n1.d3.n2.1.1.4 + + + + + ti.d2.n1.d3.n2.1.2.1 + + + + + ti.d2.n1.d3.n2.1.2.2 + + + + + ti.d2.n1.d3.n2.1.2.3 + + + + + ti.d2.n1.d3.n2.1.2.4 + + + + + ti.d2.n1.d3.n2.1.3.1 + + + + + ti.d2.n1.d3.n2.1.3.2 + + + + + ti.d2.n1.d3.n2.1.3.3 + + + + + ti.d2.n1.d3.n2.1.3.4 + + + + + ti.d2.n1.d3.n2.1.4.1 + + + + + ti.d2.n1.d3.n2.1.4.2 + + + + + ti.d2.n1.d3.n2.1.4.3 + + + + + ti.d2.n1.d3.n2.1.4.4 + + + + + ti.d2.n1.d3.n2.2.1.1 + + + + + ti.d2.n1.d3.n2.2.1.2 + + + + + ti.d2.n1.d3.n2.2.1.3 + + + + + ti.d2.n1.d3.n2.2.1.4 + + + + + ti.d2.n1.d3.n2.2.2.1 + + + + + ti.d2.n1.d3.n2.2.2.2 + + + + + ti.d2.n1.d3.n2.2.2.3 + + + + + ti.d2.n1.d3.n2.2.2.4 + + + + + ti.d2.n1.d3.n2.2.3.1 + + + + + ti.d2.n1.d3.n2.2.3.2 + + + + + ti.d2.n1.d3.n2.2.3.3 + + + + + ti.d2.n1.d3.n2.2.3.4 + + + + + ti.d2.n1.d3.n2.2.4.1 + + + + + ti.d2.n1.d3.n2.2.4.2 + + + + + ti.d2.n1.d3.n2.2.4.3 + + + + + ti.d2.n1.d3.n2.2.4.4 + + + + + ti.d2.n1.d3.n2.3.1.1 + + + + + ti.d2.n1.d3.n2.3.1.2 + + + + + ti.d2.n1.d3.n2.3.1.3 + + + + + ti.d2.n1.d3.n2.3.1.4 + + + + + ti.d2.n1.d3.n2.3.2.1 + + + + + ti.d2.n1.d3.n2.3.2.2 + + + + + ti.d2.n1.d3.n2.3.2.3 + + + + + ti.d2.n1.d3.n2.3.2.4 + + + + + ti.d2.n1.d3.n2.3.3.1 + + + + + ti.d2.n1.d3.n2.3.3.2 + + + + + ti.d2.n1.d3.n2.3.3.3 + + + + + ti.d2.n1.d3.n2.3.3.4 + + + + + ti.d2.n1.d3.n2.3.4.1 + + + + + ti.d2.n1.d3.n2.3.4.2 + + + + + ti.d2.n1.d3.n2.3.4.3 + + + + + ti.d2.n1.d3.n2.3.4.4 + + + + + ti.d2.n1.d3.n2.4.1.1 + + + + + ti.d2.n1.d3.n2.4.1.2 + + + + + ti.d2.n1.d3.n2.4.1.3 + + + + + ti.d2.n1.d3.n2.4.1.4 + + + + + ti.d2.n1.d3.n2.4.2.1 + + + + + ti.d2.n1.d3.n2.4.2.2 + + + + + ti.d2.n1.d3.n2.4.2.3 + + + + + ti.d2.n1.d3.n2.4.2.4 + + + + + ti.d2.n1.d3.n2.4.3.1 + + + + + ti.d2.n1.d3.n2.4.3.2 + + + + + ti.d2.n1.d3.n2.4.3.3 + + + + + ti.d2.n1.d3.n2.4.3.4 + + + + + ti.d2.n1.d3.n2.4.4.1 + + + + + ti.d2.n1.d3.n2.4.4.2 + + + + + ti.d2.n1.d3.n2.4.4.3 + + + + + ti.d2.n1.d3.n2.4.4.4 + + + + + ti.d2.n2.d1.n1.1.1.1 + + + + + ti.d2.n2.d1.n1.1.1.2 + + + + + ti.d2.n2.d1.n1.1.1.3 + + + + + ti.d2.n2.d1.n1.1.1.4 + + + + + ti.d2.n2.d1.n1.1.2.1 + + + + + ti.d2.n2.d1.n1.1.2.2 + + + + + ti.d2.n2.d1.n1.1.2.3 + + + + + ti.d2.n2.d1.n1.1.2.4 + + + + + ti.d2.n2.d1.n1.1.3.1 + + + + + ti.d2.n2.d1.n1.1.3.2 + + + + + ti.d2.n2.d1.n1.1.3.3 + + + + + ti.d2.n2.d1.n1.1.3.4 + + + + + ti.d2.n2.d1.n1.1.4.1 + + + + + ti.d2.n2.d1.n1.1.4.2 + + + + + ti.d2.n2.d1.n1.1.4.3 + + + + + ti.d2.n2.d1.n1.1.4.4 + + + + + ti.d2.n2.d1.n1.2.1.1 + + + + + ti.d2.n2.d1.n1.2.1.2 + + + + + ti.d2.n2.d1.n1.2.1.3 + + + + + ti.d2.n2.d1.n1.2.1.4 + + + + + ti.d2.n2.d1.n1.2.2.1 + + + + + ti.d2.n2.d1.n1.2.2.2 + + + + + ti.d2.n2.d1.n1.2.2.3 + + + + + ti.d2.n2.d1.n1.2.2.4 + + + + + ti.d2.n2.d1.n1.2.3.1 + + + + + ti.d2.n2.d1.n1.2.3.2 + + + + + ti.d2.n2.d1.n1.2.3.3 + + + + + ti.d2.n2.d1.n1.2.3.4 + + + + + ti.d2.n2.d1.n1.2.4.1 + + + + + ti.d2.n2.d1.n1.2.4.2 + + + + + ti.d2.n2.d1.n1.2.4.3 + + + + + ti.d2.n2.d1.n1.2.4.4 + + + + + ti.d2.n2.d1.n1.3.1.1 + + + + + ti.d2.n2.d1.n1.3.1.2 + + + + + ti.d2.n2.d1.n1.3.1.3 + + + + + ti.d2.n2.d1.n1.3.1.4 + + + + + ti.d2.n2.d1.n1.3.2.1 + + + + + ti.d2.n2.d1.n1.3.2.2 + + + + + ti.d2.n2.d1.n1.3.2.3 + + + + + ti.d2.n2.d1.n1.3.2.4 + + + + + ti.d2.n2.d1.n1.3.3.1 + + + + + ti.d2.n2.d1.n1.3.3.2 + + + + + ti.d2.n2.d1.n1.3.3.3 + + + + + ti.d2.n2.d1.n1.3.3.4 + + + + + ti.d2.n2.d1.n1.3.4.1 + + + + + ti.d2.n2.d1.n1.3.4.2 + + + + + ti.d2.n2.d1.n1.3.4.3 + + + + + ti.d2.n2.d1.n1.3.4.4 + + + + + ti.d2.n2.d1.n1.4.1.1 + + + + + ti.d2.n2.d1.n1.4.1.2 + + + + + ti.d2.n2.d1.n1.4.1.3 + + + + + ti.d2.n2.d1.n1.4.1.4 + + + + + ti.d2.n2.d1.n1.4.2.1 + + + + + ti.d2.n2.d1.n1.4.2.2 + + + + + ti.d2.n2.d1.n1.4.2.3 + + + + + ti.d2.n2.d1.n1.4.2.4 + + + + + ti.d2.n2.d1.n1.4.3.1 + + + + + ti.d2.n2.d1.n1.4.3.2 + + + + + ti.d2.n2.d1.n1.4.3.3 + + + + + ti.d2.n2.d1.n1.4.3.4 + + + + + ti.d2.n2.d1.n1.4.4.1 + + + + + ti.d2.n2.d1.n1.4.4.2 + + + + + ti.d2.n2.d1.n1.4.4.3 + + + + + ti.d2.n2.d1.n1.4.4.4 + + + + + ti.d2.n2.d1.n2.1.1.1 + + + + + ti.d2.n2.d1.n2.1.1.2 + + + + + ti.d2.n2.d1.n2.1.1.3 + + + + + ti.d2.n2.d1.n2.1.1.4 + + + + + ti.d2.n2.d1.n2.1.2.1 + + + + + ti.d2.n2.d1.n2.1.2.2 + + + + + ti.d2.n2.d1.n2.1.2.3 + + + + + ti.d2.n2.d1.n2.1.2.4 + + + + + ti.d2.n2.d1.n2.1.3.1 + + + + + ti.d2.n2.d1.n2.1.3.2 + + + + + ti.d2.n2.d1.n2.1.3.3 + + + + + ti.d2.n2.d1.n2.1.3.4 + + + + + ti.d2.n2.d1.n2.1.4.1 + + + + + ti.d2.n2.d1.n2.1.4.2 + + + + + ti.d2.n2.d1.n2.1.4.3 + + + + + ti.d2.n2.d1.n2.1.4.4 + + + + + ti.d2.n2.d1.n2.2.1.1 + + + + + ti.d2.n2.d1.n2.2.1.2 + + + + + ti.d2.n2.d1.n2.2.1.3 + + + + + ti.d2.n2.d1.n2.2.1.4 + + + + + ti.d2.n2.d1.n2.2.2.1 + + + + + ti.d2.n2.d1.n2.2.2.2 + + + + + ti.d2.n2.d1.n2.2.2.3 + + + + + ti.d2.n2.d1.n2.2.2.4 + + + + + ti.d2.n2.d1.n2.2.3.1 + + + + + ti.d2.n2.d1.n2.2.3.2 + + + + + ti.d2.n2.d1.n2.2.3.3 + + + + + ti.d2.n2.d1.n2.2.3.4 + + + + + ti.d2.n2.d1.n2.2.4.1 + + + + + ti.d2.n2.d1.n2.2.4.2 + + + + + ti.d2.n2.d1.n2.2.4.3 + + + + + ti.d2.n2.d1.n2.2.4.4 + + + + + ti.d2.n2.d1.n2.3.1.1 + + + + + ti.d2.n2.d1.n2.3.1.2 + + + + + ti.d2.n2.d1.n2.3.1.3 + + + + + ti.d2.n2.d1.n2.3.1.4 + + + + + ti.d2.n2.d1.n2.3.2.1 + + + + + ti.d2.n2.d1.n2.3.2.2 + + + + + ti.d2.n2.d1.n2.3.2.3 + + + + + ti.d2.n2.d1.n2.3.2.4 + + + + + ti.d2.n2.d1.n2.3.3.1 + + + + + ti.d2.n2.d1.n2.3.3.2 + + + + + ti.d2.n2.d1.n2.3.3.3 + + + + + ti.d2.n2.d1.n2.3.3.4 + + + + + ti.d2.n2.d1.n2.3.4.1 + + + + + ti.d2.n2.d1.n2.3.4.2 + + + + + ti.d2.n2.d1.n2.3.4.3 + + + + + ti.d2.n2.d1.n2.3.4.4 + + + + + ti.d2.n2.d1.n2.4.1.1 + + + + + ti.d2.n2.d1.n2.4.1.2 + + + + + ti.d2.n2.d1.n2.4.1.3 + + + + + ti.d2.n2.d1.n2.4.1.4 + + + + + ti.d2.n2.d1.n2.4.2.1 + + + + + ti.d2.n2.d1.n2.4.2.2 + + + + + ti.d2.n2.d1.n2.4.2.3 + + + + + ti.d2.n2.d1.n2.4.2.4 + + + + + ti.d2.n2.d1.n2.4.3.1 + + + + + ti.d2.n2.d1.n2.4.3.2 + + + + + ti.d2.n2.d1.n2.4.3.3 + + + + + ti.d2.n2.d1.n2.4.3.4 + + + + + ti.d2.n2.d1.n2.4.4.1 + + + + + ti.d2.n2.d1.n2.4.4.2 + + + + + ti.d2.n2.d1.n2.4.4.3 + + + + + ti.d2.n2.d1.n2.4.4.4 + + + + + ti.d2.n2.d2.n1.1.1.1 + + + + + ti.d2.n2.d2.n1.1.1.2 + + + + + ti.d2.n2.d2.n1.1.1.3 + + + + + ti.d2.n2.d2.n1.1.1.4 + + + + + ti.d2.n2.d2.n1.1.2.1 + + + + + ti.d2.n2.d2.n1.1.2.2 + + + + + ti.d2.n2.d2.n1.1.2.3 + + + + + ti.d2.n2.d2.n1.1.2.4 + + + + + ti.d2.n2.d2.n1.1.3.1 + + + + + ti.d2.n2.d2.n1.1.3.2 + + + + + ti.d2.n2.d2.n1.1.3.3 + + + + + ti.d2.n2.d2.n1.1.3.4 + + + + + ti.d2.n2.d2.n1.1.4.1 + + + + + ti.d2.n2.d2.n1.1.4.2 + + + + + ti.d2.n2.d2.n1.1.4.3 + + + + + ti.d2.n2.d2.n1.1.4.4 + + + + + ti.d2.n2.d2.n1.2.1.1 + + + + + ti.d2.n2.d2.n1.2.1.2 + + + + + ti.d2.n2.d2.n1.2.1.3 + + + + + ti.d2.n2.d2.n1.2.1.4 + + + + + ti.d2.n2.d2.n1.2.2.1 + + + + + ti.d2.n2.d2.n1.2.2.2 + + + + + ti.d2.n2.d2.n1.2.2.3 + + + + + ti.d2.n2.d2.n1.2.2.4 + + + + + ti.d2.n2.d2.n1.2.3.1 + + + + + ti.d2.n2.d2.n1.2.3.2 + + + + + ti.d2.n2.d2.n1.2.3.3 + + + + + ti.d2.n2.d2.n1.2.3.4 + + + + + ti.d2.n2.d2.n1.2.4.1 + + + + + ti.d2.n2.d2.n1.2.4.2 + + + + + ti.d2.n2.d2.n1.2.4.3 + + + + + ti.d2.n2.d2.n1.2.4.4 + + + + + ti.d2.n2.d2.n1.3.1.1 + + + + + ti.d2.n2.d2.n1.3.1.2 + + + + + ti.d2.n2.d2.n1.3.1.3 + + + + + ti.d2.n2.d2.n1.3.1.4 + + + + + ti.d2.n2.d2.n1.3.2.1 + + + + + ti.d2.n2.d2.n1.3.2.2 + + + + + ti.d2.n2.d2.n1.3.2.3 + + + + + ti.d2.n2.d2.n1.3.2.4 + + + + + ti.d2.n2.d2.n1.3.3.1 + + + + + ti.d2.n2.d2.n1.3.3.2 + + + + + ti.d2.n2.d2.n1.3.3.3 + + + + + ti.d2.n2.d2.n1.3.3.4 + + + + + ti.d2.n2.d2.n1.3.4.1 + + + + + ti.d2.n2.d2.n1.3.4.2 + + + + + ti.d2.n2.d2.n1.3.4.3 + + + + + ti.d2.n2.d2.n1.3.4.4 + + + + + ti.d2.n2.d2.n1.4.1.1 + + + + + ti.d2.n2.d2.n1.4.1.2 + + + + + ti.d2.n2.d2.n1.4.1.3 + + + + + ti.d2.n2.d2.n1.4.1.4 + + + + + ti.d2.n2.d2.n1.4.2.1 + + + + + ti.d2.n2.d2.n1.4.2.2 + + + + + ti.d2.n2.d2.n1.4.2.3 + + + + + ti.d2.n2.d2.n1.4.2.4 + + + + + ti.d2.n2.d2.n1.4.3.1 + + + + + ti.d2.n2.d2.n1.4.3.2 + + + + + ti.d2.n2.d2.n1.4.3.3 + + + + + ti.d2.n2.d2.n1.4.3.4 + + + + + ti.d2.n2.d2.n1.4.4.1 + + + + + ti.d2.n2.d2.n1.4.4.2 + + + + + ti.d2.n2.d2.n1.4.4.3 + + + + + ti.d2.n2.d2.n1.4.4.4 + + + + + ti.d2.n2.d3.n1.1.1.1 + + + + + ti.d2.n2.d3.n1.1.1.2 + + + + + ti.d2.n2.d3.n1.1.1.3 + + + + + ti.d2.n2.d3.n1.1.1.4 + + + + + ti.d2.n2.d3.n1.1.2.1 + + + + + ti.d2.n2.d3.n1.1.2.2 + + + + + ti.d2.n2.d3.n1.1.2.3 + + + + + ti.d2.n2.d3.n1.1.2.4 + + + + + ti.d2.n2.d3.n1.1.3.1 + + + + + ti.d2.n2.d3.n1.1.3.2 + + + + + ti.d2.n2.d3.n1.1.3.3 + + + + + ti.d2.n2.d3.n1.1.3.4 + + + + + ti.d2.n2.d3.n1.1.4.1 + + + + + ti.d2.n2.d3.n1.1.4.2 + + + + + ti.d2.n2.d3.n1.1.4.3 + + + + + ti.d2.n2.d3.n1.1.4.4 + + + + + ti.d2.n2.d3.n1.2.1.1 + + + + + ti.d2.n2.d3.n1.2.1.2 + + + + + ti.d2.n2.d3.n1.2.1.3 + + + + + ti.d2.n2.d3.n1.2.1.4 + + + + + ti.d2.n2.d3.n1.2.2.1 + + + + + ti.d2.n2.d3.n1.2.2.2 + + + + + ti.d2.n2.d3.n1.2.2.3 + + + + + ti.d2.n2.d3.n1.2.2.4 + + + + + ti.d2.n2.d3.n1.2.3.1 + + + + + ti.d2.n2.d3.n1.2.3.2 + + + + + ti.d2.n2.d3.n1.2.3.3 + + + + + ti.d2.n2.d3.n1.2.3.4 + + + + + ti.d2.n2.d3.n1.2.4.1 + + + + + ti.d2.n2.d3.n1.2.4.2 + + + + + ti.d2.n2.d3.n1.2.4.3 + + + + + ti.d2.n2.d3.n1.2.4.4 + + + + + ti.d2.n2.d3.n1.3.1.1 + + + + + ti.d2.n2.d3.n1.3.1.2 + + + + + ti.d2.n2.d3.n1.3.1.3 + + + + + ti.d2.n2.d3.n1.3.1.4 + + + + + ti.d2.n2.d3.n1.3.2.1 + + + + + ti.d2.n2.d3.n1.3.2.2 + + + + + ti.d2.n2.d3.n1.3.2.3 + + + + + ti.d2.n2.d3.n1.3.2.4 + + + + + ti.d2.n2.d3.n1.3.3.1 + + + + + ti.d2.n2.d3.n1.3.3.2 + + + + + ti.d2.n2.d3.n1.3.3.3 + + + + + ti.d2.n2.d3.n1.3.3.4 + + + + + ti.d2.n2.d3.n1.3.4.1 + + + + + ti.d2.n2.d3.n1.3.4.2 + + + + + ti.d2.n2.d3.n1.3.4.3 + + + + + ti.d2.n2.d3.n1.3.4.4 + + + + + ti.d2.n2.d3.n1.4.1.1 + + + + + ti.d2.n2.d3.n1.4.1.2 + + + + + ti.d2.n2.d3.n1.4.1.3 + + + + + ti.d2.n2.d3.n1.4.1.4 + + + + + ti.d2.n2.d3.n1.4.2.1 + + + + + ti.d2.n2.d3.n1.4.2.2 + + + + + ti.d2.n2.d3.n1.4.2.3 + + + + + ti.d2.n2.d3.n1.4.2.4 + + + + + ti.d2.n2.d3.n1.4.3.1 + + + + + ti.d2.n2.d3.n1.4.3.2 + + + + + ti.d2.n2.d3.n1.4.3.3 + + + + + ti.d2.n2.d3.n1.4.3.4 + + + + + ti.d2.n2.d3.n1.4.4.1 + + + + + ti.d2.n2.d3.n1.4.4.2 + + + + + ti.d2.n2.d3.n1.4.4.3 + + + + + ti.d2.n2.d3.n1.4.4.4 + + + + + ti.d2.n2.d3.n2.1.1.1 + + + + + ti.d2.n2.d3.n2.1.1.2 + + + + + ti.d2.n2.d3.n2.1.1.3 + + + + + ti.d2.n2.d3.n2.1.1.4 + + + + + ti.d2.n2.d3.n2.1.2.1 + + + + + ti.d2.n2.d3.n2.1.2.2 + + + + + ti.d2.n2.d3.n2.1.2.3 + + + + + ti.d2.n2.d3.n2.1.2.4 + + + + + ti.d2.n2.d3.n2.1.3.1 + + + + + ti.d2.n2.d3.n2.1.3.2 + + + + + ti.d2.n2.d3.n2.1.3.3 + + + + + ti.d2.n2.d3.n2.1.3.4 + + + + + ti.d2.n2.d3.n2.1.4.1 + + + + + ti.d2.n2.d3.n2.1.4.2 + + + + + ti.d2.n2.d3.n2.1.4.3 + + + + + ti.d2.n2.d3.n2.1.4.4 + + + + + ti.d2.n2.d3.n2.2.1.1 + + + + + ti.d2.n2.d3.n2.2.1.2 + + + + + ti.d2.n2.d3.n2.2.1.3 + + + + + ti.d2.n2.d3.n2.2.1.4 + + + + + ti.d2.n2.d3.n2.2.2.1 + + + + + ti.d2.n2.d3.n2.2.2.2 + + + + + ti.d2.n2.d3.n2.2.2.3 + + + + + ti.d2.n2.d3.n2.2.2.4 + + + + + ti.d2.n2.d3.n2.2.3.1 + + + + + ti.d2.n2.d3.n2.2.3.2 + + + + + ti.d2.n2.d3.n2.2.3.3 + + + + + ti.d2.n2.d3.n2.2.3.4 + + + + + ti.d2.n2.d3.n2.2.4.1 + + + + + ti.d2.n2.d3.n2.2.4.2 + + + + + ti.d2.n2.d3.n2.2.4.3 + + + + + ti.d2.n2.d3.n2.2.4.4 + + + + + ti.d2.n2.d3.n2.3.1.1 + + + + + ti.d2.n2.d3.n2.3.1.2 + + + + + ti.d2.n2.d3.n2.3.1.3 + + + + + ti.d2.n2.d3.n2.3.1.4 + + + + + ti.d2.n2.d3.n2.3.2.1 + + + + + ti.d2.n2.d3.n2.3.2.2 + + + + + ti.d2.n2.d3.n2.3.2.3 + + + + + ti.d2.n2.d3.n2.3.2.4 + + + + + ti.d2.n2.d3.n2.3.3.1 + + + + + ti.d2.n2.d3.n2.3.3.2 + + + + + ti.d2.n2.d3.n2.3.3.3 + + + + + ti.d2.n2.d3.n2.3.3.4 + + + + + ti.d2.n2.d3.n2.3.4.1 + + + + + ti.d2.n2.d3.n2.3.4.2 + + + + + ti.d2.n2.d3.n2.3.4.3 + + + + + ti.d2.n2.d3.n2.3.4.4 + + + + + ti.d2.n2.d3.n2.4.1.1 + + + + + ti.d2.n2.d3.n2.4.1.2 + + + + + ti.d2.n2.d3.n2.4.1.3 + + + + + ti.d2.n2.d3.n2.4.1.4 + + + + + ti.d2.n2.d3.n2.4.2.1 + + + + + ti.d2.n2.d3.n2.4.2.2 + + + + + ti.d2.n2.d3.n2.4.2.3 + + + + + ti.d2.n2.d3.n2.4.2.4 + + + + + ti.d2.n2.d3.n2.4.3.1 + + + + + ti.d2.n2.d3.n2.4.3.2 + + + + + ti.d2.n2.d3.n2.4.3.3 + + + + + ti.d2.n2.d3.n2.4.3.4 + + + + + ti.d2.n2.d3.n2.4.4.1 + + + + + ti.d2.n2.d3.n2.4.4.2 + + + + + ti.d2.n2.d3.n2.4.4.3 + + + + + ti.d2.n2.d3.n2.4.4.4 + + + + + ti.d3.n1.d1.n1.1.1.1 + + + + + ti.d3.n1.d1.n1.1.1.2 + + + + + ti.d3.n1.d1.n1.1.1.3 + + + + + ti.d3.n1.d1.n1.1.1.4 + + + + + ti.d3.n1.d1.n1.1.2.1 + + + + + ti.d3.n1.d1.n1.1.2.2 + + + + + ti.d3.n1.d1.n1.1.2.3 + + + + + ti.d3.n1.d1.n1.1.2.4 + + + + + ti.d3.n1.d1.n1.1.3.1 + + + + + ti.d3.n1.d1.n1.1.3.2 + + + + + ti.d3.n1.d1.n1.1.3.3 + + + + + ti.d3.n1.d1.n1.1.3.4 + + + + + ti.d3.n1.d1.n1.1.4.1 + + + + + ti.d3.n1.d1.n1.1.4.2 + + + + + ti.d3.n1.d1.n1.1.4.3 + + + + + ti.d3.n1.d1.n1.1.4.4 + + + + + ti.d3.n1.d1.n1.2.1.1 + + + + + ti.d3.n1.d1.n1.2.1.2 + + + + + ti.d3.n1.d1.n1.2.1.3 + + + + + ti.d3.n1.d1.n1.2.1.4 + + + + + ti.d3.n1.d1.n1.2.2.1 + + + + + ti.d3.n1.d1.n1.2.2.2 + + + + + ti.d3.n1.d1.n1.2.2.3 + + + + + ti.d3.n1.d1.n1.2.2.4 + + + + + ti.d3.n1.d1.n1.2.3.1 + + + + + ti.d3.n1.d1.n1.2.3.2 + + + + + ti.d3.n1.d1.n1.2.3.3 + + + + + ti.d3.n1.d1.n1.2.3.4 + + + + + ti.d3.n1.d1.n1.2.4.1 + + + + + ti.d3.n1.d1.n1.2.4.2 + + + + + ti.d3.n1.d1.n1.2.4.3 + + + + + ti.d3.n1.d1.n1.2.4.4 + + + + + ti.d3.n1.d1.n1.3.1.1 + + + + + ti.d3.n1.d1.n1.3.1.2 + + + + + ti.d3.n1.d1.n1.3.1.3 + + + + + ti.d3.n1.d1.n1.3.1.4 + + + + + ti.d3.n1.d1.n1.3.2.1 + + + + + ti.d3.n1.d1.n1.3.2.2 + + + + + ti.d3.n1.d1.n1.3.2.3 + + + + + ti.d3.n1.d1.n1.3.2.4 + + + + + ti.d3.n1.d1.n1.3.3.1 + + + + + ti.d3.n1.d1.n1.3.3.2 + + + + + ti.d3.n1.d1.n1.3.3.3 + + + + + ti.d3.n1.d1.n1.3.3.4 + + + + + ti.d3.n1.d1.n1.3.4.1 + + + + + ti.d3.n1.d1.n1.3.4.2 + + + + + ti.d3.n1.d1.n1.3.4.3 + + + + + ti.d3.n1.d1.n1.3.4.4 + + + + + ti.d3.n1.d1.n1.4.1.1 + + + + + ti.d3.n1.d1.n1.4.1.2 + + + + + ti.d3.n1.d1.n1.4.1.3 + + + + + ti.d3.n1.d1.n1.4.1.4 + + + + + ti.d3.n1.d1.n1.4.2.1 + + + + + ti.d3.n1.d1.n1.4.2.2 + + + + + ti.d3.n1.d1.n1.4.2.3 + + + + + ti.d3.n1.d1.n1.4.2.4 + + + + + ti.d3.n1.d1.n1.4.3.1 + + + + + ti.d3.n1.d1.n1.4.3.2 + + + + + ti.d3.n1.d1.n1.4.3.3 + + + + + ti.d3.n1.d1.n1.4.3.4 + + + + + ti.d3.n1.d1.n1.4.4.1 + + + + + ti.d3.n1.d1.n1.4.4.2 + + + + + ti.d3.n1.d1.n1.4.4.3 + + + + + ti.d3.n1.d1.n1.4.4.4 + + + + + ti.d3.n1.d1.n2.1.1.1 + + + + + ti.d3.n1.d1.n2.1.1.2 + + + + + ti.d3.n1.d1.n2.1.1.3 + + + + + ti.d3.n1.d1.n2.1.1.4 + + + + + ti.d3.n1.d1.n2.1.2.1 + + + + + ti.d3.n1.d1.n2.1.2.2 + + + + + ti.d3.n1.d1.n2.1.2.3 + + + + + ti.d3.n1.d1.n2.1.2.4 + + + + + ti.d3.n1.d1.n2.1.3.1 + + + + + ti.d3.n1.d1.n2.1.3.2 + + + + + ti.d3.n1.d1.n2.1.3.3 + + + + + ti.d3.n1.d1.n2.1.3.4 + + + + + ti.d3.n1.d1.n2.1.4.1 + + + + + ti.d3.n1.d1.n2.1.4.2 + + + + + ti.d3.n1.d1.n2.1.4.3 + + + + + ti.d3.n1.d1.n2.1.4.4 + + + + + ti.d3.n1.d1.n2.2.1.1 + + + + + ti.d3.n1.d1.n2.2.1.2 + + + + + ti.d3.n1.d1.n2.2.1.3 + + + + + ti.d3.n1.d1.n2.2.1.4 + + + + + ti.d3.n1.d1.n2.2.2.1 + + + + + ti.d3.n1.d1.n2.2.2.2 + + + + + ti.d3.n1.d1.n2.2.2.3 + + + + + ti.d3.n1.d1.n2.2.2.4 + + + + + ti.d3.n1.d1.n2.2.3.1 + + + + + ti.d3.n1.d1.n2.2.3.2 + + + + + ti.d3.n1.d1.n2.2.3.3 + + + + + ti.d3.n1.d1.n2.2.3.4 + + + + + ti.d3.n1.d1.n2.2.4.1 + + + + + ti.d3.n1.d1.n2.2.4.2 + + + + + ti.d3.n1.d1.n2.2.4.3 + + + + + ti.d3.n1.d1.n2.2.4.4 + + + + + ti.d3.n1.d1.n2.3.1.1 + + + + + ti.d3.n1.d1.n2.3.1.2 + + + + + ti.d3.n1.d1.n2.3.1.3 + + + + + ti.d3.n1.d1.n2.3.1.4 + + + + + ti.d3.n1.d1.n2.3.2.1 + + + + + ti.d3.n1.d1.n2.3.2.2 + + + + + ti.d3.n1.d1.n2.3.2.3 + + + + + ti.d3.n1.d1.n2.3.2.4 + + + + + ti.d3.n1.d1.n2.3.3.1 + + + + + ti.d3.n1.d1.n2.3.3.2 + + + + + ti.d3.n1.d1.n2.3.3.3 + + + + + ti.d3.n1.d1.n2.3.3.4 + + + + + ti.d3.n1.d1.n2.3.4.1 + + + + + ti.d3.n1.d1.n2.3.4.2 + + + + + ti.d3.n1.d1.n2.3.4.3 + + + + + ti.d3.n1.d1.n2.3.4.4 + + + + + ti.d3.n1.d1.n2.4.1.1 + + + + + ti.d3.n1.d1.n2.4.1.2 + + + + + ti.d3.n1.d1.n2.4.1.3 + + + + + ti.d3.n1.d1.n2.4.1.4 + + + + + ti.d3.n1.d1.n2.4.2.1 + + + + + ti.d3.n1.d1.n2.4.2.2 + + + + + ti.d3.n1.d1.n2.4.2.3 + + + + + ti.d3.n1.d1.n2.4.2.4 + + + + + ti.d3.n1.d1.n2.4.3.1 + + + + + ti.d3.n1.d1.n2.4.3.2 + + + + + ti.d3.n1.d1.n2.4.3.3 + + + + + ti.d3.n1.d1.n2.4.3.4 + + + + + ti.d3.n1.d1.n2.4.4.1 + + + + + ti.d3.n1.d1.n2.4.4.2 + + + + + ti.d3.n1.d1.n2.4.4.3 + + + + + ti.d3.n1.d1.n2.4.4.4 + + + + + ti.d3.n1.d2.n1.1.1.1 + + + + + ti.d3.n1.d2.n1.1.1.2 + + + + + ti.d3.n1.d2.n1.1.1.3 + + + + + ti.d3.n1.d2.n1.1.1.4 + + + + + ti.d3.n1.d2.n1.1.2.1 + + + + + ti.d3.n1.d2.n1.1.2.2 + + + + + ti.d3.n1.d2.n1.1.2.3 + + + + + ti.d3.n1.d2.n1.1.2.4 + + + + + ti.d3.n1.d2.n1.1.3.1 + + + + + ti.d3.n1.d2.n1.1.3.2 + + + + + ti.d3.n1.d2.n1.1.3.3 + + + + + ti.d3.n1.d2.n1.1.3.4 + + + + + ti.d3.n1.d2.n1.1.4.1 + + + + + ti.d3.n1.d2.n1.1.4.2 + + + + + ti.d3.n1.d2.n1.1.4.3 + + + + + ti.d3.n1.d2.n1.1.4.4 + + + + + ti.d3.n1.d2.n1.2.1.1 + + + + + ti.d3.n1.d2.n1.2.1.2 + + + + + ti.d3.n1.d2.n1.2.1.3 + + + + + ti.d3.n1.d2.n1.2.1.4 + + + + + ti.d3.n1.d2.n1.2.2.1 + + + + + ti.d3.n1.d2.n1.2.2.2 + + + + + ti.d3.n1.d2.n1.2.2.3 + + + + + ti.d3.n1.d2.n1.2.2.4 + + + + + ti.d3.n1.d2.n1.2.3.1 + + + + + ti.d3.n1.d2.n1.2.3.2 + + + + + ti.d3.n1.d2.n1.2.3.3 + + + + + ti.d3.n1.d2.n1.2.3.4 + + + + + ti.d3.n1.d2.n1.2.4.1 + + + + + ti.d3.n1.d2.n1.2.4.2 + + + + + ti.d3.n1.d2.n1.2.4.3 + + + + + ti.d3.n1.d2.n1.2.4.4 + + + + + ti.d3.n1.d2.n1.3.1.1 + + + + + ti.d3.n1.d2.n1.3.1.2 + + + + + ti.d3.n1.d2.n1.3.1.3 + + + + + ti.d3.n1.d2.n1.3.1.4 + + + + + ti.d3.n1.d2.n1.3.2.1 + + + + + ti.d3.n1.d2.n1.3.2.2 + + + + + ti.d3.n1.d2.n1.3.2.3 + + + + + ti.d3.n1.d2.n1.3.2.4 + + + + + ti.d3.n1.d2.n1.3.3.1 + + + + + ti.d3.n1.d2.n1.3.3.2 + + + + + ti.d3.n1.d2.n1.3.3.3 + + + + + ti.d3.n1.d2.n1.3.3.4 + + + + + ti.d3.n1.d2.n1.3.4.1 + + + + + ti.d3.n1.d2.n1.3.4.2 + + + + + ti.d3.n1.d2.n1.3.4.3 + + + + + ti.d3.n1.d2.n1.3.4.4 + + + + + ti.d3.n1.d2.n1.4.1.1 + + + + + ti.d3.n1.d2.n1.4.1.2 + + + + + ti.d3.n1.d2.n1.4.1.3 + + + + + ti.d3.n1.d2.n1.4.1.4 + + + + + ti.d3.n1.d2.n1.4.2.1 + + + + + ti.d3.n1.d2.n1.4.2.2 + + + + + ti.d3.n1.d2.n1.4.2.3 + + + + + ti.d3.n1.d2.n1.4.2.4 + + + + + ti.d3.n1.d2.n1.4.3.1 + + + + + ti.d3.n1.d2.n1.4.3.2 + + + + + ti.d3.n1.d2.n1.4.3.3 + + + + + ti.d3.n1.d2.n1.4.3.4 + + + + + ti.d3.n1.d2.n1.4.4.1 + + + + + ti.d3.n1.d2.n1.4.4.2 + + + + + ti.d3.n1.d2.n1.4.4.3 + + + + + ti.d3.n1.d2.n1.4.4.4 + + + + + ti.d3.n1.d2.n2.1.1.1 + + + + + ti.d3.n1.d2.n2.1.1.2 + + + + + ti.d3.n1.d2.n2.1.1.3 + + + + + ti.d3.n1.d2.n2.1.1.4 + + + + + ti.d3.n1.d2.n2.1.2.1 + + + + + ti.d3.n1.d2.n2.1.2.2 + + + + + ti.d3.n1.d2.n2.1.2.3 + + + + + ti.d3.n1.d2.n2.1.2.4 + + + + + ti.d3.n1.d2.n2.1.3.1 + + + + + ti.d3.n1.d2.n2.1.3.2 + + + + + ti.d3.n1.d2.n2.1.3.3 + + + + + ti.d3.n1.d2.n2.1.3.4 + + + + + ti.d3.n1.d2.n2.1.4.1 + + + + + ti.d3.n1.d2.n2.1.4.2 + + + + + ti.d3.n1.d2.n2.1.4.3 + + + + + ti.d3.n1.d2.n2.1.4.4 + + + + + ti.d3.n1.d2.n2.2.1.1 + + + + + ti.d3.n1.d2.n2.2.1.2 + + + + + ti.d3.n1.d2.n2.2.1.3 + + + + + ti.d3.n1.d2.n2.2.1.4 + + + + + ti.d3.n1.d2.n2.2.2.1 + + + + + ti.d3.n1.d2.n2.2.2.2 + + + + + ti.d3.n1.d2.n2.2.2.3 + + + + + ti.d3.n1.d2.n2.2.2.4 + + + + + ti.d3.n1.d2.n2.2.3.1 + + + + + ti.d3.n1.d2.n2.2.3.2 + + + + + ti.d3.n1.d2.n2.2.3.3 + + + + + ti.d3.n1.d2.n2.2.3.4 + + + + + ti.d3.n1.d2.n2.2.4.1 + + + + + ti.d3.n1.d2.n2.2.4.2 + + + + + ti.d3.n1.d2.n2.2.4.3 + + + + + ti.d3.n1.d2.n2.2.4.4 + + + + + ti.d3.n1.d2.n2.3.1.1 + + + + + ti.d3.n1.d2.n2.3.1.2 + + + + + ti.d3.n1.d2.n2.3.1.3 + + + + + ti.d3.n1.d2.n2.3.1.4 + + + + + ti.d3.n1.d2.n2.3.2.1 + + + + + ti.d3.n1.d2.n2.3.2.2 + + + + + ti.d3.n1.d2.n2.3.2.3 + + + + + ti.d3.n1.d2.n2.3.2.4 + + + + + ti.d3.n1.d2.n2.3.3.1 + + + + + ti.d3.n1.d2.n2.3.3.2 + + + + + ti.d3.n1.d2.n2.3.3.3 + + + + + ti.d3.n1.d2.n2.3.3.4 + + + + + ti.d3.n1.d2.n2.3.4.1 + + + + + ti.d3.n1.d2.n2.3.4.2 + + + + + ti.d3.n1.d2.n2.3.4.3 + + + + + ti.d3.n1.d2.n2.3.4.4 + + + + + ti.d3.n1.d2.n2.4.1.1 + + + + + ti.d3.n1.d2.n2.4.1.2 + + + + + ti.d3.n1.d2.n2.4.1.3 + + + + + ti.d3.n1.d2.n2.4.1.4 + + + + + ti.d3.n1.d2.n2.4.2.1 + + + + + ti.d3.n1.d2.n2.4.2.2 + + + + + ti.d3.n1.d2.n2.4.2.3 + + + + + ti.d3.n1.d2.n2.4.2.4 + + + + + ti.d3.n1.d2.n2.4.3.1 + + + + + ti.d3.n1.d2.n2.4.3.2 + + + + + ti.d3.n1.d2.n2.4.3.3 + + + + + ti.d3.n1.d2.n2.4.3.4 + + + + + ti.d3.n1.d2.n2.4.4.1 + + + + + ti.d3.n1.d2.n2.4.4.2 + + + + + ti.d3.n1.d2.n2.4.4.3 + + + + + ti.d3.n1.d2.n2.4.4.4 + + + + + ti.d3.n1.d3.n2.1.1.1 + + + + + ti.d3.n1.d3.n2.1.1.2 + + + + + ti.d3.n1.d3.n2.1.1.3 + + + + + ti.d3.n1.d3.n2.1.1.4 + + + + + ti.d3.n1.d3.n2.1.2.1 + + + + + ti.d3.n1.d3.n2.1.2.2 + + + + + ti.d3.n1.d3.n2.1.2.3 + + + + + ti.d3.n1.d3.n2.1.2.4 + + + + + ti.d3.n1.d3.n2.1.3.1 + + + + + ti.d3.n1.d3.n2.1.3.2 + + + + + ti.d3.n1.d3.n2.1.3.3 + + + + + ti.d3.n1.d3.n2.1.3.4 + + + + + ti.d3.n1.d3.n2.1.4.1 + + + + + ti.d3.n1.d3.n2.1.4.2 + + + + + ti.d3.n1.d3.n2.1.4.3 + + + + + ti.d3.n1.d3.n2.1.4.4 + + + + + ti.d3.n1.d3.n2.2.1.1 + + + + + ti.d3.n1.d3.n2.2.1.2 + + + + + ti.d3.n1.d3.n2.2.1.3 + + + + + ti.d3.n1.d3.n2.2.1.4 + + + + + ti.d3.n1.d3.n2.2.2.1 + + + + + ti.d3.n1.d3.n2.2.2.2 + + + + + ti.d3.n1.d3.n2.2.2.3 + + + + + ti.d3.n1.d3.n2.2.2.4 + + + + + ti.d3.n1.d3.n2.2.3.1 + + + + + ti.d3.n1.d3.n2.2.3.2 + + + + + ti.d3.n1.d3.n2.2.3.3 + + + + + ti.d3.n1.d3.n2.2.3.4 + + + + + ti.d3.n1.d3.n2.2.4.1 + + + + + ti.d3.n1.d3.n2.2.4.2 + + + + + ti.d3.n1.d3.n2.2.4.3 + + + + + ti.d3.n1.d3.n2.2.4.4 + + + + + ti.d3.n1.d3.n2.3.1.1 + + + + + ti.d3.n1.d3.n2.3.1.2 + + + + + ti.d3.n1.d3.n2.3.1.3 + + + + + ti.d3.n1.d3.n2.3.1.4 + + + + + ti.d3.n1.d3.n2.3.2.1 + + + + + ti.d3.n1.d3.n2.3.2.2 + + + + + ti.d3.n1.d3.n2.3.2.3 + + + + + ti.d3.n1.d3.n2.3.2.4 + + + + + ti.d3.n1.d3.n2.3.3.1 + + + + + ti.d3.n1.d3.n2.3.3.2 + + + + + ti.d3.n1.d3.n2.3.3.3 + + + + + ti.d3.n1.d3.n2.3.3.4 + + + + + ti.d3.n1.d3.n2.3.4.1 + + + + + ti.d3.n1.d3.n2.3.4.2 + + + + + ti.d3.n1.d3.n2.3.4.3 + + + + + ti.d3.n1.d3.n2.3.4.4 + + + + + ti.d3.n1.d3.n2.4.1.1 + + + + + ti.d3.n1.d3.n2.4.1.2 + + + + + ti.d3.n1.d3.n2.4.1.3 + + + + + ti.d3.n1.d3.n2.4.1.4 + + + + + ti.d3.n1.d3.n2.4.2.1 + + + + + ti.d3.n1.d3.n2.4.2.2 + + + + + ti.d3.n1.d3.n2.4.2.3 + + + + + ti.d3.n1.d3.n2.4.2.4 + + + + + ti.d3.n1.d3.n2.4.3.1 + + + + + ti.d3.n1.d3.n2.4.3.2 + + + + + ti.d3.n1.d3.n2.4.3.3 + + + + + ti.d3.n1.d3.n2.4.3.4 + + + + + ti.d3.n1.d3.n2.4.4.1 + + + + + ti.d3.n1.d3.n2.4.4.2 + + + + + ti.d3.n1.d3.n2.4.4.3 + + + + + ti.d3.n1.d3.n2.4.4.4 + + + + + ti.d3.n2.d1.n1.1.1.1 + + + + + ti.d3.n2.d1.n1.1.1.2 + + + + + ti.d3.n2.d1.n1.1.1.3 + + + + + ti.d3.n2.d1.n1.1.1.4 + + + + + ti.d3.n2.d1.n1.1.2.1 + + + + + ti.d3.n2.d1.n1.1.2.2 + + + + + ti.d3.n2.d1.n1.1.2.3 + + + + + ti.d3.n2.d1.n1.1.2.4 + + + + + ti.d3.n2.d1.n1.1.3.1 + + + + + ti.d3.n2.d1.n1.1.3.2 + + + + + ti.d3.n2.d1.n1.1.3.3 + + + + + ti.d3.n2.d1.n1.1.3.4 + + + + + ti.d3.n2.d1.n1.1.4.1 + + + + + ti.d3.n2.d1.n1.1.4.2 + + + + + ti.d3.n2.d1.n1.1.4.3 + + + + + ti.d3.n2.d1.n1.1.4.4 + + + + + ti.d3.n2.d1.n1.2.1.1 + + + + + ti.d3.n2.d1.n1.2.1.2 + + + + + ti.d3.n2.d1.n1.2.1.3 + + + + + ti.d3.n2.d1.n1.2.1.4 + + + + + ti.d3.n2.d1.n1.2.2.1 + + + + + ti.d3.n2.d1.n1.2.2.2 + + + + + ti.d3.n2.d1.n1.2.2.3 + + + + + ti.d3.n2.d1.n1.2.2.4 + + + + + ti.d3.n2.d1.n1.2.3.1 + + + + + ti.d3.n2.d1.n1.2.3.2 + + + + + ti.d3.n2.d1.n1.2.3.3 + + + + + ti.d3.n2.d1.n1.2.3.4 + + + + + ti.d3.n2.d1.n1.2.4.1 + + + + + ti.d3.n2.d1.n1.2.4.2 + + + + + ti.d3.n2.d1.n1.2.4.3 + + + + + ti.d3.n2.d1.n1.2.4.4 + + + + + ti.d3.n2.d1.n1.3.1.1 + + + + + ti.d3.n2.d1.n1.3.1.2 + + + + + ti.d3.n2.d1.n1.3.1.3 + + + + + ti.d3.n2.d1.n1.3.1.4 + + + + + ti.d3.n2.d1.n1.3.2.1 + + + + + ti.d3.n2.d1.n1.3.2.2 + + + + + ti.d3.n2.d1.n1.3.2.3 + + + + + ti.d3.n2.d1.n1.3.2.4 + + + + + ti.d3.n2.d1.n1.3.3.1 + + + + + ti.d3.n2.d1.n1.3.3.2 + + + + + ti.d3.n2.d1.n1.3.3.3 + + + + + ti.d3.n2.d1.n1.3.3.4 + + + + + ti.d3.n2.d1.n1.3.4.1 + + + + + ti.d3.n2.d1.n1.3.4.2 + + + + + ti.d3.n2.d1.n1.3.4.3 + + + + + ti.d3.n2.d1.n1.3.4.4 + + + + + ti.d3.n2.d1.n1.4.1.1 + + + + + ti.d3.n2.d1.n1.4.1.2 + + + + + ti.d3.n2.d1.n1.4.1.3 + + + + + ti.d3.n2.d1.n1.4.1.4 + + + + + ti.d3.n2.d1.n1.4.2.1 + + + + + ti.d3.n2.d1.n1.4.2.2 + + + + + ti.d3.n2.d1.n1.4.2.3 + + + + + ti.d3.n2.d1.n1.4.2.4 + + + + + ti.d3.n2.d1.n1.4.3.1 + + + + + ti.d3.n2.d1.n1.4.3.2 + + + + + ti.d3.n2.d1.n1.4.3.3 + + + + + ti.d3.n2.d1.n1.4.3.4 + + + + + ti.d3.n2.d1.n1.4.4.1 + + + + + ti.d3.n2.d1.n1.4.4.2 + + + + + ti.d3.n2.d1.n1.4.4.3 + + + + + ti.d3.n2.d1.n1.4.4.4 + + + + + ti.d3.n2.d1.n2.1.1.1 + + + + + ti.d3.n2.d1.n2.1.1.2 + + + + + ti.d3.n2.d1.n2.1.1.3 + + + + + ti.d3.n2.d1.n2.1.1.4 + + + + + ti.d3.n2.d1.n2.1.2.1 + + + + + ti.d3.n2.d1.n2.1.2.2 + + + + + ti.d3.n2.d1.n2.1.2.3 + + + + + ti.d3.n2.d1.n2.1.2.4 + + + + + ti.d3.n2.d1.n2.1.3.1 + + + + + ti.d3.n2.d1.n2.1.3.2 + + + + + ti.d3.n2.d1.n2.1.3.3 + + + + + ti.d3.n2.d1.n2.1.3.4 + + + + + ti.d3.n2.d1.n2.1.4.1 + + + + + ti.d3.n2.d1.n2.1.4.2 + + + + + ti.d3.n2.d1.n2.1.4.3 + + + + + ti.d3.n2.d1.n2.1.4.4 + + + + + ti.d3.n2.d1.n2.2.1.1 + + + + + ti.d3.n2.d1.n2.2.1.2 + + + + + ti.d3.n2.d1.n2.2.1.3 + + + + + ti.d3.n2.d1.n2.2.1.4 + + + + + ti.d3.n2.d1.n2.2.2.1 + + + + + ti.d3.n2.d1.n2.2.2.2 + + + + + ti.d3.n2.d1.n2.2.2.3 + + + + + ti.d3.n2.d1.n2.2.2.4 + + + + + ti.d3.n2.d1.n2.2.3.1 + + + + + ti.d3.n2.d1.n2.2.3.2 + + + + + ti.d3.n2.d1.n2.2.3.3 + + + + + ti.d3.n2.d1.n2.2.3.4 + + + + + ti.d3.n2.d1.n2.2.4.1 + + + + + ti.d3.n2.d1.n2.2.4.2 + + + + + ti.d3.n2.d1.n2.2.4.3 + + + + + ti.d3.n2.d1.n2.2.4.4 + + + + + ti.d3.n2.d1.n2.3.1.1 + + + + + ti.d3.n2.d1.n2.3.1.2 + + + + + ti.d3.n2.d1.n2.3.1.3 + + + + + ti.d3.n2.d1.n2.3.1.4 + + + + + ti.d3.n2.d1.n2.3.2.1 + + + + + ti.d3.n2.d1.n2.3.2.2 + + + + + ti.d3.n2.d1.n2.3.2.3 + + + + + ti.d3.n2.d1.n2.3.2.4 + + + + + ti.d3.n2.d1.n2.3.3.1 + + + + + ti.d3.n2.d1.n2.3.3.2 + + + + + ti.d3.n2.d1.n2.3.3.3 + + + + + ti.d3.n2.d1.n2.3.3.4 + + + + + ti.d3.n2.d1.n2.3.4.1 + + + + + ti.d3.n2.d1.n2.3.4.2 + + + + + ti.d3.n2.d1.n2.3.4.3 + + + + + ti.d3.n2.d1.n2.3.4.4 + + + + + ti.d3.n2.d1.n2.4.1.1 + + + + + ti.d3.n2.d1.n2.4.1.2 + + + + + ti.d3.n2.d1.n2.4.1.3 + + + + + ti.d3.n2.d1.n2.4.1.4 + + + + + ti.d3.n2.d1.n2.4.2.1 + + + + + ti.d3.n2.d1.n2.4.2.2 + + + + + ti.d3.n2.d1.n2.4.2.3 + + + + + ti.d3.n2.d1.n2.4.2.4 + + + + + ti.d3.n2.d1.n2.4.3.1 + + + + + ti.d3.n2.d1.n2.4.3.2 + + + + + ti.d3.n2.d1.n2.4.3.3 + + + + + ti.d3.n2.d1.n2.4.3.4 + + + + + ti.d3.n2.d1.n2.4.4.1 + + + + + ti.d3.n2.d1.n2.4.4.2 + + + + + ti.d3.n2.d1.n2.4.4.3 + + + + + ti.d3.n2.d1.n2.4.4.4 + + + + + ti.d3.n2.d2.n1.1.1.1 + + + + + ti.d3.n2.d2.n1.1.1.2 + + + + + ti.d3.n2.d2.n1.1.1.3 + + + + + ti.d3.n2.d2.n1.1.1.4 + + + + + ti.d3.n2.d2.n1.1.2.1 + + + + + ti.d3.n2.d2.n1.1.2.2 + + + + + ti.d3.n2.d2.n1.1.2.3 + + + + + ti.d3.n2.d2.n1.1.2.4 + + + + + ti.d3.n2.d2.n1.1.3.1 + + + + + ti.d3.n2.d2.n1.1.3.2 + + + + + ti.d3.n2.d2.n1.1.3.3 + + + + + ti.d3.n2.d2.n1.1.3.4 + + + + + ti.d3.n2.d2.n1.1.4.1 + + + + + ti.d3.n2.d2.n1.1.4.2 + + + + + ti.d3.n2.d2.n1.1.4.3 + + + + + ti.d3.n2.d2.n1.1.4.4 + + + + + ti.d3.n2.d2.n1.2.1.1 + + + + + ti.d3.n2.d2.n1.2.1.2 + + + + + ti.d3.n2.d2.n1.2.1.3 + + + + + ti.d3.n2.d2.n1.2.1.4 + + + + + ti.d3.n2.d2.n1.2.2.1 + + + + + ti.d3.n2.d2.n1.2.2.2 + + + + + ti.d3.n2.d2.n1.2.2.3 + + + + + ti.d3.n2.d2.n1.2.2.4 + + + + + ti.d3.n2.d2.n1.2.3.1 + + + + + ti.d3.n2.d2.n1.2.3.2 + + + + + ti.d3.n2.d2.n1.2.3.3 + + + + + ti.d3.n2.d2.n1.2.3.4 + + + + + ti.d3.n2.d2.n1.2.4.1 + + + + + ti.d3.n2.d2.n1.2.4.2 + + + + + ti.d3.n2.d2.n1.2.4.3 + + + + + ti.d3.n2.d2.n1.2.4.4 + + + + + ti.d3.n2.d2.n1.3.1.1 + + + + + ti.d3.n2.d2.n1.3.1.2 + + + + + ti.d3.n2.d2.n1.3.1.3 + + + + + ti.d3.n2.d2.n1.3.1.4 + + + + + ti.d3.n2.d2.n1.3.2.1 + + + + + ti.d3.n2.d2.n1.3.2.2 + + + + + ti.d3.n2.d2.n1.3.2.3 + + + + + ti.d3.n2.d2.n1.3.2.4 + + + + + ti.d3.n2.d2.n1.3.3.1 + + + + + ti.d3.n2.d2.n1.3.3.2 + + + + + ti.d3.n2.d2.n1.3.3.3 + + + + + ti.d3.n2.d2.n1.3.3.4 + + + + + ti.d3.n2.d2.n1.3.4.1 + + + + + ti.d3.n2.d2.n1.3.4.2 + + + + + ti.d3.n2.d2.n1.3.4.3 + + + + + ti.d3.n2.d2.n1.3.4.4 + + + + + ti.d3.n2.d2.n1.4.1.1 + + + + + ti.d3.n2.d2.n1.4.1.2 + + + + + ti.d3.n2.d2.n1.4.1.3 + + + + + ti.d3.n2.d2.n1.4.1.4 + + + + + ti.d3.n2.d2.n1.4.2.1 + + + + + ti.d3.n2.d2.n1.4.2.2 + + + + + ti.d3.n2.d2.n1.4.2.3 + + + + + ti.d3.n2.d2.n1.4.2.4 + + + + + ti.d3.n2.d2.n1.4.3.1 + + + + + ti.d3.n2.d2.n1.4.3.2 + + + + + ti.d3.n2.d2.n1.4.3.3 + + + + + ti.d3.n2.d2.n1.4.3.4 + + + + + ti.d3.n2.d2.n1.4.4.1 + + + + + ti.d3.n2.d2.n1.4.4.2 + + + + + ti.d3.n2.d2.n1.4.4.3 + + + + + ti.d3.n2.d2.n1.4.4.4 + + + + + ti.d3.n2.d2.n2.1.1.1 + + + + + ti.d3.n2.d2.n2.1.1.2 + + + + + ti.d3.n2.d2.n2.1.1.3 + + + + + ti.d3.n2.d2.n2.1.1.4 + + + + + ti.d3.n2.d2.n2.1.2.1 + + + + + ti.d3.n2.d2.n2.1.2.2 + + + + + ti.d3.n2.d2.n2.1.2.3 + + + + + ti.d3.n2.d2.n2.1.2.4 + + + + + ti.d3.n2.d2.n2.1.3.1 + + + + + ti.d3.n2.d2.n2.1.3.2 + + + + + ti.d3.n2.d2.n2.1.3.3 + + + + + ti.d3.n2.d2.n2.1.3.4 + + + + + ti.d3.n2.d2.n2.1.4.1 + + + + + ti.d3.n2.d2.n2.1.4.2 + + + + + ti.d3.n2.d2.n2.1.4.3 + + + + + ti.d3.n2.d2.n2.1.4.4 + + + + + ti.d3.n2.d2.n2.2.1.1 + + + + + ti.d3.n2.d2.n2.2.1.2 + + + + + ti.d3.n2.d2.n2.2.1.3 + + + + + ti.d3.n2.d2.n2.2.1.4 + + + + + ti.d3.n2.d2.n2.2.2.1 + + + + + ti.d3.n2.d2.n2.2.2.2 + + + + + ti.d3.n2.d2.n2.2.2.3 + + + + + ti.d3.n2.d2.n2.2.2.4 + + + + + ti.d3.n2.d2.n2.2.3.1 + + + + + ti.d3.n2.d2.n2.2.3.2 + + + + + ti.d3.n2.d2.n2.2.3.3 + + + + + ti.d3.n2.d2.n2.2.3.4 + + + + + ti.d3.n2.d2.n2.2.4.1 + + + + + ti.d3.n2.d2.n2.2.4.2 + + + + + ti.d3.n2.d2.n2.2.4.3 + + + + + ti.d3.n2.d2.n2.2.4.4 + + + + + ti.d3.n2.d2.n2.3.1.1 + + + + + ti.d3.n2.d2.n2.3.1.2 + + + + + ti.d3.n2.d2.n2.3.1.3 + + + + + ti.d3.n2.d2.n2.3.1.4 + + + + + ti.d3.n2.d2.n2.3.2.1 + + + + + ti.d3.n2.d2.n2.3.2.2 + + + + + ti.d3.n2.d2.n2.3.2.3 + + + + + ti.d3.n2.d2.n2.3.2.4 + + + + + ti.d3.n2.d2.n2.3.3.1 + + + + + ti.d3.n2.d2.n2.3.3.2 + + + + + ti.d3.n2.d2.n2.3.3.3 + + + + + ti.d3.n2.d2.n2.3.3.4 + + + + + ti.d3.n2.d2.n2.3.4.1 + + + + + ti.d3.n2.d2.n2.3.4.2 + + + + + ti.d3.n2.d2.n2.3.4.3 + + + + + ti.d3.n2.d2.n2.3.4.4 + + + + + ti.d3.n2.d2.n2.4.1.1 + + + + + ti.d3.n2.d2.n2.4.1.2 + + + + + ti.d3.n2.d2.n2.4.1.3 + + + + + ti.d3.n2.d2.n2.4.1.4 + + + + + ti.d3.n2.d2.n2.4.2.1 + + + + + ti.d3.n2.d2.n2.4.2.2 + + + + + ti.d3.n2.d2.n2.4.2.3 + + + + + ti.d3.n2.d2.n2.4.2.4 + + + + + ti.d3.n2.d2.n2.4.3.1 + + + + + ti.d3.n2.d2.n2.4.3.2 + + + + + ti.d3.n2.d2.n2.4.3.3 + + + + + ti.d3.n2.d2.n2.4.3.4 + + + + + ti.d3.n2.d2.n2.4.4.1 + + + + + ti.d3.n2.d2.n2.4.4.2 + + + + + ti.d3.n2.d2.n2.4.4.3 + + + + + ti.d3.n2.d2.n2.4.4.4 + + + + + ti.d3.n2.d3.n1.1.1.1 + + + + + ti.d3.n2.d3.n1.1.1.2 + + + + + ti.d3.n2.d3.n1.1.1.3 + + + + + ti.d3.n2.d3.n1.1.1.4 + + + + + ti.d3.n2.d3.n1.1.2.1 + + + + + ti.d3.n2.d3.n1.1.2.2 + + + + + ti.d3.n2.d3.n1.1.2.3 + + + + + ti.d3.n2.d3.n1.1.2.4 + + + + + ti.d3.n2.d3.n1.1.3.1 + + + + + ti.d3.n2.d3.n1.1.3.2 + + + + + ti.d3.n2.d3.n1.1.3.3 + + + + + ti.d3.n2.d3.n1.1.3.4 + + + + + ti.d3.n2.d3.n1.1.4.1 + + + + + ti.d3.n2.d3.n1.1.4.2 + + + + + ti.d3.n2.d3.n1.1.4.3 + + + + + ti.d3.n2.d3.n1.1.4.4 + + + + + ti.d3.n2.d3.n1.2.1.1 + + + + + ti.d3.n2.d3.n1.2.1.2 + + + + + ti.d3.n2.d3.n1.2.1.3 + + + + + ti.d3.n2.d3.n1.2.1.4 + + + + + ti.d3.n2.d3.n1.2.2.1 + + + + + ti.d3.n2.d3.n1.2.2.2 + + + + + ti.d3.n2.d3.n1.2.2.3 + + + + + ti.d3.n2.d3.n1.2.2.4 + + + + + ti.d3.n2.d3.n1.2.3.1 + + + + + ti.d3.n2.d3.n1.2.3.2 + + + + + ti.d3.n2.d3.n1.2.3.3 + + + + + ti.d3.n2.d3.n1.2.3.4 + + + + + ti.d3.n2.d3.n1.2.4.1 + + + + + ti.d3.n2.d3.n1.2.4.2 + + + + + ti.d3.n2.d3.n1.2.4.3 + + + + + ti.d3.n2.d3.n1.2.4.4 + + + + + ti.d3.n2.d3.n1.3.1.1 + + + + + ti.d3.n2.d3.n1.3.1.2 + + + + + ti.d3.n2.d3.n1.3.1.3 + + + + + ti.d3.n2.d3.n1.3.1.4 + + + + + ti.d3.n2.d3.n1.3.2.1 + + + + + ti.d3.n2.d3.n1.3.2.2 + + + + + ti.d3.n2.d3.n1.3.2.3 + + + + + ti.d3.n2.d3.n1.3.2.4 + + + + + ti.d3.n2.d3.n1.3.3.1 + + + + + ti.d3.n2.d3.n1.3.3.2 + + + + + ti.d3.n2.d3.n1.3.3.3 + + + + + ti.d3.n2.d3.n1.3.3.4 + + + + + ti.d3.n2.d3.n1.3.4.1 + + + + + ti.d3.n2.d3.n1.3.4.2 + + + + + ti.d3.n2.d3.n1.3.4.3 + + + + + ti.d3.n2.d3.n1.3.4.4 + + + + + ti.d3.n2.d3.n1.4.1.1 + + + + + ti.d3.n2.d3.n1.4.1.2 + + + + + ti.d3.n2.d3.n1.4.1.3 + + + + + ti.d3.n2.d3.n1.4.1.4 + + + + + ti.d3.n2.d3.n1.4.2.1 + + + + + ti.d3.n2.d3.n1.4.2.2 + + + + + ti.d3.n2.d3.n1.4.2.3 + + + + + ti.d3.n2.d3.n1.4.2.4 + + + + + ti.d3.n2.d3.n1.4.3.1 + + + + + ti.d3.n2.d3.n1.4.3.2 + + + + + ti.d3.n2.d3.n1.4.3.3 + + + + + ti.d3.n2.d3.n1.4.3.4 + + + + + ti.d3.n2.d3.n1.4.4.1 + + + + + ti.d3.n2.d3.n1.4.4.2 + + + + + ti.d3.n2.d3.n1.4.4.3 + + + + + ti.d3.n2.d3.n1.4.4.4 + + + + + to.d1.n1.1.1.1 + + + + + to.d1.n1.1.1.2 + + + + + to.d1.n1.1.1.3 + + + + + to.d1.n1.1.1.4 + + + + + to.d1.n1.1.2.1 + + + + + to.d1.n1.1.2.2 + + + + + to.d1.n1.1.2.3 + + + + + to.d1.n1.1.2.4 + + + + + to.d1.n1.1.3.1 + + + + + to.d1.n1.1.3.2 + + + + + to.d1.n1.1.3.3 + + + + + to.d1.n1.1.3.4 + + + + + to.d1.n1.1.4.1 + + + + + to.d1.n1.1.4.2 + + + + + to.d1.n1.1.4.3 + + + + + to.d1.n1.1.4.4 + + + + + to.d1.n1.2.1.1 + + + + + to.d1.n1.2.1.2 + + + + + to.d1.n1.2.1.3 + + + + + to.d1.n1.2.1.4 + + + + + to.d1.n1.2.2.1 + + + + + to.d1.n1.2.2.2 + + + + + to.d1.n1.2.2.3 + + + + + to.d1.n1.2.2.4 + + + + + to.d1.n1.2.3.1 + + + + + to.d1.n1.2.3.2 + + + + + to.d1.n1.2.3.3 + + + + + to.d1.n1.2.3.4 + + + + + to.d1.n1.2.4.1 + + + + + to.d1.n1.2.4.2 + + + + + to.d1.n1.2.4.3 + + + + + to.d1.n1.2.4.4 + + + + + to.d1.n1.3.1.1 + + + + + to.d1.n1.3.1.2 + + + + + to.d1.n1.3.1.3 + + + + + to.d1.n1.3.1.4 + + + + + to.d1.n1.3.2.1 + + + + + to.d1.n1.3.2.2 + + + + + to.d1.n1.3.2.3 + + + + + to.d1.n1.3.2.4 + + + + + to.d1.n1.3.3.1 + + + + + to.d1.n1.3.3.2 + + + + + to.d1.n1.3.3.3 + + + + + to.d1.n1.3.3.4 + + + + + to.d1.n1.3.4.1 + + + + + to.d1.n1.3.4.2 + + + + + to.d1.n1.3.4.3 + + + + + to.d1.n1.3.4.4 + + + + + to.d1.n1.4.1.1 + + + + + to.d1.n1.4.1.2 + + + + + to.d1.n1.4.1.3 + + + + + to.d1.n1.4.1.4 + + + + + to.d1.n1.4.2.1 + + + + + to.d1.n1.4.2.2 + + + + + to.d1.n1.4.2.3 + + + + + to.d1.n1.4.2.4 + + + + + to.d1.n1.4.3.1 + + + + + to.d1.n1.4.3.2 + + + + + to.d1.n1.4.3.3 + + + + + to.d1.n1.4.3.4 + + + + + to.d1.n1.4.4.1 + + + + + to.d1.n1.4.4.2 + + + + + to.d1.n1.4.4.3 + + + + + to.d1.n1.4.4.4 + + + + + to.d1.n2.1.1.1 + + + + + to.d1.n2.1.1.2 + + + + + to.d1.n2.1.1.3 + + + + + to.d1.n2.1.1.4 + + + + + to.d1.n2.1.2.1 + + + + + to.d1.n2.1.2.2 + + + + + to.d1.n2.1.2.3 + + + + + to.d1.n2.1.2.4 + + + + + to.d1.n2.1.3.1 + + + + + to.d1.n2.1.3.2 + + + + + to.d1.n2.1.3.3 + + + + + to.d1.n2.1.3.4 + + + + + to.d1.n2.1.4.1 + + + + + to.d1.n2.1.4.2 + + + + + to.d1.n2.1.4.3 + + + + + to.d1.n2.1.4.4 + + + + + to.d1.n2.2.1.1 + + + + + to.d1.n2.2.1.2 + + + + + to.d1.n2.2.1.3 + + + + + to.d1.n2.2.1.4 + + + + + to.d1.n2.2.2.1 + + + + + to.d1.n2.2.2.2 + + + + + to.d1.n2.2.2.3 + + + + + to.d1.n2.2.2.4 + + + + + to.d1.n2.2.3.1 + + + + + to.d1.n2.2.3.2 + + + + + to.d1.n2.2.3.3 + + + + + to.d1.n2.2.3.4 + + + + + to.d1.n2.2.4.1 + + + + + to.d1.n2.2.4.2 + + + + + to.d1.n2.2.4.3 + + + + + to.d1.n2.2.4.4 + + + + + to.d1.n2.3.1.1 + + + + + to.d1.n2.3.1.2 + + + + + to.d1.n2.3.1.3 + + + + + to.d1.n2.3.1.4 + + + + + to.d1.n2.3.2.1 + + + + + to.d1.n2.3.2.2 + + + + + to.d1.n2.3.2.3 + + + + + to.d1.n2.3.2.4 + + + + + to.d1.n2.3.3.1 + + + + + to.d1.n2.3.3.2 + + + + + to.d1.n2.3.3.3 + + + + + to.d1.n2.3.3.4 + + + + + to.d1.n2.3.4.1 + + + + + to.d1.n2.3.4.2 + + + + + to.d1.n2.3.4.3 + + + + + to.d1.n2.3.4.4 + + + + + to.d1.n2.4.1.1 + + + + + to.d1.n2.4.1.2 + + + + + to.d1.n2.4.1.3 + + + + + to.d1.n2.4.1.4 + + + + + to.d1.n2.4.2.1 + + + + + to.d1.n2.4.2.2 + + + + + to.d1.n2.4.2.3 + + + + + to.d1.n2.4.2.4 + + + + + to.d1.n2.4.3.1 + + + + + to.d1.n2.4.3.2 + + + + + to.d1.n2.4.3.3 + + + + + to.d1.n2.4.3.4 + + + + + to.d1.n2.4.4.1 + + + + + to.d1.n2.4.4.2 + + + + + to.d1.n2.4.4.3 + + + + + to.d1.n2.4.4.4 + + + + + to.d2.n1.1.1.1 + + + + + to.d2.n1.1.1.2 + + + + + to.d2.n1.1.1.3 + + + + + to.d2.n1.1.1.4 + + + + + to.d2.n1.1.2.1 + + + + + to.d2.n1.1.2.2 + + + + + to.d2.n1.1.2.3 + + + + + to.d2.n1.1.2.4 + + + + + to.d2.n1.1.3.1 + + + + + to.d2.n1.1.3.2 + + + + + to.d2.n1.1.3.3 + + + + + to.d2.n1.1.3.4 + + + + + to.d2.n1.1.4.1 + + + + + to.d2.n1.1.4.2 + + + + + to.d2.n1.1.4.3 + + + + + to.d2.n1.1.4.4 + + + + + to.d2.n1.2.1.1 + + + + + to.d2.n1.2.1.2 + + + + + to.d2.n1.2.1.3 + + + + + to.d2.n1.2.1.4 + + + + + to.d2.n1.2.2.1 + + + + + to.d2.n1.2.2.2 + + + + + to.d2.n1.2.2.3 + + + + + to.d2.n1.2.2.4 + + + + + to.d2.n1.2.3.1 + + + + + to.d2.n1.2.3.2 + + + + + to.d2.n1.2.3.3 + + + + + to.d2.n1.2.3.4 + + + + + to.d2.n1.2.4.1 + + + + + to.d2.n1.2.4.2 + + + + + to.d2.n1.2.4.3 + + + + + to.d2.n1.2.4.4 + + + + + to.d2.n1.3.1.1 + + + + + to.d2.n1.3.1.2 + + + + + to.d2.n1.3.1.3 + + + + + to.d2.n1.3.1.4 + + + + + to.d2.n1.3.2.1 + + + + + to.d2.n1.3.2.2 + + + + + to.d2.n1.3.2.3 + + + + + to.d2.n1.3.2.4 + + + + + to.d2.n1.3.3.1 + + + + + to.d2.n1.3.3.2 + + + + + to.d2.n1.3.3.3 + + + + + to.d2.n1.3.3.4 + + + + + to.d2.n1.3.4.1 + + + + + to.d2.n1.3.4.2 + + + + + to.d2.n1.3.4.3 + + + + + to.d2.n1.3.4.4 + + + + + to.d2.n1.4.1.1 + + + + + to.d2.n1.4.1.2 + + + + + to.d2.n1.4.1.3 + + + + + to.d2.n1.4.1.4 + + + + + to.d2.n1.4.2.1 + + + + + to.d2.n1.4.2.2 + + + + + to.d2.n1.4.2.3 + + + + + to.d2.n1.4.2.4 + + + + + to.d2.n1.4.3.1 + + + + + to.d2.n1.4.3.2 + + + + + to.d2.n1.4.3.3 + + + + + to.d2.n1.4.3.4 + + + + + to.d2.n1.4.4.1 + + + + + to.d2.n1.4.4.2 + + + + + to.d2.n1.4.4.3 + + + + + to.d2.n1.4.4.4 + + + + + to.d2.n2.1.1.1 + + + + + to.d2.n2.1.1.2 + + + + + to.d2.n2.1.1.3 + + + + + to.d2.n2.1.1.4 + + + + + to.d2.n2.1.2.1 + + + + + to.d2.n2.1.2.2 + + + + + to.d2.n2.1.2.3 + + + + + to.d2.n2.1.2.4 + + + + + to.d2.n2.1.3.1 + + + + + to.d2.n2.1.3.2 + + + + + to.d2.n2.1.3.3 + + + + + to.d2.n2.1.3.4 + + + + + to.d2.n2.1.4.1 + + + + + to.d2.n2.1.4.2 + + + + + to.d2.n2.1.4.3 + + + + + to.d2.n2.1.4.4 + + + + + to.d2.n2.2.1.1 + + + + + to.d2.n2.2.1.2 + + + + + to.d2.n2.2.1.3 + + + + + to.d2.n2.2.1.4 + + + + + to.d2.n2.2.2.1 + + + + + to.d2.n2.2.2.2 + + + + + to.d2.n2.2.2.3 + + + + + to.d2.n2.2.2.4 + + + + + to.d2.n2.2.3.1 + + + + + to.d2.n2.2.3.2 + + + + + to.d2.n2.2.3.3 + + + + + to.d2.n2.2.3.4 + + + + + to.d2.n2.2.4.1 + + + + + to.d2.n2.2.4.2 + + + + + to.d2.n2.2.4.3 + + + + + to.d2.n2.2.4.4 + + + + + to.d2.n2.3.1.1 + + + + + to.d2.n2.3.1.2 + + + + + to.d2.n2.3.1.3 + + + + + to.d2.n2.3.1.4 + + + + + to.d2.n2.3.2.1 + + + + + to.d2.n2.3.2.2 + + + + + to.d2.n2.3.2.3 + + + + + to.d2.n2.3.2.4 + + + + + to.d2.n2.3.3.1 + + + + + to.d2.n2.3.3.2 + + + + + to.d2.n2.3.3.3 + + + + + to.d2.n2.3.3.4 + + + + + to.d2.n2.3.4.1 + + + + + to.d2.n2.3.4.2 + + + + + to.d2.n2.3.4.3 + + + + + to.d2.n2.3.4.4 + + + + + to.d2.n2.4.1.1 + + + + + to.d2.n2.4.1.2 + + + + + to.d2.n2.4.1.3 + + + + + to.d2.n2.4.1.4 + + + + + to.d2.n2.4.2.1 + + + + + to.d2.n2.4.2.2 + + + + + to.d2.n2.4.2.3 + + + + + to.d2.n2.4.2.4 + + + + + to.d2.n2.4.3.1 + + + + + to.d2.n2.4.3.2 + + + + + to.d2.n2.4.3.3 + + + + + to.d2.n2.4.3.4 + + + + + to.d2.n2.4.4.1 + + + + + to.d2.n2.4.4.2 + + + + + to.d2.n2.4.4.3 + + + + + to.d2.n2.4.4.4 + + + + + to.d3.n1.1.1.1 + + + + + to.d3.n1.1.1.2 + + + + + to.d3.n1.1.1.3 + + + + + to.d3.n1.1.1.4 + + + + + to.d3.n1.1.2.1 + + + + + to.d3.n1.1.2.2 + + + + + to.d3.n1.1.2.3 + + + + + to.d3.n1.1.2.4 + + + + + to.d3.n1.1.3.1 + + + + + to.d3.n1.1.3.2 + + + + + to.d3.n1.1.3.3 + + + + + to.d3.n1.1.3.4 + + + + + to.d3.n1.1.4.1 + + + + + to.d3.n1.1.4.2 + + + + + to.d3.n1.1.4.3 + + + + + to.d3.n1.1.4.4 + + + + + to.d3.n1.2.1.1 + + + + + to.d3.n1.2.1.2 + + + + + to.d3.n1.2.1.3 + + + + + to.d3.n1.2.1.4 + + + + + to.d3.n1.2.2.1 + + + + + to.d3.n1.2.2.2 + + + + + to.d3.n1.2.2.3 + + + + + to.d3.n1.2.2.4 + + + + + to.d3.n1.2.3.1 + + + + + to.d3.n1.2.3.2 + + + + + to.d3.n1.2.3.3 + + + + + to.d3.n1.2.3.4 + + + + + to.d3.n1.2.4.1 + + + + + to.d3.n1.2.4.2 + + + + + to.d3.n1.2.4.3 + + + + + to.d3.n1.2.4.4 + + + + + to.d3.n1.3.1.1 + + + + + to.d3.n1.3.1.2 + + + + + to.d3.n1.3.1.3 + + + + + to.d3.n1.3.1.4 + + + + + to.d3.n1.3.2.1 + + + + + to.d3.n1.3.2.2 + + + + + to.d3.n1.3.2.3 + + + + + to.d3.n1.3.2.4 + + + + + to.d3.n1.3.3.1 + + + + + to.d3.n1.3.3.2 + + + + + to.d3.n1.3.3.3 + + + + + to.d3.n1.3.3.4 + + + + + to.d3.n1.3.4.1 + + + + + to.d3.n1.3.4.2 + + + + + to.d3.n1.3.4.3 + + + + + to.d3.n1.3.4.4 + + + + + to.d3.n1.4.1.1 + + + + + to.d3.n1.4.1.2 + + + + + to.d3.n1.4.1.3 + + + + + to.d3.n1.4.1.4 + + + + + to.d3.n1.4.2.1 + + + + + to.d3.n1.4.2.2 + + + + + to.d3.n1.4.2.3 + + + + + to.d3.n1.4.2.4 + + + + + to.d3.n1.4.3.1 + + + + + to.d3.n1.4.3.2 + + + + + to.d3.n1.4.3.3 + + + + + to.d3.n1.4.3.4 + + + + + to.d3.n1.4.4.1 + + + + + to.d3.n1.4.4.2 + + + + + to.d3.n1.4.4.3 + + + + + to.d3.n1.4.4.4 + + + + + to.d3.n2.1.1.1 + + + + + to.d3.n2.1.1.2 + + + + + to.d3.n2.1.1.3 + + + + + to.d3.n2.1.1.4 + + + + + to.d3.n2.1.2.1 + + + + + to.d3.n2.1.2.2 + + + + + to.d3.n2.1.2.3 + + + + + to.d3.n2.1.2.4 + + + + + to.d3.n2.1.3.1 + + + + + to.d3.n2.1.3.2 + + + + + to.d3.n2.1.3.3 + + + + + to.d3.n2.1.3.4 + + + + + to.d3.n2.1.4.1 + + + + + to.d3.n2.1.4.2 + + + + + to.d3.n2.1.4.3 + + + + + to.d3.n2.1.4.4 + + + + + to.d3.n2.2.1.1 + + + + + to.d3.n2.2.1.2 + + + + + to.d3.n2.2.1.3 + + + + + to.d3.n2.2.1.4 + + + + + to.d3.n2.2.2.1 + + + + + to.d3.n2.2.2.2 + + + + + to.d3.n2.2.2.3 + + + + + to.d3.n2.2.2.4 + + + + + to.d3.n2.2.3.1 + + + + + to.d3.n2.2.3.2 + + + + + to.d3.n2.2.3.3 + + + + + to.d3.n2.2.3.4 + + + + + to.d3.n2.2.4.1 + + + + + to.d3.n2.2.4.2 + + + + + to.d3.n2.2.4.3 + + + + + to.d3.n2.2.4.4 + + + + + to.d3.n2.3.1.1 + + + + + to.d3.n2.3.1.2 + + + + + to.d3.n2.3.1.3 + + + + + to.d3.n2.3.1.4 + + + + + to.d3.n2.3.2.1 + + + + + to.d3.n2.3.2.2 + + + + + to.d3.n2.3.2.3 + + + + + to.d3.n2.3.2.4 + + + + + to.d3.n2.3.3.1 + + + + + to.d3.n2.3.3.2 + + + + + to.d3.n2.3.3.3 + + + + + to.d3.n2.3.3.4 + + + + + to.d3.n2.3.4.1 + + + + + to.d3.n2.3.4.2 + + + + + to.d3.n2.3.4.3 + + + + + to.d3.n2.3.4.4 + + + + + to.d3.n2.4.1.1 + + + + + to.d3.n2.4.1.2 + + + + + to.d3.n2.4.1.3 + + + + + to.d3.n2.4.1.4 + + + + + to.d3.n2.4.2.1 + + + + + to.d3.n2.4.2.2 + + + + + to.d3.n2.4.2.3 + + + + + to.d3.n2.4.2.4 + + + + + to.d3.n2.4.3.1 + + + + + to.d3.n2.4.3.2 + + + + + to.d3.n2.4.3.3 + + + + + to.d3.n2.4.3.4 + + + + + to.d3.n2.4.4.1 + + + + + to.d3.n2.4.4.2 + + + + + to.d3.n2.4.4.3 + + + + + to.d3.n2.4.4.4 + + + + + tt.d1.n1.1.1.1 + + + + + tt.d1.n1.1.1.2 + + + + + tt.d1.n1.1.1.3 + + + + + tt.d1.n1.1.1.4 + + + + + tt.d1.n1.1.2.1 + + + + + tt.d1.n1.1.2.2 + + + + + tt.d1.n1.1.2.3 + + + + + tt.d1.n1.1.2.4 + + + + + tt.d1.n1.1.3.1 + + + + + tt.d1.n1.1.3.2 + + + + + tt.d1.n1.1.3.3 + + + + + tt.d1.n1.1.3.4 + + + + + tt.d1.n1.1.4.1 + + + + + tt.d1.n1.1.4.2 + + + + + tt.d1.n1.1.4.3 + + + + + tt.d1.n1.1.4.4 + + + + + tt.d1.n1.5.1.1 + + + + + tt.d1.n1.5.1.2 + + + + + tt.d1.n1.5.1.3 + + + + + tt.d1.n1.5.1.4 + + + + + tt.d1.n1.5.2.1 + + + + + tt.d1.n1.5.2.2 + + + + + tt.d1.n1.5.2.3 + + + + + tt.d1.n1.5.2.4 + + + + + tt.d1.n1.5.3.1 + + + + + tt.d1.n1.5.3.2 + + + + + tt.d1.n1.5.3.3 + + + + + tt.d1.n1.5.3.4 + + + + + tt.d1.n1.5.4.1 + + + + + tt.d1.n1.5.4.2 + + + + + tt.d1.n1.5.4.3 + + + + + tt.d1.n1.5.4.4 + + + + + tt.d2.n1.1.1.1 + + + + + tt.d2.n1.1.1.2 + + + + + tt.d2.n1.1.1.3 + + + + + tt.d2.n1.1.1.4 + + + + + tt.d2.n1.1.5.1 + + + + + tt.d2.n1.1.5.2 + + + + + tt.d2.n1.1.5.3 + + + + + tt.d2.n1.1.5.4 + + + + + tt.d2.n1.2.1.1 + + + + + tt.d2.n1.2.1.2 + + + + + tt.d2.n1.2.1.3 + + + + + tt.d2.n1.2.1.4 + + + + + tt.d2.n1.2.5.1 + + + + + tt.d2.n1.2.5.2 + + + + + tt.d2.n1.2.5.3 + + + + + tt.d2.n1.2.5.4 + + + + + tt.d2.n1.3.1.1 + + + + + tt.d2.n1.3.1.2 + + + + + tt.d2.n1.3.1.3 + + + + + tt.d2.n1.3.1.4 + + + + + tt.d2.n1.3.5.1 + + + + + tt.d2.n1.3.5.2 + + + + + tt.d2.n1.3.5.3 + + + + + tt.d2.n1.3.5.4 + + + + + tt.d2.n1.4.1.1 + + + + + tt.d2.n1.4.1.2 + + + + + tt.d2.n1.4.1.3 + + + + + tt.d2.n1.4.1.4 + + + + + tt.d2.n1.4.5.1 + + + + + tt.d2.n1.4.5.2 + + + + + tt.d2.n1.4.5.3 + + + + + tt.d2.n1.4.5.4 + + + + + tt.d3.n1.1.1.1 + + + + + tt.d3.n1.1.1.5 + + + + + tt.d3.n1.1.2.1 + + + + + tt.d3.n1.1.2.5 + + + + + tt.d3.n1.1.3.1 + + + + + tt.d3.n1.1.3.5 + + + + + tt.d3.n1.1.4.1 + + + + + tt.d3.n1.1.4.5 + + + + + tt.d3.n1.2.1.1 + + + + + tt.d3.n1.2.1.5 + + + + + tt.d3.n1.2.2.1 + + + + + tt.d3.n1.2.2.5 + + + + + tt.d3.n1.2.3.1 + + + + + tt.d3.n1.2.3.5 + + + + + tt.d3.n1.2.4.1 + + + + + tt.d3.n1.2.4.5 + + + + + tt.d3.n1.3.1.1 + + + + + tt.d3.n1.3.1.5 + + + + + tt.d3.n1.3.2.1 + + + + + tt.d3.n1.3.2.5 + + + + + tt.d3.n1.3.3.1 + + + + + tt.d3.n1.3.3.5 + + + + + tt.d3.n1.3.4.1 + + + + + tt.d3.n1.3.4.5 + + + + + tt.d3.n1.4.1.1 + + + + + tt.d3.n1.4.1.5 + + + + + tt.d3.n1.4.2.1 + + + + + tt.d3.n1.4.2.5 + + + + + tt.d3.n1.4.3.1 + + + + + tt.d3.n1.4.3.5 + + + + + tt.d3.n1.4.4.1 + + + + + tt.d3.n1.4.4.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/gspn/HypercubeGrid/hc4k3p3b12.pnml b/examples/gspn/HypercubeGrid/hc4k3p3b12.pnml new file mode 100755 index 000000000..ba148f497 --- /dev/null +++ b/examples/gspn/HypercubeGrid/hc4k3p3b12.pnml @@ -0,0 +1,87274 @@ + + + + + HypercubeGrid-PT-C4K3P3B12 + + + + + pb.d1.n1.1.1.1.1 + + + 3 + + + + + pb.d1.n1.1.1.1.2 + + + 3 + + + + + pb.d1.n1.1.1.1.3 + + + 3 + + + + + pb.d1.n1.1.1.2.1 + + + 3 + + + + + pb.d1.n1.1.1.2.2 + + + 3 + + + + + pb.d1.n1.1.1.2.3 + + + 3 + + + + + pb.d1.n1.1.1.3.1 + + + 3 + + + + + pb.d1.n1.1.1.3.2 + + + 3 + + + + + pb.d1.n1.1.1.3.3 + + + 3 + + + + + pb.d1.n1.1.2.1.1 + + + 3 + + + + + pb.d1.n1.1.2.1.2 + + + 3 + + + + + pb.d1.n1.1.2.1.3 + + + 3 + + + + + pb.d1.n1.1.2.2.1 + + + 3 + + + + + pb.d1.n1.1.2.2.2 + + + 3 + + + + + pb.d1.n1.1.2.2.3 + + + 3 + + + + + pb.d1.n1.1.2.3.1 + + + 3 + + + + + pb.d1.n1.1.2.3.2 + + + 3 + + + + + pb.d1.n1.1.2.3.3 + + + 3 + + + + + pb.d1.n1.1.3.1.1 + + + 3 + + + + + pb.d1.n1.1.3.1.2 + + + 3 + + + + + pb.d1.n1.1.3.1.3 + + + 3 + + + + + pb.d1.n1.1.3.2.1 + + + 3 + + + + + pb.d1.n1.1.3.2.2 + + + 3 + + + + + pb.d1.n1.1.3.2.3 + + + 3 + + + + + pb.d1.n1.1.3.3.1 + + + 3 + + + + + pb.d1.n1.1.3.3.2 + + + 3 + + + + + pb.d1.n1.1.3.3.3 + + + 3 + + + + + pb.d1.n1.2.1.1.1 + + + 3 + + + + + pb.d1.n1.2.1.1.2 + + + 3 + + + + + pb.d1.n1.2.1.1.3 + + + 3 + + + + + pb.d1.n1.2.1.2.1 + + + 3 + + + + + pb.d1.n1.2.1.2.2 + + + 3 + + + + + pb.d1.n1.2.1.2.3 + + + 3 + + + + + pb.d1.n1.2.1.3.1 + + + 3 + + + + + pb.d1.n1.2.1.3.2 + + + 3 + + + + + pb.d1.n1.2.1.3.3 + + + 3 + + + + + pb.d1.n1.2.2.1.1 + + + 3 + + + + + pb.d1.n1.2.2.1.2 + + + 3 + + + + + pb.d1.n1.2.2.1.3 + + + 3 + + + + + pb.d1.n1.2.2.2.1 + + + 3 + + + + + pb.d1.n1.2.2.2.2 + + + 3 + + + + + pb.d1.n1.2.2.2.3 + + + 3 + + + + + pb.d1.n1.2.2.3.1 + + + 3 + + + + + pb.d1.n1.2.2.3.2 + + + 3 + + + + + pb.d1.n1.2.2.3.3 + + + 3 + + + + + pb.d1.n1.2.3.1.1 + + + 3 + + + + + pb.d1.n1.2.3.1.2 + + + 3 + + + + + pb.d1.n1.2.3.1.3 + + + 3 + + + + + pb.d1.n1.2.3.2.1 + + + 3 + + + + + pb.d1.n1.2.3.2.2 + + + 3 + + + + + pb.d1.n1.2.3.2.3 + + + 3 + + + + + pb.d1.n1.2.3.3.1 + + + 3 + + + + + pb.d1.n1.2.3.3.2 + + + 3 + + + + + pb.d1.n1.2.3.3.3 + + + 3 + + + + + pb.d1.n1.3.1.1.1 + + + 3 + + + + + pb.d1.n1.3.1.1.2 + + + 3 + + + + + pb.d1.n1.3.1.1.3 + + + 3 + + + + + pb.d1.n1.3.1.2.1 + + + 3 + + + + + pb.d1.n1.3.1.2.2 + + + 3 + + + + + pb.d1.n1.3.1.2.3 + + + 3 + + + + + pb.d1.n1.3.1.3.1 + + + 3 + + + + + pb.d1.n1.3.1.3.2 + + + 3 + + + + + pb.d1.n1.3.1.3.3 + + + 3 + + + + + pb.d1.n1.3.2.1.1 + + + 3 + + + + + pb.d1.n1.3.2.1.2 + + + 3 + + + + + pb.d1.n1.3.2.1.3 + + + 3 + + + + + pb.d1.n1.3.2.2.1 + + + 3 + + + + + pb.d1.n1.3.2.2.2 + + + 3 + + + + + pb.d1.n1.3.2.2.3 + + + 3 + + + + + pb.d1.n1.3.2.3.1 + + + 3 + + + + + pb.d1.n1.3.2.3.2 + + + 3 + + + + + pb.d1.n1.3.2.3.3 + + + 3 + + + + + pb.d1.n1.3.3.1.1 + + + 3 + + + + + pb.d1.n1.3.3.1.2 + + + 3 + + + + + pb.d1.n1.3.3.1.3 + + + 3 + + + + + pb.d1.n1.3.3.2.1 + + + 3 + + + + + pb.d1.n1.3.3.2.2 + + + 3 + + + + + pb.d1.n1.3.3.2.3 + + + 3 + + + + + pb.d1.n1.3.3.3.1 + + + 3 + + + + + pb.d1.n1.3.3.3.2 + + + 3 + + + + + pb.d1.n1.3.3.3.3 + + + 3 + + + + + pb.d1.n2.1.1.1.1 + + + 3 + + + + + pb.d1.n2.1.1.1.2 + + + 3 + + + + + pb.d1.n2.1.1.1.3 + + + 3 + + + + + pb.d1.n2.1.1.2.1 + + + 3 + + + + + pb.d1.n2.1.1.2.2 + + + 3 + + + + + pb.d1.n2.1.1.2.3 + + + 3 + + + + + pb.d1.n2.1.1.3.1 + + + 3 + + + + + pb.d1.n2.1.1.3.2 + + + 3 + + + + + pb.d1.n2.1.1.3.3 + + + 3 + + + + + pb.d1.n2.1.2.1.1 + + + 3 + + + + + pb.d1.n2.1.2.1.2 + + + 3 + + + + + pb.d1.n2.1.2.1.3 + + + 3 + + + + + pb.d1.n2.1.2.2.1 + + + 3 + + + + + pb.d1.n2.1.2.2.2 + + + 3 + + + + + pb.d1.n2.1.2.2.3 + + + 3 + + + + + pb.d1.n2.1.2.3.1 + + + 3 + + + + + pb.d1.n2.1.2.3.2 + + + 3 + + + + + pb.d1.n2.1.2.3.3 + + + 3 + + + + + pb.d1.n2.1.3.1.1 + + + 3 + + + + + pb.d1.n2.1.3.1.2 + + + 3 + + + + + pb.d1.n2.1.3.1.3 + + + 3 + + + + + pb.d1.n2.1.3.2.1 + + + 3 + + + + + pb.d1.n2.1.3.2.2 + + + 3 + + + + + pb.d1.n2.1.3.2.3 + + + 3 + + + + + pb.d1.n2.1.3.3.1 + + + 3 + + + + + pb.d1.n2.1.3.3.2 + + + 3 + + + + + pb.d1.n2.1.3.3.3 + + + 3 + + + + + pb.d1.n2.2.1.1.1 + + + 3 + + + + + pb.d1.n2.2.1.1.2 + + + 3 + + + + + pb.d1.n2.2.1.1.3 + + + 3 + + + + + pb.d1.n2.2.1.2.1 + + + 3 + + + + + pb.d1.n2.2.1.2.2 + + + 3 + + + + + pb.d1.n2.2.1.2.3 + + + 3 + + + + + pb.d1.n2.2.1.3.1 + + + 3 + + + + + pb.d1.n2.2.1.3.2 + + + 3 + + + + + pb.d1.n2.2.1.3.3 + + + 3 + + + + + pb.d1.n2.2.2.1.1 + + + 3 + + + + + pb.d1.n2.2.2.1.2 + + + 3 + + + + + pb.d1.n2.2.2.1.3 + + + 3 + + + + + pb.d1.n2.2.2.2.1 + + + 3 + + + + + pb.d1.n2.2.2.2.2 + + + 3 + + + + + pb.d1.n2.2.2.2.3 + + + 3 + + + + + pb.d1.n2.2.2.3.1 + + + 3 + + + + + pb.d1.n2.2.2.3.2 + + + 3 + + + + + pb.d1.n2.2.2.3.3 + + + 3 + + + + + pb.d1.n2.2.3.1.1 + + + 3 + + + + + pb.d1.n2.2.3.1.2 + + + 3 + + + + + pb.d1.n2.2.3.1.3 + + + 3 + + + + + pb.d1.n2.2.3.2.1 + + + 3 + + + + + pb.d1.n2.2.3.2.2 + + + 3 + + + + + pb.d1.n2.2.3.2.3 + + + 3 + + + + + pb.d1.n2.2.3.3.1 + + + 3 + + + + + pb.d1.n2.2.3.3.2 + + + 3 + + + + + pb.d1.n2.2.3.3.3 + + + 3 + + + + + pb.d1.n2.3.1.1.1 + + + 3 + + + + + pb.d1.n2.3.1.1.2 + + + 3 + + + + + pb.d1.n2.3.1.1.3 + + + 3 + + + + + pb.d1.n2.3.1.2.1 + + + 3 + + + + + pb.d1.n2.3.1.2.2 + + + 3 + + + + + pb.d1.n2.3.1.2.3 + + + 3 + + + + + pb.d1.n2.3.1.3.1 + + + 3 + + + + + pb.d1.n2.3.1.3.2 + + + 3 + + + + + pb.d1.n2.3.1.3.3 + + + 3 + + + + + pb.d1.n2.3.2.1.1 + + + 3 + + + + + pb.d1.n2.3.2.1.2 + + + 3 + + + + + pb.d1.n2.3.2.1.3 + + + 3 + + + + + pb.d1.n2.3.2.2.1 + + + 3 + + + + + pb.d1.n2.3.2.2.2 + + + 3 + + + + + pb.d1.n2.3.2.2.3 + + + 3 + + + + + pb.d1.n2.3.2.3.1 + + + 3 + + + + + pb.d1.n2.3.2.3.2 + + + 3 + + + + + pb.d1.n2.3.2.3.3 + + + 3 + + + + + pb.d1.n2.3.3.1.1 + + + 3 + + + + + pb.d1.n2.3.3.1.2 + + + 3 + + + + + pb.d1.n2.3.3.1.3 + + + 3 + + + + + pb.d1.n2.3.3.2.1 + + + 3 + + + + + pb.d1.n2.3.3.2.2 + + + 3 + + + + + pb.d1.n2.3.3.2.3 + + + 3 + + + + + pb.d1.n2.3.3.3.1 + + + 3 + + + + + pb.d1.n2.3.3.3.2 + + + 3 + + + + + pb.d1.n2.3.3.3.3 + + + 3 + + + + + pb.d2.n1.1.1.1.1 + + + 3 + + + + + pb.d2.n1.1.1.1.2 + + + 3 + + + + + pb.d2.n1.1.1.1.3 + + + 3 + + + + + pb.d2.n1.1.1.2.1 + + + 3 + + + + + pb.d2.n1.1.1.2.2 + + + 3 + + + + + pb.d2.n1.1.1.2.3 + + + 3 + + + + + pb.d2.n1.1.1.3.1 + + + 3 + + + + + pb.d2.n1.1.1.3.2 + + + 3 + + + + + pb.d2.n1.1.1.3.3 + + + 3 + + + + + pb.d2.n1.1.2.1.1 + + + 3 + + + + + pb.d2.n1.1.2.1.2 + + + 3 + + + + + pb.d2.n1.1.2.1.3 + + + 3 + + + + + pb.d2.n1.1.2.2.1 + + + 3 + + + + + pb.d2.n1.1.2.2.2 + + + 3 + + + + + pb.d2.n1.1.2.2.3 + + + 3 + + + + + pb.d2.n1.1.2.3.1 + + + 3 + + + + + pb.d2.n1.1.2.3.2 + + + 3 + + + + + pb.d2.n1.1.2.3.3 + + + 3 + + + + + pb.d2.n1.1.3.1.1 + + + 3 + + + + + pb.d2.n1.1.3.1.2 + + + 3 + + + + + pb.d2.n1.1.3.1.3 + + + 3 + + + + + pb.d2.n1.1.3.2.1 + + + 3 + + + + + pb.d2.n1.1.3.2.2 + + + 3 + + + + + pb.d2.n1.1.3.2.3 + + + 3 + + + + + pb.d2.n1.1.3.3.1 + + + 3 + + + + + pb.d2.n1.1.3.3.2 + + + 3 + + + + + pb.d2.n1.1.3.3.3 + + + 3 + + + + + pb.d2.n1.2.1.1.1 + + + 3 + + + + + pb.d2.n1.2.1.1.2 + + + 3 + + + + + pb.d2.n1.2.1.1.3 + + + 3 + + + + + pb.d2.n1.2.1.2.1 + + + 3 + + + + + pb.d2.n1.2.1.2.2 + + + 3 + + + + + pb.d2.n1.2.1.2.3 + + + 3 + + + + + pb.d2.n1.2.1.3.1 + + + 3 + + + + + pb.d2.n1.2.1.3.2 + + + 3 + + + + + pb.d2.n1.2.1.3.3 + + + 3 + + + + + pb.d2.n1.2.2.1.1 + + + 3 + + + + + pb.d2.n1.2.2.1.2 + + + 3 + + + + + pb.d2.n1.2.2.1.3 + + + 3 + + + + + pb.d2.n1.2.2.2.1 + + + 3 + + + + + pb.d2.n1.2.2.2.2 + + + 3 + + + + + pb.d2.n1.2.2.2.3 + + + 3 + + + + + pb.d2.n1.2.2.3.1 + + + 3 + + + + + pb.d2.n1.2.2.3.2 + + + 3 + + + + + pb.d2.n1.2.2.3.3 + + + 3 + + + + + pb.d2.n1.2.3.1.1 + + + 3 + + + + + pb.d2.n1.2.3.1.2 + + + 3 + + + + + pb.d2.n1.2.3.1.3 + + + 3 + + + + + pb.d2.n1.2.3.2.1 + + + 3 + + + + + pb.d2.n1.2.3.2.2 + + + 3 + + + + + pb.d2.n1.2.3.2.3 + + + 3 + + + + + pb.d2.n1.2.3.3.1 + + + 3 + + + + + pb.d2.n1.2.3.3.2 + + + 3 + + + + + pb.d2.n1.2.3.3.3 + + + 3 + + + + + pb.d2.n1.3.1.1.1 + + + 3 + + + + + pb.d2.n1.3.1.1.2 + + + 3 + + + + + pb.d2.n1.3.1.1.3 + + + 3 + + + + + pb.d2.n1.3.1.2.1 + + + 3 + + + + + pb.d2.n1.3.1.2.2 + + + 3 + + + + + pb.d2.n1.3.1.2.3 + + + 3 + + + + + pb.d2.n1.3.1.3.1 + + + 3 + + + + + pb.d2.n1.3.1.3.2 + + + 3 + + + + + pb.d2.n1.3.1.3.3 + + + 3 + + + + + pb.d2.n1.3.2.1.1 + + + 3 + + + + + pb.d2.n1.3.2.1.2 + + + 3 + + + + + pb.d2.n1.3.2.1.3 + + + 3 + + + + + pb.d2.n1.3.2.2.1 + + + 3 + + + + + pb.d2.n1.3.2.2.2 + + + 3 + + + + + pb.d2.n1.3.2.2.3 + + + 3 + + + + + pb.d2.n1.3.2.3.1 + + + 3 + + + + + pb.d2.n1.3.2.3.2 + + + 3 + + + + + pb.d2.n1.3.2.3.3 + + + 3 + + + + + pb.d2.n1.3.3.1.1 + + + 3 + + + + + pb.d2.n1.3.3.1.2 + + + 3 + + + + + pb.d2.n1.3.3.1.3 + + + 3 + + + + + pb.d2.n1.3.3.2.1 + + + 3 + + + + + pb.d2.n1.3.3.2.2 + + + 3 + + + + + pb.d2.n1.3.3.2.3 + + + 3 + + + + + pb.d2.n1.3.3.3.1 + + + 3 + + + + + pb.d2.n1.3.3.3.2 + + + 3 + + + + + pb.d2.n1.3.3.3.3 + + + 3 + + + + + pb.d2.n2.1.1.1.1 + + + 3 + + + + + pb.d2.n2.1.1.1.2 + + + 3 + + + + + pb.d2.n2.1.1.1.3 + + + 3 + + + + + pb.d2.n2.1.1.2.1 + + + 3 + + + + + pb.d2.n2.1.1.2.2 + + + 3 + + + + + pb.d2.n2.1.1.2.3 + + + 3 + + + + + pb.d2.n2.1.1.3.1 + + + 3 + + + + + pb.d2.n2.1.1.3.2 + + + 3 + + + + + pb.d2.n2.1.1.3.3 + + + 3 + + + + + pb.d2.n2.1.2.1.1 + + + 3 + + + + + pb.d2.n2.1.2.1.2 + + + 3 + + + + + pb.d2.n2.1.2.1.3 + + + 3 + + + + + pb.d2.n2.1.2.2.1 + + + 3 + + + + + pb.d2.n2.1.2.2.2 + + + 3 + + + + + pb.d2.n2.1.2.2.3 + + + 3 + + + + + pb.d2.n2.1.2.3.1 + + + 3 + + + + + pb.d2.n2.1.2.3.2 + + + 3 + + + + + pb.d2.n2.1.2.3.3 + + + 3 + + + + + pb.d2.n2.1.3.1.1 + + + 3 + + + + + pb.d2.n2.1.3.1.2 + + + 3 + + + + + pb.d2.n2.1.3.1.3 + + + 3 + + + + + pb.d2.n2.1.3.2.1 + + + 3 + + + + + pb.d2.n2.1.3.2.2 + + + 3 + + + + + pb.d2.n2.1.3.2.3 + + + 3 + + + + + pb.d2.n2.1.3.3.1 + + + 3 + + + + + pb.d2.n2.1.3.3.2 + + + 3 + + + + + pb.d2.n2.1.3.3.3 + + + 3 + + + + + pb.d2.n2.2.1.1.1 + + + 3 + + + + + pb.d2.n2.2.1.1.2 + + + 3 + + + + + pb.d2.n2.2.1.1.3 + + + 3 + + + + + pb.d2.n2.2.1.2.1 + + + 3 + + + + + pb.d2.n2.2.1.2.2 + + + 3 + + + + + pb.d2.n2.2.1.2.3 + + + 3 + + + + + pb.d2.n2.2.1.3.1 + + + 3 + + + + + pb.d2.n2.2.1.3.2 + + + 3 + + + + + pb.d2.n2.2.1.3.3 + + + 3 + + + + + pb.d2.n2.2.2.1.1 + + + 3 + + + + + pb.d2.n2.2.2.1.2 + + + 3 + + + + + pb.d2.n2.2.2.1.3 + + + 3 + + + + + pb.d2.n2.2.2.2.1 + + + 3 + + + + + pb.d2.n2.2.2.2.2 + + + 3 + + + + + pb.d2.n2.2.2.2.3 + + + 3 + + + + + pb.d2.n2.2.2.3.1 + + + 3 + + + + + pb.d2.n2.2.2.3.2 + + + 3 + + + + + pb.d2.n2.2.2.3.3 + + + 3 + + + + + pb.d2.n2.2.3.1.1 + + + 3 + + + + + pb.d2.n2.2.3.1.2 + + + 3 + + + + + pb.d2.n2.2.3.1.3 + + + 3 + + + + + pb.d2.n2.2.3.2.1 + + + 3 + + + + + pb.d2.n2.2.3.2.2 + + + 3 + + + + + pb.d2.n2.2.3.2.3 + + + 3 + + + + + pb.d2.n2.2.3.3.1 + + + 3 + + + + + pb.d2.n2.2.3.3.2 + + + 3 + + + + + pb.d2.n2.2.3.3.3 + + + 3 + + + + + pb.d2.n2.3.1.1.1 + + + 3 + + + + + pb.d2.n2.3.1.1.2 + + + 3 + + + + + pb.d2.n2.3.1.1.3 + + + 3 + + + + + pb.d2.n2.3.1.2.1 + + + 3 + + + + + pb.d2.n2.3.1.2.2 + + + 3 + + + + + pb.d2.n2.3.1.2.3 + + + 3 + + + + + pb.d2.n2.3.1.3.1 + + + 3 + + + + + pb.d2.n2.3.1.3.2 + + + 3 + + + + + pb.d2.n2.3.1.3.3 + + + 3 + + + + + pb.d2.n2.3.2.1.1 + + + 3 + + + + + pb.d2.n2.3.2.1.2 + + + 3 + + + + + pb.d2.n2.3.2.1.3 + + + 3 + + + + + pb.d2.n2.3.2.2.1 + + + 3 + + + + + pb.d2.n2.3.2.2.2 + + + 3 + + + + + pb.d2.n2.3.2.2.3 + + + 3 + + + + + pb.d2.n2.3.2.3.1 + + + 3 + + + + + pb.d2.n2.3.2.3.2 + + + 3 + + + + + pb.d2.n2.3.2.3.3 + + + 3 + + + + + pb.d2.n2.3.3.1.1 + + + 3 + + + + + pb.d2.n2.3.3.1.2 + + + 3 + + + + + pb.d2.n2.3.3.1.3 + + + 3 + + + + + pb.d2.n2.3.3.2.1 + + + 3 + + + + + pb.d2.n2.3.3.2.2 + + + 3 + + + + + pb.d2.n2.3.3.2.3 + + + 3 + + + + + pb.d2.n2.3.3.3.1 + + + 3 + + + + + pb.d2.n2.3.3.3.2 + + + 3 + + + + + pb.d2.n2.3.3.3.3 + + + 3 + + + + + pb.d3.n1.1.1.1.1 + + + 3 + + + + + pb.d3.n1.1.1.1.2 + + + 3 + + + + + pb.d3.n1.1.1.1.3 + + + 3 + + + + + pb.d3.n1.1.1.2.1 + + + 3 + + + + + pb.d3.n1.1.1.2.2 + + + 3 + + + + + pb.d3.n1.1.1.2.3 + + + 3 + + + + + pb.d3.n1.1.1.3.1 + + + 3 + + + + + pb.d3.n1.1.1.3.2 + + + 3 + + + + + pb.d3.n1.1.1.3.3 + + + 3 + + + + + pb.d3.n1.1.2.1.1 + + + 3 + + + + + pb.d3.n1.1.2.1.2 + + + 3 + + + + + pb.d3.n1.1.2.1.3 + + + 3 + + + + + pb.d3.n1.1.2.2.1 + + + 3 + + + + + pb.d3.n1.1.2.2.2 + + + 3 + + + + + pb.d3.n1.1.2.2.3 + + + 3 + + + + + pb.d3.n1.1.2.3.1 + + + 3 + + + + + pb.d3.n1.1.2.3.2 + + + 3 + + + + + pb.d3.n1.1.2.3.3 + + + 3 + + + + + pb.d3.n1.1.3.1.1 + + + 3 + + + + + pb.d3.n1.1.3.1.2 + + + 3 + + + + + pb.d3.n1.1.3.1.3 + + + 3 + + + + + pb.d3.n1.1.3.2.1 + + + 3 + + + + + pb.d3.n1.1.3.2.2 + + + 3 + + + + + pb.d3.n1.1.3.2.3 + + + 3 + + + + + pb.d3.n1.1.3.3.1 + + + 3 + + + + + pb.d3.n1.1.3.3.2 + + + 3 + + + + + pb.d3.n1.1.3.3.3 + + + 3 + + + + + pb.d3.n1.2.1.1.1 + + + 3 + + + + + pb.d3.n1.2.1.1.2 + + + 3 + + + + + pb.d3.n1.2.1.1.3 + + + 3 + + + + + pb.d3.n1.2.1.2.1 + + + 3 + + + + + pb.d3.n1.2.1.2.2 + + + 3 + + + + + pb.d3.n1.2.1.2.3 + + + 3 + + + + + pb.d3.n1.2.1.3.1 + + + 3 + + + + + pb.d3.n1.2.1.3.2 + + + 3 + + + + + pb.d3.n1.2.1.3.3 + + + 3 + + + + + pb.d3.n1.2.2.1.1 + + + 3 + + + + + pb.d3.n1.2.2.1.2 + + + 3 + + + + + pb.d3.n1.2.2.1.3 + + + 3 + + + + + pb.d3.n1.2.2.2.1 + + + 3 + + + + + pb.d3.n1.2.2.2.2 + + + 3 + + + + + pb.d3.n1.2.2.2.3 + + + 3 + + + + + pb.d3.n1.2.2.3.1 + + + 3 + + + + + pb.d3.n1.2.2.3.2 + + + 3 + + + + + pb.d3.n1.2.2.3.3 + + + 3 + + + + + pb.d3.n1.2.3.1.1 + + + 3 + + + + + pb.d3.n1.2.3.1.2 + + + 3 + + + + + pb.d3.n1.2.3.1.3 + + + 3 + + + + + pb.d3.n1.2.3.2.1 + + + 3 + + + + + pb.d3.n1.2.3.2.2 + + + 3 + + + + + pb.d3.n1.2.3.2.3 + + + 3 + + + + + pb.d3.n1.2.3.3.1 + + + 3 + + + + + pb.d3.n1.2.3.3.2 + + + 3 + + + + + pb.d3.n1.2.3.3.3 + + + 3 + + + + + pb.d3.n1.3.1.1.1 + + + 3 + + + + + pb.d3.n1.3.1.1.2 + + + 3 + + + + + pb.d3.n1.3.1.1.3 + + + 3 + + + + + pb.d3.n1.3.1.2.1 + + + 3 + + + + + pb.d3.n1.3.1.2.2 + + + 3 + + + + + pb.d3.n1.3.1.2.3 + + + 3 + + + + + pb.d3.n1.3.1.3.1 + + + 3 + + + + + pb.d3.n1.3.1.3.2 + + + 3 + + + + + pb.d3.n1.3.1.3.3 + + + 3 + + + + + pb.d3.n1.3.2.1.1 + + + 3 + + + + + pb.d3.n1.3.2.1.2 + + + 3 + + + + + pb.d3.n1.3.2.1.3 + + + 3 + + + + + pb.d3.n1.3.2.2.1 + + + 3 + + + + + pb.d3.n1.3.2.2.2 + + + 3 + + + + + pb.d3.n1.3.2.2.3 + + + 3 + + + + + pb.d3.n1.3.2.3.1 + + + 3 + + + + + pb.d3.n1.3.2.3.2 + + + 3 + + + + + pb.d3.n1.3.2.3.3 + + + 3 + + + + + pb.d3.n1.3.3.1.1 + + + 3 + + + + + pb.d3.n1.3.3.1.2 + + + 3 + + + + + pb.d3.n1.3.3.1.3 + + + 3 + + + + + pb.d3.n1.3.3.2.1 + + + 3 + + + + + pb.d3.n1.3.3.2.2 + + + 3 + + + + + pb.d3.n1.3.3.2.3 + + + 3 + + + + + pb.d3.n1.3.3.3.1 + + + 3 + + + + + pb.d3.n1.3.3.3.2 + + + 3 + + + + + pb.d3.n1.3.3.3.3 + + + 3 + + + + + pb.d3.n2.1.1.1.1 + + + 3 + + + + + pb.d3.n2.1.1.1.2 + + + 3 + + + + + pb.d3.n2.1.1.1.3 + + + 3 + + + + + pb.d3.n2.1.1.2.1 + + + 3 + + + + + pb.d3.n2.1.1.2.2 + + + 3 + + + + + pb.d3.n2.1.1.2.3 + + + 3 + + + + + pb.d3.n2.1.1.3.1 + + + 3 + + + + + pb.d3.n2.1.1.3.2 + + + 3 + + + + + pb.d3.n2.1.1.3.3 + + + 3 + + + + + pb.d3.n2.1.2.1.1 + + + 3 + + + + + pb.d3.n2.1.2.1.2 + + + 3 + + + + + pb.d3.n2.1.2.1.3 + + + 3 + + + + + pb.d3.n2.1.2.2.1 + + + 3 + + + + + pb.d3.n2.1.2.2.2 + + + 3 + + + + + pb.d3.n2.1.2.2.3 + + + 3 + + + + + pb.d3.n2.1.2.3.1 + + + 3 + + + + + pb.d3.n2.1.2.3.2 + + + 3 + + + + + pb.d3.n2.1.2.3.3 + + + 3 + + + + + pb.d3.n2.1.3.1.1 + + + 3 + + + + + pb.d3.n2.1.3.1.2 + + + 3 + + + + + pb.d3.n2.1.3.1.3 + + + 3 + + + + + pb.d3.n2.1.3.2.1 + + + 3 + + + + + pb.d3.n2.1.3.2.2 + + + 3 + + + + + pb.d3.n2.1.3.2.3 + + + 3 + + + + + pb.d3.n2.1.3.3.1 + + + 3 + + + + + pb.d3.n2.1.3.3.2 + + + 3 + + + + + pb.d3.n2.1.3.3.3 + + + 3 + + + + + pb.d3.n2.2.1.1.1 + + + 3 + + + + + pb.d3.n2.2.1.1.2 + + + 3 + + + + + pb.d3.n2.2.1.1.3 + + + 3 + + + + + pb.d3.n2.2.1.2.1 + + + 3 + + + + + pb.d3.n2.2.1.2.2 + + + 3 + + + + + pb.d3.n2.2.1.2.3 + + + 3 + + + + + pb.d3.n2.2.1.3.1 + + + 3 + + + + + pb.d3.n2.2.1.3.2 + + + 3 + + + + + pb.d3.n2.2.1.3.3 + + + 3 + + + + + pb.d3.n2.2.2.1.1 + + + 3 + + + + + pb.d3.n2.2.2.1.2 + + + 3 + + + + + pb.d3.n2.2.2.1.3 + + + 3 + + + + + pb.d3.n2.2.2.2.1 + + + 3 + + + + + pb.d3.n2.2.2.2.2 + + + 3 + + + + + pb.d3.n2.2.2.2.3 + + + 3 + + + + + pb.d3.n2.2.2.3.1 + + + 3 + + + + + pb.d3.n2.2.2.3.2 + + + 3 + + + + + pb.d3.n2.2.2.3.3 + + + 3 + + + + + pb.d3.n2.2.3.1.1 + + + 3 + + + + + pb.d3.n2.2.3.1.2 + + + 3 + + + + + pb.d3.n2.2.3.1.3 + + + 3 + + + + + pb.d3.n2.2.3.2.1 + + + 3 + + + + + pb.d3.n2.2.3.2.2 + + + 3 + + + + + pb.d3.n2.2.3.2.3 + + + 3 + + + + + pb.d3.n2.2.3.3.1 + + + 3 + + + + + pb.d3.n2.2.3.3.2 + + + 3 + + + + + pb.d3.n2.2.3.3.3 + + + 3 + + + + + pb.d3.n2.3.1.1.1 + + + 3 + + + + + pb.d3.n2.3.1.1.2 + + + 3 + + + + + pb.d3.n2.3.1.1.3 + + + 3 + + + + + pb.d3.n2.3.1.2.1 + + + 3 + + + + + pb.d3.n2.3.1.2.2 + + + 3 + + + + + pb.d3.n2.3.1.2.3 + + + 3 + + + + + pb.d3.n2.3.1.3.1 + + + 3 + + + + + pb.d3.n2.3.1.3.2 + + + 3 + + + + + pb.d3.n2.3.1.3.3 + + + 3 + + + + + pb.d3.n2.3.2.1.1 + + + 3 + + + + + pb.d3.n2.3.2.1.2 + + + 3 + + + + + pb.d3.n2.3.2.1.3 + + + 3 + + + + + pb.d3.n2.3.2.2.1 + + + 3 + + + + + pb.d3.n2.3.2.2.2 + + + 3 + + + + + pb.d3.n2.3.2.2.3 + + + 3 + + + + + pb.d3.n2.3.2.3.1 + + + 3 + + + + + pb.d3.n2.3.2.3.2 + + + 3 + + + + + pb.d3.n2.3.2.3.3 + + + 3 + + + + + pb.d3.n2.3.3.1.1 + + + 3 + + + + + pb.d3.n2.3.3.1.2 + + + 3 + + + + + pb.d3.n2.3.3.1.3 + + + 3 + + + + + pb.d3.n2.3.3.2.1 + + + 3 + + + + + pb.d3.n2.3.3.2.2 + + + 3 + + + + + pb.d3.n2.3.3.2.3 + + + 3 + + + + + pb.d3.n2.3.3.3.1 + + + 3 + + + + + pb.d3.n2.3.3.3.2 + + + 3 + + + + + pb.d3.n2.3.3.3.3 + + + 3 + + + + + pb.d4.n1.1.1.1.1 + + + 3 + + + + + pb.d4.n1.1.1.1.2 + + + 3 + + + + + pb.d4.n1.1.1.1.3 + + + 3 + + + + + pb.d4.n1.1.1.2.1 + + + 3 + + + + + pb.d4.n1.1.1.2.2 + + + 3 + + + + + pb.d4.n1.1.1.2.3 + + + 3 + + + + + pb.d4.n1.1.1.3.1 + + + 3 + + + + + pb.d4.n1.1.1.3.2 + + + 3 + + + + + pb.d4.n1.1.1.3.3 + + + 3 + + + + + pb.d4.n1.1.2.1.1 + + + 3 + + + + + pb.d4.n1.1.2.1.2 + + + 3 + + + + + pb.d4.n1.1.2.1.3 + + + 3 + + + + + pb.d4.n1.1.2.2.1 + + + 3 + + + + + pb.d4.n1.1.2.2.2 + + + 3 + + + + + pb.d4.n1.1.2.2.3 + + + 3 + + + + + pb.d4.n1.1.2.3.1 + + + 3 + + + + + pb.d4.n1.1.2.3.2 + + + 3 + + + + + pb.d4.n1.1.2.3.3 + + + 3 + + + + + pb.d4.n1.1.3.1.1 + + + 3 + + + + + pb.d4.n1.1.3.1.2 + + + 3 + + + + + pb.d4.n1.1.3.1.3 + + + 3 + + + + + pb.d4.n1.1.3.2.1 + + + 3 + + + + + pb.d4.n1.1.3.2.2 + + + 3 + + + + + pb.d4.n1.1.3.2.3 + + + 3 + + + + + pb.d4.n1.1.3.3.1 + + + 3 + + + + + pb.d4.n1.1.3.3.2 + + + 3 + + + + + pb.d4.n1.1.3.3.3 + + + 3 + + + + + pb.d4.n1.2.1.1.1 + + + 3 + + + + + pb.d4.n1.2.1.1.2 + + + 3 + + + + + pb.d4.n1.2.1.1.3 + + + 3 + + + + + pb.d4.n1.2.1.2.1 + + + 3 + + + + + pb.d4.n1.2.1.2.2 + + + 3 + + + + + pb.d4.n1.2.1.2.3 + + + 3 + + + + + pb.d4.n1.2.1.3.1 + + + 3 + + + + + pb.d4.n1.2.1.3.2 + + + 3 + + + + + pb.d4.n1.2.1.3.3 + + + 3 + + + + + pb.d4.n1.2.2.1.1 + + + 3 + + + + + pb.d4.n1.2.2.1.2 + + + 3 + + + + + pb.d4.n1.2.2.1.3 + + + 3 + + + + + pb.d4.n1.2.2.2.1 + + + 3 + + + + + pb.d4.n1.2.2.2.2 + + + 3 + + + + + pb.d4.n1.2.2.2.3 + + + 3 + + + + + pb.d4.n1.2.2.3.1 + + + 3 + + + + + pb.d4.n1.2.2.3.2 + + + 3 + + + + + pb.d4.n1.2.2.3.3 + + + 3 + + + + + pb.d4.n1.2.3.1.1 + + + 3 + + + + + pb.d4.n1.2.3.1.2 + + + 3 + + + + + pb.d4.n1.2.3.1.3 + + + 3 + + + + + pb.d4.n1.2.3.2.1 + + + 3 + + + + + pb.d4.n1.2.3.2.2 + + + 3 + + + + + pb.d4.n1.2.3.2.3 + + + 3 + + + + + pb.d4.n1.2.3.3.1 + + + 3 + + + + + pb.d4.n1.2.3.3.2 + + + 3 + + + + + pb.d4.n1.2.3.3.3 + + + 3 + + + + + pb.d4.n1.3.1.1.1 + + + 3 + + + + + pb.d4.n1.3.1.1.2 + + + 3 + + + + + pb.d4.n1.3.1.1.3 + + + 3 + + + + + pb.d4.n1.3.1.2.1 + + + 3 + + + + + pb.d4.n1.3.1.2.2 + + + 3 + + + + + pb.d4.n1.3.1.2.3 + + + 3 + + + + + pb.d4.n1.3.1.3.1 + + + 3 + + + + + pb.d4.n1.3.1.3.2 + + + 3 + + + + + pb.d4.n1.3.1.3.3 + + + 3 + + + + + pb.d4.n1.3.2.1.1 + + + 3 + + + + + pb.d4.n1.3.2.1.2 + + + 3 + + + + + pb.d4.n1.3.2.1.3 + + + 3 + + + + + pb.d4.n1.3.2.2.1 + + + 3 + + + + + pb.d4.n1.3.2.2.2 + + + 3 + + + + + pb.d4.n1.3.2.2.3 + + + 3 + + + + + pb.d4.n1.3.2.3.1 + + + 3 + + + + + pb.d4.n1.3.2.3.2 + + + 3 + + + + + pb.d4.n1.3.2.3.3 + + + 3 + + + + + pb.d4.n1.3.3.1.1 + + + 3 + + + + + pb.d4.n1.3.3.1.2 + + + 3 + + + + + pb.d4.n1.3.3.1.3 + + + 3 + + + + + pb.d4.n1.3.3.2.1 + + + 3 + + + + + pb.d4.n1.3.3.2.2 + + + 3 + + + + + pb.d4.n1.3.3.2.3 + + + 3 + + + + + pb.d4.n1.3.3.3.1 + + + 3 + + + + + pb.d4.n1.3.3.3.2 + + + 3 + + + + + pb.d4.n1.3.3.3.3 + + + 3 + + + + + pb.d4.n2.1.1.1.1 + + + 3 + + + + + pb.d4.n2.1.1.1.2 + + + 3 + + + + + pb.d4.n2.1.1.1.3 + + + 3 + + + + + pb.d4.n2.1.1.2.1 + + + 3 + + + + + pb.d4.n2.1.1.2.2 + + + 3 + + + + + pb.d4.n2.1.1.2.3 + + + 3 + + + + + pb.d4.n2.1.1.3.1 + + + 3 + + + + + pb.d4.n2.1.1.3.2 + + + 3 + + + + + pb.d4.n2.1.1.3.3 + + + 3 + + + + + pb.d4.n2.1.2.1.1 + + + 3 + + + + + pb.d4.n2.1.2.1.2 + + + 3 + + + + + pb.d4.n2.1.2.1.3 + + + 3 + + + + + pb.d4.n2.1.2.2.1 + + + 3 + + + + + pb.d4.n2.1.2.2.2 + + + 3 + + + + + pb.d4.n2.1.2.2.3 + + + 3 + + + + + pb.d4.n2.1.2.3.1 + + + 3 + + + + + pb.d4.n2.1.2.3.2 + + + 3 + + + + + pb.d4.n2.1.2.3.3 + + + 3 + + + + + pb.d4.n2.1.3.1.1 + + + 3 + + + + + pb.d4.n2.1.3.1.2 + + + 3 + + + + + pb.d4.n2.1.3.1.3 + + + 3 + + + + + pb.d4.n2.1.3.2.1 + + + 3 + + + + + pb.d4.n2.1.3.2.2 + + + 3 + + + + + pb.d4.n2.1.3.2.3 + + + 3 + + + + + pb.d4.n2.1.3.3.1 + + + 3 + + + + + pb.d4.n2.1.3.3.2 + + + 3 + + + + + pb.d4.n2.1.3.3.3 + + + 3 + + + + + pb.d4.n2.2.1.1.1 + + + 3 + + + + + pb.d4.n2.2.1.1.2 + + + 3 + + + + + pb.d4.n2.2.1.1.3 + + + 3 + + + + + pb.d4.n2.2.1.2.1 + + + 3 + + + + + pb.d4.n2.2.1.2.2 + + + 3 + + + + + pb.d4.n2.2.1.2.3 + + + 3 + + + + + pb.d4.n2.2.1.3.1 + + + 3 + + + + + pb.d4.n2.2.1.3.2 + + + 3 + + + + + pb.d4.n2.2.1.3.3 + + + 3 + + + + + pb.d4.n2.2.2.1.1 + + + 3 + + + + + pb.d4.n2.2.2.1.2 + + + 3 + + + + + pb.d4.n2.2.2.1.3 + + + 3 + + + + + pb.d4.n2.2.2.2.1 + + + 3 + + + + + pb.d4.n2.2.2.2.2 + + + 3 + + + + + pb.d4.n2.2.2.2.3 + + + 3 + + + + + pb.d4.n2.2.2.3.1 + + + 3 + + + + + pb.d4.n2.2.2.3.2 + + + 3 + + + + + pb.d4.n2.2.2.3.3 + + + 3 + + + + + pb.d4.n2.2.3.1.1 + + + 3 + + + + + pb.d4.n2.2.3.1.2 + + + 3 + + + + + pb.d4.n2.2.3.1.3 + + + 3 + + + + + pb.d4.n2.2.3.2.1 + + + 3 + + + + + pb.d4.n2.2.3.2.2 + + + 3 + + + + + pb.d4.n2.2.3.2.3 + + + 3 + + + + + pb.d4.n2.2.3.3.1 + + + 3 + + + + + pb.d4.n2.2.3.3.2 + + + 3 + + + + + pb.d4.n2.2.3.3.3 + + + 3 + + + + + pb.d4.n2.3.1.1.1 + + + 3 + + + + + pb.d4.n2.3.1.1.2 + + + 3 + + + + + pb.d4.n2.3.1.1.3 + + + 3 + + + + + pb.d4.n2.3.1.2.1 + + + 3 + + + + + pb.d4.n2.3.1.2.2 + + + 3 + + + + + pb.d4.n2.3.1.2.3 + + + 3 + + + + + pb.d4.n2.3.1.3.1 + + + 3 + + + + + pb.d4.n2.3.1.3.2 + + + 3 + + + + + pb.d4.n2.3.1.3.3 + + + 3 + + + + + pb.d4.n2.3.2.1.1 + + + 3 + + + + + pb.d4.n2.3.2.1.2 + + + 3 + + + + + pb.d4.n2.3.2.1.3 + + + 3 + + + + + pb.d4.n2.3.2.2.1 + + + 3 + + + + + pb.d4.n2.3.2.2.2 + + + 3 + + + + + pb.d4.n2.3.2.2.3 + + + 3 + + + + + pb.d4.n2.3.2.3.1 + + + 3 + + + + + pb.d4.n2.3.2.3.2 + + + 3 + + + + + pb.d4.n2.3.2.3.3 + + + 3 + + + + + pb.d4.n2.3.3.1.1 + + + 3 + + + + + pb.d4.n2.3.3.1.2 + + + 3 + + + + + pb.d4.n2.3.3.1.3 + + + 3 + + + + + pb.d4.n2.3.3.2.1 + + + 3 + + + + + pb.d4.n2.3.3.2.2 + + + 3 + + + + + pb.d4.n2.3.3.2.3 + + + 3 + + + + + pb.d4.n2.3.3.3.1 + + + 3 + + + + + pb.d4.n2.3.3.3.2 + + + 3 + + + + + pb.d4.n2.3.3.3.3 + + + 3 + + + + + pbl.1.1.1.1 + + + 12 + + + + + pbl.1.1.1.2 + + + 12 + + + + + pbl.1.1.1.3 + + + 12 + + + + + pbl.1.1.2.1 + + + 12 + + + + + pbl.1.1.2.2 + + + 12 + + + + + pbl.1.1.2.3 + + + 12 + + + + + pbl.1.1.3.1 + + + 12 + + + + + pbl.1.1.3.2 + + + 12 + + + + + pbl.1.1.3.3 + + + 12 + + + + + pbl.1.2.1.1 + + + 12 + + + + + pbl.1.2.1.2 + + + 12 + + + + + pbl.1.2.1.3 + + + 12 + + + + + pbl.1.2.2.1 + + + 12 + + + + + pbl.1.2.2.2 + + + 12 + + + + + pbl.1.2.2.3 + + + 12 + + + + + pbl.1.2.3.1 + + + 12 + + + + + pbl.1.2.3.2 + + + 12 + + + + + pbl.1.2.3.3 + + + 12 + + + + + pbl.1.3.1.1 + + + 12 + + + + + pbl.1.3.1.2 + + + 12 + + + + + pbl.1.3.1.3 + + + 12 + + + + + pbl.1.3.2.1 + + + 12 + + + + + pbl.1.3.2.2 + + + 12 + + + + + pbl.1.3.2.3 + + + 12 + + + + + pbl.1.3.3.1 + + + 12 + + + + + pbl.1.3.3.2 + + + 12 + + + + + pbl.1.3.3.3 + + + 12 + + + + + pbl.2.1.1.1 + + + 12 + + + + + pbl.2.1.1.2 + + + 12 + + + + + pbl.2.1.1.3 + + + 12 + + + + + pbl.2.1.2.1 + + + 12 + + + + + pbl.2.1.2.2 + + + 12 + + + + + pbl.2.1.2.3 + + + 12 + + + + + pbl.2.1.3.1 + + + 12 + + + + + pbl.2.1.3.2 + + + 12 + + + + + pbl.2.1.3.3 + + + 12 + + + + + pbl.2.2.1.1 + + + 12 + + + + + pbl.2.2.1.2 + + + 12 + + + + + pbl.2.2.1.3 + + + 12 + + + + + pbl.2.2.2.1 + + + 12 + + + + + pbl.2.2.2.2 + + + 12 + + + + + pbl.2.2.2.3 + + + 12 + + + + + pbl.2.2.3.1 + + + 12 + + + + + pbl.2.2.3.2 + + + 12 + + + + + pbl.2.2.3.3 + + + 12 + + + + + pbl.2.3.1.1 + + + 12 + + + + + pbl.2.3.1.2 + + + 12 + + + + + pbl.2.3.1.3 + + + 12 + + + + + pbl.2.3.2.1 + + + 12 + + + + + pbl.2.3.2.2 + + + 12 + + + + + pbl.2.3.2.3 + + + 12 + + + + + pbl.2.3.3.1 + + + 12 + + + + + pbl.2.3.3.2 + + + 12 + + + + + pbl.2.3.3.3 + + + 12 + + + + + pbl.3.1.1.1 + + + 12 + + + + + pbl.3.1.1.2 + + + 12 + + + + + pbl.3.1.1.3 + + + 12 + + + + + pbl.3.1.2.1 + + + 12 + + + + + pbl.3.1.2.2 + + + 12 + + + + + pbl.3.1.2.3 + + + 12 + + + + + pbl.3.1.3.1 + + + 12 + + + + + pbl.3.1.3.2 + + + 12 + + + + + pbl.3.1.3.3 + + + 12 + + + + + pbl.3.2.1.1 + + + 12 + + + + + pbl.3.2.1.2 + + + 12 + + + + + pbl.3.2.1.3 + + + 12 + + + + + pbl.3.2.2.1 + + + 12 + + + + + pbl.3.2.2.2 + + + 12 + + + + + pbl.3.2.2.3 + + + 12 + + + + + pbl.3.2.3.1 + + + 12 + + + + + pbl.3.2.3.2 + + + 12 + + + + + pbl.3.2.3.3 + + + 12 + + + + + pbl.3.3.1.1 + + + 12 + + + + + pbl.3.3.1.2 + + + 12 + + + + + pbl.3.3.1.3 + + + 12 + + + + + pbl.3.3.2.1 + + + 12 + + + + + pbl.3.3.2.2 + + + 12 + + + + + pbl.3.3.2.3 + + + 12 + + + + + pbl.3.3.3.1 + + + 12 + + + + + pbl.3.3.3.2 + + + 12 + + + + + pbl.3.3.3.3 + + + 12 + + + + + pi.d1.n1.1.1.1.1 + + + + + pi.d1.n1.1.1.1.2 + + + + + pi.d1.n1.1.1.1.3 + + + + + pi.d1.n1.1.1.2.1 + + + + + pi.d1.n1.1.1.2.2 + + + + + pi.d1.n1.1.1.2.3 + + + + + pi.d1.n1.1.1.3.1 + + + + + pi.d1.n1.1.1.3.2 + + + + + pi.d1.n1.1.1.3.3 + + + + + pi.d1.n1.1.2.1.1 + + + + + pi.d1.n1.1.2.1.2 + + + + + pi.d1.n1.1.2.1.3 + + + + + pi.d1.n1.1.2.2.1 + + + + + pi.d1.n1.1.2.2.2 + + + + + pi.d1.n1.1.2.2.3 + + + + + pi.d1.n1.1.2.3.1 + + + + + pi.d1.n1.1.2.3.2 + + + + + pi.d1.n1.1.2.3.3 + + + + + pi.d1.n1.1.3.1.1 + + + + + pi.d1.n1.1.3.1.2 + + + + + pi.d1.n1.1.3.1.3 + + + + + pi.d1.n1.1.3.2.1 + + + + + pi.d1.n1.1.3.2.2 + + + + + pi.d1.n1.1.3.2.3 + + + + + pi.d1.n1.1.3.3.1 + + + + + pi.d1.n1.1.3.3.2 + + + + + pi.d1.n1.1.3.3.3 + + + + + pi.d1.n1.2.1.1.1 + + + + + pi.d1.n1.2.1.1.2 + + + + + pi.d1.n1.2.1.1.3 + + + + + pi.d1.n1.2.1.2.1 + + + + + pi.d1.n1.2.1.2.2 + + + + + pi.d1.n1.2.1.2.3 + + + + + pi.d1.n1.2.1.3.1 + + + + + pi.d1.n1.2.1.3.2 + + + + + pi.d1.n1.2.1.3.3 + + + + + pi.d1.n1.2.2.1.1 + + + + + pi.d1.n1.2.2.1.2 + + + + + pi.d1.n1.2.2.1.3 + + + + + pi.d1.n1.2.2.2.1 + + + + + pi.d1.n1.2.2.2.2 + + + + + pi.d1.n1.2.2.2.3 + + + + + pi.d1.n1.2.2.3.1 + + + + + pi.d1.n1.2.2.3.2 + + + + + pi.d1.n1.2.2.3.3 + + + + + pi.d1.n1.2.3.1.1 + + + + + pi.d1.n1.2.3.1.2 + + + + + pi.d1.n1.2.3.1.3 + + + + + pi.d1.n1.2.3.2.1 + + + + + pi.d1.n1.2.3.2.2 + + + + + pi.d1.n1.2.3.2.3 + + + + + pi.d1.n1.2.3.3.1 + + + + + pi.d1.n1.2.3.3.2 + + + + + pi.d1.n1.2.3.3.3 + + + + + pi.d1.n1.3.1.1.1 + + + + + pi.d1.n1.3.1.1.2 + + + + + pi.d1.n1.3.1.1.3 + + + + + pi.d1.n1.3.1.2.1 + + + + + pi.d1.n1.3.1.2.2 + + + + + pi.d1.n1.3.1.2.3 + + + + + pi.d1.n1.3.1.3.1 + + + + + pi.d1.n1.3.1.3.2 + + + + + pi.d1.n1.3.1.3.3 + + + + + pi.d1.n1.3.2.1.1 + + + + + pi.d1.n1.3.2.1.2 + + + + + pi.d1.n1.3.2.1.3 + + + + + pi.d1.n1.3.2.2.1 + + + + + pi.d1.n1.3.2.2.2 + + + + + pi.d1.n1.3.2.2.3 + + + + + pi.d1.n1.3.2.3.1 + + + + + pi.d1.n1.3.2.3.2 + + + + + pi.d1.n1.3.2.3.3 + + + + + pi.d1.n1.3.3.1.1 + + + + + pi.d1.n1.3.3.1.2 + + + + + pi.d1.n1.3.3.1.3 + + + + + pi.d1.n1.3.3.2.1 + + + + + pi.d1.n1.3.3.2.2 + + + + + pi.d1.n1.3.3.2.3 + + + + + pi.d1.n1.3.3.3.1 + + + + + pi.d1.n1.3.3.3.2 + + + + + pi.d1.n1.3.3.3.3 + + + + + pi.d1.n1.4.1.1.1 + + + + + pi.d1.n1.4.1.1.2 + + + + + pi.d1.n1.4.1.1.3 + + + + + pi.d1.n1.4.1.2.1 + + + + + pi.d1.n1.4.1.2.2 + + + + + pi.d1.n1.4.1.2.3 + + + + + pi.d1.n1.4.1.3.1 + + + + + pi.d1.n1.4.1.3.2 + + + + + pi.d1.n1.4.1.3.3 + + + + + pi.d1.n1.4.2.1.1 + + + + + pi.d1.n1.4.2.1.2 + + + + + pi.d1.n1.4.2.1.3 + + + + + pi.d1.n1.4.2.2.1 + + + + + pi.d1.n1.4.2.2.2 + + + + + pi.d1.n1.4.2.2.3 + + + + + pi.d1.n1.4.2.3.1 + + + + + pi.d1.n1.4.2.3.2 + + + + + pi.d1.n1.4.2.3.3 + + + + + pi.d1.n1.4.3.1.1 + + + + + pi.d1.n1.4.3.1.2 + + + + + pi.d1.n1.4.3.1.3 + + + + + pi.d1.n1.4.3.2.1 + + + + + pi.d1.n1.4.3.2.2 + + + + + pi.d1.n1.4.3.2.3 + + + + + pi.d1.n1.4.3.3.1 + + + + + pi.d1.n1.4.3.3.2 + + + + + pi.d1.n1.4.3.3.3 + + + + + pi.d2.n1.1.1.1.1 + + + + + pi.d2.n1.1.1.1.2 + + + + + pi.d2.n1.1.1.1.3 + + + + + pi.d2.n1.1.1.2.1 + + + + + pi.d2.n1.1.1.2.2 + + + + + pi.d2.n1.1.1.2.3 + + + + + pi.d2.n1.1.1.3.1 + + + + + pi.d2.n1.1.1.3.2 + + + + + pi.d2.n1.1.1.3.3 + + + + + pi.d2.n1.1.2.1.1 + + + + + pi.d2.n1.1.2.1.2 + + + + + pi.d2.n1.1.2.1.3 + + + + + pi.d2.n1.1.2.2.1 + + + + + pi.d2.n1.1.2.2.2 + + + + + pi.d2.n1.1.2.2.3 + + + + + pi.d2.n1.1.2.3.1 + + + + + pi.d2.n1.1.2.3.2 + + + + + pi.d2.n1.1.2.3.3 + + + + + pi.d2.n1.1.3.1.1 + + + + + pi.d2.n1.1.3.1.2 + + + + + pi.d2.n1.1.3.1.3 + + + + + pi.d2.n1.1.3.2.1 + + + + + pi.d2.n1.1.3.2.2 + + + + + pi.d2.n1.1.3.2.3 + + + + + pi.d2.n1.1.3.3.1 + + + + + pi.d2.n1.1.3.3.2 + + + + + pi.d2.n1.1.3.3.3 + + + + + pi.d2.n1.1.4.1.1 + + + + + pi.d2.n1.1.4.1.2 + + + + + pi.d2.n1.1.4.1.3 + + + + + pi.d2.n1.1.4.2.1 + + + + + pi.d2.n1.1.4.2.2 + + + + + pi.d2.n1.1.4.2.3 + + + + + pi.d2.n1.1.4.3.1 + + + + + pi.d2.n1.1.4.3.2 + + + + + pi.d2.n1.1.4.3.3 + + + + + pi.d2.n1.2.1.1.1 + + + + + pi.d2.n1.2.1.1.2 + + + + + pi.d2.n1.2.1.1.3 + + + + + pi.d2.n1.2.1.2.1 + + + + + pi.d2.n1.2.1.2.2 + + + + + pi.d2.n1.2.1.2.3 + + + + + pi.d2.n1.2.1.3.1 + + + + + pi.d2.n1.2.1.3.2 + + + + + pi.d2.n1.2.1.3.3 + + + + + pi.d2.n1.2.2.1.1 + + + + + pi.d2.n1.2.2.1.2 + + + + + pi.d2.n1.2.2.1.3 + + + + + pi.d2.n1.2.2.2.1 + + + + + pi.d2.n1.2.2.2.2 + + + + + pi.d2.n1.2.2.2.3 + + + + + pi.d2.n1.2.2.3.1 + + + + + pi.d2.n1.2.2.3.2 + + + + + pi.d2.n1.2.2.3.3 + + + + + pi.d2.n1.2.3.1.1 + + + + + pi.d2.n1.2.3.1.2 + + + + + pi.d2.n1.2.3.1.3 + + + + + pi.d2.n1.2.3.2.1 + + + + + pi.d2.n1.2.3.2.2 + + + + + pi.d2.n1.2.3.2.3 + + + + + pi.d2.n1.2.3.3.1 + + + + + pi.d2.n1.2.3.3.2 + + + + + pi.d2.n1.2.3.3.3 + + + + + pi.d2.n1.2.4.1.1 + + + + + pi.d2.n1.2.4.1.2 + + + + + pi.d2.n1.2.4.1.3 + + + + + pi.d2.n1.2.4.2.1 + + + + + pi.d2.n1.2.4.2.2 + + + + + pi.d2.n1.2.4.2.3 + + + + + pi.d2.n1.2.4.3.1 + + + + + pi.d2.n1.2.4.3.2 + + + + + pi.d2.n1.2.4.3.3 + + + + + pi.d2.n1.3.1.1.1 + + + + + pi.d2.n1.3.1.1.2 + + + + + pi.d2.n1.3.1.1.3 + + + + + pi.d2.n1.3.1.2.1 + + + + + pi.d2.n1.3.1.2.2 + + + + + pi.d2.n1.3.1.2.3 + + + + + pi.d2.n1.3.1.3.1 + + + + + pi.d2.n1.3.1.3.2 + + + + + pi.d2.n1.3.1.3.3 + + + + + pi.d2.n1.3.2.1.1 + + + + + pi.d2.n1.3.2.1.2 + + + + + pi.d2.n1.3.2.1.3 + + + + + pi.d2.n1.3.2.2.1 + + + + + pi.d2.n1.3.2.2.2 + + + + + pi.d2.n1.3.2.2.3 + + + + + pi.d2.n1.3.2.3.1 + + + + + pi.d2.n1.3.2.3.2 + + + + + pi.d2.n1.3.2.3.3 + + + + + pi.d2.n1.3.3.1.1 + + + + + pi.d2.n1.3.3.1.2 + + + + + pi.d2.n1.3.3.1.3 + + + + + pi.d2.n1.3.3.2.1 + + + + + pi.d2.n1.3.3.2.2 + + + + + pi.d2.n1.3.3.2.3 + + + + + pi.d2.n1.3.3.3.1 + + + + + pi.d2.n1.3.3.3.2 + + + + + pi.d2.n1.3.3.3.3 + + + + + pi.d2.n1.3.4.1.1 + + + + + pi.d2.n1.3.4.1.2 + + + + + pi.d2.n1.3.4.1.3 + + + + + pi.d2.n1.3.4.2.1 + + + + + pi.d2.n1.3.4.2.2 + + + + + pi.d2.n1.3.4.2.3 + + + + + pi.d2.n1.3.4.3.1 + + + + + pi.d2.n1.3.4.3.2 + + + + + pi.d2.n1.3.4.3.3 + + + + + pi.d3.n1.1.1.1.1 + + + + + pi.d3.n1.1.1.1.2 + + + + + pi.d3.n1.1.1.1.3 + + + + + pi.d3.n1.1.1.2.1 + + + + + pi.d3.n1.1.1.2.2 + + + + + pi.d3.n1.1.1.2.3 + + + + + pi.d3.n1.1.1.3.1 + + + + + pi.d3.n1.1.1.3.2 + + + + + pi.d3.n1.1.1.3.3 + + + + + pi.d3.n1.1.1.4.1 + + + + + pi.d3.n1.1.1.4.2 + + + + + pi.d3.n1.1.1.4.3 + + + + + pi.d3.n1.1.2.1.1 + + + + + pi.d3.n1.1.2.1.2 + + + + + pi.d3.n1.1.2.1.3 + + + + + pi.d3.n1.1.2.2.1 + + + + + pi.d3.n1.1.2.2.2 + + + + + pi.d3.n1.1.2.2.3 + + + + + pi.d3.n1.1.2.3.1 + + + + + pi.d3.n1.1.2.3.2 + + + + + pi.d3.n1.1.2.3.3 + + + + + pi.d3.n1.1.2.4.1 + + + + + pi.d3.n1.1.2.4.2 + + + + + pi.d3.n1.1.2.4.3 + + + + + pi.d3.n1.1.3.1.1 + + + + + pi.d3.n1.1.3.1.2 + + + + + pi.d3.n1.1.3.1.3 + + + + + pi.d3.n1.1.3.2.1 + + + + + pi.d3.n1.1.3.2.2 + + + + + pi.d3.n1.1.3.2.3 + + + + + pi.d3.n1.1.3.3.1 + + + + + pi.d3.n1.1.3.3.2 + + + + + pi.d3.n1.1.3.3.3 + + + + + pi.d3.n1.1.3.4.1 + + + + + pi.d3.n1.1.3.4.2 + + + + + pi.d3.n1.1.3.4.3 + + + + + pi.d3.n1.2.1.1.1 + + + + + pi.d3.n1.2.1.1.2 + + + + + pi.d3.n1.2.1.1.3 + + + + + pi.d3.n1.2.1.2.1 + + + + + pi.d3.n1.2.1.2.2 + + + + + pi.d3.n1.2.1.2.3 + + + + + pi.d3.n1.2.1.3.1 + + + + + pi.d3.n1.2.1.3.2 + + + + + pi.d3.n1.2.1.3.3 + + + + + pi.d3.n1.2.1.4.1 + + + + + pi.d3.n1.2.1.4.2 + + + + + pi.d3.n1.2.1.4.3 + + + + + pi.d3.n1.2.2.1.1 + + + + + pi.d3.n1.2.2.1.2 + + + + + pi.d3.n1.2.2.1.3 + + + + + pi.d3.n1.2.2.2.1 + + + + + pi.d3.n1.2.2.2.2 + + + + + pi.d3.n1.2.2.2.3 + + + + + pi.d3.n1.2.2.3.1 + + + + + pi.d3.n1.2.2.3.2 + + + + + pi.d3.n1.2.2.3.3 + + + + + pi.d3.n1.2.2.4.1 + + + + + pi.d3.n1.2.2.4.2 + + + + + pi.d3.n1.2.2.4.3 + + + + + pi.d3.n1.2.3.1.1 + + + + + pi.d3.n1.2.3.1.2 + + + + + pi.d3.n1.2.3.1.3 + + + + + pi.d3.n1.2.3.2.1 + + + + + pi.d3.n1.2.3.2.2 + + + + + pi.d3.n1.2.3.2.3 + + + + + pi.d3.n1.2.3.3.1 + + + + + pi.d3.n1.2.3.3.2 + + + + + pi.d3.n1.2.3.3.3 + + + + + pi.d3.n1.2.3.4.1 + + + + + pi.d3.n1.2.3.4.2 + + + + + pi.d3.n1.2.3.4.3 + + + + + pi.d3.n1.3.1.1.1 + + + + + pi.d3.n1.3.1.1.2 + + + + + pi.d3.n1.3.1.1.3 + + + + + pi.d3.n1.3.1.2.1 + + + + + pi.d3.n1.3.1.2.2 + + + + + pi.d3.n1.3.1.2.3 + + + + + pi.d3.n1.3.1.3.1 + + + + + pi.d3.n1.3.1.3.2 + + + + + pi.d3.n1.3.1.3.3 + + + + + pi.d3.n1.3.1.4.1 + + + + + pi.d3.n1.3.1.4.2 + + + + + pi.d3.n1.3.1.4.3 + + + + + pi.d3.n1.3.2.1.1 + + + + + pi.d3.n1.3.2.1.2 + + + + + pi.d3.n1.3.2.1.3 + + + + + pi.d3.n1.3.2.2.1 + + + + + pi.d3.n1.3.2.2.2 + + + + + pi.d3.n1.3.2.2.3 + + + + + pi.d3.n1.3.2.3.1 + + + + + pi.d3.n1.3.2.3.2 + + + + + pi.d3.n1.3.2.3.3 + + + + + pi.d3.n1.3.2.4.1 + + + + + pi.d3.n1.3.2.4.2 + + + + + pi.d3.n1.3.2.4.3 + + + + + pi.d3.n1.3.3.1.1 + + + + + pi.d3.n1.3.3.1.2 + + + + + pi.d3.n1.3.3.1.3 + + + + + pi.d3.n1.3.3.2.1 + + + + + pi.d3.n1.3.3.2.2 + + + + + pi.d3.n1.3.3.2.3 + + + + + pi.d3.n1.3.3.3.1 + + + + + pi.d3.n1.3.3.3.2 + + + + + pi.d3.n1.3.3.3.3 + + + + + pi.d3.n1.3.3.4.1 + + + + + pi.d3.n1.3.3.4.2 + + + + + pi.d3.n1.3.3.4.3 + + + + + pi.d4.n1.1.1.1.1 + + + + + pi.d4.n1.1.1.1.2 + + + + + pi.d4.n1.1.1.1.3 + + + + + pi.d4.n1.1.1.1.4 + + + + + pi.d4.n1.1.1.2.1 + + + + + pi.d4.n1.1.1.2.2 + + + + + pi.d4.n1.1.1.2.3 + + + + + pi.d4.n1.1.1.2.4 + + + + + pi.d4.n1.1.1.3.1 + + + + + pi.d4.n1.1.1.3.2 + + + + + pi.d4.n1.1.1.3.3 + + + + + pi.d4.n1.1.1.3.4 + + + + + pi.d4.n1.1.2.1.1 + + + + + pi.d4.n1.1.2.1.2 + + + + + pi.d4.n1.1.2.1.3 + + + + + pi.d4.n1.1.2.1.4 + + + + + pi.d4.n1.1.2.2.1 + + + + + pi.d4.n1.1.2.2.2 + + + + + pi.d4.n1.1.2.2.3 + + + + + pi.d4.n1.1.2.2.4 + + + + + pi.d4.n1.1.2.3.1 + + + + + pi.d4.n1.1.2.3.2 + + + + + pi.d4.n1.1.2.3.3 + + + + + pi.d4.n1.1.2.3.4 + + + + + pi.d4.n1.1.3.1.1 + + + + + pi.d4.n1.1.3.1.2 + + + + + pi.d4.n1.1.3.1.3 + + + + + pi.d4.n1.1.3.1.4 + + + + + pi.d4.n1.1.3.2.1 + + + + + pi.d4.n1.1.3.2.2 + + + + + pi.d4.n1.1.3.2.3 + + + + + pi.d4.n1.1.3.2.4 + + + + + pi.d4.n1.1.3.3.1 + + + + + pi.d4.n1.1.3.3.2 + + + + + pi.d4.n1.1.3.3.3 + + + + + pi.d4.n1.1.3.3.4 + + + + + pi.d4.n1.2.1.1.1 + + + + + pi.d4.n1.2.1.1.2 + + + + + pi.d4.n1.2.1.1.3 + + + + + pi.d4.n1.2.1.1.4 + + + + + pi.d4.n1.2.1.2.1 + + + + + pi.d4.n1.2.1.2.2 + + + + + pi.d4.n1.2.1.2.3 + + + + + pi.d4.n1.2.1.2.4 + + + + + pi.d4.n1.2.1.3.1 + + + + + pi.d4.n1.2.1.3.2 + + + + + pi.d4.n1.2.1.3.3 + + + + + pi.d4.n1.2.1.3.4 + + + + + pi.d4.n1.2.2.1.1 + + + + + pi.d4.n1.2.2.1.2 + + + + + pi.d4.n1.2.2.1.3 + + + + + pi.d4.n1.2.2.1.4 + + + + + pi.d4.n1.2.2.2.1 + + + + + pi.d4.n1.2.2.2.2 + + + + + pi.d4.n1.2.2.2.3 + + + + + pi.d4.n1.2.2.2.4 + + + + + pi.d4.n1.2.2.3.1 + + + + + pi.d4.n1.2.2.3.2 + + + + + pi.d4.n1.2.2.3.3 + + + + + pi.d4.n1.2.2.3.4 + + + + + pi.d4.n1.2.3.1.1 + + + + + pi.d4.n1.2.3.1.2 + + + + + pi.d4.n1.2.3.1.3 + + + + + pi.d4.n1.2.3.1.4 + + + + + pi.d4.n1.2.3.2.1 + + + + + pi.d4.n1.2.3.2.2 + + + + + pi.d4.n1.2.3.2.3 + + + + + pi.d4.n1.2.3.2.4 + + + + + pi.d4.n1.2.3.3.1 + + + + + pi.d4.n1.2.3.3.2 + + + + + pi.d4.n1.2.3.3.3 + + + + + pi.d4.n1.2.3.3.4 + + + + + pi.d4.n1.3.1.1.1 + + + + + pi.d4.n1.3.1.1.2 + + + + + pi.d4.n1.3.1.1.3 + + + + + pi.d4.n1.3.1.1.4 + + + + + pi.d4.n1.3.1.2.1 + + + + + pi.d4.n1.3.1.2.2 + + + + + pi.d4.n1.3.1.2.3 + + + + + pi.d4.n1.3.1.2.4 + + + + + pi.d4.n1.3.1.3.1 + + + + + pi.d4.n1.3.1.3.2 + + + + + pi.d4.n1.3.1.3.3 + + + + + pi.d4.n1.3.1.3.4 + + + + + pi.d4.n1.3.2.1.1 + + + + + pi.d4.n1.3.2.1.2 + + + + + pi.d4.n1.3.2.1.3 + + + + + pi.d4.n1.3.2.1.4 + + + + + pi.d4.n1.3.2.2.1 + + + + + pi.d4.n1.3.2.2.2 + + + + + pi.d4.n1.3.2.2.3 + + + + + pi.d4.n1.3.2.2.4 + + + + + pi.d4.n1.3.2.3.1 + + + + + pi.d4.n1.3.2.3.2 + + + + + pi.d4.n1.3.2.3.3 + + + + + pi.d4.n1.3.2.3.4 + + + + + pi.d4.n1.3.3.1.1 + + + + + pi.d4.n1.3.3.1.2 + + + + + pi.d4.n1.3.3.1.3 + + + + + pi.d4.n1.3.3.1.4 + + + + + pi.d4.n1.3.3.2.1 + + + + + pi.d4.n1.3.3.2.2 + + + + + pi.d4.n1.3.3.2.3 + + + + + pi.d4.n1.3.3.2.4 + + + + + pi.d4.n1.3.3.3.1 + + + + + pi.d4.n1.3.3.3.2 + + + + + pi.d4.n1.3.3.3.3 + + + + + pi.d4.n1.3.3.3.4 + + + + + pil.d1.n1.1.1.1.1 + + + 1 + + + + + pil.d1.n1.1.1.1.2 + + + 1 + + + + + pil.d1.n1.1.1.1.3 + + + 1 + + + + + pil.d1.n1.1.1.2.1 + + + 1 + + + + + pil.d1.n1.1.1.2.2 + + + 1 + + + + + pil.d1.n1.1.1.2.3 + + + 1 + + + + + pil.d1.n1.1.1.3.1 + + + 1 + + + + + pil.d1.n1.1.1.3.2 + + + 1 + + + + + pil.d1.n1.1.1.3.3 + + + 1 + + + + + pil.d1.n1.1.2.1.1 + + + 1 + + + + + pil.d1.n1.1.2.1.2 + + + 1 + + + + + pil.d1.n1.1.2.1.3 + + + 1 + + + + + pil.d1.n1.1.2.2.1 + + + 1 + + + + + pil.d1.n1.1.2.2.2 + + + 1 + + + + + pil.d1.n1.1.2.2.3 + + + 1 + + + + + pil.d1.n1.1.2.3.1 + + + 1 + + + + + pil.d1.n1.1.2.3.2 + + + 1 + + + + + pil.d1.n1.1.2.3.3 + + + 1 + + + + + pil.d1.n1.1.3.1.1 + + + 1 + + + + + pil.d1.n1.1.3.1.2 + + + 1 + + + + + pil.d1.n1.1.3.1.3 + + + 1 + + + + + pil.d1.n1.1.3.2.1 + + + 1 + + + + + pil.d1.n1.1.3.2.2 + + + 1 + + + + + pil.d1.n1.1.3.2.3 + + + 1 + + + + + pil.d1.n1.1.3.3.1 + + + 1 + + + + + pil.d1.n1.1.3.3.2 + + + 1 + + + + + pil.d1.n1.1.3.3.3 + + + 1 + + + + + pil.d1.n1.2.1.1.1 + + + 1 + + + + + pil.d1.n1.2.1.1.2 + + + 1 + + + + + pil.d1.n1.2.1.1.3 + + + 1 + + + + + pil.d1.n1.2.1.2.1 + + + 1 + + + + + pil.d1.n1.2.1.2.2 + + + 1 + + + + + pil.d1.n1.2.1.2.3 + + + 1 + + + + + pil.d1.n1.2.1.3.1 + + + 1 + + + + + pil.d1.n1.2.1.3.2 + + + 1 + + + + + pil.d1.n1.2.1.3.3 + + + 1 + + + + + pil.d1.n1.2.2.1.1 + + + 1 + + + + + pil.d1.n1.2.2.1.2 + + + 1 + + + + + pil.d1.n1.2.2.1.3 + + + 1 + + + + + pil.d1.n1.2.2.2.1 + + + 1 + + + + + pil.d1.n1.2.2.2.2 + + + 1 + + + + + pil.d1.n1.2.2.2.3 + + + 1 + + + + + pil.d1.n1.2.2.3.1 + + + 1 + + + + + pil.d1.n1.2.2.3.2 + + + 1 + + + + + pil.d1.n1.2.2.3.3 + + + 1 + + + + + pil.d1.n1.2.3.1.1 + + + 1 + + + + + pil.d1.n1.2.3.1.2 + + + 1 + + + + + pil.d1.n1.2.3.1.3 + + + 1 + + + + + pil.d1.n1.2.3.2.1 + + + 1 + + + + + pil.d1.n1.2.3.2.2 + + + 1 + + + + + pil.d1.n1.2.3.2.3 + + + 1 + + + + + pil.d1.n1.2.3.3.1 + + + 1 + + + + + pil.d1.n1.2.3.3.2 + + + 1 + + + + + pil.d1.n1.2.3.3.3 + + + 1 + + + + + pil.d1.n1.3.1.1.1 + + + 1 + + + + + pil.d1.n1.3.1.1.2 + + + 1 + + + + + pil.d1.n1.3.1.1.3 + + + 1 + + + + + pil.d1.n1.3.1.2.1 + + + 1 + + + + + pil.d1.n1.3.1.2.2 + + + 1 + + + + + pil.d1.n1.3.1.2.3 + + + 1 + + + + + pil.d1.n1.3.1.3.1 + + + 1 + + + + + pil.d1.n1.3.1.3.2 + + + 1 + + + + + pil.d1.n1.3.1.3.3 + + + 1 + + + + + pil.d1.n1.3.2.1.1 + + + 1 + + + + + pil.d1.n1.3.2.1.2 + + + 1 + + + + + pil.d1.n1.3.2.1.3 + + + 1 + + + + + pil.d1.n1.3.2.2.1 + + + 1 + + + + + pil.d1.n1.3.2.2.2 + + + 1 + + + + + pil.d1.n1.3.2.2.3 + + + 1 + + + + + pil.d1.n1.3.2.3.1 + + + 1 + + + + + pil.d1.n1.3.2.3.2 + + + 1 + + + + + pil.d1.n1.3.2.3.3 + + + 1 + + + + + pil.d1.n1.3.3.1.1 + + + 1 + + + + + pil.d1.n1.3.3.1.2 + + + 1 + + + + + pil.d1.n1.3.3.1.3 + + + 1 + + + + + pil.d1.n1.3.3.2.1 + + + 1 + + + + + pil.d1.n1.3.3.2.2 + + + 1 + + + + + pil.d1.n1.3.3.2.3 + + + 1 + + + + + pil.d1.n1.3.3.3.1 + + + 1 + + + + + pil.d1.n1.3.3.3.2 + + + 1 + + + + + pil.d1.n1.3.3.3.3 + + + 1 + + + + + pil.d1.n1.4.1.1.1 + + + 1 + + + + + pil.d1.n1.4.1.1.2 + + + 1 + + + + + pil.d1.n1.4.1.1.3 + + + 1 + + + + + pil.d1.n1.4.1.2.1 + + + 1 + + + + + pil.d1.n1.4.1.2.2 + + + 1 + + + + + pil.d1.n1.4.1.2.3 + + + 1 + + + + + pil.d1.n1.4.1.3.1 + + + 1 + + + + + pil.d1.n1.4.1.3.2 + + + 1 + + + + + pil.d1.n1.4.1.3.3 + + + 1 + + + + + pil.d1.n1.4.2.1.1 + + + 1 + + + + + pil.d1.n1.4.2.1.2 + + + 1 + + + + + pil.d1.n1.4.2.1.3 + + + 1 + + + + + pil.d1.n1.4.2.2.1 + + + 1 + + + + + pil.d1.n1.4.2.2.2 + + + 1 + + + + + pil.d1.n1.4.2.2.3 + + + 1 + + + + + pil.d1.n1.4.2.3.1 + + + 1 + + + + + pil.d1.n1.4.2.3.2 + + + 1 + + + + + pil.d1.n1.4.2.3.3 + + + 1 + + + + + pil.d1.n1.4.3.1.1 + + + 1 + + + + + pil.d1.n1.4.3.1.2 + + + 1 + + + + + pil.d1.n1.4.3.1.3 + + + 1 + + + + + pil.d1.n1.4.3.2.1 + + + 1 + + + + + pil.d1.n1.4.3.2.2 + + + 1 + + + + + pil.d1.n1.4.3.2.3 + + + 1 + + + + + pil.d1.n1.4.3.3.1 + + + 1 + + + + + pil.d1.n1.4.3.3.2 + + + 1 + + + + + pil.d1.n1.4.3.3.3 + + + 1 + + + + + pil.d2.n1.1.1.1.1 + + + 1 + + + + + pil.d2.n1.1.1.1.2 + + + 1 + + + + + pil.d2.n1.1.1.1.3 + + + 1 + + + + + pil.d2.n1.1.1.2.1 + + + 1 + + + + + pil.d2.n1.1.1.2.2 + + + 1 + + + + + pil.d2.n1.1.1.2.3 + + + 1 + + + + + pil.d2.n1.1.1.3.1 + + + 1 + + + + + pil.d2.n1.1.1.3.2 + + + 1 + + + + + pil.d2.n1.1.1.3.3 + + + 1 + + + + + pil.d2.n1.1.2.1.1 + + + 1 + + + + + pil.d2.n1.1.2.1.2 + + + 1 + + + + + pil.d2.n1.1.2.1.3 + + + 1 + + + + + pil.d2.n1.1.2.2.1 + + + 1 + + + + + pil.d2.n1.1.2.2.2 + + + 1 + + + + + pil.d2.n1.1.2.2.3 + + + 1 + + + + + pil.d2.n1.1.2.3.1 + + + 1 + + + + + pil.d2.n1.1.2.3.2 + + + 1 + + + + + pil.d2.n1.1.2.3.3 + + + 1 + + + + + pil.d2.n1.1.3.1.1 + + + 1 + + + + + pil.d2.n1.1.3.1.2 + + + 1 + + + + + pil.d2.n1.1.3.1.3 + + + 1 + + + + + pil.d2.n1.1.3.2.1 + + + 1 + + + + + pil.d2.n1.1.3.2.2 + + + 1 + + + + + pil.d2.n1.1.3.2.3 + + + 1 + + + + + pil.d2.n1.1.3.3.1 + + + 1 + + + + + pil.d2.n1.1.3.3.2 + + + 1 + + + + + pil.d2.n1.1.3.3.3 + + + 1 + + + + + pil.d2.n1.1.4.1.1 + + + 1 + + + + + pil.d2.n1.1.4.1.2 + + + 1 + + + + + pil.d2.n1.1.4.1.3 + + + 1 + + + + + pil.d2.n1.1.4.2.1 + + + 1 + + + + + pil.d2.n1.1.4.2.2 + + + 1 + + + + + pil.d2.n1.1.4.2.3 + + + 1 + + + + + pil.d2.n1.1.4.3.1 + + + 1 + + + + + pil.d2.n1.1.4.3.2 + + + 1 + + + + + pil.d2.n1.1.4.3.3 + + + 1 + + + + + pil.d2.n1.2.1.1.1 + + + 1 + + + + + pil.d2.n1.2.1.1.2 + + + 1 + + + + + pil.d2.n1.2.1.1.3 + + + 1 + + + + + pil.d2.n1.2.1.2.1 + + + 1 + + + + + pil.d2.n1.2.1.2.2 + + + 1 + + + + + pil.d2.n1.2.1.2.3 + + + 1 + + + + + pil.d2.n1.2.1.3.1 + + + 1 + + + + + pil.d2.n1.2.1.3.2 + + + 1 + + + + + pil.d2.n1.2.1.3.3 + + + 1 + + + + + pil.d2.n1.2.2.1.1 + + + 1 + + + + + pil.d2.n1.2.2.1.2 + + + 1 + + + + + pil.d2.n1.2.2.1.3 + + + 1 + + + + + pil.d2.n1.2.2.2.1 + + + 1 + + + + + pil.d2.n1.2.2.2.2 + + + 1 + + + + + pil.d2.n1.2.2.2.3 + + + 1 + + + + + pil.d2.n1.2.2.3.1 + + + 1 + + + + + pil.d2.n1.2.2.3.2 + + + 1 + + + + + pil.d2.n1.2.2.3.3 + + + 1 + + + + + pil.d2.n1.2.3.1.1 + + + 1 + + + + + pil.d2.n1.2.3.1.2 + + + 1 + + + + + pil.d2.n1.2.3.1.3 + + + 1 + + + + + pil.d2.n1.2.3.2.1 + + + 1 + + + + + pil.d2.n1.2.3.2.2 + + + 1 + + + + + pil.d2.n1.2.3.2.3 + + + 1 + + + + + pil.d2.n1.2.3.3.1 + + + 1 + + + + + pil.d2.n1.2.3.3.2 + + + 1 + + + + + pil.d2.n1.2.3.3.3 + + + 1 + + + + + pil.d2.n1.2.4.1.1 + + + 1 + + + + + pil.d2.n1.2.4.1.2 + + + 1 + + + + + pil.d2.n1.2.4.1.3 + + + 1 + + + + + pil.d2.n1.2.4.2.1 + + + 1 + + + + + pil.d2.n1.2.4.2.2 + + + 1 + + + + + pil.d2.n1.2.4.2.3 + + + 1 + + + + + pil.d2.n1.2.4.3.1 + + + 1 + + + + + pil.d2.n1.2.4.3.2 + + + 1 + + + + + pil.d2.n1.2.4.3.3 + + + 1 + + + + + pil.d2.n1.3.1.1.1 + + + 1 + + + + + pil.d2.n1.3.1.1.2 + + + 1 + + + + + pil.d2.n1.3.1.1.3 + + + 1 + + + + + pil.d2.n1.3.1.2.1 + + + 1 + + + + + pil.d2.n1.3.1.2.2 + + + 1 + + + + + pil.d2.n1.3.1.2.3 + + + 1 + + + + + pil.d2.n1.3.1.3.1 + + + 1 + + + + + pil.d2.n1.3.1.3.2 + + + 1 + + + + + pil.d2.n1.3.1.3.3 + + + 1 + + + + + pil.d2.n1.3.2.1.1 + + + 1 + + + + + pil.d2.n1.3.2.1.2 + + + 1 + + + + + pil.d2.n1.3.2.1.3 + + + 1 + + + + + pil.d2.n1.3.2.2.1 + + + 1 + + + + + pil.d2.n1.3.2.2.2 + + + 1 + + + + + pil.d2.n1.3.2.2.3 + + + 1 + + + + + pil.d2.n1.3.2.3.1 + + + 1 + + + + + pil.d2.n1.3.2.3.2 + + + 1 + + + + + pil.d2.n1.3.2.3.3 + + + 1 + + + + + pil.d2.n1.3.3.1.1 + + + 1 + + + + + pil.d2.n1.3.3.1.2 + + + 1 + + + + + pil.d2.n1.3.3.1.3 + + + 1 + + + + + pil.d2.n1.3.3.2.1 + + + 1 + + + + + pil.d2.n1.3.3.2.2 + + + 1 + + + + + pil.d2.n1.3.3.2.3 + + + 1 + + + + + pil.d2.n1.3.3.3.1 + + + 1 + + + + + pil.d2.n1.3.3.3.2 + + + 1 + + + + + pil.d2.n1.3.3.3.3 + + + 1 + + + + + pil.d2.n1.3.4.1.1 + + + 1 + + + + + pil.d2.n1.3.4.1.2 + + + 1 + + + + + pil.d2.n1.3.4.1.3 + + + 1 + + + + + pil.d2.n1.3.4.2.1 + + + 1 + + + + + pil.d2.n1.3.4.2.2 + + + 1 + + + + + pil.d2.n1.3.4.2.3 + + + 1 + + + + + pil.d2.n1.3.4.3.1 + + + 1 + + + + + pil.d2.n1.3.4.3.2 + + + 1 + + + + + pil.d2.n1.3.4.3.3 + + + 1 + + + + + pil.d3.n1.1.1.1.1 + + + 1 + + + + + pil.d3.n1.1.1.1.2 + + + 1 + + + + + pil.d3.n1.1.1.1.3 + + + 1 + + + + + pil.d3.n1.1.1.2.1 + + + 1 + + + + + pil.d3.n1.1.1.2.2 + + + 1 + + + + + pil.d3.n1.1.1.2.3 + + + 1 + + + + + pil.d3.n1.1.1.3.1 + + + 1 + + + + + pil.d3.n1.1.1.3.2 + + + 1 + + + + + pil.d3.n1.1.1.3.3 + + + 1 + + + + + pil.d3.n1.1.1.4.1 + + + 1 + + + + + pil.d3.n1.1.1.4.2 + + + 1 + + + + + pil.d3.n1.1.1.4.3 + + + 1 + + + + + pil.d3.n1.1.2.1.1 + + + 1 + + + + + pil.d3.n1.1.2.1.2 + + + 1 + + + + + pil.d3.n1.1.2.1.3 + + + 1 + + + + + pil.d3.n1.1.2.2.1 + + + 1 + + + + + pil.d3.n1.1.2.2.2 + + + 1 + + + + + pil.d3.n1.1.2.2.3 + + + 1 + + + + + pil.d3.n1.1.2.3.1 + + + 1 + + + + + pil.d3.n1.1.2.3.2 + + + 1 + + + + + pil.d3.n1.1.2.3.3 + + + 1 + + + + + pil.d3.n1.1.2.4.1 + + + 1 + + + + + pil.d3.n1.1.2.4.2 + + + 1 + + + + + pil.d3.n1.1.2.4.3 + + + 1 + + + + + pil.d3.n1.1.3.1.1 + + + 1 + + + + + pil.d3.n1.1.3.1.2 + + + 1 + + + + + pil.d3.n1.1.3.1.3 + + + 1 + + + + + pil.d3.n1.1.3.2.1 + + + 1 + + + + + pil.d3.n1.1.3.2.2 + + + 1 + + + + + pil.d3.n1.1.3.2.3 + + + 1 + + + + + pil.d3.n1.1.3.3.1 + + + 1 + + + + + pil.d3.n1.1.3.3.2 + + + 1 + + + + + pil.d3.n1.1.3.3.3 + + + 1 + + + + + pil.d3.n1.1.3.4.1 + + + 1 + + + + + pil.d3.n1.1.3.4.2 + + + 1 + + + + + pil.d3.n1.1.3.4.3 + + + 1 + + + + + pil.d3.n1.2.1.1.1 + + + 1 + + + + + pil.d3.n1.2.1.1.2 + + + 1 + + + + + pil.d3.n1.2.1.1.3 + + + 1 + + + + + pil.d3.n1.2.1.2.1 + + + 1 + + + + + pil.d3.n1.2.1.2.2 + + + 1 + + + + + pil.d3.n1.2.1.2.3 + + + 1 + + + + + pil.d3.n1.2.1.3.1 + + + 1 + + + + + pil.d3.n1.2.1.3.2 + + + 1 + + + + + pil.d3.n1.2.1.3.3 + + + 1 + + + + + pil.d3.n1.2.1.4.1 + + + 1 + + + + + pil.d3.n1.2.1.4.2 + + + 1 + + + + + pil.d3.n1.2.1.4.3 + + + 1 + + + + + pil.d3.n1.2.2.1.1 + + + 1 + + + + + pil.d3.n1.2.2.1.2 + + + 1 + + + + + pil.d3.n1.2.2.1.3 + + + 1 + + + + + pil.d3.n1.2.2.2.1 + + + 1 + + + + + pil.d3.n1.2.2.2.2 + + + 1 + + + + + pil.d3.n1.2.2.2.3 + + + 1 + + + + + pil.d3.n1.2.2.3.1 + + + 1 + + + + + pil.d3.n1.2.2.3.2 + + + 1 + + + + + pil.d3.n1.2.2.3.3 + + + 1 + + + + + pil.d3.n1.2.2.4.1 + + + 1 + + + + + pil.d3.n1.2.2.4.2 + + + 1 + + + + + pil.d3.n1.2.2.4.3 + + + 1 + + + + + pil.d3.n1.2.3.1.1 + + + 1 + + + + + pil.d3.n1.2.3.1.2 + + + 1 + + + + + pil.d3.n1.2.3.1.3 + + + 1 + + + + + pil.d3.n1.2.3.2.1 + + + 1 + + + + + pil.d3.n1.2.3.2.2 + + + 1 + + + + + pil.d3.n1.2.3.2.3 + + + 1 + + + + + pil.d3.n1.2.3.3.1 + + + 1 + + + + + pil.d3.n1.2.3.3.2 + + + 1 + + + + + pil.d3.n1.2.3.3.3 + + + 1 + + + + + pil.d3.n1.2.3.4.1 + + + 1 + + + + + pil.d3.n1.2.3.4.2 + + + 1 + + + + + pil.d3.n1.2.3.4.3 + + + 1 + + + + + pil.d3.n1.3.1.1.1 + + + 1 + + + + + pil.d3.n1.3.1.1.2 + + + 1 + + + + + pil.d3.n1.3.1.1.3 + + + 1 + + + + + pil.d3.n1.3.1.2.1 + + + 1 + + + + + pil.d3.n1.3.1.2.2 + + + 1 + + + + + pil.d3.n1.3.1.2.3 + + + 1 + + + + + pil.d3.n1.3.1.3.1 + + + 1 + + + + + pil.d3.n1.3.1.3.2 + + + 1 + + + + + pil.d3.n1.3.1.3.3 + + + 1 + + + + + pil.d3.n1.3.1.4.1 + + + 1 + + + + + pil.d3.n1.3.1.4.2 + + + 1 + + + + + pil.d3.n1.3.1.4.3 + + + 1 + + + + + pil.d3.n1.3.2.1.1 + + + 1 + + + + + pil.d3.n1.3.2.1.2 + + + 1 + + + + + pil.d3.n1.3.2.1.3 + + + 1 + + + + + pil.d3.n1.3.2.2.1 + + + 1 + + + + + pil.d3.n1.3.2.2.2 + + + 1 + + + + + pil.d3.n1.3.2.2.3 + + + 1 + + + + + pil.d3.n1.3.2.3.1 + + + 1 + + + + + pil.d3.n1.3.2.3.2 + + + 1 + + + + + pil.d3.n1.3.2.3.3 + + + 1 + + + + + pil.d3.n1.3.2.4.1 + + + 1 + + + + + pil.d3.n1.3.2.4.2 + + + 1 + + + + + pil.d3.n1.3.2.4.3 + + + 1 + + + + + pil.d3.n1.3.3.1.1 + + + 1 + + + + + pil.d3.n1.3.3.1.2 + + + 1 + + + + + pil.d3.n1.3.3.1.3 + + + 1 + + + + + pil.d3.n1.3.3.2.1 + + + 1 + + + + + pil.d3.n1.3.3.2.2 + + + 1 + + + + + pil.d3.n1.3.3.2.3 + + + 1 + + + + + pil.d3.n1.3.3.3.1 + + + 1 + + + + + pil.d3.n1.3.3.3.2 + + + 1 + + + + + pil.d3.n1.3.3.3.3 + + + 1 + + + + + pil.d3.n1.3.3.4.1 + + + 1 + + + + + pil.d3.n1.3.3.4.2 + + + 1 + + + + + pil.d3.n1.3.3.4.3 + + + 1 + + + + + pil.d4.n1.1.1.1.1 + + + 1 + + + + + pil.d4.n1.1.1.1.2 + + + 1 + + + + + pil.d4.n1.1.1.1.3 + + + 1 + + + + + pil.d4.n1.1.1.1.4 + + + 1 + + + + + pil.d4.n1.1.1.2.1 + + + 1 + + + + + pil.d4.n1.1.1.2.2 + + + 1 + + + + + pil.d4.n1.1.1.2.3 + + + 1 + + + + + pil.d4.n1.1.1.2.4 + + + 1 + + + + + pil.d4.n1.1.1.3.1 + + + 1 + + + + + pil.d4.n1.1.1.3.2 + + + 1 + + + + + pil.d4.n1.1.1.3.3 + + + 1 + + + + + pil.d4.n1.1.1.3.4 + + + 1 + + + + + pil.d4.n1.1.2.1.1 + + + 1 + + + + + pil.d4.n1.1.2.1.2 + + + 1 + + + + + pil.d4.n1.1.2.1.3 + + + 1 + + + + + pil.d4.n1.1.2.1.4 + + + 1 + + + + + pil.d4.n1.1.2.2.1 + + + 1 + + + + + pil.d4.n1.1.2.2.2 + + + 1 + + + + + pil.d4.n1.1.2.2.3 + + + 1 + + + + + pil.d4.n1.1.2.2.4 + + + 1 + + + + + pil.d4.n1.1.2.3.1 + + + 1 + + + + + pil.d4.n1.1.2.3.2 + + + 1 + + + + + pil.d4.n1.1.2.3.3 + + + 1 + + + + + pil.d4.n1.1.2.3.4 + + + 1 + + + + + pil.d4.n1.1.3.1.1 + + + 1 + + + + + pil.d4.n1.1.3.1.2 + + + 1 + + + + + pil.d4.n1.1.3.1.3 + + + 1 + + + + + pil.d4.n1.1.3.1.4 + + + 1 + + + + + pil.d4.n1.1.3.2.1 + + + 1 + + + + + pil.d4.n1.1.3.2.2 + + + 1 + + + + + pil.d4.n1.1.3.2.3 + + + 1 + + + + + pil.d4.n1.1.3.2.4 + + + 1 + + + + + pil.d4.n1.1.3.3.1 + + + 1 + + + + + pil.d4.n1.1.3.3.2 + + + 1 + + + + + pil.d4.n1.1.3.3.3 + + + 1 + + + + + pil.d4.n1.1.3.3.4 + + + 1 + + + + + pil.d4.n1.2.1.1.1 + + + 1 + + + + + pil.d4.n1.2.1.1.2 + + + 1 + + + + + pil.d4.n1.2.1.1.3 + + + 1 + + + + + pil.d4.n1.2.1.1.4 + + + 1 + + + + + pil.d4.n1.2.1.2.1 + + + 1 + + + + + pil.d4.n1.2.1.2.2 + + + 1 + + + + + pil.d4.n1.2.1.2.3 + + + 1 + + + + + pil.d4.n1.2.1.2.4 + + + 1 + + + + + pil.d4.n1.2.1.3.1 + + + 1 + + + + + pil.d4.n1.2.1.3.2 + + + 1 + + + + + pil.d4.n1.2.1.3.3 + + + 1 + + + + + pil.d4.n1.2.1.3.4 + + + 1 + + + + + pil.d4.n1.2.2.1.1 + + + 1 + + + + + pil.d4.n1.2.2.1.2 + + + 1 + + + + + pil.d4.n1.2.2.1.3 + + + 1 + + + + + pil.d4.n1.2.2.1.4 + + + 1 + + + + + pil.d4.n1.2.2.2.1 + + + 1 + + + + + pil.d4.n1.2.2.2.2 + + + 1 + + + + + pil.d4.n1.2.2.2.3 + + + 1 + + + + + pil.d4.n1.2.2.2.4 + + + 1 + + + + + pil.d4.n1.2.2.3.1 + + + 1 + + + + + pil.d4.n1.2.2.3.2 + + + 1 + + + + + pil.d4.n1.2.2.3.3 + + + 1 + + + + + pil.d4.n1.2.2.3.4 + + + 1 + + + + + pil.d4.n1.2.3.1.1 + + + 1 + + + + + pil.d4.n1.2.3.1.2 + + + 1 + + + + + pil.d4.n1.2.3.1.3 + + + 1 + + + + + pil.d4.n1.2.3.1.4 + + + 1 + + + + + pil.d4.n1.2.3.2.1 + + + 1 + + + + + pil.d4.n1.2.3.2.2 + + + 1 + + + + + pil.d4.n1.2.3.2.3 + + + 1 + + + + + pil.d4.n1.2.3.2.4 + + + 1 + + + + + pil.d4.n1.2.3.3.1 + + + 1 + + + + + pil.d4.n1.2.3.3.2 + + + 1 + + + + + pil.d4.n1.2.3.3.3 + + + 1 + + + + + pil.d4.n1.2.3.3.4 + + + 1 + + + + + pil.d4.n1.3.1.1.1 + + + 1 + + + + + pil.d4.n1.3.1.1.2 + + + 1 + + + + + pil.d4.n1.3.1.1.3 + + + 1 + + + + + pil.d4.n1.3.1.1.4 + + + 1 + + + + + pil.d4.n1.3.1.2.1 + + + 1 + + + + + pil.d4.n1.3.1.2.2 + + + 1 + + + + + pil.d4.n1.3.1.2.3 + + + 1 + + + + + pil.d4.n1.3.1.2.4 + + + 1 + + + + + pil.d4.n1.3.1.3.1 + + + 1 + + + + + pil.d4.n1.3.1.3.2 + + + 1 + + + + + pil.d4.n1.3.1.3.3 + + + 1 + + + + + pil.d4.n1.3.1.3.4 + + + 1 + + + + + pil.d4.n1.3.2.1.1 + + + 1 + + + + + pil.d4.n1.3.2.1.2 + + + 1 + + + + + pil.d4.n1.3.2.1.3 + + + 1 + + + + + pil.d4.n1.3.2.1.4 + + + 1 + + + + + pil.d4.n1.3.2.2.1 + + + 1 + + + + + pil.d4.n1.3.2.2.2 + + + 1 + + + + + pil.d4.n1.3.2.2.3 + + + 1 + + + + + pil.d4.n1.3.2.2.4 + + + 1 + + + + + pil.d4.n1.3.2.3.1 + + + 1 + + + + + pil.d4.n1.3.2.3.2 + + + 1 + + + + + pil.d4.n1.3.2.3.3 + + + 1 + + + + + pil.d4.n1.3.2.3.4 + + + 1 + + + + + pil.d4.n1.3.3.1.1 + + + 1 + + + + + pil.d4.n1.3.3.1.2 + + + 1 + + + + + pil.d4.n1.3.3.1.3 + + + 1 + + + + + pil.d4.n1.3.3.1.4 + + + 1 + + + + + pil.d4.n1.3.3.2.1 + + + 1 + + + + + pil.d4.n1.3.3.2.2 + + + 1 + + + + + pil.d4.n1.3.3.2.3 + + + 1 + + + + + pil.d4.n1.3.3.2.4 + + + 1 + + + + + pil.d4.n1.3.3.3.1 + + + 1 + + + + + pil.d4.n1.3.3.3.2 + + + 1 + + + + + pil.d4.n1.3.3.3.3 + + + 1 + + + + + pil.d4.n1.3.3.3.4 + + + 1 + + + + + po.d1.n1.1.1.1.1 + + + + + po.d1.n1.1.1.1.2 + + + + + po.d1.n1.1.1.1.3 + + + + + po.d1.n1.1.1.2.1 + + + + + po.d1.n1.1.1.2.2 + + + + + po.d1.n1.1.1.2.3 + + + + + po.d1.n1.1.1.3.1 + + + + + po.d1.n1.1.1.3.2 + + + + + po.d1.n1.1.1.3.3 + + + + + po.d1.n1.1.2.1.1 + + + + + po.d1.n1.1.2.1.2 + + + + + po.d1.n1.1.2.1.3 + + + + + po.d1.n1.1.2.2.1 + + + + + po.d1.n1.1.2.2.2 + + + + + po.d1.n1.1.2.2.3 + + + + + po.d1.n1.1.2.3.1 + + + + + po.d1.n1.1.2.3.2 + + + + + po.d1.n1.1.2.3.3 + + + + + po.d1.n1.1.3.1.1 + + + + + po.d1.n1.1.3.1.2 + + + + + po.d1.n1.1.3.1.3 + + + + + po.d1.n1.1.3.2.1 + + + + + po.d1.n1.1.3.2.2 + + + + + po.d1.n1.1.3.2.3 + + + + + po.d1.n1.1.3.3.1 + + + + + po.d1.n1.1.3.3.2 + + + + + po.d1.n1.1.3.3.3 + + + + + po.d1.n1.2.1.1.1 + + + + + po.d1.n1.2.1.1.2 + + + + + po.d1.n1.2.1.1.3 + + + + + po.d1.n1.2.1.2.1 + + + + + po.d1.n1.2.1.2.2 + + + + + po.d1.n1.2.1.2.3 + + + + + po.d1.n1.2.1.3.1 + + + + + po.d1.n1.2.1.3.2 + + + + + po.d1.n1.2.1.3.3 + + + + + po.d1.n1.2.2.1.1 + + + + + po.d1.n1.2.2.1.2 + + + + + po.d1.n1.2.2.1.3 + + + + + po.d1.n1.2.2.2.1 + + + + + po.d1.n1.2.2.2.2 + + + + + po.d1.n1.2.2.2.3 + + + + + po.d1.n1.2.2.3.1 + + + + + po.d1.n1.2.2.3.2 + + + + + po.d1.n1.2.2.3.3 + + + + + po.d1.n1.2.3.1.1 + + + + + po.d1.n1.2.3.1.2 + + + + + po.d1.n1.2.3.1.3 + + + + + po.d1.n1.2.3.2.1 + + + + + po.d1.n1.2.3.2.2 + + + + + po.d1.n1.2.3.2.3 + + + + + po.d1.n1.2.3.3.1 + + + + + po.d1.n1.2.3.3.2 + + + + + po.d1.n1.2.3.3.3 + + + + + po.d1.n1.3.1.1.1 + + + + + po.d1.n1.3.1.1.2 + + + + + po.d1.n1.3.1.1.3 + + + + + po.d1.n1.3.1.2.1 + + + + + po.d1.n1.3.1.2.2 + + + + + po.d1.n1.3.1.2.3 + + + + + po.d1.n1.3.1.3.1 + + + + + po.d1.n1.3.1.3.2 + + + + + po.d1.n1.3.1.3.3 + + + + + po.d1.n1.3.2.1.1 + + + + + po.d1.n1.3.2.1.2 + + + + + po.d1.n1.3.2.1.3 + + + + + po.d1.n1.3.2.2.1 + + + + + po.d1.n1.3.2.2.2 + + + + + po.d1.n1.3.2.2.3 + + + + + po.d1.n1.3.2.3.1 + + + + + po.d1.n1.3.2.3.2 + + + + + po.d1.n1.3.2.3.3 + + + + + po.d1.n1.3.3.1.1 + + + + + po.d1.n1.3.3.1.2 + + + + + po.d1.n1.3.3.1.3 + + + + + po.d1.n1.3.3.2.1 + + + + + po.d1.n1.3.3.2.2 + + + + + po.d1.n1.3.3.2.3 + + + + + po.d1.n1.3.3.3.1 + + + + + po.d1.n1.3.3.3.2 + + + + + po.d1.n1.3.3.3.3 + + + + + po.d1.n1.4.1.1.1 + + + + + po.d1.n1.4.1.1.2 + + + + + po.d1.n1.4.1.1.3 + + + + + po.d1.n1.4.1.2.1 + + + + + po.d1.n1.4.1.2.2 + + + + + po.d1.n1.4.1.2.3 + + + + + po.d1.n1.4.1.3.1 + + + + + po.d1.n1.4.1.3.2 + + + + + po.d1.n1.4.1.3.3 + + + + + po.d1.n1.4.2.1.1 + + + + + po.d1.n1.4.2.1.2 + + + + + po.d1.n1.4.2.1.3 + + + + + po.d1.n1.4.2.2.1 + + + + + po.d1.n1.4.2.2.2 + + + + + po.d1.n1.4.2.2.3 + + + + + po.d1.n1.4.2.3.1 + + + + + po.d1.n1.4.2.3.2 + + + + + po.d1.n1.4.2.3.3 + + + + + po.d1.n1.4.3.1.1 + + + + + po.d1.n1.4.3.1.2 + + + + + po.d1.n1.4.3.1.3 + + + + + po.d1.n1.4.3.2.1 + + + + + po.d1.n1.4.3.2.2 + + + + + po.d1.n1.4.3.2.3 + + + + + po.d1.n1.4.3.3.1 + + + + + po.d1.n1.4.3.3.2 + + + + + po.d1.n1.4.3.3.3 + + + + + po.d2.n1.1.1.1.1 + + + + + po.d2.n1.1.1.1.2 + + + + + po.d2.n1.1.1.1.3 + + + + + po.d2.n1.1.1.2.1 + + + + + po.d2.n1.1.1.2.2 + + + + + po.d2.n1.1.1.2.3 + + + + + po.d2.n1.1.1.3.1 + + + + + po.d2.n1.1.1.3.2 + + + + + po.d2.n1.1.1.3.3 + + + + + po.d2.n1.1.2.1.1 + + + + + po.d2.n1.1.2.1.2 + + + + + po.d2.n1.1.2.1.3 + + + + + po.d2.n1.1.2.2.1 + + + + + po.d2.n1.1.2.2.2 + + + + + po.d2.n1.1.2.2.3 + + + + + po.d2.n1.1.2.3.1 + + + + + po.d2.n1.1.2.3.2 + + + + + po.d2.n1.1.2.3.3 + + + + + po.d2.n1.1.3.1.1 + + + + + po.d2.n1.1.3.1.2 + + + + + po.d2.n1.1.3.1.3 + + + + + po.d2.n1.1.3.2.1 + + + + + po.d2.n1.1.3.2.2 + + + + + po.d2.n1.1.3.2.3 + + + + + po.d2.n1.1.3.3.1 + + + + + po.d2.n1.1.3.3.2 + + + + + po.d2.n1.1.3.3.3 + + + + + po.d2.n1.1.4.1.1 + + + + + po.d2.n1.1.4.1.2 + + + + + po.d2.n1.1.4.1.3 + + + + + po.d2.n1.1.4.2.1 + + + + + po.d2.n1.1.4.2.2 + + + + + po.d2.n1.1.4.2.3 + + + + + po.d2.n1.1.4.3.1 + + + + + po.d2.n1.1.4.3.2 + + + + + po.d2.n1.1.4.3.3 + + + + + po.d2.n1.2.1.1.1 + + + + + po.d2.n1.2.1.1.2 + + + + + po.d2.n1.2.1.1.3 + + + + + po.d2.n1.2.1.2.1 + + + + + po.d2.n1.2.1.2.2 + + + + + po.d2.n1.2.1.2.3 + + + + + po.d2.n1.2.1.3.1 + + + + + po.d2.n1.2.1.3.2 + + + + + po.d2.n1.2.1.3.3 + + + + + po.d2.n1.2.2.1.1 + + + + + po.d2.n1.2.2.1.2 + + + + + po.d2.n1.2.2.1.3 + + + + + po.d2.n1.2.2.2.1 + + + + + po.d2.n1.2.2.2.2 + + + + + po.d2.n1.2.2.2.3 + + + + + po.d2.n1.2.2.3.1 + + + + + po.d2.n1.2.2.3.2 + + + + + po.d2.n1.2.2.3.3 + + + + + po.d2.n1.2.3.1.1 + + + + + po.d2.n1.2.3.1.2 + + + + + po.d2.n1.2.3.1.3 + + + + + po.d2.n1.2.3.2.1 + + + + + po.d2.n1.2.3.2.2 + + + + + po.d2.n1.2.3.2.3 + + + + + po.d2.n1.2.3.3.1 + + + + + po.d2.n1.2.3.3.2 + + + + + po.d2.n1.2.3.3.3 + + + + + po.d2.n1.2.4.1.1 + + + + + po.d2.n1.2.4.1.2 + + + + + po.d2.n1.2.4.1.3 + + + + + po.d2.n1.2.4.2.1 + + + + + po.d2.n1.2.4.2.2 + + + + + po.d2.n1.2.4.2.3 + + + + + po.d2.n1.2.4.3.1 + + + + + po.d2.n1.2.4.3.2 + + + + + po.d2.n1.2.4.3.3 + + + + + po.d2.n1.3.1.1.1 + + + + + po.d2.n1.3.1.1.2 + + + + + po.d2.n1.3.1.1.3 + + + + + po.d2.n1.3.1.2.1 + + + + + po.d2.n1.3.1.2.2 + + + + + po.d2.n1.3.1.2.3 + + + + + po.d2.n1.3.1.3.1 + + + + + po.d2.n1.3.1.3.2 + + + + + po.d2.n1.3.1.3.3 + + + + + po.d2.n1.3.2.1.1 + + + + + po.d2.n1.3.2.1.2 + + + + + po.d2.n1.3.2.1.3 + + + + + po.d2.n1.3.2.2.1 + + + + + po.d2.n1.3.2.2.2 + + + + + po.d2.n1.3.2.2.3 + + + + + po.d2.n1.3.2.3.1 + + + + + po.d2.n1.3.2.3.2 + + + + + po.d2.n1.3.2.3.3 + + + + + po.d2.n1.3.3.1.1 + + + + + po.d2.n1.3.3.1.2 + + + + + po.d2.n1.3.3.1.3 + + + + + po.d2.n1.3.3.2.1 + + + + + po.d2.n1.3.3.2.2 + + + + + po.d2.n1.3.3.2.3 + + + + + po.d2.n1.3.3.3.1 + + + + + po.d2.n1.3.3.3.2 + + + + + po.d2.n1.3.3.3.3 + + + + + po.d2.n1.3.4.1.1 + + + + + po.d2.n1.3.4.1.2 + + + + + po.d2.n1.3.4.1.3 + + + + + po.d2.n1.3.4.2.1 + + + + + po.d2.n1.3.4.2.2 + + + + + po.d2.n1.3.4.2.3 + + + + + po.d2.n1.3.4.3.1 + + + + + po.d2.n1.3.4.3.2 + + + + + po.d2.n1.3.4.3.3 + + + + + po.d3.n1.1.1.1.1 + + + + + po.d3.n1.1.1.1.2 + + + + + po.d3.n1.1.1.1.3 + + + + + po.d3.n1.1.1.2.1 + + + + + po.d3.n1.1.1.2.2 + + + + + po.d3.n1.1.1.2.3 + + + + + po.d3.n1.1.1.3.1 + + + + + po.d3.n1.1.1.3.2 + + + + + po.d3.n1.1.1.3.3 + + + + + po.d3.n1.1.1.4.1 + + + + + po.d3.n1.1.1.4.2 + + + + + po.d3.n1.1.1.4.3 + + + + + po.d3.n1.1.2.1.1 + + + + + po.d3.n1.1.2.1.2 + + + + + po.d3.n1.1.2.1.3 + + + + + po.d3.n1.1.2.2.1 + + + + + po.d3.n1.1.2.2.2 + + + + + po.d3.n1.1.2.2.3 + + + + + po.d3.n1.1.2.3.1 + + + + + po.d3.n1.1.2.3.2 + + + + + po.d3.n1.1.2.3.3 + + + + + po.d3.n1.1.2.4.1 + + + + + po.d3.n1.1.2.4.2 + + + + + po.d3.n1.1.2.4.3 + + + + + po.d3.n1.1.3.1.1 + + + + + po.d3.n1.1.3.1.2 + + + + + po.d3.n1.1.3.1.3 + + + + + po.d3.n1.1.3.2.1 + + + + + po.d3.n1.1.3.2.2 + + + + + po.d3.n1.1.3.2.3 + + + + + po.d3.n1.1.3.3.1 + + + + + po.d3.n1.1.3.3.2 + + + + + po.d3.n1.1.3.3.3 + + + + + po.d3.n1.1.3.4.1 + + + + + po.d3.n1.1.3.4.2 + + + + + po.d3.n1.1.3.4.3 + + + + + po.d3.n1.2.1.1.1 + + + + + po.d3.n1.2.1.1.2 + + + + + po.d3.n1.2.1.1.3 + + + + + po.d3.n1.2.1.2.1 + + + + + po.d3.n1.2.1.2.2 + + + + + po.d3.n1.2.1.2.3 + + + + + po.d3.n1.2.1.3.1 + + + + + po.d3.n1.2.1.3.2 + + + + + po.d3.n1.2.1.3.3 + + + + + po.d3.n1.2.1.4.1 + + + + + po.d3.n1.2.1.4.2 + + + + + po.d3.n1.2.1.4.3 + + + + + po.d3.n1.2.2.1.1 + + + + + po.d3.n1.2.2.1.2 + + + + + po.d3.n1.2.2.1.3 + + + + + po.d3.n1.2.2.2.1 + + + + + po.d3.n1.2.2.2.2 + + + + + po.d3.n1.2.2.2.3 + + + + + po.d3.n1.2.2.3.1 + + + + + po.d3.n1.2.2.3.2 + + + + + po.d3.n1.2.2.3.3 + + + + + po.d3.n1.2.2.4.1 + + + + + po.d3.n1.2.2.4.2 + + + + + po.d3.n1.2.2.4.3 + + + + + po.d3.n1.2.3.1.1 + + + + + po.d3.n1.2.3.1.2 + + + + + po.d3.n1.2.3.1.3 + + + + + po.d3.n1.2.3.2.1 + + + + + po.d3.n1.2.3.2.2 + + + + + po.d3.n1.2.3.2.3 + + + + + po.d3.n1.2.3.3.1 + + + + + po.d3.n1.2.3.3.2 + + + + + po.d3.n1.2.3.3.3 + + + + + po.d3.n1.2.3.4.1 + + + + + po.d3.n1.2.3.4.2 + + + + + po.d3.n1.2.3.4.3 + + + + + po.d3.n1.3.1.1.1 + + + + + po.d3.n1.3.1.1.2 + + + + + po.d3.n1.3.1.1.3 + + + + + po.d3.n1.3.1.2.1 + + + + + po.d3.n1.3.1.2.2 + + + + + po.d3.n1.3.1.2.3 + + + + + po.d3.n1.3.1.3.1 + + + + + po.d3.n1.3.1.3.2 + + + + + po.d3.n1.3.1.3.3 + + + + + po.d3.n1.3.1.4.1 + + + + + po.d3.n1.3.1.4.2 + + + + + po.d3.n1.3.1.4.3 + + + + + po.d3.n1.3.2.1.1 + + + + + po.d3.n1.3.2.1.2 + + + + + po.d3.n1.3.2.1.3 + + + + + po.d3.n1.3.2.2.1 + + + + + po.d3.n1.3.2.2.2 + + + + + po.d3.n1.3.2.2.3 + + + + + po.d3.n1.3.2.3.1 + + + + + po.d3.n1.3.2.3.2 + + + + + po.d3.n1.3.2.3.3 + + + + + po.d3.n1.3.2.4.1 + + + + + po.d3.n1.3.2.4.2 + + + + + po.d3.n1.3.2.4.3 + + + + + po.d3.n1.3.3.1.1 + + + + + po.d3.n1.3.3.1.2 + + + + + po.d3.n1.3.3.1.3 + + + + + po.d3.n1.3.3.2.1 + + + + + po.d3.n1.3.3.2.2 + + + + + po.d3.n1.3.3.2.3 + + + + + po.d3.n1.3.3.3.1 + + + + + po.d3.n1.3.3.3.2 + + + + + po.d3.n1.3.3.3.3 + + + + + po.d3.n1.3.3.4.1 + + + + + po.d3.n1.3.3.4.2 + + + + + po.d3.n1.3.3.4.3 + + + + + po.d4.n1.1.1.1.1 + + + + + po.d4.n1.1.1.1.2 + + + + + po.d4.n1.1.1.1.3 + + + + + po.d4.n1.1.1.1.4 + + + + + po.d4.n1.1.1.2.1 + + + + + po.d4.n1.1.1.2.2 + + + + + po.d4.n1.1.1.2.3 + + + + + po.d4.n1.1.1.2.4 + + + + + po.d4.n1.1.1.3.1 + + + + + po.d4.n1.1.1.3.2 + + + + + po.d4.n1.1.1.3.3 + + + + + po.d4.n1.1.1.3.4 + + + + + po.d4.n1.1.2.1.1 + + + + + po.d4.n1.1.2.1.2 + + + + + po.d4.n1.1.2.1.3 + + + + + po.d4.n1.1.2.1.4 + + + + + po.d4.n1.1.2.2.1 + + + + + po.d4.n1.1.2.2.2 + + + + + po.d4.n1.1.2.2.3 + + + + + po.d4.n1.1.2.2.4 + + + + + po.d4.n1.1.2.3.1 + + + + + po.d4.n1.1.2.3.2 + + + + + po.d4.n1.1.2.3.3 + + + + + po.d4.n1.1.2.3.4 + + + + + po.d4.n1.1.3.1.1 + + + + + po.d4.n1.1.3.1.2 + + + + + po.d4.n1.1.3.1.3 + + + + + po.d4.n1.1.3.1.4 + + + + + po.d4.n1.1.3.2.1 + + + + + po.d4.n1.1.3.2.2 + + + + + po.d4.n1.1.3.2.3 + + + + + po.d4.n1.1.3.2.4 + + + + + po.d4.n1.1.3.3.1 + + + + + po.d4.n1.1.3.3.2 + + + + + po.d4.n1.1.3.3.3 + + + + + po.d4.n1.1.3.3.4 + + + + + po.d4.n1.2.1.1.1 + + + + + po.d4.n1.2.1.1.2 + + + + + po.d4.n1.2.1.1.3 + + + + + po.d4.n1.2.1.1.4 + + + + + po.d4.n1.2.1.2.1 + + + + + po.d4.n1.2.1.2.2 + + + + + po.d4.n1.2.1.2.3 + + + + + po.d4.n1.2.1.2.4 + + + + + po.d4.n1.2.1.3.1 + + + + + po.d4.n1.2.1.3.2 + + + + + po.d4.n1.2.1.3.3 + + + + + po.d4.n1.2.1.3.4 + + + + + po.d4.n1.2.2.1.1 + + + + + po.d4.n1.2.2.1.2 + + + + + po.d4.n1.2.2.1.3 + + + + + po.d4.n1.2.2.1.4 + + + + + po.d4.n1.2.2.2.1 + + + + + po.d4.n1.2.2.2.2 + + + + + po.d4.n1.2.2.2.3 + + + + + po.d4.n1.2.2.2.4 + + + + + po.d4.n1.2.2.3.1 + + + + + po.d4.n1.2.2.3.2 + + + + + po.d4.n1.2.2.3.3 + + + + + po.d4.n1.2.2.3.4 + + + + + po.d4.n1.2.3.1.1 + + + + + po.d4.n1.2.3.1.2 + + + + + po.d4.n1.2.3.1.3 + + + + + po.d4.n1.2.3.1.4 + + + + + po.d4.n1.2.3.2.1 + + + + + po.d4.n1.2.3.2.2 + + + + + po.d4.n1.2.3.2.3 + + + + + po.d4.n1.2.3.2.4 + + + + + po.d4.n1.2.3.3.1 + + + + + po.d4.n1.2.3.3.2 + + + + + po.d4.n1.2.3.3.3 + + + + + po.d4.n1.2.3.3.4 + + + + + po.d4.n1.3.1.1.1 + + + + + po.d4.n1.3.1.1.2 + + + + + po.d4.n1.3.1.1.3 + + + + + po.d4.n1.3.1.1.4 + + + + + po.d4.n1.3.1.2.1 + + + + + po.d4.n1.3.1.2.2 + + + + + po.d4.n1.3.1.2.3 + + + + + po.d4.n1.3.1.2.4 + + + + + po.d4.n1.3.1.3.1 + + + + + po.d4.n1.3.1.3.2 + + + + + po.d4.n1.3.1.3.3 + + + + + po.d4.n1.3.1.3.4 + + + + + po.d4.n1.3.2.1.1 + + + + + po.d4.n1.3.2.1.2 + + + + + po.d4.n1.3.2.1.3 + + + + + po.d4.n1.3.2.1.4 + + + + + po.d4.n1.3.2.2.1 + + + + + po.d4.n1.3.2.2.2 + + + + + po.d4.n1.3.2.2.3 + + + + + po.d4.n1.3.2.2.4 + + + + + po.d4.n1.3.2.3.1 + + + + + po.d4.n1.3.2.3.2 + + + + + po.d4.n1.3.2.3.3 + + + + + po.d4.n1.3.2.3.4 + + + + + po.d4.n1.3.3.1.1 + + + + + po.d4.n1.3.3.1.2 + + + + + po.d4.n1.3.3.1.3 + + + + + po.d4.n1.3.3.1.4 + + + + + po.d4.n1.3.3.2.1 + + + + + po.d4.n1.3.3.2.2 + + + + + po.d4.n1.3.3.2.3 + + + + + po.d4.n1.3.3.2.4 + + + + + po.d4.n1.3.3.3.1 + + + + + po.d4.n1.3.3.3.2 + + + + + po.d4.n1.3.3.3.3 + + + + + po.d4.n1.3.3.3.4 + + + + + pol.d1.n1.1.1.1.1 + + + 1 + + + + + pol.d1.n1.1.1.1.2 + + + 1 + + + + + pol.d1.n1.1.1.1.3 + + + 1 + + + + + pol.d1.n1.1.1.2.1 + + + 1 + + + + + pol.d1.n1.1.1.2.2 + + + 1 + + + + + pol.d1.n1.1.1.2.3 + + + 1 + + + + + pol.d1.n1.1.1.3.1 + + + 1 + + + + + pol.d1.n1.1.1.3.2 + + + 1 + + + + + pol.d1.n1.1.1.3.3 + + + 1 + + + + + pol.d1.n1.1.2.1.1 + + + 1 + + + + + pol.d1.n1.1.2.1.2 + + + 1 + + + + + pol.d1.n1.1.2.1.3 + + + 1 + + + + + pol.d1.n1.1.2.2.1 + + + 1 + + + + + pol.d1.n1.1.2.2.2 + + + 1 + + + + + pol.d1.n1.1.2.2.3 + + + 1 + + + + + pol.d1.n1.1.2.3.1 + + + 1 + + + + + pol.d1.n1.1.2.3.2 + + + 1 + + + + + pol.d1.n1.1.2.3.3 + + + 1 + + + + + pol.d1.n1.1.3.1.1 + + + 1 + + + + + pol.d1.n1.1.3.1.2 + + + 1 + + + + + pol.d1.n1.1.3.1.3 + + + 1 + + + + + pol.d1.n1.1.3.2.1 + + + 1 + + + + + pol.d1.n1.1.3.2.2 + + + 1 + + + + + pol.d1.n1.1.3.2.3 + + + 1 + + + + + pol.d1.n1.1.3.3.1 + + + 1 + + + + + pol.d1.n1.1.3.3.2 + + + 1 + + + + + pol.d1.n1.1.3.3.3 + + + 1 + + + + + pol.d1.n1.2.1.1.1 + + + 1 + + + + + pol.d1.n1.2.1.1.2 + + + 1 + + + + + pol.d1.n1.2.1.1.3 + + + 1 + + + + + pol.d1.n1.2.1.2.1 + + + 1 + + + + + pol.d1.n1.2.1.2.2 + + + 1 + + + + + pol.d1.n1.2.1.2.3 + + + 1 + + + + + pol.d1.n1.2.1.3.1 + + + 1 + + + + + pol.d1.n1.2.1.3.2 + + + 1 + + + + + pol.d1.n1.2.1.3.3 + + + 1 + + + + + pol.d1.n1.2.2.1.1 + + + 1 + + + + + pol.d1.n1.2.2.1.2 + + + 1 + + + + + pol.d1.n1.2.2.1.3 + + + 1 + + + + + pol.d1.n1.2.2.2.1 + + + 1 + + + + + pol.d1.n1.2.2.2.2 + + + 1 + + + + + pol.d1.n1.2.2.2.3 + + + 1 + + + + + pol.d1.n1.2.2.3.1 + + + 1 + + + + + pol.d1.n1.2.2.3.2 + + + 1 + + + + + pol.d1.n1.2.2.3.3 + + + 1 + + + + + pol.d1.n1.2.3.1.1 + + + 1 + + + + + pol.d1.n1.2.3.1.2 + + + 1 + + + + + pol.d1.n1.2.3.1.3 + + + 1 + + + + + pol.d1.n1.2.3.2.1 + + + 1 + + + + + pol.d1.n1.2.3.2.2 + + + 1 + + + + + pol.d1.n1.2.3.2.3 + + + 1 + + + + + pol.d1.n1.2.3.3.1 + + + 1 + + + + + pol.d1.n1.2.3.3.2 + + + 1 + + + + + pol.d1.n1.2.3.3.3 + + + 1 + + + + + pol.d1.n1.3.1.1.1 + + + 1 + + + + + pol.d1.n1.3.1.1.2 + + + 1 + + + + + pol.d1.n1.3.1.1.3 + + + 1 + + + + + pol.d1.n1.3.1.2.1 + + + 1 + + + + + pol.d1.n1.3.1.2.2 + + + 1 + + + + + pol.d1.n1.3.1.2.3 + + + 1 + + + + + pol.d1.n1.3.1.3.1 + + + 1 + + + + + pol.d1.n1.3.1.3.2 + + + 1 + + + + + pol.d1.n1.3.1.3.3 + + + 1 + + + + + pol.d1.n1.3.2.1.1 + + + 1 + + + + + pol.d1.n1.3.2.1.2 + + + 1 + + + + + pol.d1.n1.3.2.1.3 + + + 1 + + + + + pol.d1.n1.3.2.2.1 + + + 1 + + + + + pol.d1.n1.3.2.2.2 + + + 1 + + + + + pol.d1.n1.3.2.2.3 + + + 1 + + + + + pol.d1.n1.3.2.3.1 + + + 1 + + + + + pol.d1.n1.3.2.3.2 + + + 1 + + + + + pol.d1.n1.3.2.3.3 + + + 1 + + + + + pol.d1.n1.3.3.1.1 + + + 1 + + + + + pol.d1.n1.3.3.1.2 + + + 1 + + + + + pol.d1.n1.3.3.1.3 + + + 1 + + + + + pol.d1.n1.3.3.2.1 + + + 1 + + + + + pol.d1.n1.3.3.2.2 + + + 1 + + + + + pol.d1.n1.3.3.2.3 + + + 1 + + + + + pol.d1.n1.3.3.3.1 + + + 1 + + + + + pol.d1.n1.3.3.3.2 + + + 1 + + + + + pol.d1.n1.3.3.3.3 + + + 1 + + + + + pol.d1.n1.4.1.1.1 + + + 1 + + + + + pol.d1.n1.4.1.1.2 + + + 1 + + + + + pol.d1.n1.4.1.1.3 + + + 1 + + + + + pol.d1.n1.4.1.2.1 + + + 1 + + + + + pol.d1.n1.4.1.2.2 + + + 1 + + + + + pol.d1.n1.4.1.2.3 + + + 1 + + + + + pol.d1.n1.4.1.3.1 + + + 1 + + + + + pol.d1.n1.4.1.3.2 + + + 1 + + + + + pol.d1.n1.4.1.3.3 + + + 1 + + + + + pol.d1.n1.4.2.1.1 + + + 1 + + + + + pol.d1.n1.4.2.1.2 + + + 1 + + + + + pol.d1.n1.4.2.1.3 + + + 1 + + + + + pol.d1.n1.4.2.2.1 + + + 1 + + + + + pol.d1.n1.4.2.2.2 + + + 1 + + + + + pol.d1.n1.4.2.2.3 + + + 1 + + + + + pol.d1.n1.4.2.3.1 + + + 1 + + + + + pol.d1.n1.4.2.3.2 + + + 1 + + + + + pol.d1.n1.4.2.3.3 + + + 1 + + + + + pol.d1.n1.4.3.1.1 + + + 1 + + + + + pol.d1.n1.4.3.1.2 + + + 1 + + + + + pol.d1.n1.4.3.1.3 + + + 1 + + + + + pol.d1.n1.4.3.2.1 + + + 1 + + + + + pol.d1.n1.4.3.2.2 + + + 1 + + + + + pol.d1.n1.4.3.2.3 + + + 1 + + + + + pol.d1.n1.4.3.3.1 + + + 1 + + + + + pol.d1.n1.4.3.3.2 + + + 1 + + + + + pol.d1.n1.4.3.3.3 + + + 1 + + + + + pol.d2.n1.1.1.1.1 + + + 1 + + + + + pol.d2.n1.1.1.1.2 + + + 1 + + + + + pol.d2.n1.1.1.1.3 + + + 1 + + + + + pol.d2.n1.1.1.2.1 + + + 1 + + + + + pol.d2.n1.1.1.2.2 + + + 1 + + + + + pol.d2.n1.1.1.2.3 + + + 1 + + + + + pol.d2.n1.1.1.3.1 + + + 1 + + + + + pol.d2.n1.1.1.3.2 + + + 1 + + + + + pol.d2.n1.1.1.3.3 + + + 1 + + + + + pol.d2.n1.1.2.1.1 + + + 1 + + + + + pol.d2.n1.1.2.1.2 + + + 1 + + + + + pol.d2.n1.1.2.1.3 + + + 1 + + + + + pol.d2.n1.1.2.2.1 + + + 1 + + + + + pol.d2.n1.1.2.2.2 + + + 1 + + + + + pol.d2.n1.1.2.2.3 + + + 1 + + + + + pol.d2.n1.1.2.3.1 + + + 1 + + + + + pol.d2.n1.1.2.3.2 + + + 1 + + + + + pol.d2.n1.1.2.3.3 + + + 1 + + + + + pol.d2.n1.1.3.1.1 + + + 1 + + + + + pol.d2.n1.1.3.1.2 + + + 1 + + + + + pol.d2.n1.1.3.1.3 + + + 1 + + + + + pol.d2.n1.1.3.2.1 + + + 1 + + + + + pol.d2.n1.1.3.2.2 + + + 1 + + + + + pol.d2.n1.1.3.2.3 + + + 1 + + + + + pol.d2.n1.1.3.3.1 + + + 1 + + + + + pol.d2.n1.1.3.3.2 + + + 1 + + + + + pol.d2.n1.1.3.3.3 + + + 1 + + + + + pol.d2.n1.1.4.1.1 + + + 1 + + + + + pol.d2.n1.1.4.1.2 + + + 1 + + + + + pol.d2.n1.1.4.1.3 + + + 1 + + + + + pol.d2.n1.1.4.2.1 + + + 1 + + + + + pol.d2.n1.1.4.2.2 + + + 1 + + + + + pol.d2.n1.1.4.2.3 + + + 1 + + + + + pol.d2.n1.1.4.3.1 + + + 1 + + + + + pol.d2.n1.1.4.3.2 + + + 1 + + + + + pol.d2.n1.1.4.3.3 + + + 1 + + + + + pol.d2.n1.2.1.1.1 + + + 1 + + + + + pol.d2.n1.2.1.1.2 + + + 1 + + + + + pol.d2.n1.2.1.1.3 + + + 1 + + + + + pol.d2.n1.2.1.2.1 + + + 1 + + + + + pol.d2.n1.2.1.2.2 + + + 1 + + + + + pol.d2.n1.2.1.2.3 + + + 1 + + + + + pol.d2.n1.2.1.3.1 + + + 1 + + + + + pol.d2.n1.2.1.3.2 + + + 1 + + + + + pol.d2.n1.2.1.3.3 + + + 1 + + + + + pol.d2.n1.2.2.1.1 + + + 1 + + + + + pol.d2.n1.2.2.1.2 + + + 1 + + + + + pol.d2.n1.2.2.1.3 + + + 1 + + + + + pol.d2.n1.2.2.2.1 + + + 1 + + + + + pol.d2.n1.2.2.2.2 + + + 1 + + + + + pol.d2.n1.2.2.2.3 + + + 1 + + + + + pol.d2.n1.2.2.3.1 + + + 1 + + + + + pol.d2.n1.2.2.3.2 + + + 1 + + + + + pol.d2.n1.2.2.3.3 + + + 1 + + + + + pol.d2.n1.2.3.1.1 + + + 1 + + + + + pol.d2.n1.2.3.1.2 + + + 1 + + + + + pol.d2.n1.2.3.1.3 + + + 1 + + + + + pol.d2.n1.2.3.2.1 + + + 1 + + + + + pol.d2.n1.2.3.2.2 + + + 1 + + + + + pol.d2.n1.2.3.2.3 + + + 1 + + + + + pol.d2.n1.2.3.3.1 + + + 1 + + + + + pol.d2.n1.2.3.3.2 + + + 1 + + + + + pol.d2.n1.2.3.3.3 + + + 1 + + + + + pol.d2.n1.2.4.1.1 + + + 1 + + + + + pol.d2.n1.2.4.1.2 + + + 1 + + + + + pol.d2.n1.2.4.1.3 + + + 1 + + + + + pol.d2.n1.2.4.2.1 + + + 1 + + + + + pol.d2.n1.2.4.2.2 + + + 1 + + + + + pol.d2.n1.2.4.2.3 + + + 1 + + + + + pol.d2.n1.2.4.3.1 + + + 1 + + + + + pol.d2.n1.2.4.3.2 + + + 1 + + + + + pol.d2.n1.2.4.3.3 + + + 1 + + + + + pol.d2.n1.3.1.1.1 + + + 1 + + + + + pol.d2.n1.3.1.1.2 + + + 1 + + + + + pol.d2.n1.3.1.1.3 + + + 1 + + + + + pol.d2.n1.3.1.2.1 + + + 1 + + + + + pol.d2.n1.3.1.2.2 + + + 1 + + + + + pol.d2.n1.3.1.2.3 + + + 1 + + + + + pol.d2.n1.3.1.3.1 + + + 1 + + + + + pol.d2.n1.3.1.3.2 + + + 1 + + + + + pol.d2.n1.3.1.3.3 + + + 1 + + + + + pol.d2.n1.3.2.1.1 + + + 1 + + + + + pol.d2.n1.3.2.1.2 + + + 1 + + + + + pol.d2.n1.3.2.1.3 + + + 1 + + + + + pol.d2.n1.3.2.2.1 + + + 1 + + + + + pol.d2.n1.3.2.2.2 + + + 1 + + + + + pol.d2.n1.3.2.2.3 + + + 1 + + + + + pol.d2.n1.3.2.3.1 + + + 1 + + + + + pol.d2.n1.3.2.3.2 + + + 1 + + + + + pol.d2.n1.3.2.3.3 + + + 1 + + + + + pol.d2.n1.3.3.1.1 + + + 1 + + + + + pol.d2.n1.3.3.1.2 + + + 1 + + + + + pol.d2.n1.3.3.1.3 + + + 1 + + + + + pol.d2.n1.3.3.2.1 + + + 1 + + + + + pol.d2.n1.3.3.2.2 + + + 1 + + + + + pol.d2.n1.3.3.2.3 + + + 1 + + + + + pol.d2.n1.3.3.3.1 + + + 1 + + + + + pol.d2.n1.3.3.3.2 + + + 1 + + + + + pol.d2.n1.3.3.3.3 + + + 1 + + + + + pol.d2.n1.3.4.1.1 + + + 1 + + + + + pol.d2.n1.3.4.1.2 + + + 1 + + + + + pol.d2.n1.3.4.1.3 + + + 1 + + + + + pol.d2.n1.3.4.2.1 + + + 1 + + + + + pol.d2.n1.3.4.2.2 + + + 1 + + + + + pol.d2.n1.3.4.2.3 + + + 1 + + + + + pol.d2.n1.3.4.3.1 + + + 1 + + + + + pol.d2.n1.3.4.3.2 + + + 1 + + + + + pol.d2.n1.3.4.3.3 + + + 1 + + + + + pol.d3.n1.1.1.1.1 + + + 1 + + + + + pol.d3.n1.1.1.1.2 + + + 1 + + + + + pol.d3.n1.1.1.1.3 + + + 1 + + + + + pol.d3.n1.1.1.2.1 + + + 1 + + + + + pol.d3.n1.1.1.2.2 + + + 1 + + + + + pol.d3.n1.1.1.2.3 + + + 1 + + + + + pol.d3.n1.1.1.3.1 + + + 1 + + + + + pol.d3.n1.1.1.3.2 + + + 1 + + + + + pol.d3.n1.1.1.3.3 + + + 1 + + + + + pol.d3.n1.1.1.4.1 + + + 1 + + + + + pol.d3.n1.1.1.4.2 + + + 1 + + + + + pol.d3.n1.1.1.4.3 + + + 1 + + + + + pol.d3.n1.1.2.1.1 + + + 1 + + + + + pol.d3.n1.1.2.1.2 + + + 1 + + + + + pol.d3.n1.1.2.1.3 + + + 1 + + + + + pol.d3.n1.1.2.2.1 + + + 1 + + + + + pol.d3.n1.1.2.2.2 + + + 1 + + + + + pol.d3.n1.1.2.2.3 + + + 1 + + + + + pol.d3.n1.1.2.3.1 + + + 1 + + + + + pol.d3.n1.1.2.3.2 + + + 1 + + + + + pol.d3.n1.1.2.3.3 + + + 1 + + + + + pol.d3.n1.1.2.4.1 + + + 1 + + + + + pol.d3.n1.1.2.4.2 + + + 1 + + + + + pol.d3.n1.1.2.4.3 + + + 1 + + + + + pol.d3.n1.1.3.1.1 + + + 1 + + + + + pol.d3.n1.1.3.1.2 + + + 1 + + + + + pol.d3.n1.1.3.1.3 + + + 1 + + + + + pol.d3.n1.1.3.2.1 + + + 1 + + + + + pol.d3.n1.1.3.2.2 + + + 1 + + + + + pol.d3.n1.1.3.2.3 + + + 1 + + + + + pol.d3.n1.1.3.3.1 + + + 1 + + + + + pol.d3.n1.1.3.3.2 + + + 1 + + + + + pol.d3.n1.1.3.3.3 + + + 1 + + + + + pol.d3.n1.1.3.4.1 + + + 1 + + + + + pol.d3.n1.1.3.4.2 + + + 1 + + + + + pol.d3.n1.1.3.4.3 + + + 1 + + + + + pol.d3.n1.2.1.1.1 + + + 1 + + + + + pol.d3.n1.2.1.1.2 + + + 1 + + + + + pol.d3.n1.2.1.1.3 + + + 1 + + + + + pol.d3.n1.2.1.2.1 + + + 1 + + + + + pol.d3.n1.2.1.2.2 + + + 1 + + + + + pol.d3.n1.2.1.2.3 + + + 1 + + + + + pol.d3.n1.2.1.3.1 + + + 1 + + + + + pol.d3.n1.2.1.3.2 + + + 1 + + + + + pol.d3.n1.2.1.3.3 + + + 1 + + + + + pol.d3.n1.2.1.4.1 + + + 1 + + + + + pol.d3.n1.2.1.4.2 + + + 1 + + + + + pol.d3.n1.2.1.4.3 + + + 1 + + + + + pol.d3.n1.2.2.1.1 + + + 1 + + + + + pol.d3.n1.2.2.1.2 + + + 1 + + + + + pol.d3.n1.2.2.1.3 + + + 1 + + + + + pol.d3.n1.2.2.2.1 + + + 1 + + + + + pol.d3.n1.2.2.2.2 + + + 1 + + + + + pol.d3.n1.2.2.2.3 + + + 1 + + + + + pol.d3.n1.2.2.3.1 + + + 1 + + + + + pol.d3.n1.2.2.3.2 + + + 1 + + + + + pol.d3.n1.2.2.3.3 + + + 1 + + + + + pol.d3.n1.2.2.4.1 + + + 1 + + + + + pol.d3.n1.2.2.4.2 + + + 1 + + + + + pol.d3.n1.2.2.4.3 + + + 1 + + + + + pol.d3.n1.2.3.1.1 + + + 1 + + + + + pol.d3.n1.2.3.1.2 + + + 1 + + + + + pol.d3.n1.2.3.1.3 + + + 1 + + + + + pol.d3.n1.2.3.2.1 + + + 1 + + + + + pol.d3.n1.2.3.2.2 + + + 1 + + + + + pol.d3.n1.2.3.2.3 + + + 1 + + + + + pol.d3.n1.2.3.3.1 + + + 1 + + + + + pol.d3.n1.2.3.3.2 + + + 1 + + + + + pol.d3.n1.2.3.3.3 + + + 1 + + + + + pol.d3.n1.2.3.4.1 + + + 1 + + + + + pol.d3.n1.2.3.4.2 + + + 1 + + + + + pol.d3.n1.2.3.4.3 + + + 1 + + + + + pol.d3.n1.3.1.1.1 + + + 1 + + + + + pol.d3.n1.3.1.1.2 + + + 1 + + + + + pol.d3.n1.3.1.1.3 + + + 1 + + + + + pol.d3.n1.3.1.2.1 + + + 1 + + + + + pol.d3.n1.3.1.2.2 + + + 1 + + + + + pol.d3.n1.3.1.2.3 + + + 1 + + + + + pol.d3.n1.3.1.3.1 + + + 1 + + + + + pol.d3.n1.3.1.3.2 + + + 1 + + + + + pol.d3.n1.3.1.3.3 + + + 1 + + + + + pol.d3.n1.3.1.4.1 + + + 1 + + + + + pol.d3.n1.3.1.4.2 + + + 1 + + + + + pol.d3.n1.3.1.4.3 + + + 1 + + + + + pol.d3.n1.3.2.1.1 + + + 1 + + + + + pol.d3.n1.3.2.1.2 + + + 1 + + + + + pol.d3.n1.3.2.1.3 + + + 1 + + + + + pol.d3.n1.3.2.2.1 + + + 1 + + + + + pol.d3.n1.3.2.2.2 + + + 1 + + + + + pol.d3.n1.3.2.2.3 + + + 1 + + + + + pol.d3.n1.3.2.3.1 + + + 1 + + + + + pol.d3.n1.3.2.3.2 + + + 1 + + + + + pol.d3.n1.3.2.3.3 + + + 1 + + + + + pol.d3.n1.3.2.4.1 + + + 1 + + + + + pol.d3.n1.3.2.4.2 + + + 1 + + + + + pol.d3.n1.3.2.4.3 + + + 1 + + + + + pol.d3.n1.3.3.1.1 + + + 1 + + + + + pol.d3.n1.3.3.1.2 + + + 1 + + + + + pol.d3.n1.3.3.1.3 + + + 1 + + + + + pol.d3.n1.3.3.2.1 + + + 1 + + + + + pol.d3.n1.3.3.2.2 + + + 1 + + + + + pol.d3.n1.3.3.2.3 + + + 1 + + + + + pol.d3.n1.3.3.3.1 + + + 1 + + + + + pol.d3.n1.3.3.3.2 + + + 1 + + + + + pol.d3.n1.3.3.3.3 + + + 1 + + + + + pol.d3.n1.3.3.4.1 + + + 1 + + + + + pol.d3.n1.3.3.4.2 + + + 1 + + + + + pol.d3.n1.3.3.4.3 + + + 1 + + + + + pol.d4.n1.1.1.1.1 + + + 1 + + + + + pol.d4.n1.1.1.1.2 + + + 1 + + + + + pol.d4.n1.1.1.1.3 + + + 1 + + + + + pol.d4.n1.1.1.1.4 + + + 1 + + + + + pol.d4.n1.1.1.2.1 + + + 1 + + + + + pol.d4.n1.1.1.2.2 + + + 1 + + + + + pol.d4.n1.1.1.2.3 + + + 1 + + + + + pol.d4.n1.1.1.2.4 + + + 1 + + + + + pol.d4.n1.1.1.3.1 + + + 1 + + + + + pol.d4.n1.1.1.3.2 + + + 1 + + + + + pol.d4.n1.1.1.3.3 + + + 1 + + + + + pol.d4.n1.1.1.3.4 + + + 1 + + + + + pol.d4.n1.1.2.1.1 + + + 1 + + + + + pol.d4.n1.1.2.1.2 + + + 1 + + + + + pol.d4.n1.1.2.1.3 + + + 1 + + + + + pol.d4.n1.1.2.1.4 + + + 1 + + + + + pol.d4.n1.1.2.2.1 + + + 1 + + + + + pol.d4.n1.1.2.2.2 + + + 1 + + + + + pol.d4.n1.1.2.2.3 + + + 1 + + + + + pol.d4.n1.1.2.2.4 + + + 1 + + + + + pol.d4.n1.1.2.3.1 + + + 1 + + + + + pol.d4.n1.1.2.3.2 + + + 1 + + + + + pol.d4.n1.1.2.3.3 + + + 1 + + + + + pol.d4.n1.1.2.3.4 + + + 1 + + + + + pol.d4.n1.1.3.1.1 + + + 1 + + + + + pol.d4.n1.1.3.1.2 + + + 1 + + + + + pol.d4.n1.1.3.1.3 + + + 1 + + + + + pol.d4.n1.1.3.1.4 + + + 1 + + + + + pol.d4.n1.1.3.2.1 + + + 1 + + + + + pol.d4.n1.1.3.2.2 + + + 1 + + + + + pol.d4.n1.1.3.2.3 + + + 1 + + + + + pol.d4.n1.1.3.2.4 + + + 1 + + + + + pol.d4.n1.1.3.3.1 + + + 1 + + + + + pol.d4.n1.1.3.3.2 + + + 1 + + + + + pol.d4.n1.1.3.3.3 + + + 1 + + + + + pol.d4.n1.1.3.3.4 + + + 1 + + + + + pol.d4.n1.2.1.1.1 + + + 1 + + + + + pol.d4.n1.2.1.1.2 + + + 1 + + + + + pol.d4.n1.2.1.1.3 + + + 1 + + + + + pol.d4.n1.2.1.1.4 + + + 1 + + + + + pol.d4.n1.2.1.2.1 + + + 1 + + + + + pol.d4.n1.2.1.2.2 + + + 1 + + + + + pol.d4.n1.2.1.2.3 + + + 1 + + + + + pol.d4.n1.2.1.2.4 + + + 1 + + + + + pol.d4.n1.2.1.3.1 + + + 1 + + + + + pol.d4.n1.2.1.3.2 + + + 1 + + + + + pol.d4.n1.2.1.3.3 + + + 1 + + + + + pol.d4.n1.2.1.3.4 + + + 1 + + + + + pol.d4.n1.2.2.1.1 + + + 1 + + + + + pol.d4.n1.2.2.1.2 + + + 1 + + + + + pol.d4.n1.2.2.1.3 + + + 1 + + + + + pol.d4.n1.2.2.1.4 + + + 1 + + + + + pol.d4.n1.2.2.2.1 + + + 1 + + + + + pol.d4.n1.2.2.2.2 + + + 1 + + + + + pol.d4.n1.2.2.2.3 + + + 1 + + + + + pol.d4.n1.2.2.2.4 + + + 1 + + + + + pol.d4.n1.2.2.3.1 + + + 1 + + + + + pol.d4.n1.2.2.3.2 + + + 1 + + + + + pol.d4.n1.2.2.3.3 + + + 1 + + + + + pol.d4.n1.2.2.3.4 + + + 1 + + + + + pol.d4.n1.2.3.1.1 + + + 1 + + + + + pol.d4.n1.2.3.1.2 + + + 1 + + + + + pol.d4.n1.2.3.1.3 + + + 1 + + + + + pol.d4.n1.2.3.1.4 + + + 1 + + + + + pol.d4.n1.2.3.2.1 + + + 1 + + + + + pol.d4.n1.2.3.2.2 + + + 1 + + + + + pol.d4.n1.2.3.2.3 + + + 1 + + + + + pol.d4.n1.2.3.2.4 + + + 1 + + + + + pol.d4.n1.2.3.3.1 + + + 1 + + + + + pol.d4.n1.2.3.3.2 + + + 1 + + + + + pol.d4.n1.2.3.3.3 + + + 1 + + + + + pol.d4.n1.2.3.3.4 + + + 1 + + + + + pol.d4.n1.3.1.1.1 + + + 1 + + + + + pol.d4.n1.3.1.1.2 + + + 1 + + + + + pol.d4.n1.3.1.1.3 + + + 1 + + + + + pol.d4.n1.3.1.1.4 + + + 1 + + + + + pol.d4.n1.3.1.2.1 + + + 1 + + + + + pol.d4.n1.3.1.2.2 + + + 1 + + + + + pol.d4.n1.3.1.2.3 + + + 1 + + + + + pol.d4.n1.3.1.2.4 + + + 1 + + + + + pol.d4.n1.3.1.3.1 + + + 1 + + + + + pol.d4.n1.3.1.3.2 + + + 1 + + + + + pol.d4.n1.3.1.3.3 + + + 1 + + + + + pol.d4.n1.3.1.3.4 + + + 1 + + + + + pol.d4.n1.3.2.1.1 + + + 1 + + + + + pol.d4.n1.3.2.1.2 + + + 1 + + + + + pol.d4.n1.3.2.1.3 + + + 1 + + + + + pol.d4.n1.3.2.1.4 + + + 1 + + + + + pol.d4.n1.3.2.2.1 + + + 1 + + + + + pol.d4.n1.3.2.2.2 + + + 1 + + + + + pol.d4.n1.3.2.2.3 + + + 1 + + + + + pol.d4.n1.3.2.2.4 + + + 1 + + + + + pol.d4.n1.3.2.3.1 + + + 1 + + + + + pol.d4.n1.3.2.3.2 + + + 1 + + + + + pol.d4.n1.3.2.3.3 + + + 1 + + + + + pol.d4.n1.3.2.3.4 + + + 1 + + + + + pol.d4.n1.3.3.1.1 + + + 1 + + + + + pol.d4.n1.3.3.1.2 + + + 1 + + + + + pol.d4.n1.3.3.1.3 + + + 1 + + + + + pol.d4.n1.3.3.1.4 + + + 1 + + + + + pol.d4.n1.3.3.2.1 + + + 1 + + + + + pol.d4.n1.3.3.2.2 + + + 1 + + + + + pol.d4.n1.3.3.2.3 + + + 1 + + + + + pol.d4.n1.3.3.2.4 + + + 1 + + + + + pol.d4.n1.3.3.3.1 + + + 1 + + + + + pol.d4.n1.3.3.3.2 + + + 1 + + + + + pol.d4.n1.3.3.3.3 + + + 1 + + + + + pol.d4.n1.3.3.3.4 + + + 1 + + + + + ti.d1.n1.d1.n2.1.1.1.1 + + + + + ti.d1.n1.d1.n2.1.1.1.2 + + + + + ti.d1.n1.d1.n2.1.1.1.3 + + + + + ti.d1.n1.d1.n2.1.1.2.1 + + + + + ti.d1.n1.d1.n2.1.1.2.2 + + + + + ti.d1.n1.d1.n2.1.1.2.3 + + + + + ti.d1.n1.d1.n2.1.1.3.1 + + + + + ti.d1.n1.d1.n2.1.1.3.2 + + + + + ti.d1.n1.d1.n2.1.1.3.3 + + + + + ti.d1.n1.d1.n2.1.2.1.1 + + + + + ti.d1.n1.d1.n2.1.2.1.2 + + + + + ti.d1.n1.d1.n2.1.2.1.3 + + + + + ti.d1.n1.d1.n2.1.2.2.1 + + + + + ti.d1.n1.d1.n2.1.2.2.2 + + + + + ti.d1.n1.d1.n2.1.2.2.3 + + + + + ti.d1.n1.d1.n2.1.2.3.1 + + + + + ti.d1.n1.d1.n2.1.2.3.2 + + + + + ti.d1.n1.d1.n2.1.2.3.3 + + + + + ti.d1.n1.d1.n2.1.3.1.1 + + + + + ti.d1.n1.d1.n2.1.3.1.2 + + + + + ti.d1.n1.d1.n2.1.3.1.3 + + + + + ti.d1.n1.d1.n2.1.3.2.1 + + + + + ti.d1.n1.d1.n2.1.3.2.2 + + + + + ti.d1.n1.d1.n2.1.3.2.3 + + + + + ti.d1.n1.d1.n2.1.3.3.1 + + + + + ti.d1.n1.d1.n2.1.3.3.2 + + + + + ti.d1.n1.d1.n2.1.3.3.3 + + + + + ti.d1.n1.d1.n2.2.1.1.1 + + + + + ti.d1.n1.d1.n2.2.1.1.2 + + + + + ti.d1.n1.d1.n2.2.1.1.3 + + + + + ti.d1.n1.d1.n2.2.1.2.1 + + + + + ti.d1.n1.d1.n2.2.1.2.2 + + + + + ti.d1.n1.d1.n2.2.1.2.3 + + + + + ti.d1.n1.d1.n2.2.1.3.1 + + + + + ti.d1.n1.d1.n2.2.1.3.2 + + + + + ti.d1.n1.d1.n2.2.1.3.3 + + + + + ti.d1.n1.d1.n2.2.2.1.1 + + + + + ti.d1.n1.d1.n2.2.2.1.2 + + + + + ti.d1.n1.d1.n2.2.2.1.3 + + + + + ti.d1.n1.d1.n2.2.2.2.1 + + + + + ti.d1.n1.d1.n2.2.2.2.2 + + + + + ti.d1.n1.d1.n2.2.2.2.3 + + + + + ti.d1.n1.d1.n2.2.2.3.1 + + + + + ti.d1.n1.d1.n2.2.2.3.2 + + + + + ti.d1.n1.d1.n2.2.2.3.3 + + + + + ti.d1.n1.d1.n2.2.3.1.1 + + + + + ti.d1.n1.d1.n2.2.3.1.2 + + + + + ti.d1.n1.d1.n2.2.3.1.3 + + + + + ti.d1.n1.d1.n2.2.3.2.1 + + + + + ti.d1.n1.d1.n2.2.3.2.2 + + + + + ti.d1.n1.d1.n2.2.3.2.3 + + + + + ti.d1.n1.d1.n2.2.3.3.1 + + + + + ti.d1.n1.d1.n2.2.3.3.2 + + + + + ti.d1.n1.d1.n2.2.3.3.3 + + + + + ti.d1.n1.d1.n2.3.1.1.1 + + + + + ti.d1.n1.d1.n2.3.1.1.2 + + + + + ti.d1.n1.d1.n2.3.1.1.3 + + + + + ti.d1.n1.d1.n2.3.1.2.1 + + + + + ti.d1.n1.d1.n2.3.1.2.2 + + + + + ti.d1.n1.d1.n2.3.1.2.3 + + + + + ti.d1.n1.d1.n2.3.1.3.1 + + + + + ti.d1.n1.d1.n2.3.1.3.2 + + + + + ti.d1.n1.d1.n2.3.1.3.3 + + + + + ti.d1.n1.d1.n2.3.2.1.1 + + + + + ti.d1.n1.d1.n2.3.2.1.2 + + + + + ti.d1.n1.d1.n2.3.2.1.3 + + + + + ti.d1.n1.d1.n2.3.2.2.1 + + + + + ti.d1.n1.d1.n2.3.2.2.2 + + + + + ti.d1.n1.d1.n2.3.2.2.3 + + + + + ti.d1.n1.d1.n2.3.2.3.1 + + + + + ti.d1.n1.d1.n2.3.2.3.2 + + + + + ti.d1.n1.d1.n2.3.2.3.3 + + + + + ti.d1.n1.d1.n2.3.3.1.1 + + + + + ti.d1.n1.d1.n2.3.3.1.2 + + + + + ti.d1.n1.d1.n2.3.3.1.3 + + + + + ti.d1.n1.d1.n2.3.3.2.1 + + + + + ti.d1.n1.d1.n2.3.3.2.2 + + + + + ti.d1.n1.d1.n2.3.3.2.3 + + + + + ti.d1.n1.d1.n2.3.3.3.1 + + + + + ti.d1.n1.d1.n2.3.3.3.2 + + + + + ti.d1.n1.d1.n2.3.3.3.3 + + + + + ti.d1.n1.d2.n1.1.1.1.1 + + + + + ti.d1.n1.d2.n1.1.1.1.2 + + + + + ti.d1.n1.d2.n1.1.1.1.3 + + + + + ti.d1.n1.d2.n1.1.1.2.1 + + + + + ti.d1.n1.d2.n1.1.1.2.2 + + + + + ti.d1.n1.d2.n1.1.1.2.3 + + + + + ti.d1.n1.d2.n1.1.1.3.1 + + + + + ti.d1.n1.d2.n1.1.1.3.2 + + + + + ti.d1.n1.d2.n1.1.1.3.3 + + + + + ti.d1.n1.d2.n1.1.2.1.1 + + + + + ti.d1.n1.d2.n1.1.2.1.2 + + + + + ti.d1.n1.d2.n1.1.2.1.3 + + + + + ti.d1.n1.d2.n1.1.2.2.1 + + + + + ti.d1.n1.d2.n1.1.2.2.2 + + + + + ti.d1.n1.d2.n1.1.2.2.3 + + + + + ti.d1.n1.d2.n1.1.2.3.1 + + + + + ti.d1.n1.d2.n1.1.2.3.2 + + + + + ti.d1.n1.d2.n1.1.2.3.3 + + + + + ti.d1.n1.d2.n1.1.3.1.1 + + + + + ti.d1.n1.d2.n1.1.3.1.2 + + + + + ti.d1.n1.d2.n1.1.3.1.3 + + + + + ti.d1.n1.d2.n1.1.3.2.1 + + + + + ti.d1.n1.d2.n1.1.3.2.2 + + + + + ti.d1.n1.d2.n1.1.3.2.3 + + + + + ti.d1.n1.d2.n1.1.3.3.1 + + + + + ti.d1.n1.d2.n1.1.3.3.2 + + + + + ti.d1.n1.d2.n1.1.3.3.3 + + + + + ti.d1.n1.d2.n1.2.1.1.1 + + + + + ti.d1.n1.d2.n1.2.1.1.2 + + + + + ti.d1.n1.d2.n1.2.1.1.3 + + + + + ti.d1.n1.d2.n1.2.1.2.1 + + + + + ti.d1.n1.d2.n1.2.1.2.2 + + + + + ti.d1.n1.d2.n1.2.1.2.3 + + + + + ti.d1.n1.d2.n1.2.1.3.1 + + + + + ti.d1.n1.d2.n1.2.1.3.2 + + + + + ti.d1.n1.d2.n1.2.1.3.3 + + + + + ti.d1.n1.d2.n1.2.2.1.1 + + + + + ti.d1.n1.d2.n1.2.2.1.2 + + + + + ti.d1.n1.d2.n1.2.2.1.3 + + + + + ti.d1.n1.d2.n1.2.2.2.1 + + + + + ti.d1.n1.d2.n1.2.2.2.2 + + + + + ti.d1.n1.d2.n1.2.2.2.3 + + + + + ti.d1.n1.d2.n1.2.2.3.1 + + + + + ti.d1.n1.d2.n1.2.2.3.2 + + + + + ti.d1.n1.d2.n1.2.2.3.3 + + + + + ti.d1.n1.d2.n1.2.3.1.1 + + + + + ti.d1.n1.d2.n1.2.3.1.2 + + + + + ti.d1.n1.d2.n1.2.3.1.3 + + + + + ti.d1.n1.d2.n1.2.3.2.1 + + + + + ti.d1.n1.d2.n1.2.3.2.2 + + + + + ti.d1.n1.d2.n1.2.3.2.3 + + + + + ti.d1.n1.d2.n1.2.3.3.1 + + + + + ti.d1.n1.d2.n1.2.3.3.2 + + + + + ti.d1.n1.d2.n1.2.3.3.3 + + + + + ti.d1.n1.d2.n1.3.1.1.1 + + + + + ti.d1.n1.d2.n1.3.1.1.2 + + + + + ti.d1.n1.d2.n1.3.1.1.3 + + + + + ti.d1.n1.d2.n1.3.1.2.1 + + + + + ti.d1.n1.d2.n1.3.1.2.2 + + + + + ti.d1.n1.d2.n1.3.1.2.3 + + + + + ti.d1.n1.d2.n1.3.1.3.1 + + + + + ti.d1.n1.d2.n1.3.1.3.2 + + + + + ti.d1.n1.d2.n1.3.1.3.3 + + + + + ti.d1.n1.d2.n1.3.2.1.1 + + + + + ti.d1.n1.d2.n1.3.2.1.2 + + + + + ti.d1.n1.d2.n1.3.2.1.3 + + + + + ti.d1.n1.d2.n1.3.2.2.1 + + + + + ti.d1.n1.d2.n1.3.2.2.2 + + + + + ti.d1.n1.d2.n1.3.2.2.3 + + + + + ti.d1.n1.d2.n1.3.2.3.1 + + + + + ti.d1.n1.d2.n1.3.2.3.2 + + + + + ti.d1.n1.d2.n1.3.2.3.3 + + + + + ti.d1.n1.d2.n1.3.3.1.1 + + + + + ti.d1.n1.d2.n1.3.3.1.2 + + + + + ti.d1.n1.d2.n1.3.3.1.3 + + + + + ti.d1.n1.d2.n1.3.3.2.1 + + + + + ti.d1.n1.d2.n1.3.3.2.2 + + + + + ti.d1.n1.d2.n1.3.3.2.3 + + + + + ti.d1.n1.d2.n1.3.3.3.1 + + + + + ti.d1.n1.d2.n1.3.3.3.2 + + + + + ti.d1.n1.d2.n1.3.3.3.3 + + + + + ti.d1.n1.d2.n2.1.1.1.1 + + + + + ti.d1.n1.d2.n2.1.1.1.2 + + + + + ti.d1.n1.d2.n2.1.1.1.3 + + + + + ti.d1.n1.d2.n2.1.1.2.1 + + + + + ti.d1.n1.d2.n2.1.1.2.2 + + + + + ti.d1.n1.d2.n2.1.1.2.3 + + + + + ti.d1.n1.d2.n2.1.1.3.1 + + + + + ti.d1.n1.d2.n2.1.1.3.2 + + + + + ti.d1.n1.d2.n2.1.1.3.3 + + + + + ti.d1.n1.d2.n2.1.2.1.1 + + + + + ti.d1.n1.d2.n2.1.2.1.2 + + + + + ti.d1.n1.d2.n2.1.2.1.3 + + + + + ti.d1.n1.d2.n2.1.2.2.1 + + + + + ti.d1.n1.d2.n2.1.2.2.2 + + + + + ti.d1.n1.d2.n2.1.2.2.3 + + + + + ti.d1.n1.d2.n2.1.2.3.1 + + + + + ti.d1.n1.d2.n2.1.2.3.2 + + + + + ti.d1.n1.d2.n2.1.2.3.3 + + + + + ti.d1.n1.d2.n2.1.3.1.1 + + + + + ti.d1.n1.d2.n2.1.3.1.2 + + + + + ti.d1.n1.d2.n2.1.3.1.3 + + + + + ti.d1.n1.d2.n2.1.3.2.1 + + + + + ti.d1.n1.d2.n2.1.3.2.2 + + + + + ti.d1.n1.d2.n2.1.3.2.3 + + + + + ti.d1.n1.d2.n2.1.3.3.1 + + + + + ti.d1.n1.d2.n2.1.3.3.2 + + + + + ti.d1.n1.d2.n2.1.3.3.3 + + + + + ti.d1.n1.d2.n2.2.1.1.1 + + + + + ti.d1.n1.d2.n2.2.1.1.2 + + + + + ti.d1.n1.d2.n2.2.1.1.3 + + + + + ti.d1.n1.d2.n2.2.1.2.1 + + + + + ti.d1.n1.d2.n2.2.1.2.2 + + + + + ti.d1.n1.d2.n2.2.1.2.3 + + + + + ti.d1.n1.d2.n2.2.1.3.1 + + + + + ti.d1.n1.d2.n2.2.1.3.2 + + + + + ti.d1.n1.d2.n2.2.1.3.3 + + + + + ti.d1.n1.d2.n2.2.2.1.1 + + + + + ti.d1.n1.d2.n2.2.2.1.2 + + + + + ti.d1.n1.d2.n2.2.2.1.3 + + + + + ti.d1.n1.d2.n2.2.2.2.1 + + + + + ti.d1.n1.d2.n2.2.2.2.2 + + + + + ti.d1.n1.d2.n2.2.2.2.3 + + + + + ti.d1.n1.d2.n2.2.2.3.1 + + + + + ti.d1.n1.d2.n2.2.2.3.2 + + + + + ti.d1.n1.d2.n2.2.2.3.3 + + + + + ti.d1.n1.d2.n2.2.3.1.1 + + + + + ti.d1.n1.d2.n2.2.3.1.2 + + + + + ti.d1.n1.d2.n2.2.3.1.3 + + + + + ti.d1.n1.d2.n2.2.3.2.1 + + + + + ti.d1.n1.d2.n2.2.3.2.2 + + + + + ti.d1.n1.d2.n2.2.3.2.3 + + + + + ti.d1.n1.d2.n2.2.3.3.1 + + + + + ti.d1.n1.d2.n2.2.3.3.2 + + + + + ti.d1.n1.d2.n2.2.3.3.3 + + + + + ti.d1.n1.d2.n2.3.1.1.1 + + + + + ti.d1.n1.d2.n2.3.1.1.2 + + + + + ti.d1.n1.d2.n2.3.1.1.3 + + + + + ti.d1.n1.d2.n2.3.1.2.1 + + + + + ti.d1.n1.d2.n2.3.1.2.2 + + + + + ti.d1.n1.d2.n2.3.1.2.3 + + + + + ti.d1.n1.d2.n2.3.1.3.1 + + + + + ti.d1.n1.d2.n2.3.1.3.2 + + + + + ti.d1.n1.d2.n2.3.1.3.3 + + + + + ti.d1.n1.d2.n2.3.2.1.1 + + + + + ti.d1.n1.d2.n2.3.2.1.2 + + + + + ti.d1.n1.d2.n2.3.2.1.3 + + + + + ti.d1.n1.d2.n2.3.2.2.1 + + + + + ti.d1.n1.d2.n2.3.2.2.2 + + + + + ti.d1.n1.d2.n2.3.2.2.3 + + + + + ti.d1.n1.d2.n2.3.2.3.1 + + + + + ti.d1.n1.d2.n2.3.2.3.2 + + + + + ti.d1.n1.d2.n2.3.2.3.3 + + + + + ti.d1.n1.d2.n2.3.3.1.1 + + + + + ti.d1.n1.d2.n2.3.3.1.2 + + + + + ti.d1.n1.d2.n2.3.3.1.3 + + + + + ti.d1.n1.d2.n2.3.3.2.1 + + + + + ti.d1.n1.d2.n2.3.3.2.2 + + + + + ti.d1.n1.d2.n2.3.3.2.3 + + + + + ti.d1.n1.d2.n2.3.3.3.1 + + + + + ti.d1.n1.d2.n2.3.3.3.2 + + + + + ti.d1.n1.d2.n2.3.3.3.3 + + + + + ti.d1.n1.d3.n1.1.1.1.1 + + + + + ti.d1.n1.d3.n1.1.1.1.2 + + + + + ti.d1.n1.d3.n1.1.1.1.3 + + + + + ti.d1.n1.d3.n1.1.1.2.1 + + + + + ti.d1.n1.d3.n1.1.1.2.2 + + + + + ti.d1.n1.d3.n1.1.1.2.3 + + + + + ti.d1.n1.d3.n1.1.1.3.1 + + + + + ti.d1.n1.d3.n1.1.1.3.2 + + + + + ti.d1.n1.d3.n1.1.1.3.3 + + + + + ti.d1.n1.d3.n1.1.2.1.1 + + + + + ti.d1.n1.d3.n1.1.2.1.2 + + + + + ti.d1.n1.d3.n1.1.2.1.3 + + + + + ti.d1.n1.d3.n1.1.2.2.1 + + + + + ti.d1.n1.d3.n1.1.2.2.2 + + + + + ti.d1.n1.d3.n1.1.2.2.3 + + + + + ti.d1.n1.d3.n1.1.2.3.1 + + + + + ti.d1.n1.d3.n1.1.2.3.2 + + + + + ti.d1.n1.d3.n1.1.2.3.3 + + + + + ti.d1.n1.d3.n1.1.3.1.1 + + + + + ti.d1.n1.d3.n1.1.3.1.2 + + + + + ti.d1.n1.d3.n1.1.3.1.3 + + + + + ti.d1.n1.d3.n1.1.3.2.1 + + + + + ti.d1.n1.d3.n1.1.3.2.2 + + + + + ti.d1.n1.d3.n1.1.3.2.3 + + + + + ti.d1.n1.d3.n1.1.3.3.1 + + + + + ti.d1.n1.d3.n1.1.3.3.2 + + + + + ti.d1.n1.d3.n1.1.3.3.3 + + + + + ti.d1.n1.d3.n1.2.1.1.1 + + + + + ti.d1.n1.d3.n1.2.1.1.2 + + + + + ti.d1.n1.d3.n1.2.1.1.3 + + + + + ti.d1.n1.d3.n1.2.1.2.1 + + + + + ti.d1.n1.d3.n1.2.1.2.2 + + + + + ti.d1.n1.d3.n1.2.1.2.3 + + + + + ti.d1.n1.d3.n1.2.1.3.1 + + + + + ti.d1.n1.d3.n1.2.1.3.2 + + + + + ti.d1.n1.d3.n1.2.1.3.3 + + + + + ti.d1.n1.d3.n1.2.2.1.1 + + + + + ti.d1.n1.d3.n1.2.2.1.2 + + + + + ti.d1.n1.d3.n1.2.2.1.3 + + + + + ti.d1.n1.d3.n1.2.2.2.1 + + + + + ti.d1.n1.d3.n1.2.2.2.2 + + + + + ti.d1.n1.d3.n1.2.2.2.3 + + + + + ti.d1.n1.d3.n1.2.2.3.1 + + + + + ti.d1.n1.d3.n1.2.2.3.2 + + + + + ti.d1.n1.d3.n1.2.2.3.3 + + + + + ti.d1.n1.d3.n1.2.3.1.1 + + + + + ti.d1.n1.d3.n1.2.3.1.2 + + + + + ti.d1.n1.d3.n1.2.3.1.3 + + + + + ti.d1.n1.d3.n1.2.3.2.1 + + + + + ti.d1.n1.d3.n1.2.3.2.2 + + + + + ti.d1.n1.d3.n1.2.3.2.3 + + + + + ti.d1.n1.d3.n1.2.3.3.1 + + + + + ti.d1.n1.d3.n1.2.3.3.2 + + + + + ti.d1.n1.d3.n1.2.3.3.3 + + + + + ti.d1.n1.d3.n1.3.1.1.1 + + + + + ti.d1.n1.d3.n1.3.1.1.2 + + + + + ti.d1.n1.d3.n1.3.1.1.3 + + + + + ti.d1.n1.d3.n1.3.1.2.1 + + + + + ti.d1.n1.d3.n1.3.1.2.2 + + + + + ti.d1.n1.d3.n1.3.1.2.3 + + + + + ti.d1.n1.d3.n1.3.1.3.1 + + + + + ti.d1.n1.d3.n1.3.1.3.2 + + + + + ti.d1.n1.d3.n1.3.1.3.3 + + + + + ti.d1.n1.d3.n1.3.2.1.1 + + + + + ti.d1.n1.d3.n1.3.2.1.2 + + + + + ti.d1.n1.d3.n1.3.2.1.3 + + + + + ti.d1.n1.d3.n1.3.2.2.1 + + + + + ti.d1.n1.d3.n1.3.2.2.2 + + + + + ti.d1.n1.d3.n1.3.2.2.3 + + + + + ti.d1.n1.d3.n1.3.2.3.1 + + + + + ti.d1.n1.d3.n1.3.2.3.2 + + + + + ti.d1.n1.d3.n1.3.2.3.3 + + + + + ti.d1.n1.d3.n1.3.3.1.1 + + + + + ti.d1.n1.d3.n1.3.3.1.2 + + + + + ti.d1.n1.d3.n1.3.3.1.3 + + + + + ti.d1.n1.d3.n1.3.3.2.1 + + + + + ti.d1.n1.d3.n1.3.3.2.2 + + + + + ti.d1.n1.d3.n1.3.3.2.3 + + + + + ti.d1.n1.d3.n1.3.3.3.1 + + + + + ti.d1.n1.d3.n1.3.3.3.2 + + + + + ti.d1.n1.d3.n1.3.3.3.3 + + + + + ti.d1.n1.d3.n2.1.1.1.1 + + + + + ti.d1.n1.d3.n2.1.1.1.2 + + + + + ti.d1.n1.d3.n2.1.1.1.3 + + + + + ti.d1.n1.d3.n2.1.1.2.1 + + + + + ti.d1.n1.d3.n2.1.1.2.2 + + + + + ti.d1.n1.d3.n2.1.1.2.3 + + + + + ti.d1.n1.d3.n2.1.1.3.1 + + + + + ti.d1.n1.d3.n2.1.1.3.2 + + + + + ti.d1.n1.d3.n2.1.1.3.3 + + + + + ti.d1.n1.d3.n2.1.2.1.1 + + + + + ti.d1.n1.d3.n2.1.2.1.2 + + + + + ti.d1.n1.d3.n2.1.2.1.3 + + + + + ti.d1.n1.d3.n2.1.2.2.1 + + + + + ti.d1.n1.d3.n2.1.2.2.2 + + + + + ti.d1.n1.d3.n2.1.2.2.3 + + + + + ti.d1.n1.d3.n2.1.2.3.1 + + + + + ti.d1.n1.d3.n2.1.2.3.2 + + + + + ti.d1.n1.d3.n2.1.2.3.3 + + + + + ti.d1.n1.d3.n2.1.3.1.1 + + + + + ti.d1.n1.d3.n2.1.3.1.2 + + + + + ti.d1.n1.d3.n2.1.3.1.3 + + + + + ti.d1.n1.d3.n2.1.3.2.1 + + + + + ti.d1.n1.d3.n2.1.3.2.2 + + + + + ti.d1.n1.d3.n2.1.3.2.3 + + + + + ti.d1.n1.d3.n2.1.3.3.1 + + + + + ti.d1.n1.d3.n2.1.3.3.2 + + + + + ti.d1.n1.d3.n2.1.3.3.3 + + + + + ti.d1.n1.d3.n2.2.1.1.1 + + + + + ti.d1.n1.d3.n2.2.1.1.2 + + + + + ti.d1.n1.d3.n2.2.1.1.3 + + + + + ti.d1.n1.d3.n2.2.1.2.1 + + + + + ti.d1.n1.d3.n2.2.1.2.2 + + + + + ti.d1.n1.d3.n2.2.1.2.3 + + + + + ti.d1.n1.d3.n2.2.1.3.1 + + + + + ti.d1.n1.d3.n2.2.1.3.2 + + + + + ti.d1.n1.d3.n2.2.1.3.3 + + + + + ti.d1.n1.d3.n2.2.2.1.1 + + + + + ti.d1.n1.d3.n2.2.2.1.2 + + + + + ti.d1.n1.d3.n2.2.2.1.3 + + + + + ti.d1.n1.d3.n2.2.2.2.1 + + + + + ti.d1.n1.d3.n2.2.2.2.2 + + + + + ti.d1.n1.d3.n2.2.2.2.3 + + + + + ti.d1.n1.d3.n2.2.2.3.1 + + + + + ti.d1.n1.d3.n2.2.2.3.2 + + + + + ti.d1.n1.d3.n2.2.2.3.3 + + + + + ti.d1.n1.d3.n2.2.3.1.1 + + + + + ti.d1.n1.d3.n2.2.3.1.2 + + + + + ti.d1.n1.d3.n2.2.3.1.3 + + + + + ti.d1.n1.d3.n2.2.3.2.1 + + + + + ti.d1.n1.d3.n2.2.3.2.2 + + + + + ti.d1.n1.d3.n2.2.3.2.3 + + + + + ti.d1.n1.d3.n2.2.3.3.1 + + + + + ti.d1.n1.d3.n2.2.3.3.2 + + + + + ti.d1.n1.d3.n2.2.3.3.3 + + + + + ti.d1.n1.d3.n2.3.1.1.1 + + + + + ti.d1.n1.d3.n2.3.1.1.2 + + + + + ti.d1.n1.d3.n2.3.1.1.3 + + + + + ti.d1.n1.d3.n2.3.1.2.1 + + + + + ti.d1.n1.d3.n2.3.1.2.2 + + + + + ti.d1.n1.d3.n2.3.1.2.3 + + + + + ti.d1.n1.d3.n2.3.1.3.1 + + + + + ti.d1.n1.d3.n2.3.1.3.2 + + + + + ti.d1.n1.d3.n2.3.1.3.3 + + + + + ti.d1.n1.d3.n2.3.2.1.1 + + + + + ti.d1.n1.d3.n2.3.2.1.2 + + + + + ti.d1.n1.d3.n2.3.2.1.3 + + + + + ti.d1.n1.d3.n2.3.2.2.1 + + + + + ti.d1.n1.d3.n2.3.2.2.2 + + + + + ti.d1.n1.d3.n2.3.2.2.3 + + + + + ti.d1.n1.d3.n2.3.2.3.1 + + + + + ti.d1.n1.d3.n2.3.2.3.2 + + + + + ti.d1.n1.d3.n2.3.2.3.3 + + + + + ti.d1.n1.d3.n2.3.3.1.1 + + + + + ti.d1.n1.d3.n2.3.3.1.2 + + + + + ti.d1.n1.d3.n2.3.3.1.3 + + + + + ti.d1.n1.d3.n2.3.3.2.1 + + + + + ti.d1.n1.d3.n2.3.3.2.2 + + + + + ti.d1.n1.d3.n2.3.3.2.3 + + + + + ti.d1.n1.d3.n2.3.3.3.1 + + + + + ti.d1.n1.d3.n2.3.3.3.2 + + + + + ti.d1.n1.d3.n2.3.3.3.3 + + + + + ti.d1.n1.d4.n1.1.1.1.1 + + + + + ti.d1.n1.d4.n1.1.1.1.2 + + + + + ti.d1.n1.d4.n1.1.1.1.3 + + + + + ti.d1.n1.d4.n1.1.1.2.1 + + + + + ti.d1.n1.d4.n1.1.1.2.2 + + + + + ti.d1.n1.d4.n1.1.1.2.3 + + + + + ti.d1.n1.d4.n1.1.1.3.1 + + + + + ti.d1.n1.d4.n1.1.1.3.2 + + + + + ti.d1.n1.d4.n1.1.1.3.3 + + + + + ti.d1.n1.d4.n1.1.2.1.1 + + + + + ti.d1.n1.d4.n1.1.2.1.2 + + + + + ti.d1.n1.d4.n1.1.2.1.3 + + + + + ti.d1.n1.d4.n1.1.2.2.1 + + + + + ti.d1.n1.d4.n1.1.2.2.2 + + + + + ti.d1.n1.d4.n1.1.2.2.3 + + + + + ti.d1.n1.d4.n1.1.2.3.1 + + + + + ti.d1.n1.d4.n1.1.2.3.2 + + + + + ti.d1.n1.d4.n1.1.2.3.3 + + + + + ti.d1.n1.d4.n1.1.3.1.1 + + + + + ti.d1.n1.d4.n1.1.3.1.2 + + + + + ti.d1.n1.d4.n1.1.3.1.3 + + + + + ti.d1.n1.d4.n1.1.3.2.1 + + + + + ti.d1.n1.d4.n1.1.3.2.2 + + + + + ti.d1.n1.d4.n1.1.3.2.3 + + + + + ti.d1.n1.d4.n1.1.3.3.1 + + + + + ti.d1.n1.d4.n1.1.3.3.2 + + + + + ti.d1.n1.d4.n1.1.3.3.3 + + + + + ti.d1.n1.d4.n1.2.1.1.1 + + + + + ti.d1.n1.d4.n1.2.1.1.2 + + + + + ti.d1.n1.d4.n1.2.1.1.3 + + + + + ti.d1.n1.d4.n1.2.1.2.1 + + + + + ti.d1.n1.d4.n1.2.1.2.2 + + + + + ti.d1.n1.d4.n1.2.1.2.3 + + + + + ti.d1.n1.d4.n1.2.1.3.1 + + + + + ti.d1.n1.d4.n1.2.1.3.2 + + + + + ti.d1.n1.d4.n1.2.1.3.3 + + + + + ti.d1.n1.d4.n1.2.2.1.1 + + + + + ti.d1.n1.d4.n1.2.2.1.2 + + + + + ti.d1.n1.d4.n1.2.2.1.3 + + + + + ti.d1.n1.d4.n1.2.2.2.1 + + + + + ti.d1.n1.d4.n1.2.2.2.2 + + + + + ti.d1.n1.d4.n1.2.2.2.3 + + + + + ti.d1.n1.d4.n1.2.2.3.1 + + + + + ti.d1.n1.d4.n1.2.2.3.2 + + + + + ti.d1.n1.d4.n1.2.2.3.3 + + + + + ti.d1.n1.d4.n1.2.3.1.1 + + + + + ti.d1.n1.d4.n1.2.3.1.2 + + + + + ti.d1.n1.d4.n1.2.3.1.3 + + + + + ti.d1.n1.d4.n1.2.3.2.1 + + + + + ti.d1.n1.d4.n1.2.3.2.2 + + + + + ti.d1.n1.d4.n1.2.3.2.3 + + + + + ti.d1.n1.d4.n1.2.3.3.1 + + + + + ti.d1.n1.d4.n1.2.3.3.2 + + + + + ti.d1.n1.d4.n1.2.3.3.3 + + + + + ti.d1.n1.d4.n1.3.1.1.1 + + + + + ti.d1.n1.d4.n1.3.1.1.2 + + + + + ti.d1.n1.d4.n1.3.1.1.3 + + + + + ti.d1.n1.d4.n1.3.1.2.1 + + + + + ti.d1.n1.d4.n1.3.1.2.2 + + + + + ti.d1.n1.d4.n1.3.1.2.3 + + + + + ti.d1.n1.d4.n1.3.1.3.1 + + + + + ti.d1.n1.d4.n1.3.1.3.2 + + + + + ti.d1.n1.d4.n1.3.1.3.3 + + + + + ti.d1.n1.d4.n1.3.2.1.1 + + + + + ti.d1.n1.d4.n1.3.2.1.2 + + + + + ti.d1.n1.d4.n1.3.2.1.3 + + + + + ti.d1.n1.d4.n1.3.2.2.1 + + + + + ti.d1.n1.d4.n1.3.2.2.2 + + + + + ti.d1.n1.d4.n1.3.2.2.3 + + + + + ti.d1.n1.d4.n1.3.2.3.1 + + + + + ti.d1.n1.d4.n1.3.2.3.2 + + + + + ti.d1.n1.d4.n1.3.2.3.3 + + + + + ti.d1.n1.d4.n1.3.3.1.1 + + + + + ti.d1.n1.d4.n1.3.3.1.2 + + + + + ti.d1.n1.d4.n1.3.3.1.3 + + + + + ti.d1.n1.d4.n1.3.3.2.1 + + + + + ti.d1.n1.d4.n1.3.3.2.2 + + + + + ti.d1.n1.d4.n1.3.3.2.3 + + + + + ti.d1.n1.d4.n1.3.3.3.1 + + + + + ti.d1.n1.d4.n1.3.3.3.2 + + + + + ti.d1.n1.d4.n1.3.3.3.3 + + + + + ti.d1.n1.d4.n2.1.1.1.1 + + + + + ti.d1.n1.d4.n2.1.1.1.2 + + + + + ti.d1.n1.d4.n2.1.1.1.3 + + + + + ti.d1.n1.d4.n2.1.1.2.1 + + + + + ti.d1.n1.d4.n2.1.1.2.2 + + + + + ti.d1.n1.d4.n2.1.1.2.3 + + + + + ti.d1.n1.d4.n2.1.1.3.1 + + + + + ti.d1.n1.d4.n2.1.1.3.2 + + + + + ti.d1.n1.d4.n2.1.1.3.3 + + + + + ti.d1.n1.d4.n2.1.2.1.1 + + + + + ti.d1.n1.d4.n2.1.2.1.2 + + + + + ti.d1.n1.d4.n2.1.2.1.3 + + + + + ti.d1.n1.d4.n2.1.2.2.1 + + + + + ti.d1.n1.d4.n2.1.2.2.2 + + + + + ti.d1.n1.d4.n2.1.2.2.3 + + + + + ti.d1.n1.d4.n2.1.2.3.1 + + + + + ti.d1.n1.d4.n2.1.2.3.2 + + + + + ti.d1.n1.d4.n2.1.2.3.3 + + + + + ti.d1.n1.d4.n2.1.3.1.1 + + + + + ti.d1.n1.d4.n2.1.3.1.2 + + + + + ti.d1.n1.d4.n2.1.3.1.3 + + + + + ti.d1.n1.d4.n2.1.3.2.1 + + + + + ti.d1.n1.d4.n2.1.3.2.2 + + + + + ti.d1.n1.d4.n2.1.3.2.3 + + + + + ti.d1.n1.d4.n2.1.3.3.1 + + + + + ti.d1.n1.d4.n2.1.3.3.2 + + + + + ti.d1.n1.d4.n2.1.3.3.3 + + + + + ti.d1.n1.d4.n2.2.1.1.1 + + + + + ti.d1.n1.d4.n2.2.1.1.2 + + + + + ti.d1.n1.d4.n2.2.1.1.3 + + + + + ti.d1.n1.d4.n2.2.1.2.1 + + + + + ti.d1.n1.d4.n2.2.1.2.2 + + + + + ti.d1.n1.d4.n2.2.1.2.3 + + + + + ti.d1.n1.d4.n2.2.1.3.1 + + + + + ti.d1.n1.d4.n2.2.1.3.2 + + + + + ti.d1.n1.d4.n2.2.1.3.3 + + + + + ti.d1.n1.d4.n2.2.2.1.1 + + + + + ti.d1.n1.d4.n2.2.2.1.2 + + + + + ti.d1.n1.d4.n2.2.2.1.3 + + + + + ti.d1.n1.d4.n2.2.2.2.1 + + + + + ti.d1.n1.d4.n2.2.2.2.2 + + + + + ti.d1.n1.d4.n2.2.2.2.3 + + + + + ti.d1.n1.d4.n2.2.2.3.1 + + + + + ti.d1.n1.d4.n2.2.2.3.2 + + + + + ti.d1.n1.d4.n2.2.2.3.3 + + + + + ti.d1.n1.d4.n2.2.3.1.1 + + + + + ti.d1.n1.d4.n2.2.3.1.2 + + + + + ti.d1.n1.d4.n2.2.3.1.3 + + + + + ti.d1.n1.d4.n2.2.3.2.1 + + + + + ti.d1.n1.d4.n2.2.3.2.2 + + + + + ti.d1.n1.d4.n2.2.3.2.3 + + + + + ti.d1.n1.d4.n2.2.3.3.1 + + + + + ti.d1.n1.d4.n2.2.3.3.2 + + + + + ti.d1.n1.d4.n2.2.3.3.3 + + + + + ti.d1.n1.d4.n2.3.1.1.1 + + + + + ti.d1.n1.d4.n2.3.1.1.2 + + + + + ti.d1.n1.d4.n2.3.1.1.3 + + + + + ti.d1.n1.d4.n2.3.1.2.1 + + + + + ti.d1.n1.d4.n2.3.1.2.2 + + + + + ti.d1.n1.d4.n2.3.1.2.3 + + + + + ti.d1.n1.d4.n2.3.1.3.1 + + + + + ti.d1.n1.d4.n2.3.1.3.2 + + + + + ti.d1.n1.d4.n2.3.1.3.3 + + + + + ti.d1.n1.d4.n2.3.2.1.1 + + + + + ti.d1.n1.d4.n2.3.2.1.2 + + + + + ti.d1.n1.d4.n2.3.2.1.3 + + + + + ti.d1.n1.d4.n2.3.2.2.1 + + + + + ti.d1.n1.d4.n2.3.2.2.2 + + + + + ti.d1.n1.d4.n2.3.2.2.3 + + + + + ti.d1.n1.d4.n2.3.2.3.1 + + + + + ti.d1.n1.d4.n2.3.2.3.2 + + + + + ti.d1.n1.d4.n2.3.2.3.3 + + + + + ti.d1.n1.d4.n2.3.3.1.1 + + + + + ti.d1.n1.d4.n2.3.3.1.2 + + + + + ti.d1.n1.d4.n2.3.3.1.3 + + + + + ti.d1.n1.d4.n2.3.3.2.1 + + + + + ti.d1.n1.d4.n2.3.3.2.2 + + + + + ti.d1.n1.d4.n2.3.3.2.3 + + + + + ti.d1.n1.d4.n2.3.3.3.1 + + + + + ti.d1.n1.d4.n2.3.3.3.2 + + + + + ti.d1.n1.d4.n2.3.3.3.3 + + + + + ti.d1.n2.d1.n1.1.1.1.1 + + + + + ti.d1.n2.d1.n1.1.1.1.2 + + + + + ti.d1.n2.d1.n1.1.1.1.3 + + + + + ti.d1.n2.d1.n1.1.1.2.1 + + + + + ti.d1.n2.d1.n1.1.1.2.2 + + + + + ti.d1.n2.d1.n1.1.1.2.3 + + + + + ti.d1.n2.d1.n1.1.1.3.1 + + + + + ti.d1.n2.d1.n1.1.1.3.2 + + + + + ti.d1.n2.d1.n1.1.1.3.3 + + + + + ti.d1.n2.d1.n1.1.2.1.1 + + + + + ti.d1.n2.d1.n1.1.2.1.2 + + + + + ti.d1.n2.d1.n1.1.2.1.3 + + + + + ti.d1.n2.d1.n1.1.2.2.1 + + + + + ti.d1.n2.d1.n1.1.2.2.2 + + + + + ti.d1.n2.d1.n1.1.2.2.3 + + + + + ti.d1.n2.d1.n1.1.2.3.1 + + + + + ti.d1.n2.d1.n1.1.2.3.2 + + + + + ti.d1.n2.d1.n1.1.2.3.3 + + + + + ti.d1.n2.d1.n1.1.3.1.1 + + + + + ti.d1.n2.d1.n1.1.3.1.2 + + + + + ti.d1.n2.d1.n1.1.3.1.3 + + + + + ti.d1.n2.d1.n1.1.3.2.1 + + + + + ti.d1.n2.d1.n1.1.3.2.2 + + + + + ti.d1.n2.d1.n1.1.3.2.3 + + + + + ti.d1.n2.d1.n1.1.3.3.1 + + + + + ti.d1.n2.d1.n1.1.3.3.2 + + + + + ti.d1.n2.d1.n1.1.3.3.3 + + + + + ti.d1.n2.d1.n1.2.1.1.1 + + + + + ti.d1.n2.d1.n1.2.1.1.2 + + + + + ti.d1.n2.d1.n1.2.1.1.3 + + + + + ti.d1.n2.d1.n1.2.1.2.1 + + + + + ti.d1.n2.d1.n1.2.1.2.2 + + + + + ti.d1.n2.d1.n1.2.1.2.3 + + + + + ti.d1.n2.d1.n1.2.1.3.1 + + + + + ti.d1.n2.d1.n1.2.1.3.2 + + + + + ti.d1.n2.d1.n1.2.1.3.3 + + + + + ti.d1.n2.d1.n1.2.2.1.1 + + + + + ti.d1.n2.d1.n1.2.2.1.2 + + + + + ti.d1.n2.d1.n1.2.2.1.3 + + + + + ti.d1.n2.d1.n1.2.2.2.1 + + + + + ti.d1.n2.d1.n1.2.2.2.2 + + + + + ti.d1.n2.d1.n1.2.2.2.3 + + + + + ti.d1.n2.d1.n1.2.2.3.1 + + + + + ti.d1.n2.d1.n1.2.2.3.2 + + + + + ti.d1.n2.d1.n1.2.2.3.3 + + + + + ti.d1.n2.d1.n1.2.3.1.1 + + + + + ti.d1.n2.d1.n1.2.3.1.2 + + + + + ti.d1.n2.d1.n1.2.3.1.3 + + + + + ti.d1.n2.d1.n1.2.3.2.1 + + + + + ti.d1.n2.d1.n1.2.3.2.2 + + + + + ti.d1.n2.d1.n1.2.3.2.3 + + + + + ti.d1.n2.d1.n1.2.3.3.1 + + + + + ti.d1.n2.d1.n1.2.3.3.2 + + + + + ti.d1.n2.d1.n1.2.3.3.3 + + + + + ti.d1.n2.d1.n1.3.1.1.1 + + + + + ti.d1.n2.d1.n1.3.1.1.2 + + + + + ti.d1.n2.d1.n1.3.1.1.3 + + + + + ti.d1.n2.d1.n1.3.1.2.1 + + + + + ti.d1.n2.d1.n1.3.1.2.2 + + + + + ti.d1.n2.d1.n1.3.1.2.3 + + + + + ti.d1.n2.d1.n1.3.1.3.1 + + + + + ti.d1.n2.d1.n1.3.1.3.2 + + + + + ti.d1.n2.d1.n1.3.1.3.3 + + + + + ti.d1.n2.d1.n1.3.2.1.1 + + + + + ti.d1.n2.d1.n1.3.2.1.2 + + + + + ti.d1.n2.d1.n1.3.2.1.3 + + + + + ti.d1.n2.d1.n1.3.2.2.1 + + + + + ti.d1.n2.d1.n1.3.2.2.2 + + + + + ti.d1.n2.d1.n1.3.2.2.3 + + + + + ti.d1.n2.d1.n1.3.2.3.1 + + + + + ti.d1.n2.d1.n1.3.2.3.2 + + + + + ti.d1.n2.d1.n1.3.2.3.3 + + + + + ti.d1.n2.d1.n1.3.3.1.1 + + + + + ti.d1.n2.d1.n1.3.3.1.2 + + + + + ti.d1.n2.d1.n1.3.3.1.3 + + + + + ti.d1.n2.d1.n1.3.3.2.1 + + + + + ti.d1.n2.d1.n1.3.3.2.2 + + + + + ti.d1.n2.d1.n1.3.3.2.3 + + + + + ti.d1.n2.d1.n1.3.3.3.1 + + + + + ti.d1.n2.d1.n1.3.3.3.2 + + + + + ti.d1.n2.d1.n1.3.3.3.3 + + + + + ti.d1.n2.d2.n1.1.1.1.1 + + + + + ti.d1.n2.d2.n1.1.1.1.2 + + + + + ti.d1.n2.d2.n1.1.1.1.3 + + + + + ti.d1.n2.d2.n1.1.1.2.1 + + + + + ti.d1.n2.d2.n1.1.1.2.2 + + + + + ti.d1.n2.d2.n1.1.1.2.3 + + + + + ti.d1.n2.d2.n1.1.1.3.1 + + + + + ti.d1.n2.d2.n1.1.1.3.2 + + + + + ti.d1.n2.d2.n1.1.1.3.3 + + + + + ti.d1.n2.d2.n1.1.2.1.1 + + + + + ti.d1.n2.d2.n1.1.2.1.2 + + + + + ti.d1.n2.d2.n1.1.2.1.3 + + + + + ti.d1.n2.d2.n1.1.2.2.1 + + + + + ti.d1.n2.d2.n1.1.2.2.2 + + + + + ti.d1.n2.d2.n1.1.2.2.3 + + + + + ti.d1.n2.d2.n1.1.2.3.1 + + + + + ti.d1.n2.d2.n1.1.2.3.2 + + + + + ti.d1.n2.d2.n1.1.2.3.3 + + + + + ti.d1.n2.d2.n1.1.3.1.1 + + + + + ti.d1.n2.d2.n1.1.3.1.2 + + + + + ti.d1.n2.d2.n1.1.3.1.3 + + + + + ti.d1.n2.d2.n1.1.3.2.1 + + + + + ti.d1.n2.d2.n1.1.3.2.2 + + + + + ti.d1.n2.d2.n1.1.3.2.3 + + + + + ti.d1.n2.d2.n1.1.3.3.1 + + + + + ti.d1.n2.d2.n1.1.3.3.2 + + + + + ti.d1.n2.d2.n1.1.3.3.3 + + + + + ti.d1.n2.d2.n1.2.1.1.1 + + + + + ti.d1.n2.d2.n1.2.1.1.2 + + + + + ti.d1.n2.d2.n1.2.1.1.3 + + + + + ti.d1.n2.d2.n1.2.1.2.1 + + + + + ti.d1.n2.d2.n1.2.1.2.2 + + + + + ti.d1.n2.d2.n1.2.1.2.3 + + + + + ti.d1.n2.d2.n1.2.1.3.1 + + + + + ti.d1.n2.d2.n1.2.1.3.2 + + + + + ti.d1.n2.d2.n1.2.1.3.3 + + + + + ti.d1.n2.d2.n1.2.2.1.1 + + + + + ti.d1.n2.d2.n1.2.2.1.2 + + + + + ti.d1.n2.d2.n1.2.2.1.3 + + + + + ti.d1.n2.d2.n1.2.2.2.1 + + + + + ti.d1.n2.d2.n1.2.2.2.2 + + + + + ti.d1.n2.d2.n1.2.2.2.3 + + + + + ti.d1.n2.d2.n1.2.2.3.1 + + + + + ti.d1.n2.d2.n1.2.2.3.2 + + + + + ti.d1.n2.d2.n1.2.2.3.3 + + + + + ti.d1.n2.d2.n1.2.3.1.1 + + + + + ti.d1.n2.d2.n1.2.3.1.2 + + + + + ti.d1.n2.d2.n1.2.3.1.3 + + + + + ti.d1.n2.d2.n1.2.3.2.1 + + + + + ti.d1.n2.d2.n1.2.3.2.2 + + + + + ti.d1.n2.d2.n1.2.3.2.3 + + + + + ti.d1.n2.d2.n1.2.3.3.1 + + + + + ti.d1.n2.d2.n1.2.3.3.2 + + + + + ti.d1.n2.d2.n1.2.3.3.3 + + + + + ti.d1.n2.d2.n1.3.1.1.1 + + + + + ti.d1.n2.d2.n1.3.1.1.2 + + + + + ti.d1.n2.d2.n1.3.1.1.3 + + + + + ti.d1.n2.d2.n1.3.1.2.1 + + + + + ti.d1.n2.d2.n1.3.1.2.2 + + + + + ti.d1.n2.d2.n1.3.1.2.3 + + + + + ti.d1.n2.d2.n1.3.1.3.1 + + + + + ti.d1.n2.d2.n1.3.1.3.2 + + + + + ti.d1.n2.d2.n1.3.1.3.3 + + + + + ti.d1.n2.d2.n1.3.2.1.1 + + + + + ti.d1.n2.d2.n1.3.2.1.2 + + + + + ti.d1.n2.d2.n1.3.2.1.3 + + + + + ti.d1.n2.d2.n1.3.2.2.1 + + + + + ti.d1.n2.d2.n1.3.2.2.2 + + + + + ti.d1.n2.d2.n1.3.2.2.3 + + + + + ti.d1.n2.d2.n1.3.2.3.1 + + + + + ti.d1.n2.d2.n1.3.2.3.2 + + + + + ti.d1.n2.d2.n1.3.2.3.3 + + + + + ti.d1.n2.d2.n1.3.3.1.1 + + + + + ti.d1.n2.d2.n1.3.3.1.2 + + + + + ti.d1.n2.d2.n1.3.3.1.3 + + + + + ti.d1.n2.d2.n1.3.3.2.1 + + + + + ti.d1.n2.d2.n1.3.3.2.2 + + + + + ti.d1.n2.d2.n1.3.3.2.3 + + + + + ti.d1.n2.d2.n1.3.3.3.1 + + + + + ti.d1.n2.d2.n1.3.3.3.2 + + + + + ti.d1.n2.d2.n1.3.3.3.3 + + + + + ti.d1.n2.d2.n2.1.1.1.1 + + + + + ti.d1.n2.d2.n2.1.1.1.2 + + + + + ti.d1.n2.d2.n2.1.1.1.3 + + + + + ti.d1.n2.d2.n2.1.1.2.1 + + + + + ti.d1.n2.d2.n2.1.1.2.2 + + + + + ti.d1.n2.d2.n2.1.1.2.3 + + + + + ti.d1.n2.d2.n2.1.1.3.1 + + + + + ti.d1.n2.d2.n2.1.1.3.2 + + + + + ti.d1.n2.d2.n2.1.1.3.3 + + + + + ti.d1.n2.d2.n2.1.2.1.1 + + + + + ti.d1.n2.d2.n2.1.2.1.2 + + + + + ti.d1.n2.d2.n2.1.2.1.3 + + + + + ti.d1.n2.d2.n2.1.2.2.1 + + + + + ti.d1.n2.d2.n2.1.2.2.2 + + + + + ti.d1.n2.d2.n2.1.2.2.3 + + + + + ti.d1.n2.d2.n2.1.2.3.1 + + + + + ti.d1.n2.d2.n2.1.2.3.2 + + + + + ti.d1.n2.d2.n2.1.2.3.3 + + + + + ti.d1.n2.d2.n2.1.3.1.1 + + + + + ti.d1.n2.d2.n2.1.3.1.2 + + + + + ti.d1.n2.d2.n2.1.3.1.3 + + + + + ti.d1.n2.d2.n2.1.3.2.1 + + + + + ti.d1.n2.d2.n2.1.3.2.2 + + + + + ti.d1.n2.d2.n2.1.3.2.3 + + + + + ti.d1.n2.d2.n2.1.3.3.1 + + + + + ti.d1.n2.d2.n2.1.3.3.2 + + + + + ti.d1.n2.d2.n2.1.3.3.3 + + + + + ti.d1.n2.d2.n2.2.1.1.1 + + + + + ti.d1.n2.d2.n2.2.1.1.2 + + + + + ti.d1.n2.d2.n2.2.1.1.3 + + + + + ti.d1.n2.d2.n2.2.1.2.1 + + + + + ti.d1.n2.d2.n2.2.1.2.2 + + + + + ti.d1.n2.d2.n2.2.1.2.3 + + + + + ti.d1.n2.d2.n2.2.1.3.1 + + + + + ti.d1.n2.d2.n2.2.1.3.2 + + + + + ti.d1.n2.d2.n2.2.1.3.3 + + + + + ti.d1.n2.d2.n2.2.2.1.1 + + + + + ti.d1.n2.d2.n2.2.2.1.2 + + + + + ti.d1.n2.d2.n2.2.2.1.3 + + + + + ti.d1.n2.d2.n2.2.2.2.1 + + + + + ti.d1.n2.d2.n2.2.2.2.2 + + + + + ti.d1.n2.d2.n2.2.2.2.3 + + + + + ti.d1.n2.d2.n2.2.2.3.1 + + + + + ti.d1.n2.d2.n2.2.2.3.2 + + + + + ti.d1.n2.d2.n2.2.2.3.3 + + + + + ti.d1.n2.d2.n2.2.3.1.1 + + + + + ti.d1.n2.d2.n2.2.3.1.2 + + + + + ti.d1.n2.d2.n2.2.3.1.3 + + + + + ti.d1.n2.d2.n2.2.3.2.1 + + + + + ti.d1.n2.d2.n2.2.3.2.2 + + + + + ti.d1.n2.d2.n2.2.3.2.3 + + + + + ti.d1.n2.d2.n2.2.3.3.1 + + + + + ti.d1.n2.d2.n2.2.3.3.2 + + + + + ti.d1.n2.d2.n2.2.3.3.3 + + + + + ti.d1.n2.d2.n2.3.1.1.1 + + + + + ti.d1.n2.d2.n2.3.1.1.2 + + + + + ti.d1.n2.d2.n2.3.1.1.3 + + + + + ti.d1.n2.d2.n2.3.1.2.1 + + + + + ti.d1.n2.d2.n2.3.1.2.2 + + + + + ti.d1.n2.d2.n2.3.1.2.3 + + + + + ti.d1.n2.d2.n2.3.1.3.1 + + + + + ti.d1.n2.d2.n2.3.1.3.2 + + + + + ti.d1.n2.d2.n2.3.1.3.3 + + + + + ti.d1.n2.d2.n2.3.2.1.1 + + + + + ti.d1.n2.d2.n2.3.2.1.2 + + + + + ti.d1.n2.d2.n2.3.2.1.3 + + + + + ti.d1.n2.d2.n2.3.2.2.1 + + + + + ti.d1.n2.d2.n2.3.2.2.2 + + + + + ti.d1.n2.d2.n2.3.2.2.3 + + + + + ti.d1.n2.d2.n2.3.2.3.1 + + + + + ti.d1.n2.d2.n2.3.2.3.2 + + + + + ti.d1.n2.d2.n2.3.2.3.3 + + + + + ti.d1.n2.d2.n2.3.3.1.1 + + + + + ti.d1.n2.d2.n2.3.3.1.2 + + + + + ti.d1.n2.d2.n2.3.3.1.3 + + + + + ti.d1.n2.d2.n2.3.3.2.1 + + + + + ti.d1.n2.d2.n2.3.3.2.2 + + + + + ti.d1.n2.d2.n2.3.3.2.3 + + + + + ti.d1.n2.d2.n2.3.3.3.1 + + + + + ti.d1.n2.d2.n2.3.3.3.2 + + + + + ti.d1.n2.d2.n2.3.3.3.3 + + + + + ti.d1.n2.d3.n1.1.1.1.1 + + + + + ti.d1.n2.d3.n1.1.1.1.2 + + + + + ti.d1.n2.d3.n1.1.1.1.3 + + + + + ti.d1.n2.d3.n1.1.1.2.1 + + + + + ti.d1.n2.d3.n1.1.1.2.2 + + + + + ti.d1.n2.d3.n1.1.1.2.3 + + + + + ti.d1.n2.d3.n1.1.1.3.1 + + + + + ti.d1.n2.d3.n1.1.1.3.2 + + + + + ti.d1.n2.d3.n1.1.1.3.3 + + + + + ti.d1.n2.d3.n1.1.2.1.1 + + + + + ti.d1.n2.d3.n1.1.2.1.2 + + + + + ti.d1.n2.d3.n1.1.2.1.3 + + + + + ti.d1.n2.d3.n1.1.2.2.1 + + + + + ti.d1.n2.d3.n1.1.2.2.2 + + + + + ti.d1.n2.d3.n1.1.2.2.3 + + + + + ti.d1.n2.d3.n1.1.2.3.1 + + + + + ti.d1.n2.d3.n1.1.2.3.2 + + + + + ti.d1.n2.d3.n1.1.2.3.3 + + + + + ti.d1.n2.d3.n1.1.3.1.1 + + + + + ti.d1.n2.d3.n1.1.3.1.2 + + + + + ti.d1.n2.d3.n1.1.3.1.3 + + + + + ti.d1.n2.d3.n1.1.3.2.1 + + + + + ti.d1.n2.d3.n1.1.3.2.2 + + + + + ti.d1.n2.d3.n1.1.3.2.3 + + + + + ti.d1.n2.d3.n1.1.3.3.1 + + + + + ti.d1.n2.d3.n1.1.3.3.2 + + + + + ti.d1.n2.d3.n1.1.3.3.3 + + + + + ti.d1.n2.d3.n1.2.1.1.1 + + + + + ti.d1.n2.d3.n1.2.1.1.2 + + + + + ti.d1.n2.d3.n1.2.1.1.3 + + + + + ti.d1.n2.d3.n1.2.1.2.1 + + + + + ti.d1.n2.d3.n1.2.1.2.2 + + + + + ti.d1.n2.d3.n1.2.1.2.3 + + + + + ti.d1.n2.d3.n1.2.1.3.1 + + + + + ti.d1.n2.d3.n1.2.1.3.2 + + + + + ti.d1.n2.d3.n1.2.1.3.3 + + + + + ti.d1.n2.d3.n1.2.2.1.1 + + + + + ti.d1.n2.d3.n1.2.2.1.2 + + + + + ti.d1.n2.d3.n1.2.2.1.3 + + + + + ti.d1.n2.d3.n1.2.2.2.1 + + + + + ti.d1.n2.d3.n1.2.2.2.2 + + + + + ti.d1.n2.d3.n1.2.2.2.3 + + + + + ti.d1.n2.d3.n1.2.2.3.1 + + + + + ti.d1.n2.d3.n1.2.2.3.2 + + + + + ti.d1.n2.d3.n1.2.2.3.3 + + + + + ti.d1.n2.d3.n1.2.3.1.1 + + + + + ti.d1.n2.d3.n1.2.3.1.2 + + + + + ti.d1.n2.d3.n1.2.3.1.3 + + + + + ti.d1.n2.d3.n1.2.3.2.1 + + + + + ti.d1.n2.d3.n1.2.3.2.2 + + + + + ti.d1.n2.d3.n1.2.3.2.3 + + + + + ti.d1.n2.d3.n1.2.3.3.1 + + + + + ti.d1.n2.d3.n1.2.3.3.2 + + + + + ti.d1.n2.d3.n1.2.3.3.3 + + + + + ti.d1.n2.d3.n1.3.1.1.1 + + + + + ti.d1.n2.d3.n1.3.1.1.2 + + + + + ti.d1.n2.d3.n1.3.1.1.3 + + + + + ti.d1.n2.d3.n1.3.1.2.1 + + + + + ti.d1.n2.d3.n1.3.1.2.2 + + + + + ti.d1.n2.d3.n1.3.1.2.3 + + + + + ti.d1.n2.d3.n1.3.1.3.1 + + + + + ti.d1.n2.d3.n1.3.1.3.2 + + + + + ti.d1.n2.d3.n1.3.1.3.3 + + + + + ti.d1.n2.d3.n1.3.2.1.1 + + + + + ti.d1.n2.d3.n1.3.2.1.2 + + + + + ti.d1.n2.d3.n1.3.2.1.3 + + + + + ti.d1.n2.d3.n1.3.2.2.1 + + + + + ti.d1.n2.d3.n1.3.2.2.2 + + + + + ti.d1.n2.d3.n1.3.2.2.3 + + + + + ti.d1.n2.d3.n1.3.2.3.1 + + + + + ti.d1.n2.d3.n1.3.2.3.2 + + + + + ti.d1.n2.d3.n1.3.2.3.3 + + + + + ti.d1.n2.d3.n1.3.3.1.1 + + + + + ti.d1.n2.d3.n1.3.3.1.2 + + + + + ti.d1.n2.d3.n1.3.3.1.3 + + + + + ti.d1.n2.d3.n1.3.3.2.1 + + + + + ti.d1.n2.d3.n1.3.3.2.2 + + + + + ti.d1.n2.d3.n1.3.3.2.3 + + + + + ti.d1.n2.d3.n1.3.3.3.1 + + + + + ti.d1.n2.d3.n1.3.3.3.2 + + + + + ti.d1.n2.d3.n1.3.3.3.3 + + + + + ti.d1.n2.d3.n2.1.1.1.1 + + + + + ti.d1.n2.d3.n2.1.1.1.2 + + + + + ti.d1.n2.d3.n2.1.1.1.3 + + + + + ti.d1.n2.d3.n2.1.1.2.1 + + + + + ti.d1.n2.d3.n2.1.1.2.2 + + + + + ti.d1.n2.d3.n2.1.1.2.3 + + + + + ti.d1.n2.d3.n2.1.1.3.1 + + + + + ti.d1.n2.d3.n2.1.1.3.2 + + + + + ti.d1.n2.d3.n2.1.1.3.3 + + + + + ti.d1.n2.d3.n2.1.2.1.1 + + + + + ti.d1.n2.d3.n2.1.2.1.2 + + + + + ti.d1.n2.d3.n2.1.2.1.3 + + + + + ti.d1.n2.d3.n2.1.2.2.1 + + + + + ti.d1.n2.d3.n2.1.2.2.2 + + + + + ti.d1.n2.d3.n2.1.2.2.3 + + + + + ti.d1.n2.d3.n2.1.2.3.1 + + + + + ti.d1.n2.d3.n2.1.2.3.2 + + + + + ti.d1.n2.d3.n2.1.2.3.3 + + + + + ti.d1.n2.d3.n2.1.3.1.1 + + + + + ti.d1.n2.d3.n2.1.3.1.2 + + + + + ti.d1.n2.d3.n2.1.3.1.3 + + + + + ti.d1.n2.d3.n2.1.3.2.1 + + + + + ti.d1.n2.d3.n2.1.3.2.2 + + + + + ti.d1.n2.d3.n2.1.3.2.3 + + + + + ti.d1.n2.d3.n2.1.3.3.1 + + + + + ti.d1.n2.d3.n2.1.3.3.2 + + + + + ti.d1.n2.d3.n2.1.3.3.3 + + + + + ti.d1.n2.d3.n2.2.1.1.1 + + + + + ti.d1.n2.d3.n2.2.1.1.2 + + + + + ti.d1.n2.d3.n2.2.1.1.3 + + + + + ti.d1.n2.d3.n2.2.1.2.1 + + + + + ti.d1.n2.d3.n2.2.1.2.2 + + + + + ti.d1.n2.d3.n2.2.1.2.3 + + + + + ti.d1.n2.d3.n2.2.1.3.1 + + + + + ti.d1.n2.d3.n2.2.1.3.2 + + + + + ti.d1.n2.d3.n2.2.1.3.3 + + + + + ti.d1.n2.d3.n2.2.2.1.1 + + + + + ti.d1.n2.d3.n2.2.2.1.2 + + + + + ti.d1.n2.d3.n2.2.2.1.3 + + + + + ti.d1.n2.d3.n2.2.2.2.1 + + + + + ti.d1.n2.d3.n2.2.2.2.2 + + + + + ti.d1.n2.d3.n2.2.2.2.3 + + + + + ti.d1.n2.d3.n2.2.2.3.1 + + + + + ti.d1.n2.d3.n2.2.2.3.2 + + + + + ti.d1.n2.d3.n2.2.2.3.3 + + + + + ti.d1.n2.d3.n2.2.3.1.1 + + + + + ti.d1.n2.d3.n2.2.3.1.2 + + + + + ti.d1.n2.d3.n2.2.3.1.3 + + + + + ti.d1.n2.d3.n2.2.3.2.1 + + + + + ti.d1.n2.d3.n2.2.3.2.2 + + + + + ti.d1.n2.d3.n2.2.3.2.3 + + + + + ti.d1.n2.d3.n2.2.3.3.1 + + + + + ti.d1.n2.d3.n2.2.3.3.2 + + + + + ti.d1.n2.d3.n2.2.3.3.3 + + + + + ti.d1.n2.d3.n2.3.1.1.1 + + + + + ti.d1.n2.d3.n2.3.1.1.2 + + + + + ti.d1.n2.d3.n2.3.1.1.3 + + + + + ti.d1.n2.d3.n2.3.1.2.1 + + + + + ti.d1.n2.d3.n2.3.1.2.2 + + + + + ti.d1.n2.d3.n2.3.1.2.3 + + + + + ti.d1.n2.d3.n2.3.1.3.1 + + + + + ti.d1.n2.d3.n2.3.1.3.2 + + + + + ti.d1.n2.d3.n2.3.1.3.3 + + + + + ti.d1.n2.d3.n2.3.2.1.1 + + + + + ti.d1.n2.d3.n2.3.2.1.2 + + + + + ti.d1.n2.d3.n2.3.2.1.3 + + + + + ti.d1.n2.d3.n2.3.2.2.1 + + + + + ti.d1.n2.d3.n2.3.2.2.2 + + + + + ti.d1.n2.d3.n2.3.2.2.3 + + + + + ti.d1.n2.d3.n2.3.2.3.1 + + + + + ti.d1.n2.d3.n2.3.2.3.2 + + + + + ti.d1.n2.d3.n2.3.2.3.3 + + + + + ti.d1.n2.d3.n2.3.3.1.1 + + + + + ti.d1.n2.d3.n2.3.3.1.2 + + + + + ti.d1.n2.d3.n2.3.3.1.3 + + + + + ti.d1.n2.d3.n2.3.3.2.1 + + + + + ti.d1.n2.d3.n2.3.3.2.2 + + + + + ti.d1.n2.d3.n2.3.3.2.3 + + + + + ti.d1.n2.d3.n2.3.3.3.1 + + + + + ti.d1.n2.d3.n2.3.3.3.2 + + + + + ti.d1.n2.d3.n2.3.3.3.3 + + + + + ti.d1.n2.d4.n1.1.1.1.1 + + + + + ti.d1.n2.d4.n1.1.1.1.2 + + + + + ti.d1.n2.d4.n1.1.1.1.3 + + + + + ti.d1.n2.d4.n1.1.1.2.1 + + + + + ti.d1.n2.d4.n1.1.1.2.2 + + + + + ti.d1.n2.d4.n1.1.1.2.3 + + + + + ti.d1.n2.d4.n1.1.1.3.1 + + + + + ti.d1.n2.d4.n1.1.1.3.2 + + + + + ti.d1.n2.d4.n1.1.1.3.3 + + + + + ti.d1.n2.d4.n1.1.2.1.1 + + + + + ti.d1.n2.d4.n1.1.2.1.2 + + + + + ti.d1.n2.d4.n1.1.2.1.3 + + + + + ti.d1.n2.d4.n1.1.2.2.1 + + + + + ti.d1.n2.d4.n1.1.2.2.2 + + + + + ti.d1.n2.d4.n1.1.2.2.3 + + + + + ti.d1.n2.d4.n1.1.2.3.1 + + + + + ti.d1.n2.d4.n1.1.2.3.2 + + + + + ti.d1.n2.d4.n1.1.2.3.3 + + + + + ti.d1.n2.d4.n1.1.3.1.1 + + + + + ti.d1.n2.d4.n1.1.3.1.2 + + + + + ti.d1.n2.d4.n1.1.3.1.3 + + + + + ti.d1.n2.d4.n1.1.3.2.1 + + + + + ti.d1.n2.d4.n1.1.3.2.2 + + + + + ti.d1.n2.d4.n1.1.3.2.3 + + + + + ti.d1.n2.d4.n1.1.3.3.1 + + + + + ti.d1.n2.d4.n1.1.3.3.2 + + + + + ti.d1.n2.d4.n1.1.3.3.3 + + + + + ti.d1.n2.d4.n1.2.1.1.1 + + + + + ti.d1.n2.d4.n1.2.1.1.2 + + + + + ti.d1.n2.d4.n1.2.1.1.3 + + + + + ti.d1.n2.d4.n1.2.1.2.1 + + + + + ti.d1.n2.d4.n1.2.1.2.2 + + + + + ti.d1.n2.d4.n1.2.1.2.3 + + + + + ti.d1.n2.d4.n1.2.1.3.1 + + + + + ti.d1.n2.d4.n1.2.1.3.2 + + + + + ti.d1.n2.d4.n1.2.1.3.3 + + + + + ti.d1.n2.d4.n1.2.2.1.1 + + + + + ti.d1.n2.d4.n1.2.2.1.2 + + + + + ti.d1.n2.d4.n1.2.2.1.3 + + + + + ti.d1.n2.d4.n1.2.2.2.1 + + + + + ti.d1.n2.d4.n1.2.2.2.2 + + + + + ti.d1.n2.d4.n1.2.2.2.3 + + + + + ti.d1.n2.d4.n1.2.2.3.1 + + + + + ti.d1.n2.d4.n1.2.2.3.2 + + + + + ti.d1.n2.d4.n1.2.2.3.3 + + + + + ti.d1.n2.d4.n1.2.3.1.1 + + + + + ti.d1.n2.d4.n1.2.3.1.2 + + + + + ti.d1.n2.d4.n1.2.3.1.3 + + + + + ti.d1.n2.d4.n1.2.3.2.1 + + + + + ti.d1.n2.d4.n1.2.3.2.2 + + + + + ti.d1.n2.d4.n1.2.3.2.3 + + + + + ti.d1.n2.d4.n1.2.3.3.1 + + + + + ti.d1.n2.d4.n1.2.3.3.2 + + + + + ti.d1.n2.d4.n1.2.3.3.3 + + + + + ti.d1.n2.d4.n1.3.1.1.1 + + + + + ti.d1.n2.d4.n1.3.1.1.2 + + + + + ti.d1.n2.d4.n1.3.1.1.3 + + + + + ti.d1.n2.d4.n1.3.1.2.1 + + + + + ti.d1.n2.d4.n1.3.1.2.2 + + + + + ti.d1.n2.d4.n1.3.1.2.3 + + + + + ti.d1.n2.d4.n1.3.1.3.1 + + + + + ti.d1.n2.d4.n1.3.1.3.2 + + + + + ti.d1.n2.d4.n1.3.1.3.3 + + + + + ti.d1.n2.d4.n1.3.2.1.1 + + + + + ti.d1.n2.d4.n1.3.2.1.2 + + + + + ti.d1.n2.d4.n1.3.2.1.3 + + + + + ti.d1.n2.d4.n1.3.2.2.1 + + + + + ti.d1.n2.d4.n1.3.2.2.2 + + + + + ti.d1.n2.d4.n1.3.2.2.3 + + + + + ti.d1.n2.d4.n1.3.2.3.1 + + + + + ti.d1.n2.d4.n1.3.2.3.2 + + + + + ti.d1.n2.d4.n1.3.2.3.3 + + + + + ti.d1.n2.d4.n1.3.3.1.1 + + + + + ti.d1.n2.d4.n1.3.3.1.2 + + + + + ti.d1.n2.d4.n1.3.3.1.3 + + + + + ti.d1.n2.d4.n1.3.3.2.1 + + + + + ti.d1.n2.d4.n1.3.3.2.2 + + + + + ti.d1.n2.d4.n1.3.3.2.3 + + + + + ti.d1.n2.d4.n1.3.3.3.1 + + + + + ti.d1.n2.d4.n1.3.3.3.2 + + + + + ti.d1.n2.d4.n1.3.3.3.3 + + + + + ti.d1.n2.d4.n2.1.1.1.1 + + + + + ti.d1.n2.d4.n2.1.1.1.2 + + + + + ti.d1.n2.d4.n2.1.1.1.3 + + + + + ti.d1.n2.d4.n2.1.1.2.1 + + + + + ti.d1.n2.d4.n2.1.1.2.2 + + + + + ti.d1.n2.d4.n2.1.1.2.3 + + + + + ti.d1.n2.d4.n2.1.1.3.1 + + + + + ti.d1.n2.d4.n2.1.1.3.2 + + + + + ti.d1.n2.d4.n2.1.1.3.3 + + + + + ti.d1.n2.d4.n2.1.2.1.1 + + + + + ti.d1.n2.d4.n2.1.2.1.2 + + + + + ti.d1.n2.d4.n2.1.2.1.3 + + + + + ti.d1.n2.d4.n2.1.2.2.1 + + + + + ti.d1.n2.d4.n2.1.2.2.2 + + + + + ti.d1.n2.d4.n2.1.2.2.3 + + + + + ti.d1.n2.d4.n2.1.2.3.1 + + + + + ti.d1.n2.d4.n2.1.2.3.2 + + + + + ti.d1.n2.d4.n2.1.2.3.3 + + + + + ti.d1.n2.d4.n2.1.3.1.1 + + + + + ti.d1.n2.d4.n2.1.3.1.2 + + + + + ti.d1.n2.d4.n2.1.3.1.3 + + + + + ti.d1.n2.d4.n2.1.3.2.1 + + + + + ti.d1.n2.d4.n2.1.3.2.2 + + + + + ti.d1.n2.d4.n2.1.3.2.3 + + + + + ti.d1.n2.d4.n2.1.3.3.1 + + + + + ti.d1.n2.d4.n2.1.3.3.2 + + + + + ti.d1.n2.d4.n2.1.3.3.3 + + + + + ti.d1.n2.d4.n2.2.1.1.1 + + + + + ti.d1.n2.d4.n2.2.1.1.2 + + + + + ti.d1.n2.d4.n2.2.1.1.3 + + + + + ti.d1.n2.d4.n2.2.1.2.1 + + + + + ti.d1.n2.d4.n2.2.1.2.2 + + + + + ti.d1.n2.d4.n2.2.1.2.3 + + + + + ti.d1.n2.d4.n2.2.1.3.1 + + + + + ti.d1.n2.d4.n2.2.1.3.2 + + + + + ti.d1.n2.d4.n2.2.1.3.3 + + + + + ti.d1.n2.d4.n2.2.2.1.1 + + + + + ti.d1.n2.d4.n2.2.2.1.2 + + + + + ti.d1.n2.d4.n2.2.2.1.3 + + + + + ti.d1.n2.d4.n2.2.2.2.1 + + + + + ti.d1.n2.d4.n2.2.2.2.2 + + + + + ti.d1.n2.d4.n2.2.2.2.3 + + + + + ti.d1.n2.d4.n2.2.2.3.1 + + + + + ti.d1.n2.d4.n2.2.2.3.2 + + + + + ti.d1.n2.d4.n2.2.2.3.3 + + + + + ti.d1.n2.d4.n2.2.3.1.1 + + + + + ti.d1.n2.d4.n2.2.3.1.2 + + + + + ti.d1.n2.d4.n2.2.3.1.3 + + + + + ti.d1.n2.d4.n2.2.3.2.1 + + + + + ti.d1.n2.d4.n2.2.3.2.2 + + + + + ti.d1.n2.d4.n2.2.3.2.3 + + + + + ti.d1.n2.d4.n2.2.3.3.1 + + + + + ti.d1.n2.d4.n2.2.3.3.2 + + + + + ti.d1.n2.d4.n2.2.3.3.3 + + + + + ti.d1.n2.d4.n2.3.1.1.1 + + + + + ti.d1.n2.d4.n2.3.1.1.2 + + + + + ti.d1.n2.d4.n2.3.1.1.3 + + + + + ti.d1.n2.d4.n2.3.1.2.1 + + + + + ti.d1.n2.d4.n2.3.1.2.2 + + + + + ti.d1.n2.d4.n2.3.1.2.3 + + + + + ti.d1.n2.d4.n2.3.1.3.1 + + + + + ti.d1.n2.d4.n2.3.1.3.2 + + + + + ti.d1.n2.d4.n2.3.1.3.3 + + + + + ti.d1.n2.d4.n2.3.2.1.1 + + + + + ti.d1.n2.d4.n2.3.2.1.2 + + + + + ti.d1.n2.d4.n2.3.2.1.3 + + + + + ti.d1.n2.d4.n2.3.2.2.1 + + + + + ti.d1.n2.d4.n2.3.2.2.2 + + + + + ti.d1.n2.d4.n2.3.2.2.3 + + + + + ti.d1.n2.d4.n2.3.2.3.1 + + + + + ti.d1.n2.d4.n2.3.2.3.2 + + + + + ti.d1.n2.d4.n2.3.2.3.3 + + + + + ti.d1.n2.d4.n2.3.3.1.1 + + + + + ti.d1.n2.d4.n2.3.3.1.2 + + + + + ti.d1.n2.d4.n2.3.3.1.3 + + + + + ti.d1.n2.d4.n2.3.3.2.1 + + + + + ti.d1.n2.d4.n2.3.3.2.2 + + + + + ti.d1.n2.d4.n2.3.3.2.3 + + + + + ti.d1.n2.d4.n2.3.3.3.1 + + + + + ti.d1.n2.d4.n2.3.3.3.2 + + + + + ti.d1.n2.d4.n2.3.3.3.3 + + + + + ti.d2.n1.d1.n1.1.1.1.1 + + + + + ti.d2.n1.d1.n1.1.1.1.2 + + + + + ti.d2.n1.d1.n1.1.1.1.3 + + + + + ti.d2.n1.d1.n1.1.1.2.1 + + + + + ti.d2.n1.d1.n1.1.1.2.2 + + + + + ti.d2.n1.d1.n1.1.1.2.3 + + + + + ti.d2.n1.d1.n1.1.1.3.1 + + + + + ti.d2.n1.d1.n1.1.1.3.2 + + + + + ti.d2.n1.d1.n1.1.1.3.3 + + + + + ti.d2.n1.d1.n1.1.2.1.1 + + + + + ti.d2.n1.d1.n1.1.2.1.2 + + + + + ti.d2.n1.d1.n1.1.2.1.3 + + + + + ti.d2.n1.d1.n1.1.2.2.1 + + + + + ti.d2.n1.d1.n1.1.2.2.2 + + + + + ti.d2.n1.d1.n1.1.2.2.3 + + + + + ti.d2.n1.d1.n1.1.2.3.1 + + + + + ti.d2.n1.d1.n1.1.2.3.2 + + + + + ti.d2.n1.d1.n1.1.2.3.3 + + + + + ti.d2.n1.d1.n1.1.3.1.1 + + + + + ti.d2.n1.d1.n1.1.3.1.2 + + + + + ti.d2.n1.d1.n1.1.3.1.3 + + + + + ti.d2.n1.d1.n1.1.3.2.1 + + + + + ti.d2.n1.d1.n1.1.3.2.2 + + + + + ti.d2.n1.d1.n1.1.3.2.3 + + + + + ti.d2.n1.d1.n1.1.3.3.1 + + + + + ti.d2.n1.d1.n1.1.3.3.2 + + + + + ti.d2.n1.d1.n1.1.3.3.3 + + + + + ti.d2.n1.d1.n1.2.1.1.1 + + + + + ti.d2.n1.d1.n1.2.1.1.2 + + + + + ti.d2.n1.d1.n1.2.1.1.3 + + + + + ti.d2.n1.d1.n1.2.1.2.1 + + + + + ti.d2.n1.d1.n1.2.1.2.2 + + + + + ti.d2.n1.d1.n1.2.1.2.3 + + + + + ti.d2.n1.d1.n1.2.1.3.1 + + + + + ti.d2.n1.d1.n1.2.1.3.2 + + + + + ti.d2.n1.d1.n1.2.1.3.3 + + + + + ti.d2.n1.d1.n1.2.2.1.1 + + + + + ti.d2.n1.d1.n1.2.2.1.2 + + + + + ti.d2.n1.d1.n1.2.2.1.3 + + + + + ti.d2.n1.d1.n1.2.2.2.1 + + + + + ti.d2.n1.d1.n1.2.2.2.2 + + + + + ti.d2.n1.d1.n1.2.2.2.3 + + + + + ti.d2.n1.d1.n1.2.2.3.1 + + + + + ti.d2.n1.d1.n1.2.2.3.2 + + + + + ti.d2.n1.d1.n1.2.2.3.3 + + + + + ti.d2.n1.d1.n1.2.3.1.1 + + + + + ti.d2.n1.d1.n1.2.3.1.2 + + + + + ti.d2.n1.d1.n1.2.3.1.3 + + + + + ti.d2.n1.d1.n1.2.3.2.1 + + + + + ti.d2.n1.d1.n1.2.3.2.2 + + + + + ti.d2.n1.d1.n1.2.3.2.3 + + + + + ti.d2.n1.d1.n1.2.3.3.1 + + + + + ti.d2.n1.d1.n1.2.3.3.2 + + + + + ti.d2.n1.d1.n1.2.3.3.3 + + + + + ti.d2.n1.d1.n1.3.1.1.1 + + + + + ti.d2.n1.d1.n1.3.1.1.2 + + + + + ti.d2.n1.d1.n1.3.1.1.3 + + + + + ti.d2.n1.d1.n1.3.1.2.1 + + + + + ti.d2.n1.d1.n1.3.1.2.2 + + + + + ti.d2.n1.d1.n1.3.1.2.3 + + + + + ti.d2.n1.d1.n1.3.1.3.1 + + + + + ti.d2.n1.d1.n1.3.1.3.2 + + + + + ti.d2.n1.d1.n1.3.1.3.3 + + + + + ti.d2.n1.d1.n1.3.2.1.1 + + + + + ti.d2.n1.d1.n1.3.2.1.2 + + + + + ti.d2.n1.d1.n1.3.2.1.3 + + + + + ti.d2.n1.d1.n1.3.2.2.1 + + + + + ti.d2.n1.d1.n1.3.2.2.2 + + + + + ti.d2.n1.d1.n1.3.2.2.3 + + + + + ti.d2.n1.d1.n1.3.2.3.1 + + + + + ti.d2.n1.d1.n1.3.2.3.2 + + + + + ti.d2.n1.d1.n1.3.2.3.3 + + + + + ti.d2.n1.d1.n1.3.3.1.1 + + + + + ti.d2.n1.d1.n1.3.3.1.2 + + + + + ti.d2.n1.d1.n1.3.3.1.3 + + + + + ti.d2.n1.d1.n1.3.3.2.1 + + + + + ti.d2.n1.d1.n1.3.3.2.2 + + + + + ti.d2.n1.d1.n1.3.3.2.3 + + + + + ti.d2.n1.d1.n1.3.3.3.1 + + + + + ti.d2.n1.d1.n1.3.3.3.2 + + + + + ti.d2.n1.d1.n1.3.3.3.3 + + + + + ti.d2.n1.d1.n2.1.1.1.1 + + + + + ti.d2.n1.d1.n2.1.1.1.2 + + + + + ti.d2.n1.d1.n2.1.1.1.3 + + + + + ti.d2.n1.d1.n2.1.1.2.1 + + + + + ti.d2.n1.d1.n2.1.1.2.2 + + + + + ti.d2.n1.d1.n2.1.1.2.3 + + + + + ti.d2.n1.d1.n2.1.1.3.1 + + + + + ti.d2.n1.d1.n2.1.1.3.2 + + + + + ti.d2.n1.d1.n2.1.1.3.3 + + + + + ti.d2.n1.d1.n2.1.2.1.1 + + + + + ti.d2.n1.d1.n2.1.2.1.2 + + + + + ti.d2.n1.d1.n2.1.2.1.3 + + + + + ti.d2.n1.d1.n2.1.2.2.1 + + + + + ti.d2.n1.d1.n2.1.2.2.2 + + + + + ti.d2.n1.d1.n2.1.2.2.3 + + + + + ti.d2.n1.d1.n2.1.2.3.1 + + + + + ti.d2.n1.d1.n2.1.2.3.2 + + + + + ti.d2.n1.d1.n2.1.2.3.3 + + + + + ti.d2.n1.d1.n2.1.3.1.1 + + + + + ti.d2.n1.d1.n2.1.3.1.2 + + + + + ti.d2.n1.d1.n2.1.3.1.3 + + + + + ti.d2.n1.d1.n2.1.3.2.1 + + + + + ti.d2.n1.d1.n2.1.3.2.2 + + + + + ti.d2.n1.d1.n2.1.3.2.3 + + + + + ti.d2.n1.d1.n2.1.3.3.1 + + + + + ti.d2.n1.d1.n2.1.3.3.2 + + + + + ti.d2.n1.d1.n2.1.3.3.3 + + + + + ti.d2.n1.d1.n2.2.1.1.1 + + + + + ti.d2.n1.d1.n2.2.1.1.2 + + + + + ti.d2.n1.d1.n2.2.1.1.3 + + + + + ti.d2.n1.d1.n2.2.1.2.1 + + + + + ti.d2.n1.d1.n2.2.1.2.2 + + + + + ti.d2.n1.d1.n2.2.1.2.3 + + + + + ti.d2.n1.d1.n2.2.1.3.1 + + + + + ti.d2.n1.d1.n2.2.1.3.2 + + + + + ti.d2.n1.d1.n2.2.1.3.3 + + + + + ti.d2.n1.d1.n2.2.2.1.1 + + + + + ti.d2.n1.d1.n2.2.2.1.2 + + + + + ti.d2.n1.d1.n2.2.2.1.3 + + + + + ti.d2.n1.d1.n2.2.2.2.1 + + + + + ti.d2.n1.d1.n2.2.2.2.2 + + + + + ti.d2.n1.d1.n2.2.2.2.3 + + + + + ti.d2.n1.d1.n2.2.2.3.1 + + + + + ti.d2.n1.d1.n2.2.2.3.2 + + + + + ti.d2.n1.d1.n2.2.2.3.3 + + + + + ti.d2.n1.d1.n2.2.3.1.1 + + + + + ti.d2.n1.d1.n2.2.3.1.2 + + + + + ti.d2.n1.d1.n2.2.3.1.3 + + + + + ti.d2.n1.d1.n2.2.3.2.1 + + + + + ti.d2.n1.d1.n2.2.3.2.2 + + + + + ti.d2.n1.d1.n2.2.3.2.3 + + + + + ti.d2.n1.d1.n2.2.3.3.1 + + + + + ti.d2.n1.d1.n2.2.3.3.2 + + + + + ti.d2.n1.d1.n2.2.3.3.3 + + + + + ti.d2.n1.d1.n2.3.1.1.1 + + + + + ti.d2.n1.d1.n2.3.1.1.2 + + + + + ti.d2.n1.d1.n2.3.1.1.3 + + + + + ti.d2.n1.d1.n2.3.1.2.1 + + + + + ti.d2.n1.d1.n2.3.1.2.2 + + + + + ti.d2.n1.d1.n2.3.1.2.3 + + + + + ti.d2.n1.d1.n2.3.1.3.1 + + + + + ti.d2.n1.d1.n2.3.1.3.2 + + + + + ti.d2.n1.d1.n2.3.1.3.3 + + + + + ti.d2.n1.d1.n2.3.2.1.1 + + + + + ti.d2.n1.d1.n2.3.2.1.2 + + + + + ti.d2.n1.d1.n2.3.2.1.3 + + + + + ti.d2.n1.d1.n2.3.2.2.1 + + + + + ti.d2.n1.d1.n2.3.2.2.2 + + + + + ti.d2.n1.d1.n2.3.2.2.3 + + + + + ti.d2.n1.d1.n2.3.2.3.1 + + + + + ti.d2.n1.d1.n2.3.2.3.2 + + + + + ti.d2.n1.d1.n2.3.2.3.3 + + + + + ti.d2.n1.d1.n2.3.3.1.1 + + + + + ti.d2.n1.d1.n2.3.3.1.2 + + + + + ti.d2.n1.d1.n2.3.3.1.3 + + + + + ti.d2.n1.d1.n2.3.3.2.1 + + + + + ti.d2.n1.d1.n2.3.3.2.2 + + + + + ti.d2.n1.d1.n2.3.3.2.3 + + + + + ti.d2.n1.d1.n2.3.3.3.1 + + + + + ti.d2.n1.d1.n2.3.3.3.2 + + + + + ti.d2.n1.d1.n2.3.3.3.3 + + + + + ti.d2.n1.d2.n2.1.1.1.1 + + + + + ti.d2.n1.d2.n2.1.1.1.2 + + + + + ti.d2.n1.d2.n2.1.1.1.3 + + + + + ti.d2.n1.d2.n2.1.1.2.1 + + + + + ti.d2.n1.d2.n2.1.1.2.2 + + + + + ti.d2.n1.d2.n2.1.1.2.3 + + + + + ti.d2.n1.d2.n2.1.1.3.1 + + + + + ti.d2.n1.d2.n2.1.1.3.2 + + + + + ti.d2.n1.d2.n2.1.1.3.3 + + + + + ti.d2.n1.d2.n2.1.2.1.1 + + + + + ti.d2.n1.d2.n2.1.2.1.2 + + + + + ti.d2.n1.d2.n2.1.2.1.3 + + + + + ti.d2.n1.d2.n2.1.2.2.1 + + + + + ti.d2.n1.d2.n2.1.2.2.2 + + + + + ti.d2.n1.d2.n2.1.2.2.3 + + + + + ti.d2.n1.d2.n2.1.2.3.1 + + + + + ti.d2.n1.d2.n2.1.2.3.2 + + + + + ti.d2.n1.d2.n2.1.2.3.3 + + + + + ti.d2.n1.d2.n2.1.3.1.1 + + + + + ti.d2.n1.d2.n2.1.3.1.2 + + + + + ti.d2.n1.d2.n2.1.3.1.3 + + + + + ti.d2.n1.d2.n2.1.3.2.1 + + + + + ti.d2.n1.d2.n2.1.3.2.2 + + + + + ti.d2.n1.d2.n2.1.3.2.3 + + + + + ti.d2.n1.d2.n2.1.3.3.1 + + + + + ti.d2.n1.d2.n2.1.3.3.2 + + + + + ti.d2.n1.d2.n2.1.3.3.3 + + + + + ti.d2.n1.d2.n2.2.1.1.1 + + + + + ti.d2.n1.d2.n2.2.1.1.2 + + + + + ti.d2.n1.d2.n2.2.1.1.3 + + + + + ti.d2.n1.d2.n2.2.1.2.1 + + + + + ti.d2.n1.d2.n2.2.1.2.2 + + + + + ti.d2.n1.d2.n2.2.1.2.3 + + + + + ti.d2.n1.d2.n2.2.1.3.1 + + + + + ti.d2.n1.d2.n2.2.1.3.2 + + + + + ti.d2.n1.d2.n2.2.1.3.3 + + + + + ti.d2.n1.d2.n2.2.2.1.1 + + + + + ti.d2.n1.d2.n2.2.2.1.2 + + + + + ti.d2.n1.d2.n2.2.2.1.3 + + + + + ti.d2.n1.d2.n2.2.2.2.1 + + + + + ti.d2.n1.d2.n2.2.2.2.2 + + + + + ti.d2.n1.d2.n2.2.2.2.3 + + + + + ti.d2.n1.d2.n2.2.2.3.1 + + + + + ti.d2.n1.d2.n2.2.2.3.2 + + + + + ti.d2.n1.d2.n2.2.2.3.3 + + + + + ti.d2.n1.d2.n2.2.3.1.1 + + + + + ti.d2.n1.d2.n2.2.3.1.2 + + + + + ti.d2.n1.d2.n2.2.3.1.3 + + + + + ti.d2.n1.d2.n2.2.3.2.1 + + + + + ti.d2.n1.d2.n2.2.3.2.2 + + + + + ti.d2.n1.d2.n2.2.3.2.3 + + + + + ti.d2.n1.d2.n2.2.3.3.1 + + + + + ti.d2.n1.d2.n2.2.3.3.2 + + + + + ti.d2.n1.d2.n2.2.3.3.3 + + + + + ti.d2.n1.d2.n2.3.1.1.1 + + + + + ti.d2.n1.d2.n2.3.1.1.2 + + + + + ti.d2.n1.d2.n2.3.1.1.3 + + + + + ti.d2.n1.d2.n2.3.1.2.1 + + + + + ti.d2.n1.d2.n2.3.1.2.2 + + + + + ti.d2.n1.d2.n2.3.1.2.3 + + + + + ti.d2.n1.d2.n2.3.1.3.1 + + + + + ti.d2.n1.d2.n2.3.1.3.2 + + + + + ti.d2.n1.d2.n2.3.1.3.3 + + + + + ti.d2.n1.d2.n2.3.2.1.1 + + + + + ti.d2.n1.d2.n2.3.2.1.2 + + + + + ti.d2.n1.d2.n2.3.2.1.3 + + + + + ti.d2.n1.d2.n2.3.2.2.1 + + + + + ti.d2.n1.d2.n2.3.2.2.2 + + + + + ti.d2.n1.d2.n2.3.2.2.3 + + + + + ti.d2.n1.d2.n2.3.2.3.1 + + + + + ti.d2.n1.d2.n2.3.2.3.2 + + + + + ti.d2.n1.d2.n2.3.2.3.3 + + + + + ti.d2.n1.d2.n2.3.3.1.1 + + + + + ti.d2.n1.d2.n2.3.3.1.2 + + + + + ti.d2.n1.d2.n2.3.3.1.3 + + + + + ti.d2.n1.d2.n2.3.3.2.1 + + + + + ti.d2.n1.d2.n2.3.3.2.2 + + + + + ti.d2.n1.d2.n2.3.3.2.3 + + + + + ti.d2.n1.d2.n2.3.3.3.1 + + + + + ti.d2.n1.d2.n2.3.3.3.2 + + + + + ti.d2.n1.d2.n2.3.3.3.3 + + + + + ti.d2.n1.d3.n1.1.1.1.1 + + + + + ti.d2.n1.d3.n1.1.1.1.2 + + + + + ti.d2.n1.d3.n1.1.1.1.3 + + + + + ti.d2.n1.d3.n1.1.1.2.1 + + + + + ti.d2.n1.d3.n1.1.1.2.2 + + + + + ti.d2.n1.d3.n1.1.1.2.3 + + + + + ti.d2.n1.d3.n1.1.1.3.1 + + + + + ti.d2.n1.d3.n1.1.1.3.2 + + + + + ti.d2.n1.d3.n1.1.1.3.3 + + + + + ti.d2.n1.d3.n1.1.2.1.1 + + + + + ti.d2.n1.d3.n1.1.2.1.2 + + + + + ti.d2.n1.d3.n1.1.2.1.3 + + + + + ti.d2.n1.d3.n1.1.2.2.1 + + + + + ti.d2.n1.d3.n1.1.2.2.2 + + + + + ti.d2.n1.d3.n1.1.2.2.3 + + + + + ti.d2.n1.d3.n1.1.2.3.1 + + + + + ti.d2.n1.d3.n1.1.2.3.2 + + + + + ti.d2.n1.d3.n1.1.2.3.3 + + + + + ti.d2.n1.d3.n1.1.3.1.1 + + + + + ti.d2.n1.d3.n1.1.3.1.2 + + + + + ti.d2.n1.d3.n1.1.3.1.3 + + + + + ti.d2.n1.d3.n1.1.3.2.1 + + + + + ti.d2.n1.d3.n1.1.3.2.2 + + + + + ti.d2.n1.d3.n1.1.3.2.3 + + + + + ti.d2.n1.d3.n1.1.3.3.1 + + + + + ti.d2.n1.d3.n1.1.3.3.2 + + + + + ti.d2.n1.d3.n1.1.3.3.3 + + + + + ti.d2.n1.d3.n1.2.1.1.1 + + + + + ti.d2.n1.d3.n1.2.1.1.2 + + + + + ti.d2.n1.d3.n1.2.1.1.3 + + + + + ti.d2.n1.d3.n1.2.1.2.1 + + + + + ti.d2.n1.d3.n1.2.1.2.2 + + + + + ti.d2.n1.d3.n1.2.1.2.3 + + + + + ti.d2.n1.d3.n1.2.1.3.1 + + + + + ti.d2.n1.d3.n1.2.1.3.2 + + + + + ti.d2.n1.d3.n1.2.1.3.3 + + + + + ti.d2.n1.d3.n1.2.2.1.1 + + + + + ti.d2.n1.d3.n1.2.2.1.2 + + + + + ti.d2.n1.d3.n1.2.2.1.3 + + + + + ti.d2.n1.d3.n1.2.2.2.1 + + + + + ti.d2.n1.d3.n1.2.2.2.2 + + + + + ti.d2.n1.d3.n1.2.2.2.3 + + + + + ti.d2.n1.d3.n1.2.2.3.1 + + + + + ti.d2.n1.d3.n1.2.2.3.2 + + + + + ti.d2.n1.d3.n1.2.2.3.3 + + + + + ti.d2.n1.d3.n1.2.3.1.1 + + + + + ti.d2.n1.d3.n1.2.3.1.2 + + + + + ti.d2.n1.d3.n1.2.3.1.3 + + + + + ti.d2.n1.d3.n1.2.3.2.1 + + + + + ti.d2.n1.d3.n1.2.3.2.2 + + + + + ti.d2.n1.d3.n1.2.3.2.3 + + + + + ti.d2.n1.d3.n1.2.3.3.1 + + + + + ti.d2.n1.d3.n1.2.3.3.2 + + + + + ti.d2.n1.d3.n1.2.3.3.3 + + + + + ti.d2.n1.d3.n1.3.1.1.1 + + + + + ti.d2.n1.d3.n1.3.1.1.2 + + + + + ti.d2.n1.d3.n1.3.1.1.3 + + + + + ti.d2.n1.d3.n1.3.1.2.1 + + + + + ti.d2.n1.d3.n1.3.1.2.2 + + + + + ti.d2.n1.d3.n1.3.1.2.3 + + + + + ti.d2.n1.d3.n1.3.1.3.1 + + + + + ti.d2.n1.d3.n1.3.1.3.2 + + + + + ti.d2.n1.d3.n1.3.1.3.3 + + + + + ti.d2.n1.d3.n1.3.2.1.1 + + + + + ti.d2.n1.d3.n1.3.2.1.2 + + + + + ti.d2.n1.d3.n1.3.2.1.3 + + + + + ti.d2.n1.d3.n1.3.2.2.1 + + + + + ti.d2.n1.d3.n1.3.2.2.2 + + + + + ti.d2.n1.d3.n1.3.2.2.3 + + + + + ti.d2.n1.d3.n1.3.2.3.1 + + + + + ti.d2.n1.d3.n1.3.2.3.2 + + + + + ti.d2.n1.d3.n1.3.2.3.3 + + + + + ti.d2.n1.d3.n1.3.3.1.1 + + + + + ti.d2.n1.d3.n1.3.3.1.2 + + + + + ti.d2.n1.d3.n1.3.3.1.3 + + + + + ti.d2.n1.d3.n1.3.3.2.1 + + + + + ti.d2.n1.d3.n1.3.3.2.2 + + + + + ti.d2.n1.d3.n1.3.3.2.3 + + + + + ti.d2.n1.d3.n1.3.3.3.1 + + + + + ti.d2.n1.d3.n1.3.3.3.2 + + + + + ti.d2.n1.d3.n1.3.3.3.3 + + + + + ti.d2.n1.d3.n2.1.1.1.1 + + + + + ti.d2.n1.d3.n2.1.1.1.2 + + + + + ti.d2.n1.d3.n2.1.1.1.3 + + + + + ti.d2.n1.d3.n2.1.1.2.1 + + + + + ti.d2.n1.d3.n2.1.1.2.2 + + + + + ti.d2.n1.d3.n2.1.1.2.3 + + + + + ti.d2.n1.d3.n2.1.1.3.1 + + + + + ti.d2.n1.d3.n2.1.1.3.2 + + + + + ti.d2.n1.d3.n2.1.1.3.3 + + + + + ti.d2.n1.d3.n2.1.2.1.1 + + + + + ti.d2.n1.d3.n2.1.2.1.2 + + + + + ti.d2.n1.d3.n2.1.2.1.3 + + + + + ti.d2.n1.d3.n2.1.2.2.1 + + + + + ti.d2.n1.d3.n2.1.2.2.2 + + + + + ti.d2.n1.d3.n2.1.2.2.3 + + + + + ti.d2.n1.d3.n2.1.2.3.1 + + + + + ti.d2.n1.d3.n2.1.2.3.2 + + + + + ti.d2.n1.d3.n2.1.2.3.3 + + + + + ti.d2.n1.d3.n2.1.3.1.1 + + + + + ti.d2.n1.d3.n2.1.3.1.2 + + + + + ti.d2.n1.d3.n2.1.3.1.3 + + + + + ti.d2.n1.d3.n2.1.3.2.1 + + + + + ti.d2.n1.d3.n2.1.3.2.2 + + + + + ti.d2.n1.d3.n2.1.3.2.3 + + + + + ti.d2.n1.d3.n2.1.3.3.1 + + + + + ti.d2.n1.d3.n2.1.3.3.2 + + + + + ti.d2.n1.d3.n2.1.3.3.3 + + + + + ti.d2.n1.d3.n2.2.1.1.1 + + + + + ti.d2.n1.d3.n2.2.1.1.2 + + + + + ti.d2.n1.d3.n2.2.1.1.3 + + + + + ti.d2.n1.d3.n2.2.1.2.1 + + + + + ti.d2.n1.d3.n2.2.1.2.2 + + + + + ti.d2.n1.d3.n2.2.1.2.3 + + + + + ti.d2.n1.d3.n2.2.1.3.1 + + + + + ti.d2.n1.d3.n2.2.1.3.2 + + + + + ti.d2.n1.d3.n2.2.1.3.3 + + + + + ti.d2.n1.d3.n2.2.2.1.1 + + + + + ti.d2.n1.d3.n2.2.2.1.2 + + + + + ti.d2.n1.d3.n2.2.2.1.3 + + + + + ti.d2.n1.d3.n2.2.2.2.1 + + + + + ti.d2.n1.d3.n2.2.2.2.2 + + + + + ti.d2.n1.d3.n2.2.2.2.3 + + + + + ti.d2.n1.d3.n2.2.2.3.1 + + + + + ti.d2.n1.d3.n2.2.2.3.2 + + + + + ti.d2.n1.d3.n2.2.2.3.3 + + + + + ti.d2.n1.d3.n2.2.3.1.1 + + + + + ti.d2.n1.d3.n2.2.3.1.2 + + + + + ti.d2.n1.d3.n2.2.3.1.3 + + + + + ti.d2.n1.d3.n2.2.3.2.1 + + + + + ti.d2.n1.d3.n2.2.3.2.2 + + + + + ti.d2.n1.d3.n2.2.3.2.3 + + + + + ti.d2.n1.d3.n2.2.3.3.1 + + + + + ti.d2.n1.d3.n2.2.3.3.2 + + + + + ti.d2.n1.d3.n2.2.3.3.3 + + + + + ti.d2.n1.d3.n2.3.1.1.1 + + + + + ti.d2.n1.d3.n2.3.1.1.2 + + + + + ti.d2.n1.d3.n2.3.1.1.3 + + + + + ti.d2.n1.d3.n2.3.1.2.1 + + + + + ti.d2.n1.d3.n2.3.1.2.2 + + + + + ti.d2.n1.d3.n2.3.1.2.3 + + + + + ti.d2.n1.d3.n2.3.1.3.1 + + + + + ti.d2.n1.d3.n2.3.1.3.2 + + + + + ti.d2.n1.d3.n2.3.1.3.3 + + + + + ti.d2.n1.d3.n2.3.2.1.1 + + + + + ti.d2.n1.d3.n2.3.2.1.2 + + + + + ti.d2.n1.d3.n2.3.2.1.3 + + + + + ti.d2.n1.d3.n2.3.2.2.1 + + + + + ti.d2.n1.d3.n2.3.2.2.2 + + + + + ti.d2.n1.d3.n2.3.2.2.3 + + + + + ti.d2.n1.d3.n2.3.2.3.1 + + + + + ti.d2.n1.d3.n2.3.2.3.2 + + + + + ti.d2.n1.d3.n2.3.2.3.3 + + + + + ti.d2.n1.d3.n2.3.3.1.1 + + + + + ti.d2.n1.d3.n2.3.3.1.2 + + + + + ti.d2.n1.d3.n2.3.3.1.3 + + + + + ti.d2.n1.d3.n2.3.3.2.1 + + + + + ti.d2.n1.d3.n2.3.3.2.2 + + + + + ti.d2.n1.d3.n2.3.3.2.3 + + + + + ti.d2.n1.d3.n2.3.3.3.1 + + + + + ti.d2.n1.d3.n2.3.3.3.2 + + + + + ti.d2.n1.d3.n2.3.3.3.3 + + + + + ti.d2.n1.d4.n1.1.1.1.1 + + + + + ti.d2.n1.d4.n1.1.1.1.2 + + + + + ti.d2.n1.d4.n1.1.1.1.3 + + + + + ti.d2.n1.d4.n1.1.1.2.1 + + + + + ti.d2.n1.d4.n1.1.1.2.2 + + + + + ti.d2.n1.d4.n1.1.1.2.3 + + + + + ti.d2.n1.d4.n1.1.1.3.1 + + + + + ti.d2.n1.d4.n1.1.1.3.2 + + + + + ti.d2.n1.d4.n1.1.1.3.3 + + + + + ti.d2.n1.d4.n1.1.2.1.1 + + + + + ti.d2.n1.d4.n1.1.2.1.2 + + + + + ti.d2.n1.d4.n1.1.2.1.3 + + + + + ti.d2.n1.d4.n1.1.2.2.1 + + + + + ti.d2.n1.d4.n1.1.2.2.2 + + + + + ti.d2.n1.d4.n1.1.2.2.3 + + + + + ti.d2.n1.d4.n1.1.2.3.1 + + + + + ti.d2.n1.d4.n1.1.2.3.2 + + + + + ti.d2.n1.d4.n1.1.2.3.3 + + + + + ti.d2.n1.d4.n1.1.3.1.1 + + + + + ti.d2.n1.d4.n1.1.3.1.2 + + + + + ti.d2.n1.d4.n1.1.3.1.3 + + + + + ti.d2.n1.d4.n1.1.3.2.1 + + + + + ti.d2.n1.d4.n1.1.3.2.2 + + + + + ti.d2.n1.d4.n1.1.3.2.3 + + + + + ti.d2.n1.d4.n1.1.3.3.1 + + + + + ti.d2.n1.d4.n1.1.3.3.2 + + + + + ti.d2.n1.d4.n1.1.3.3.3 + + + + + ti.d2.n1.d4.n1.2.1.1.1 + + + + + ti.d2.n1.d4.n1.2.1.1.2 + + + + + ti.d2.n1.d4.n1.2.1.1.3 + + + + + ti.d2.n1.d4.n1.2.1.2.1 + + + + + ti.d2.n1.d4.n1.2.1.2.2 + + + + + ti.d2.n1.d4.n1.2.1.2.3 + + + + + ti.d2.n1.d4.n1.2.1.3.1 + + + + + ti.d2.n1.d4.n1.2.1.3.2 + + + + + ti.d2.n1.d4.n1.2.1.3.3 + + + + + ti.d2.n1.d4.n1.2.2.1.1 + + + + + ti.d2.n1.d4.n1.2.2.1.2 + + + + + ti.d2.n1.d4.n1.2.2.1.3 + + + + + ti.d2.n1.d4.n1.2.2.2.1 + + + + + ti.d2.n1.d4.n1.2.2.2.2 + + + + + ti.d2.n1.d4.n1.2.2.2.3 + + + + + ti.d2.n1.d4.n1.2.2.3.1 + + + + + ti.d2.n1.d4.n1.2.2.3.2 + + + + + ti.d2.n1.d4.n1.2.2.3.3 + + + + + ti.d2.n1.d4.n1.2.3.1.1 + + + + + ti.d2.n1.d4.n1.2.3.1.2 + + + + + ti.d2.n1.d4.n1.2.3.1.3 + + + + + ti.d2.n1.d4.n1.2.3.2.1 + + + + + ti.d2.n1.d4.n1.2.3.2.2 + + + + + ti.d2.n1.d4.n1.2.3.2.3 + + + + + ti.d2.n1.d4.n1.2.3.3.1 + + + + + ti.d2.n1.d4.n1.2.3.3.2 + + + + + ti.d2.n1.d4.n1.2.3.3.3 + + + + + ti.d2.n1.d4.n1.3.1.1.1 + + + + + ti.d2.n1.d4.n1.3.1.1.2 + + + + + ti.d2.n1.d4.n1.3.1.1.3 + + + + + ti.d2.n1.d4.n1.3.1.2.1 + + + + + ti.d2.n1.d4.n1.3.1.2.2 + + + + + ti.d2.n1.d4.n1.3.1.2.3 + + + + + ti.d2.n1.d4.n1.3.1.3.1 + + + + + ti.d2.n1.d4.n1.3.1.3.2 + + + + + ti.d2.n1.d4.n1.3.1.3.3 + + + + + ti.d2.n1.d4.n1.3.2.1.1 + + + + + ti.d2.n1.d4.n1.3.2.1.2 + + + + + ti.d2.n1.d4.n1.3.2.1.3 + + + + + ti.d2.n1.d4.n1.3.2.2.1 + + + + + ti.d2.n1.d4.n1.3.2.2.2 + + + + + ti.d2.n1.d4.n1.3.2.2.3 + + + + + ti.d2.n1.d4.n1.3.2.3.1 + + + + + ti.d2.n1.d4.n1.3.2.3.2 + + + + + ti.d2.n1.d4.n1.3.2.3.3 + + + + + ti.d2.n1.d4.n1.3.3.1.1 + + + + + ti.d2.n1.d4.n1.3.3.1.2 + + + + + ti.d2.n1.d4.n1.3.3.1.3 + + + + + ti.d2.n1.d4.n1.3.3.2.1 + + + + + ti.d2.n1.d4.n1.3.3.2.2 + + + + + ti.d2.n1.d4.n1.3.3.2.3 + + + + + ti.d2.n1.d4.n1.3.3.3.1 + + + + + ti.d2.n1.d4.n1.3.3.3.2 + + + + + ti.d2.n1.d4.n1.3.3.3.3 + + + + + ti.d2.n1.d4.n2.1.1.1.1 + + + + + ti.d2.n1.d4.n2.1.1.1.2 + + + + + ti.d2.n1.d4.n2.1.1.1.3 + + + + + ti.d2.n1.d4.n2.1.1.2.1 + + + + + ti.d2.n1.d4.n2.1.1.2.2 + + + + + ti.d2.n1.d4.n2.1.1.2.3 + + + + + ti.d2.n1.d4.n2.1.1.3.1 + + + + + ti.d2.n1.d4.n2.1.1.3.2 + + + + + ti.d2.n1.d4.n2.1.1.3.3 + + + + + ti.d2.n1.d4.n2.1.2.1.1 + + + + + ti.d2.n1.d4.n2.1.2.1.2 + + + + + ti.d2.n1.d4.n2.1.2.1.3 + + + + + ti.d2.n1.d4.n2.1.2.2.1 + + + + + ti.d2.n1.d4.n2.1.2.2.2 + + + + + ti.d2.n1.d4.n2.1.2.2.3 + + + + + ti.d2.n1.d4.n2.1.2.3.1 + + + + + ti.d2.n1.d4.n2.1.2.3.2 + + + + + ti.d2.n1.d4.n2.1.2.3.3 + + + + + ti.d2.n1.d4.n2.1.3.1.1 + + + + + ti.d2.n1.d4.n2.1.3.1.2 + + + + + ti.d2.n1.d4.n2.1.3.1.3 + + + + + ti.d2.n1.d4.n2.1.3.2.1 + + + + + ti.d2.n1.d4.n2.1.3.2.2 + + + + + ti.d2.n1.d4.n2.1.3.2.3 + + + + + ti.d2.n1.d4.n2.1.3.3.1 + + + + + ti.d2.n1.d4.n2.1.3.3.2 + + + + + ti.d2.n1.d4.n2.1.3.3.3 + + + + + ti.d2.n1.d4.n2.2.1.1.1 + + + + + ti.d2.n1.d4.n2.2.1.1.2 + + + + + ti.d2.n1.d4.n2.2.1.1.3 + + + + + ti.d2.n1.d4.n2.2.1.2.1 + + + + + ti.d2.n1.d4.n2.2.1.2.2 + + + + + ti.d2.n1.d4.n2.2.1.2.3 + + + + + ti.d2.n1.d4.n2.2.1.3.1 + + + + + ti.d2.n1.d4.n2.2.1.3.2 + + + + + ti.d2.n1.d4.n2.2.1.3.3 + + + + + ti.d2.n1.d4.n2.2.2.1.1 + + + + + ti.d2.n1.d4.n2.2.2.1.2 + + + + + ti.d2.n1.d4.n2.2.2.1.3 + + + + + ti.d2.n1.d4.n2.2.2.2.1 + + + + + ti.d2.n1.d4.n2.2.2.2.2 + + + + + ti.d2.n1.d4.n2.2.2.2.3 + + + + + ti.d2.n1.d4.n2.2.2.3.1 + + + + + ti.d2.n1.d4.n2.2.2.3.2 + + + + + ti.d2.n1.d4.n2.2.2.3.3 + + + + + ti.d2.n1.d4.n2.2.3.1.1 + + + + + ti.d2.n1.d4.n2.2.3.1.2 + + + + + ti.d2.n1.d4.n2.2.3.1.3 + + + + + ti.d2.n1.d4.n2.2.3.2.1 + + + + + ti.d2.n1.d4.n2.2.3.2.2 + + + + + ti.d2.n1.d4.n2.2.3.2.3 + + + + + ti.d2.n1.d4.n2.2.3.3.1 + + + + + ti.d2.n1.d4.n2.2.3.3.2 + + + + + ti.d2.n1.d4.n2.2.3.3.3 + + + + + ti.d2.n1.d4.n2.3.1.1.1 + + + + + ti.d2.n1.d4.n2.3.1.1.2 + + + + + ti.d2.n1.d4.n2.3.1.1.3 + + + + + ti.d2.n1.d4.n2.3.1.2.1 + + + + + ti.d2.n1.d4.n2.3.1.2.2 + + + + + ti.d2.n1.d4.n2.3.1.2.3 + + + + + ti.d2.n1.d4.n2.3.1.3.1 + + + + + ti.d2.n1.d4.n2.3.1.3.2 + + + + + ti.d2.n1.d4.n2.3.1.3.3 + + + + + ti.d2.n1.d4.n2.3.2.1.1 + + + + + ti.d2.n1.d4.n2.3.2.1.2 + + + + + ti.d2.n1.d4.n2.3.2.1.3 + + + + + ti.d2.n1.d4.n2.3.2.2.1 + + + + + ti.d2.n1.d4.n2.3.2.2.2 + + + + + ti.d2.n1.d4.n2.3.2.2.3 + + + + + ti.d2.n1.d4.n2.3.2.3.1 + + + + + ti.d2.n1.d4.n2.3.2.3.2 + + + + + ti.d2.n1.d4.n2.3.2.3.3 + + + + + ti.d2.n1.d4.n2.3.3.1.1 + + + + + ti.d2.n1.d4.n2.3.3.1.2 + + + + + ti.d2.n1.d4.n2.3.3.1.3 + + + + + ti.d2.n1.d4.n2.3.3.2.1 + + + + + ti.d2.n1.d4.n2.3.3.2.2 + + + + + ti.d2.n1.d4.n2.3.3.2.3 + + + + + ti.d2.n1.d4.n2.3.3.3.1 + + + + + ti.d2.n1.d4.n2.3.3.3.2 + + + + + ti.d2.n1.d4.n2.3.3.3.3 + + + + + ti.d2.n2.d1.n1.1.1.1.1 + + + + + ti.d2.n2.d1.n1.1.1.1.2 + + + + + ti.d2.n2.d1.n1.1.1.1.3 + + + + + ti.d2.n2.d1.n1.1.1.2.1 + + + + + ti.d2.n2.d1.n1.1.1.2.2 + + + + + ti.d2.n2.d1.n1.1.1.2.3 + + + + + ti.d2.n2.d1.n1.1.1.3.1 + + + + + ti.d2.n2.d1.n1.1.1.3.2 + + + + + ti.d2.n2.d1.n1.1.1.3.3 + + + + + ti.d2.n2.d1.n1.1.2.1.1 + + + + + ti.d2.n2.d1.n1.1.2.1.2 + + + + + ti.d2.n2.d1.n1.1.2.1.3 + + + + + ti.d2.n2.d1.n1.1.2.2.1 + + + + + ti.d2.n2.d1.n1.1.2.2.2 + + + + + ti.d2.n2.d1.n1.1.2.2.3 + + + + + ti.d2.n2.d1.n1.1.2.3.1 + + + + + ti.d2.n2.d1.n1.1.2.3.2 + + + + + ti.d2.n2.d1.n1.1.2.3.3 + + + + + ti.d2.n2.d1.n1.1.3.1.1 + + + + + ti.d2.n2.d1.n1.1.3.1.2 + + + + + ti.d2.n2.d1.n1.1.3.1.3 + + + + + ti.d2.n2.d1.n1.1.3.2.1 + + + + + ti.d2.n2.d1.n1.1.3.2.2 + + + + + ti.d2.n2.d1.n1.1.3.2.3 + + + + + ti.d2.n2.d1.n1.1.3.3.1 + + + + + ti.d2.n2.d1.n1.1.3.3.2 + + + + + ti.d2.n2.d1.n1.1.3.3.3 + + + + + ti.d2.n2.d1.n1.2.1.1.1 + + + + + ti.d2.n2.d1.n1.2.1.1.2 + + + + + ti.d2.n2.d1.n1.2.1.1.3 + + + + + ti.d2.n2.d1.n1.2.1.2.1 + + + + + ti.d2.n2.d1.n1.2.1.2.2 + + + + + ti.d2.n2.d1.n1.2.1.2.3 + + + + + ti.d2.n2.d1.n1.2.1.3.1 + + + + + ti.d2.n2.d1.n1.2.1.3.2 + + + + + ti.d2.n2.d1.n1.2.1.3.3 + + + + + ti.d2.n2.d1.n1.2.2.1.1 + + + + + ti.d2.n2.d1.n1.2.2.1.2 + + + + + ti.d2.n2.d1.n1.2.2.1.3 + + + + + ti.d2.n2.d1.n1.2.2.2.1 + + + + + ti.d2.n2.d1.n1.2.2.2.2 + + + + + ti.d2.n2.d1.n1.2.2.2.3 + + + + + ti.d2.n2.d1.n1.2.2.3.1 + + + + + ti.d2.n2.d1.n1.2.2.3.2 + + + + + ti.d2.n2.d1.n1.2.2.3.3 + + + + + ti.d2.n2.d1.n1.2.3.1.1 + + + + + ti.d2.n2.d1.n1.2.3.1.2 + + + + + ti.d2.n2.d1.n1.2.3.1.3 + + + + + ti.d2.n2.d1.n1.2.3.2.1 + + + + + ti.d2.n2.d1.n1.2.3.2.2 + + + + + ti.d2.n2.d1.n1.2.3.2.3 + + + + + ti.d2.n2.d1.n1.2.3.3.1 + + + + + ti.d2.n2.d1.n1.2.3.3.2 + + + + + ti.d2.n2.d1.n1.2.3.3.3 + + + + + ti.d2.n2.d1.n1.3.1.1.1 + + + + + ti.d2.n2.d1.n1.3.1.1.2 + + + + + ti.d2.n2.d1.n1.3.1.1.3 + + + + + ti.d2.n2.d1.n1.3.1.2.1 + + + + + ti.d2.n2.d1.n1.3.1.2.2 + + + + + ti.d2.n2.d1.n1.3.1.2.3 + + + + + ti.d2.n2.d1.n1.3.1.3.1 + + + + + ti.d2.n2.d1.n1.3.1.3.2 + + + + + ti.d2.n2.d1.n1.3.1.3.3 + + + + + ti.d2.n2.d1.n1.3.2.1.1 + + + + + ti.d2.n2.d1.n1.3.2.1.2 + + + + + ti.d2.n2.d1.n1.3.2.1.3 + + + + + ti.d2.n2.d1.n1.3.2.2.1 + + + + + ti.d2.n2.d1.n1.3.2.2.2 + + + + + ti.d2.n2.d1.n1.3.2.2.3 + + + + + ti.d2.n2.d1.n1.3.2.3.1 + + + + + ti.d2.n2.d1.n1.3.2.3.2 + + + + + ti.d2.n2.d1.n1.3.2.3.3 + + + + + ti.d2.n2.d1.n1.3.3.1.1 + + + + + ti.d2.n2.d1.n1.3.3.1.2 + + + + + ti.d2.n2.d1.n1.3.3.1.3 + + + + + ti.d2.n2.d1.n1.3.3.2.1 + + + + + ti.d2.n2.d1.n1.3.3.2.2 + + + + + ti.d2.n2.d1.n1.3.3.2.3 + + + + + ti.d2.n2.d1.n1.3.3.3.1 + + + + + ti.d2.n2.d1.n1.3.3.3.2 + + + + + ti.d2.n2.d1.n1.3.3.3.3 + + + + + ti.d2.n2.d1.n2.1.1.1.1 + + + + + ti.d2.n2.d1.n2.1.1.1.2 + + + + + ti.d2.n2.d1.n2.1.1.1.3 + + + + + ti.d2.n2.d1.n2.1.1.2.1 + + + + + ti.d2.n2.d1.n2.1.1.2.2 + + + + + ti.d2.n2.d1.n2.1.1.2.3 + + + + + ti.d2.n2.d1.n2.1.1.3.1 + + + + + ti.d2.n2.d1.n2.1.1.3.2 + + + + + ti.d2.n2.d1.n2.1.1.3.3 + + + + + ti.d2.n2.d1.n2.1.2.1.1 + + + + + ti.d2.n2.d1.n2.1.2.1.2 + + + + + ti.d2.n2.d1.n2.1.2.1.3 + + + + + ti.d2.n2.d1.n2.1.2.2.1 + + + + + ti.d2.n2.d1.n2.1.2.2.2 + + + + + ti.d2.n2.d1.n2.1.2.2.3 + + + + + ti.d2.n2.d1.n2.1.2.3.1 + + + + + ti.d2.n2.d1.n2.1.2.3.2 + + + + + ti.d2.n2.d1.n2.1.2.3.3 + + + + + ti.d2.n2.d1.n2.1.3.1.1 + + + + + ti.d2.n2.d1.n2.1.3.1.2 + + + + + ti.d2.n2.d1.n2.1.3.1.3 + + + + + ti.d2.n2.d1.n2.1.3.2.1 + + + + + ti.d2.n2.d1.n2.1.3.2.2 + + + + + ti.d2.n2.d1.n2.1.3.2.3 + + + + + ti.d2.n2.d1.n2.1.3.3.1 + + + + + ti.d2.n2.d1.n2.1.3.3.2 + + + + + ti.d2.n2.d1.n2.1.3.3.3 + + + + + ti.d2.n2.d1.n2.2.1.1.1 + + + + + ti.d2.n2.d1.n2.2.1.1.2 + + + + + ti.d2.n2.d1.n2.2.1.1.3 + + + + + ti.d2.n2.d1.n2.2.1.2.1 + + + + + ti.d2.n2.d1.n2.2.1.2.2 + + + + + ti.d2.n2.d1.n2.2.1.2.3 + + + + + ti.d2.n2.d1.n2.2.1.3.1 + + + + + ti.d2.n2.d1.n2.2.1.3.2 + + + + + ti.d2.n2.d1.n2.2.1.3.3 + + + + + ti.d2.n2.d1.n2.2.2.1.1 + + + + + ti.d2.n2.d1.n2.2.2.1.2 + + + + + ti.d2.n2.d1.n2.2.2.1.3 + + + + + ti.d2.n2.d1.n2.2.2.2.1 + + + + + ti.d2.n2.d1.n2.2.2.2.2 + + + + + ti.d2.n2.d1.n2.2.2.2.3 + + + + + ti.d2.n2.d1.n2.2.2.3.1 + + + + + ti.d2.n2.d1.n2.2.2.3.2 + + + + + ti.d2.n2.d1.n2.2.2.3.3 + + + + + ti.d2.n2.d1.n2.2.3.1.1 + + + + + ti.d2.n2.d1.n2.2.3.1.2 + + + + + ti.d2.n2.d1.n2.2.3.1.3 + + + + + ti.d2.n2.d1.n2.2.3.2.1 + + + + + ti.d2.n2.d1.n2.2.3.2.2 + + + + + ti.d2.n2.d1.n2.2.3.2.3 + + + + + ti.d2.n2.d1.n2.2.3.3.1 + + + + + ti.d2.n2.d1.n2.2.3.3.2 + + + + + ti.d2.n2.d1.n2.2.3.3.3 + + + + + ti.d2.n2.d1.n2.3.1.1.1 + + + + + ti.d2.n2.d1.n2.3.1.1.2 + + + + + ti.d2.n2.d1.n2.3.1.1.3 + + + + + ti.d2.n2.d1.n2.3.1.2.1 + + + + + ti.d2.n2.d1.n2.3.1.2.2 + + + + + ti.d2.n2.d1.n2.3.1.2.3 + + + + + ti.d2.n2.d1.n2.3.1.3.1 + + + + + ti.d2.n2.d1.n2.3.1.3.2 + + + + + ti.d2.n2.d1.n2.3.1.3.3 + + + + + ti.d2.n2.d1.n2.3.2.1.1 + + + + + ti.d2.n2.d1.n2.3.2.1.2 + + + + + ti.d2.n2.d1.n2.3.2.1.3 + + + + + ti.d2.n2.d1.n2.3.2.2.1 + + + + + ti.d2.n2.d1.n2.3.2.2.2 + + + + + ti.d2.n2.d1.n2.3.2.2.3 + + + + + ti.d2.n2.d1.n2.3.2.3.1 + + + + + ti.d2.n2.d1.n2.3.2.3.2 + + + + + ti.d2.n2.d1.n2.3.2.3.3 + + + + + ti.d2.n2.d1.n2.3.3.1.1 + + + + + ti.d2.n2.d1.n2.3.3.1.2 + + + + + ti.d2.n2.d1.n2.3.3.1.3 + + + + + ti.d2.n2.d1.n2.3.3.2.1 + + + + + ti.d2.n2.d1.n2.3.3.2.2 + + + + + ti.d2.n2.d1.n2.3.3.2.3 + + + + + ti.d2.n2.d1.n2.3.3.3.1 + + + + + ti.d2.n2.d1.n2.3.3.3.2 + + + + + ti.d2.n2.d1.n2.3.3.3.3 + + + + + ti.d2.n2.d2.n1.1.1.1.1 + + + + + ti.d2.n2.d2.n1.1.1.1.2 + + + + + ti.d2.n2.d2.n1.1.1.1.3 + + + + + ti.d2.n2.d2.n1.1.1.2.1 + + + + + ti.d2.n2.d2.n1.1.1.2.2 + + + + + ti.d2.n2.d2.n1.1.1.2.3 + + + + + ti.d2.n2.d2.n1.1.1.3.1 + + + + + ti.d2.n2.d2.n1.1.1.3.2 + + + + + ti.d2.n2.d2.n1.1.1.3.3 + + + + + ti.d2.n2.d2.n1.1.2.1.1 + + + + + ti.d2.n2.d2.n1.1.2.1.2 + + + + + ti.d2.n2.d2.n1.1.2.1.3 + + + + + ti.d2.n2.d2.n1.1.2.2.1 + + + + + ti.d2.n2.d2.n1.1.2.2.2 + + + + + ti.d2.n2.d2.n1.1.2.2.3 + + + + + ti.d2.n2.d2.n1.1.2.3.1 + + + + + ti.d2.n2.d2.n1.1.2.3.2 + + + + + ti.d2.n2.d2.n1.1.2.3.3 + + + + + ti.d2.n2.d2.n1.1.3.1.1 + + + + + ti.d2.n2.d2.n1.1.3.1.2 + + + + + ti.d2.n2.d2.n1.1.3.1.3 + + + + + ti.d2.n2.d2.n1.1.3.2.1 + + + + + ti.d2.n2.d2.n1.1.3.2.2 + + + + + ti.d2.n2.d2.n1.1.3.2.3 + + + + + ti.d2.n2.d2.n1.1.3.3.1 + + + + + ti.d2.n2.d2.n1.1.3.3.2 + + + + + ti.d2.n2.d2.n1.1.3.3.3 + + + + + ti.d2.n2.d2.n1.2.1.1.1 + + + + + ti.d2.n2.d2.n1.2.1.1.2 + + + + + ti.d2.n2.d2.n1.2.1.1.3 + + + + + ti.d2.n2.d2.n1.2.1.2.1 + + + + + ti.d2.n2.d2.n1.2.1.2.2 + + + + + ti.d2.n2.d2.n1.2.1.2.3 + + + + + ti.d2.n2.d2.n1.2.1.3.1 + + + + + ti.d2.n2.d2.n1.2.1.3.2 + + + + + ti.d2.n2.d2.n1.2.1.3.3 + + + + + ti.d2.n2.d2.n1.2.2.1.1 + + + + + ti.d2.n2.d2.n1.2.2.1.2 + + + + + ti.d2.n2.d2.n1.2.2.1.3 + + + + + ti.d2.n2.d2.n1.2.2.2.1 + + + + + ti.d2.n2.d2.n1.2.2.2.2 + + + + + ti.d2.n2.d2.n1.2.2.2.3 + + + + + ti.d2.n2.d2.n1.2.2.3.1 + + + + + ti.d2.n2.d2.n1.2.2.3.2 + + + + + ti.d2.n2.d2.n1.2.2.3.3 + + + + + ti.d2.n2.d2.n1.2.3.1.1 + + + + + ti.d2.n2.d2.n1.2.3.1.2 + + + + + ti.d2.n2.d2.n1.2.3.1.3 + + + + + ti.d2.n2.d2.n1.2.3.2.1 + + + + + ti.d2.n2.d2.n1.2.3.2.2 + + + + + ti.d2.n2.d2.n1.2.3.2.3 + + + + + ti.d2.n2.d2.n1.2.3.3.1 + + + + + ti.d2.n2.d2.n1.2.3.3.2 + + + + + ti.d2.n2.d2.n1.2.3.3.3 + + + + + ti.d2.n2.d2.n1.3.1.1.1 + + + + + ti.d2.n2.d2.n1.3.1.1.2 + + + + + ti.d2.n2.d2.n1.3.1.1.3 + + + + + ti.d2.n2.d2.n1.3.1.2.1 + + + + + ti.d2.n2.d2.n1.3.1.2.2 + + + + + ti.d2.n2.d2.n1.3.1.2.3 + + + + + ti.d2.n2.d2.n1.3.1.3.1 + + + + + ti.d2.n2.d2.n1.3.1.3.2 + + + + + ti.d2.n2.d2.n1.3.1.3.3 + + + + + ti.d2.n2.d2.n1.3.2.1.1 + + + + + ti.d2.n2.d2.n1.3.2.1.2 + + + + + ti.d2.n2.d2.n1.3.2.1.3 + + + + + ti.d2.n2.d2.n1.3.2.2.1 + + + + + ti.d2.n2.d2.n1.3.2.2.2 + + + + + ti.d2.n2.d2.n1.3.2.2.3 + + + + + ti.d2.n2.d2.n1.3.2.3.1 + + + + + ti.d2.n2.d2.n1.3.2.3.2 + + + + + ti.d2.n2.d2.n1.3.2.3.3 + + + + + ti.d2.n2.d2.n1.3.3.1.1 + + + + + ti.d2.n2.d2.n1.3.3.1.2 + + + + + ti.d2.n2.d2.n1.3.3.1.3 + + + + + ti.d2.n2.d2.n1.3.3.2.1 + + + + + ti.d2.n2.d2.n1.3.3.2.2 + + + + + ti.d2.n2.d2.n1.3.3.2.3 + + + + + ti.d2.n2.d2.n1.3.3.3.1 + + + + + ti.d2.n2.d2.n1.3.3.3.2 + + + + + ti.d2.n2.d2.n1.3.3.3.3 + + + + + ti.d2.n2.d3.n1.1.1.1.1 + + + + + ti.d2.n2.d3.n1.1.1.1.2 + + + + + ti.d2.n2.d3.n1.1.1.1.3 + + + + + ti.d2.n2.d3.n1.1.1.2.1 + + + + + ti.d2.n2.d3.n1.1.1.2.2 + + + + + ti.d2.n2.d3.n1.1.1.2.3 + + + + + ti.d2.n2.d3.n1.1.1.3.1 + + + + + ti.d2.n2.d3.n1.1.1.3.2 + + + + + ti.d2.n2.d3.n1.1.1.3.3 + + + + + ti.d2.n2.d3.n1.1.2.1.1 + + + + + ti.d2.n2.d3.n1.1.2.1.2 + + + + + ti.d2.n2.d3.n1.1.2.1.3 + + + + + ti.d2.n2.d3.n1.1.2.2.1 + + + + + ti.d2.n2.d3.n1.1.2.2.2 + + + + + ti.d2.n2.d3.n1.1.2.2.3 + + + + + ti.d2.n2.d3.n1.1.2.3.1 + + + + + ti.d2.n2.d3.n1.1.2.3.2 + + + + + ti.d2.n2.d3.n1.1.2.3.3 + + + + + ti.d2.n2.d3.n1.1.3.1.1 + + + + + ti.d2.n2.d3.n1.1.3.1.2 + + + + + ti.d2.n2.d3.n1.1.3.1.3 + + + + + ti.d2.n2.d3.n1.1.3.2.1 + + + + + ti.d2.n2.d3.n1.1.3.2.2 + + + + + ti.d2.n2.d3.n1.1.3.2.3 + + + + + ti.d2.n2.d3.n1.1.3.3.1 + + + + + ti.d2.n2.d3.n1.1.3.3.2 + + + + + ti.d2.n2.d3.n1.1.3.3.3 + + + + + ti.d2.n2.d3.n1.2.1.1.1 + + + + + ti.d2.n2.d3.n1.2.1.1.2 + + + + + ti.d2.n2.d3.n1.2.1.1.3 + + + + + ti.d2.n2.d3.n1.2.1.2.1 + + + + + ti.d2.n2.d3.n1.2.1.2.2 + + + + + ti.d2.n2.d3.n1.2.1.2.3 + + + + + ti.d2.n2.d3.n1.2.1.3.1 + + + + + ti.d2.n2.d3.n1.2.1.3.2 + + + + + ti.d2.n2.d3.n1.2.1.3.3 + + + + + ti.d2.n2.d3.n1.2.2.1.1 + + + + + ti.d2.n2.d3.n1.2.2.1.2 + + + + + ti.d2.n2.d3.n1.2.2.1.3 + + + + + ti.d2.n2.d3.n1.2.2.2.1 + + + + + ti.d2.n2.d3.n1.2.2.2.2 + + + + + ti.d2.n2.d3.n1.2.2.2.3 + + + + + ti.d2.n2.d3.n1.2.2.3.1 + + + + + ti.d2.n2.d3.n1.2.2.3.2 + + + + + ti.d2.n2.d3.n1.2.2.3.3 + + + + + ti.d2.n2.d3.n1.2.3.1.1 + + + + + ti.d2.n2.d3.n1.2.3.1.2 + + + + + ti.d2.n2.d3.n1.2.3.1.3 + + + + + ti.d2.n2.d3.n1.2.3.2.1 + + + + + ti.d2.n2.d3.n1.2.3.2.2 + + + + + ti.d2.n2.d3.n1.2.3.2.3 + + + + + ti.d2.n2.d3.n1.2.3.3.1 + + + + + ti.d2.n2.d3.n1.2.3.3.2 + + + + + ti.d2.n2.d3.n1.2.3.3.3 + + + + + ti.d2.n2.d3.n1.3.1.1.1 + + + + + ti.d2.n2.d3.n1.3.1.1.2 + + + + + ti.d2.n2.d3.n1.3.1.1.3 + + + + + ti.d2.n2.d3.n1.3.1.2.1 + + + + + ti.d2.n2.d3.n1.3.1.2.2 + + + + + ti.d2.n2.d3.n1.3.1.2.3 + + + + + ti.d2.n2.d3.n1.3.1.3.1 + + + + + ti.d2.n2.d3.n1.3.1.3.2 + + + + + ti.d2.n2.d3.n1.3.1.3.3 + + + + + ti.d2.n2.d3.n1.3.2.1.1 + + + + + ti.d2.n2.d3.n1.3.2.1.2 + + + + + ti.d2.n2.d3.n1.3.2.1.3 + + + + + ti.d2.n2.d3.n1.3.2.2.1 + + + + + ti.d2.n2.d3.n1.3.2.2.2 + + + + + ti.d2.n2.d3.n1.3.2.2.3 + + + + + ti.d2.n2.d3.n1.3.2.3.1 + + + + + ti.d2.n2.d3.n1.3.2.3.2 + + + + + ti.d2.n2.d3.n1.3.2.3.3 + + + + + ti.d2.n2.d3.n1.3.3.1.1 + + + + + ti.d2.n2.d3.n1.3.3.1.2 + + + + + ti.d2.n2.d3.n1.3.3.1.3 + + + + + ti.d2.n2.d3.n1.3.3.2.1 + + + + + ti.d2.n2.d3.n1.3.3.2.2 + + + + + ti.d2.n2.d3.n1.3.3.2.3 + + + + + ti.d2.n2.d3.n1.3.3.3.1 + + + + + ti.d2.n2.d3.n1.3.3.3.2 + + + + + ti.d2.n2.d3.n1.3.3.3.3 + + + + + ti.d2.n2.d3.n2.1.1.1.1 + + + + + ti.d2.n2.d3.n2.1.1.1.2 + + + + + ti.d2.n2.d3.n2.1.1.1.3 + + + + + ti.d2.n2.d3.n2.1.1.2.1 + + + + + ti.d2.n2.d3.n2.1.1.2.2 + + + + + ti.d2.n2.d3.n2.1.1.2.3 + + + + + ti.d2.n2.d3.n2.1.1.3.1 + + + + + ti.d2.n2.d3.n2.1.1.3.2 + + + + + ti.d2.n2.d3.n2.1.1.3.3 + + + + + ti.d2.n2.d3.n2.1.2.1.1 + + + + + ti.d2.n2.d3.n2.1.2.1.2 + + + + + ti.d2.n2.d3.n2.1.2.1.3 + + + + + ti.d2.n2.d3.n2.1.2.2.1 + + + + + ti.d2.n2.d3.n2.1.2.2.2 + + + + + ti.d2.n2.d3.n2.1.2.2.3 + + + + + ti.d2.n2.d3.n2.1.2.3.1 + + + + + ti.d2.n2.d3.n2.1.2.3.2 + + + + + ti.d2.n2.d3.n2.1.2.3.3 + + + + + ti.d2.n2.d3.n2.1.3.1.1 + + + + + ti.d2.n2.d3.n2.1.3.1.2 + + + + + ti.d2.n2.d3.n2.1.3.1.3 + + + + + ti.d2.n2.d3.n2.1.3.2.1 + + + + + ti.d2.n2.d3.n2.1.3.2.2 + + + + + ti.d2.n2.d3.n2.1.3.2.3 + + + + + ti.d2.n2.d3.n2.1.3.3.1 + + + + + ti.d2.n2.d3.n2.1.3.3.2 + + + + + ti.d2.n2.d3.n2.1.3.3.3 + + + + + ti.d2.n2.d3.n2.2.1.1.1 + + + + + ti.d2.n2.d3.n2.2.1.1.2 + + + + + ti.d2.n2.d3.n2.2.1.1.3 + + + + + ti.d2.n2.d3.n2.2.1.2.1 + + + + + ti.d2.n2.d3.n2.2.1.2.2 + + + + + ti.d2.n2.d3.n2.2.1.2.3 + + + + + ti.d2.n2.d3.n2.2.1.3.1 + + + + + ti.d2.n2.d3.n2.2.1.3.2 + + + + + ti.d2.n2.d3.n2.2.1.3.3 + + + + + ti.d2.n2.d3.n2.2.2.1.1 + + + + + ti.d2.n2.d3.n2.2.2.1.2 + + + + + ti.d2.n2.d3.n2.2.2.1.3 + + + + + ti.d2.n2.d3.n2.2.2.2.1 + + + + + ti.d2.n2.d3.n2.2.2.2.2 + + + + + ti.d2.n2.d3.n2.2.2.2.3 + + + + + ti.d2.n2.d3.n2.2.2.3.1 + + + + + ti.d2.n2.d3.n2.2.2.3.2 + + + + + ti.d2.n2.d3.n2.2.2.3.3 + + + + + ti.d2.n2.d3.n2.2.3.1.1 + + + + + ti.d2.n2.d3.n2.2.3.1.2 + + + + + ti.d2.n2.d3.n2.2.3.1.3 + + + + + ti.d2.n2.d3.n2.2.3.2.1 + + + + + ti.d2.n2.d3.n2.2.3.2.2 + + + + + ti.d2.n2.d3.n2.2.3.2.3 + + + + + ti.d2.n2.d3.n2.2.3.3.1 + + + + + ti.d2.n2.d3.n2.2.3.3.2 + + + + + ti.d2.n2.d3.n2.2.3.3.3 + + + + + ti.d2.n2.d3.n2.3.1.1.1 + + + + + ti.d2.n2.d3.n2.3.1.1.2 + + + + + ti.d2.n2.d3.n2.3.1.1.3 + + + + + ti.d2.n2.d3.n2.3.1.2.1 + + + + + ti.d2.n2.d3.n2.3.1.2.2 + + + + + ti.d2.n2.d3.n2.3.1.2.3 + + + + + ti.d2.n2.d3.n2.3.1.3.1 + + + + + ti.d2.n2.d3.n2.3.1.3.2 + + + + + ti.d2.n2.d3.n2.3.1.3.3 + + + + + ti.d2.n2.d3.n2.3.2.1.1 + + + + + ti.d2.n2.d3.n2.3.2.1.2 + + + + + ti.d2.n2.d3.n2.3.2.1.3 + + + + + ti.d2.n2.d3.n2.3.2.2.1 + + + + + ti.d2.n2.d3.n2.3.2.2.2 + + + + + ti.d2.n2.d3.n2.3.2.2.3 + + + + + ti.d2.n2.d3.n2.3.2.3.1 + + + + + ti.d2.n2.d3.n2.3.2.3.2 + + + + + ti.d2.n2.d3.n2.3.2.3.3 + + + + + ti.d2.n2.d3.n2.3.3.1.1 + + + + + ti.d2.n2.d3.n2.3.3.1.2 + + + + + ti.d2.n2.d3.n2.3.3.1.3 + + + + + ti.d2.n2.d3.n2.3.3.2.1 + + + + + ti.d2.n2.d3.n2.3.3.2.2 + + + + + ti.d2.n2.d3.n2.3.3.2.3 + + + + + ti.d2.n2.d3.n2.3.3.3.1 + + + + + ti.d2.n2.d3.n2.3.3.3.2 + + + + + ti.d2.n2.d3.n2.3.3.3.3 + + + + + ti.d2.n2.d4.n1.1.1.1.1 + + + + + ti.d2.n2.d4.n1.1.1.1.2 + + + + + ti.d2.n2.d4.n1.1.1.1.3 + + + + + ti.d2.n2.d4.n1.1.1.2.1 + + + + + ti.d2.n2.d4.n1.1.1.2.2 + + + + + ti.d2.n2.d4.n1.1.1.2.3 + + + + + ti.d2.n2.d4.n1.1.1.3.1 + + + + + ti.d2.n2.d4.n1.1.1.3.2 + + + + + ti.d2.n2.d4.n1.1.1.3.3 + + + + + ti.d2.n2.d4.n1.1.2.1.1 + + + + + ti.d2.n2.d4.n1.1.2.1.2 + + + + + ti.d2.n2.d4.n1.1.2.1.3 + + + + + ti.d2.n2.d4.n1.1.2.2.1 + + + + + ti.d2.n2.d4.n1.1.2.2.2 + + + + + ti.d2.n2.d4.n1.1.2.2.3 + + + + + ti.d2.n2.d4.n1.1.2.3.1 + + + + + ti.d2.n2.d4.n1.1.2.3.2 + + + + + ti.d2.n2.d4.n1.1.2.3.3 + + + + + ti.d2.n2.d4.n1.1.3.1.1 + + + + + ti.d2.n2.d4.n1.1.3.1.2 + + + + + ti.d2.n2.d4.n1.1.3.1.3 + + + + + ti.d2.n2.d4.n1.1.3.2.1 + + + + + ti.d2.n2.d4.n1.1.3.2.2 + + + + + ti.d2.n2.d4.n1.1.3.2.3 + + + + + ti.d2.n2.d4.n1.1.3.3.1 + + + + + ti.d2.n2.d4.n1.1.3.3.2 + + + + + ti.d2.n2.d4.n1.1.3.3.3 + + + + + ti.d2.n2.d4.n1.2.1.1.1 + + + + + ti.d2.n2.d4.n1.2.1.1.2 + + + + + ti.d2.n2.d4.n1.2.1.1.3 + + + + + ti.d2.n2.d4.n1.2.1.2.1 + + + + + ti.d2.n2.d4.n1.2.1.2.2 + + + + + ti.d2.n2.d4.n1.2.1.2.3 + + + + + ti.d2.n2.d4.n1.2.1.3.1 + + + + + ti.d2.n2.d4.n1.2.1.3.2 + + + + + ti.d2.n2.d4.n1.2.1.3.3 + + + + + ti.d2.n2.d4.n1.2.2.1.1 + + + + + ti.d2.n2.d4.n1.2.2.1.2 + + + + + ti.d2.n2.d4.n1.2.2.1.3 + + + + + ti.d2.n2.d4.n1.2.2.2.1 + + + + + ti.d2.n2.d4.n1.2.2.2.2 + + + + + ti.d2.n2.d4.n1.2.2.2.3 + + + + + ti.d2.n2.d4.n1.2.2.3.1 + + + + + ti.d2.n2.d4.n1.2.2.3.2 + + + + + ti.d2.n2.d4.n1.2.2.3.3 + + + + + ti.d2.n2.d4.n1.2.3.1.1 + + + + + ti.d2.n2.d4.n1.2.3.1.2 + + + + + ti.d2.n2.d4.n1.2.3.1.3 + + + + + ti.d2.n2.d4.n1.2.3.2.1 + + + + + ti.d2.n2.d4.n1.2.3.2.2 + + + + + ti.d2.n2.d4.n1.2.3.2.3 + + + + + ti.d2.n2.d4.n1.2.3.3.1 + + + + + ti.d2.n2.d4.n1.2.3.3.2 + + + + + ti.d2.n2.d4.n1.2.3.3.3 + + + + + ti.d2.n2.d4.n1.3.1.1.1 + + + + + ti.d2.n2.d4.n1.3.1.1.2 + + + + + ti.d2.n2.d4.n1.3.1.1.3 + + + + + ti.d2.n2.d4.n1.3.1.2.1 + + + + + ti.d2.n2.d4.n1.3.1.2.2 + + + + + ti.d2.n2.d4.n1.3.1.2.3 + + + + + ti.d2.n2.d4.n1.3.1.3.1 + + + + + ti.d2.n2.d4.n1.3.1.3.2 + + + + + ti.d2.n2.d4.n1.3.1.3.3 + + + + + ti.d2.n2.d4.n1.3.2.1.1 + + + + + ti.d2.n2.d4.n1.3.2.1.2 + + + + + ti.d2.n2.d4.n1.3.2.1.3 + + + + + ti.d2.n2.d4.n1.3.2.2.1 + + + + + ti.d2.n2.d4.n1.3.2.2.2 + + + + + ti.d2.n2.d4.n1.3.2.2.3 + + + + + ti.d2.n2.d4.n1.3.2.3.1 + + + + + ti.d2.n2.d4.n1.3.2.3.2 + + + + + ti.d2.n2.d4.n1.3.2.3.3 + + + + + ti.d2.n2.d4.n1.3.3.1.1 + + + + + ti.d2.n2.d4.n1.3.3.1.2 + + + + + ti.d2.n2.d4.n1.3.3.1.3 + + + + + ti.d2.n2.d4.n1.3.3.2.1 + + + + + ti.d2.n2.d4.n1.3.3.2.2 + + + + + ti.d2.n2.d4.n1.3.3.2.3 + + + + + ti.d2.n2.d4.n1.3.3.3.1 + + + + + ti.d2.n2.d4.n1.3.3.3.2 + + + + + ti.d2.n2.d4.n1.3.3.3.3 + + + + + ti.d2.n2.d4.n2.1.1.1.1 + + + + + ti.d2.n2.d4.n2.1.1.1.2 + + + + + ti.d2.n2.d4.n2.1.1.1.3 + + + + + ti.d2.n2.d4.n2.1.1.2.1 + + + + + ti.d2.n2.d4.n2.1.1.2.2 + + + + + ti.d2.n2.d4.n2.1.1.2.3 + + + + + ti.d2.n2.d4.n2.1.1.3.1 + + + + + ti.d2.n2.d4.n2.1.1.3.2 + + + + + ti.d2.n2.d4.n2.1.1.3.3 + + + + + ti.d2.n2.d4.n2.1.2.1.1 + + + + + ti.d2.n2.d4.n2.1.2.1.2 + + + + + ti.d2.n2.d4.n2.1.2.1.3 + + + + + ti.d2.n2.d4.n2.1.2.2.1 + + + + + ti.d2.n2.d4.n2.1.2.2.2 + + + + + ti.d2.n2.d4.n2.1.2.2.3 + + + + + ti.d2.n2.d4.n2.1.2.3.1 + + + + + ti.d2.n2.d4.n2.1.2.3.2 + + + + + ti.d2.n2.d4.n2.1.2.3.3 + + + + + ti.d2.n2.d4.n2.1.3.1.1 + + + + + ti.d2.n2.d4.n2.1.3.1.2 + + + + + ti.d2.n2.d4.n2.1.3.1.3 + + + + + ti.d2.n2.d4.n2.1.3.2.1 + + + + + ti.d2.n2.d4.n2.1.3.2.2 + + + + + ti.d2.n2.d4.n2.1.3.2.3 + + + + + ti.d2.n2.d4.n2.1.3.3.1 + + + + + ti.d2.n2.d4.n2.1.3.3.2 + + + + + ti.d2.n2.d4.n2.1.3.3.3 + + + + + ti.d2.n2.d4.n2.2.1.1.1 + + + + + ti.d2.n2.d4.n2.2.1.1.2 + + + + + ti.d2.n2.d4.n2.2.1.1.3 + + + + + ti.d2.n2.d4.n2.2.1.2.1 + + + + + ti.d2.n2.d4.n2.2.1.2.2 + + + + + ti.d2.n2.d4.n2.2.1.2.3 + + + + + ti.d2.n2.d4.n2.2.1.3.1 + + + + + ti.d2.n2.d4.n2.2.1.3.2 + + + + + ti.d2.n2.d4.n2.2.1.3.3 + + + + + ti.d2.n2.d4.n2.2.2.1.1 + + + + + ti.d2.n2.d4.n2.2.2.1.2 + + + + + ti.d2.n2.d4.n2.2.2.1.3 + + + + + ti.d2.n2.d4.n2.2.2.2.1 + + + + + ti.d2.n2.d4.n2.2.2.2.2 + + + + + ti.d2.n2.d4.n2.2.2.2.3 + + + + + ti.d2.n2.d4.n2.2.2.3.1 + + + + + ti.d2.n2.d4.n2.2.2.3.2 + + + + + ti.d2.n2.d4.n2.2.2.3.3 + + + + + ti.d2.n2.d4.n2.2.3.1.1 + + + + + ti.d2.n2.d4.n2.2.3.1.2 + + + + + ti.d2.n2.d4.n2.2.3.1.3 + + + + + ti.d2.n2.d4.n2.2.3.2.1 + + + + + ti.d2.n2.d4.n2.2.3.2.2 + + + + + ti.d2.n2.d4.n2.2.3.2.3 + + + + + ti.d2.n2.d4.n2.2.3.3.1 + + + + + ti.d2.n2.d4.n2.2.3.3.2 + + + + + ti.d2.n2.d4.n2.2.3.3.3 + + + + + ti.d2.n2.d4.n2.3.1.1.1 + + + + + ti.d2.n2.d4.n2.3.1.1.2 + + + + + ti.d2.n2.d4.n2.3.1.1.3 + + + + + ti.d2.n2.d4.n2.3.1.2.1 + + + + + ti.d2.n2.d4.n2.3.1.2.2 + + + + + ti.d2.n2.d4.n2.3.1.2.3 + + + + + ti.d2.n2.d4.n2.3.1.3.1 + + + + + ti.d2.n2.d4.n2.3.1.3.2 + + + + + ti.d2.n2.d4.n2.3.1.3.3 + + + + + ti.d2.n2.d4.n2.3.2.1.1 + + + + + ti.d2.n2.d4.n2.3.2.1.2 + + + + + ti.d2.n2.d4.n2.3.2.1.3 + + + + + ti.d2.n2.d4.n2.3.2.2.1 + + + + + ti.d2.n2.d4.n2.3.2.2.2 + + + + + ti.d2.n2.d4.n2.3.2.2.3 + + + + + ti.d2.n2.d4.n2.3.2.3.1 + + + + + ti.d2.n2.d4.n2.3.2.3.2 + + + + + ti.d2.n2.d4.n2.3.2.3.3 + + + + + ti.d2.n2.d4.n2.3.3.1.1 + + + + + ti.d2.n2.d4.n2.3.3.1.2 + + + + + ti.d2.n2.d4.n2.3.3.1.3 + + + + + ti.d2.n2.d4.n2.3.3.2.1 + + + + + ti.d2.n2.d4.n2.3.3.2.2 + + + + + ti.d2.n2.d4.n2.3.3.2.3 + + + + + ti.d2.n2.d4.n2.3.3.3.1 + + + + + ti.d2.n2.d4.n2.3.3.3.2 + + + + + ti.d2.n2.d4.n2.3.3.3.3 + + + + + ti.d3.n1.d1.n1.1.1.1.1 + + + + + ti.d3.n1.d1.n1.1.1.1.2 + + + + + ti.d3.n1.d1.n1.1.1.1.3 + + + + + ti.d3.n1.d1.n1.1.1.2.1 + + + + + ti.d3.n1.d1.n1.1.1.2.2 + + + + + ti.d3.n1.d1.n1.1.1.2.3 + + + + + ti.d3.n1.d1.n1.1.1.3.1 + + + + + ti.d3.n1.d1.n1.1.1.3.2 + + + + + ti.d3.n1.d1.n1.1.1.3.3 + + + + + ti.d3.n1.d1.n1.1.2.1.1 + + + + + ti.d3.n1.d1.n1.1.2.1.2 + + + + + ti.d3.n1.d1.n1.1.2.1.3 + + + + + ti.d3.n1.d1.n1.1.2.2.1 + + + + + ti.d3.n1.d1.n1.1.2.2.2 + + + + + ti.d3.n1.d1.n1.1.2.2.3 + + + + + ti.d3.n1.d1.n1.1.2.3.1 + + + + + ti.d3.n1.d1.n1.1.2.3.2 + + + + + ti.d3.n1.d1.n1.1.2.3.3 + + + + + ti.d3.n1.d1.n1.1.3.1.1 + + + + + ti.d3.n1.d1.n1.1.3.1.2 + + + + + ti.d3.n1.d1.n1.1.3.1.3 + + + + + ti.d3.n1.d1.n1.1.3.2.1 + + + + + ti.d3.n1.d1.n1.1.3.2.2 + + + + + ti.d3.n1.d1.n1.1.3.2.3 + + + + + ti.d3.n1.d1.n1.1.3.3.1 + + + + + ti.d3.n1.d1.n1.1.3.3.2 + + + + + ti.d3.n1.d1.n1.1.3.3.3 + + + + + ti.d3.n1.d1.n1.2.1.1.1 + + + + + ti.d3.n1.d1.n1.2.1.1.2 + + + + + ti.d3.n1.d1.n1.2.1.1.3 + + + + + ti.d3.n1.d1.n1.2.1.2.1 + + + + + ti.d3.n1.d1.n1.2.1.2.2 + + + + + ti.d3.n1.d1.n1.2.1.2.3 + + + + + ti.d3.n1.d1.n1.2.1.3.1 + + + + + ti.d3.n1.d1.n1.2.1.3.2 + + + + + ti.d3.n1.d1.n1.2.1.3.3 + + + + + ti.d3.n1.d1.n1.2.2.1.1 + + + + + ti.d3.n1.d1.n1.2.2.1.2 + + + + + ti.d3.n1.d1.n1.2.2.1.3 + + + + + ti.d3.n1.d1.n1.2.2.2.1 + + + + + ti.d3.n1.d1.n1.2.2.2.2 + + + + + ti.d3.n1.d1.n1.2.2.2.3 + + + + + ti.d3.n1.d1.n1.2.2.3.1 + + + + + ti.d3.n1.d1.n1.2.2.3.2 + + + + + ti.d3.n1.d1.n1.2.2.3.3 + + + + + ti.d3.n1.d1.n1.2.3.1.1 + + + + + ti.d3.n1.d1.n1.2.3.1.2 + + + + + ti.d3.n1.d1.n1.2.3.1.3 + + + + + ti.d3.n1.d1.n1.2.3.2.1 + + + + + ti.d3.n1.d1.n1.2.3.2.2 + + + + + ti.d3.n1.d1.n1.2.3.2.3 + + + + + ti.d3.n1.d1.n1.2.3.3.1 + + + + + ti.d3.n1.d1.n1.2.3.3.2 + + + + + ti.d3.n1.d1.n1.2.3.3.3 + + + + + ti.d3.n1.d1.n1.3.1.1.1 + + + + + ti.d3.n1.d1.n1.3.1.1.2 + + + + + ti.d3.n1.d1.n1.3.1.1.3 + + + + + ti.d3.n1.d1.n1.3.1.2.1 + + + + + ti.d3.n1.d1.n1.3.1.2.2 + + + + + ti.d3.n1.d1.n1.3.1.2.3 + + + + + ti.d3.n1.d1.n1.3.1.3.1 + + + + + ti.d3.n1.d1.n1.3.1.3.2 + + + + + ti.d3.n1.d1.n1.3.1.3.3 + + + + + ti.d3.n1.d1.n1.3.2.1.1 + + + + + ti.d3.n1.d1.n1.3.2.1.2 + + + + + ti.d3.n1.d1.n1.3.2.1.3 + + + + + ti.d3.n1.d1.n1.3.2.2.1 + + + + + ti.d3.n1.d1.n1.3.2.2.2 + + + + + ti.d3.n1.d1.n1.3.2.2.3 + + + + + ti.d3.n1.d1.n1.3.2.3.1 + + + + + ti.d3.n1.d1.n1.3.2.3.2 + + + + + ti.d3.n1.d1.n1.3.2.3.3 + + + + + ti.d3.n1.d1.n1.3.3.1.1 + + + + + ti.d3.n1.d1.n1.3.3.1.2 + + + + + ti.d3.n1.d1.n1.3.3.1.3 + + + + + ti.d3.n1.d1.n1.3.3.2.1 + + + + + ti.d3.n1.d1.n1.3.3.2.2 + + + + + ti.d3.n1.d1.n1.3.3.2.3 + + + + + ti.d3.n1.d1.n1.3.3.3.1 + + + + + ti.d3.n1.d1.n1.3.3.3.2 + + + + + ti.d3.n1.d1.n1.3.3.3.3 + + + + + ti.d3.n1.d1.n2.1.1.1.1 + + + + + ti.d3.n1.d1.n2.1.1.1.2 + + + + + ti.d3.n1.d1.n2.1.1.1.3 + + + + + ti.d3.n1.d1.n2.1.1.2.1 + + + + + ti.d3.n1.d1.n2.1.1.2.2 + + + + + ti.d3.n1.d1.n2.1.1.2.3 + + + + + ti.d3.n1.d1.n2.1.1.3.1 + + + + + ti.d3.n1.d1.n2.1.1.3.2 + + + + + ti.d3.n1.d1.n2.1.1.3.3 + + + + + ti.d3.n1.d1.n2.1.2.1.1 + + + + + ti.d3.n1.d1.n2.1.2.1.2 + + + + + ti.d3.n1.d1.n2.1.2.1.3 + + + + + ti.d3.n1.d1.n2.1.2.2.1 + + + + + ti.d3.n1.d1.n2.1.2.2.2 + + + + + ti.d3.n1.d1.n2.1.2.2.3 + + + + + ti.d3.n1.d1.n2.1.2.3.1 + + + + + ti.d3.n1.d1.n2.1.2.3.2 + + + + + ti.d3.n1.d1.n2.1.2.3.3 + + + + + ti.d3.n1.d1.n2.1.3.1.1 + + + + + ti.d3.n1.d1.n2.1.3.1.2 + + + + + ti.d3.n1.d1.n2.1.3.1.3 + + + + + ti.d3.n1.d1.n2.1.3.2.1 + + + + + ti.d3.n1.d1.n2.1.3.2.2 + + + + + ti.d3.n1.d1.n2.1.3.2.3 + + + + + ti.d3.n1.d1.n2.1.3.3.1 + + + + + ti.d3.n1.d1.n2.1.3.3.2 + + + + + ti.d3.n1.d1.n2.1.3.3.3 + + + + + ti.d3.n1.d1.n2.2.1.1.1 + + + + + ti.d3.n1.d1.n2.2.1.1.2 + + + + + ti.d3.n1.d1.n2.2.1.1.3 + + + + + ti.d3.n1.d1.n2.2.1.2.1 + + + + + ti.d3.n1.d1.n2.2.1.2.2 + + + + + ti.d3.n1.d1.n2.2.1.2.3 + + + + + ti.d3.n1.d1.n2.2.1.3.1 + + + + + ti.d3.n1.d1.n2.2.1.3.2 + + + + + ti.d3.n1.d1.n2.2.1.3.3 + + + + + ti.d3.n1.d1.n2.2.2.1.1 + + + + + ti.d3.n1.d1.n2.2.2.1.2 + + + + + ti.d3.n1.d1.n2.2.2.1.3 + + + + + ti.d3.n1.d1.n2.2.2.2.1 + + + + + ti.d3.n1.d1.n2.2.2.2.2 + + + + + ti.d3.n1.d1.n2.2.2.2.3 + + + + + ti.d3.n1.d1.n2.2.2.3.1 + + + + + ti.d3.n1.d1.n2.2.2.3.2 + + + + + ti.d3.n1.d1.n2.2.2.3.3 + + + + + ti.d3.n1.d1.n2.2.3.1.1 + + + + + ti.d3.n1.d1.n2.2.3.1.2 + + + + + ti.d3.n1.d1.n2.2.3.1.3 + + + + + ti.d3.n1.d1.n2.2.3.2.1 + + + + + ti.d3.n1.d1.n2.2.3.2.2 + + + + + ti.d3.n1.d1.n2.2.3.2.3 + + + + + ti.d3.n1.d1.n2.2.3.3.1 + + + + + ti.d3.n1.d1.n2.2.3.3.2 + + + + + ti.d3.n1.d1.n2.2.3.3.3 + + + + + ti.d3.n1.d1.n2.3.1.1.1 + + + + + ti.d3.n1.d1.n2.3.1.1.2 + + + + + ti.d3.n1.d1.n2.3.1.1.3 + + + + + ti.d3.n1.d1.n2.3.1.2.1 + + + + + ti.d3.n1.d1.n2.3.1.2.2 + + + + + ti.d3.n1.d1.n2.3.1.2.3 + + + + + ti.d3.n1.d1.n2.3.1.3.1 + + + + + ti.d3.n1.d1.n2.3.1.3.2 + + + + + ti.d3.n1.d1.n2.3.1.3.3 + + + + + ti.d3.n1.d1.n2.3.2.1.1 + + + + + ti.d3.n1.d1.n2.3.2.1.2 + + + + + ti.d3.n1.d1.n2.3.2.1.3 + + + + + ti.d3.n1.d1.n2.3.2.2.1 + + + + + ti.d3.n1.d1.n2.3.2.2.2 + + + + + ti.d3.n1.d1.n2.3.2.2.3 + + + + + ti.d3.n1.d1.n2.3.2.3.1 + + + + + ti.d3.n1.d1.n2.3.2.3.2 + + + + + ti.d3.n1.d1.n2.3.2.3.3 + + + + + ti.d3.n1.d1.n2.3.3.1.1 + + + + + ti.d3.n1.d1.n2.3.3.1.2 + + + + + ti.d3.n1.d1.n2.3.3.1.3 + + + + + ti.d3.n1.d1.n2.3.3.2.1 + + + + + ti.d3.n1.d1.n2.3.3.2.2 + + + + + ti.d3.n1.d1.n2.3.3.2.3 + + + + + ti.d3.n1.d1.n2.3.3.3.1 + + + + + ti.d3.n1.d1.n2.3.3.3.2 + + + + + ti.d3.n1.d1.n2.3.3.3.3 + + + + + ti.d3.n1.d2.n1.1.1.1.1 + + + + + ti.d3.n1.d2.n1.1.1.1.2 + + + + + ti.d3.n1.d2.n1.1.1.1.3 + + + + + ti.d3.n1.d2.n1.1.1.2.1 + + + + + ti.d3.n1.d2.n1.1.1.2.2 + + + + + ti.d3.n1.d2.n1.1.1.2.3 + + + + + ti.d3.n1.d2.n1.1.1.3.1 + + + + + ti.d3.n1.d2.n1.1.1.3.2 + + + + + ti.d3.n1.d2.n1.1.1.3.3 + + + + + ti.d3.n1.d2.n1.1.2.1.1 + + + + + ti.d3.n1.d2.n1.1.2.1.2 + + + + + ti.d3.n1.d2.n1.1.2.1.3 + + + + + ti.d3.n1.d2.n1.1.2.2.1 + + + + + ti.d3.n1.d2.n1.1.2.2.2 + + + + + ti.d3.n1.d2.n1.1.2.2.3 + + + + + ti.d3.n1.d2.n1.1.2.3.1 + + + + + ti.d3.n1.d2.n1.1.2.3.2 + + + + + ti.d3.n1.d2.n1.1.2.3.3 + + + + + ti.d3.n1.d2.n1.1.3.1.1 + + + + + ti.d3.n1.d2.n1.1.3.1.2 + + + + + ti.d3.n1.d2.n1.1.3.1.3 + + + + + ti.d3.n1.d2.n1.1.3.2.1 + + + + + ti.d3.n1.d2.n1.1.3.2.2 + + + + + ti.d3.n1.d2.n1.1.3.2.3 + + + + + ti.d3.n1.d2.n1.1.3.3.1 + + + + + ti.d3.n1.d2.n1.1.3.3.2 + + + + + ti.d3.n1.d2.n1.1.3.3.3 + + + + + ti.d3.n1.d2.n1.2.1.1.1 + + + + + ti.d3.n1.d2.n1.2.1.1.2 + + + + + ti.d3.n1.d2.n1.2.1.1.3 + + + + + ti.d3.n1.d2.n1.2.1.2.1 + + + + + ti.d3.n1.d2.n1.2.1.2.2 + + + + + ti.d3.n1.d2.n1.2.1.2.3 + + + + + ti.d3.n1.d2.n1.2.1.3.1 + + + + + ti.d3.n1.d2.n1.2.1.3.2 + + + + + ti.d3.n1.d2.n1.2.1.3.3 + + + + + ti.d3.n1.d2.n1.2.2.1.1 + + + + + ti.d3.n1.d2.n1.2.2.1.2 + + + + + ti.d3.n1.d2.n1.2.2.1.3 + + + + + ti.d3.n1.d2.n1.2.2.2.1 + + + + + ti.d3.n1.d2.n1.2.2.2.2 + + + + + ti.d3.n1.d2.n1.2.2.2.3 + + + + + ti.d3.n1.d2.n1.2.2.3.1 + + + + + ti.d3.n1.d2.n1.2.2.3.2 + + + + + ti.d3.n1.d2.n1.2.2.3.3 + + + + + ti.d3.n1.d2.n1.2.3.1.1 + + + + + ti.d3.n1.d2.n1.2.3.1.2 + + + + + ti.d3.n1.d2.n1.2.3.1.3 + + + + + ti.d3.n1.d2.n1.2.3.2.1 + + + + + ti.d3.n1.d2.n1.2.3.2.2 + + + + + ti.d3.n1.d2.n1.2.3.2.3 + + + + + ti.d3.n1.d2.n1.2.3.3.1 + + + + + ti.d3.n1.d2.n1.2.3.3.2 + + + + + ti.d3.n1.d2.n1.2.3.3.3 + + + + + ti.d3.n1.d2.n1.3.1.1.1 + + + + + ti.d3.n1.d2.n1.3.1.1.2 + + + + + ti.d3.n1.d2.n1.3.1.1.3 + + + + + ti.d3.n1.d2.n1.3.1.2.1 + + + + + ti.d3.n1.d2.n1.3.1.2.2 + + + + + ti.d3.n1.d2.n1.3.1.2.3 + + + + + ti.d3.n1.d2.n1.3.1.3.1 + + + + + ti.d3.n1.d2.n1.3.1.3.2 + + + + + ti.d3.n1.d2.n1.3.1.3.3 + + + + + ti.d3.n1.d2.n1.3.2.1.1 + + + + + ti.d3.n1.d2.n1.3.2.1.2 + + + + + ti.d3.n1.d2.n1.3.2.1.3 + + + + + ti.d3.n1.d2.n1.3.2.2.1 + + + + + ti.d3.n1.d2.n1.3.2.2.2 + + + + + ti.d3.n1.d2.n1.3.2.2.3 + + + + + ti.d3.n1.d2.n1.3.2.3.1 + + + + + ti.d3.n1.d2.n1.3.2.3.2 + + + + + ti.d3.n1.d2.n1.3.2.3.3 + + + + + ti.d3.n1.d2.n1.3.3.1.1 + + + + + ti.d3.n1.d2.n1.3.3.1.2 + + + + + ti.d3.n1.d2.n1.3.3.1.3 + + + + + ti.d3.n1.d2.n1.3.3.2.1 + + + + + ti.d3.n1.d2.n1.3.3.2.2 + + + + + ti.d3.n1.d2.n1.3.3.2.3 + + + + + ti.d3.n1.d2.n1.3.3.3.1 + + + + + ti.d3.n1.d2.n1.3.3.3.2 + + + + + ti.d3.n1.d2.n1.3.3.3.3 + + + + + ti.d3.n1.d2.n2.1.1.1.1 + + + + + ti.d3.n1.d2.n2.1.1.1.2 + + + + + ti.d3.n1.d2.n2.1.1.1.3 + + + + + ti.d3.n1.d2.n2.1.1.2.1 + + + + + ti.d3.n1.d2.n2.1.1.2.2 + + + + + ti.d3.n1.d2.n2.1.1.2.3 + + + + + ti.d3.n1.d2.n2.1.1.3.1 + + + + + ti.d3.n1.d2.n2.1.1.3.2 + + + + + ti.d3.n1.d2.n2.1.1.3.3 + + + + + ti.d3.n1.d2.n2.1.2.1.1 + + + + + ti.d3.n1.d2.n2.1.2.1.2 + + + + + ti.d3.n1.d2.n2.1.2.1.3 + + + + + ti.d3.n1.d2.n2.1.2.2.1 + + + + + ti.d3.n1.d2.n2.1.2.2.2 + + + + + ti.d3.n1.d2.n2.1.2.2.3 + + + + + ti.d3.n1.d2.n2.1.2.3.1 + + + + + ti.d3.n1.d2.n2.1.2.3.2 + + + + + ti.d3.n1.d2.n2.1.2.3.3 + + + + + ti.d3.n1.d2.n2.1.3.1.1 + + + + + ti.d3.n1.d2.n2.1.3.1.2 + + + + + ti.d3.n1.d2.n2.1.3.1.3 + + + + + ti.d3.n1.d2.n2.1.3.2.1 + + + + + ti.d3.n1.d2.n2.1.3.2.2 + + + + + ti.d3.n1.d2.n2.1.3.2.3 + + + + + ti.d3.n1.d2.n2.1.3.3.1 + + + + + ti.d3.n1.d2.n2.1.3.3.2 + + + + + ti.d3.n1.d2.n2.1.3.3.3 + + + + + ti.d3.n1.d2.n2.2.1.1.1 + + + + + ti.d3.n1.d2.n2.2.1.1.2 + + + + + ti.d3.n1.d2.n2.2.1.1.3 + + + + + ti.d3.n1.d2.n2.2.1.2.1 + + + + + ti.d3.n1.d2.n2.2.1.2.2 + + + + + ti.d3.n1.d2.n2.2.1.2.3 + + + + + ti.d3.n1.d2.n2.2.1.3.1 + + + + + ti.d3.n1.d2.n2.2.1.3.2 + + + + + ti.d3.n1.d2.n2.2.1.3.3 + + + + + ti.d3.n1.d2.n2.2.2.1.1 + + + + + ti.d3.n1.d2.n2.2.2.1.2 + + + + + ti.d3.n1.d2.n2.2.2.1.3 + + + + + ti.d3.n1.d2.n2.2.2.2.1 + + + + + ti.d3.n1.d2.n2.2.2.2.2 + + + + + ti.d3.n1.d2.n2.2.2.2.3 + + + + + ti.d3.n1.d2.n2.2.2.3.1 + + + + + ti.d3.n1.d2.n2.2.2.3.2 + + + + + ti.d3.n1.d2.n2.2.2.3.3 + + + + + ti.d3.n1.d2.n2.2.3.1.1 + + + + + ti.d3.n1.d2.n2.2.3.1.2 + + + + + ti.d3.n1.d2.n2.2.3.1.3 + + + + + ti.d3.n1.d2.n2.2.3.2.1 + + + + + ti.d3.n1.d2.n2.2.3.2.2 + + + + + ti.d3.n1.d2.n2.2.3.2.3 + + + + + ti.d3.n1.d2.n2.2.3.3.1 + + + + + ti.d3.n1.d2.n2.2.3.3.2 + + + + + ti.d3.n1.d2.n2.2.3.3.3 + + + + + ti.d3.n1.d2.n2.3.1.1.1 + + + + + ti.d3.n1.d2.n2.3.1.1.2 + + + + + ti.d3.n1.d2.n2.3.1.1.3 + + + + + ti.d3.n1.d2.n2.3.1.2.1 + + + + + ti.d3.n1.d2.n2.3.1.2.2 + + + + + ti.d3.n1.d2.n2.3.1.2.3 + + + + + ti.d3.n1.d2.n2.3.1.3.1 + + + + + ti.d3.n1.d2.n2.3.1.3.2 + + + + + ti.d3.n1.d2.n2.3.1.3.3 + + + + + ti.d3.n1.d2.n2.3.2.1.1 + + + + + ti.d3.n1.d2.n2.3.2.1.2 + + + + + ti.d3.n1.d2.n2.3.2.1.3 + + + + + ti.d3.n1.d2.n2.3.2.2.1 + + + + + ti.d3.n1.d2.n2.3.2.2.2 + + + + + ti.d3.n1.d2.n2.3.2.2.3 + + + + + ti.d3.n1.d2.n2.3.2.3.1 + + + + + ti.d3.n1.d2.n2.3.2.3.2 + + + + + ti.d3.n1.d2.n2.3.2.3.3 + + + + + ti.d3.n1.d2.n2.3.3.1.1 + + + + + ti.d3.n1.d2.n2.3.3.1.2 + + + + + ti.d3.n1.d2.n2.3.3.1.3 + + + + + ti.d3.n1.d2.n2.3.3.2.1 + + + + + ti.d3.n1.d2.n2.3.3.2.2 + + + + + ti.d3.n1.d2.n2.3.3.2.3 + + + + + ti.d3.n1.d2.n2.3.3.3.1 + + + + + ti.d3.n1.d2.n2.3.3.3.2 + + + + + ti.d3.n1.d2.n2.3.3.3.3 + + + + + ti.d3.n1.d3.n2.1.1.1.1 + + + + + ti.d3.n1.d3.n2.1.1.1.2 + + + + + ti.d3.n1.d3.n2.1.1.1.3 + + + + + ti.d3.n1.d3.n2.1.1.2.1 + + + + + ti.d3.n1.d3.n2.1.1.2.2 + + + + + ti.d3.n1.d3.n2.1.1.2.3 + + + + + ti.d3.n1.d3.n2.1.1.3.1 + + + + + ti.d3.n1.d3.n2.1.1.3.2 + + + + + ti.d3.n1.d3.n2.1.1.3.3 + + + + + ti.d3.n1.d3.n2.1.2.1.1 + + + + + ti.d3.n1.d3.n2.1.2.1.2 + + + + + ti.d3.n1.d3.n2.1.2.1.3 + + + + + ti.d3.n1.d3.n2.1.2.2.1 + + + + + ti.d3.n1.d3.n2.1.2.2.2 + + + + + ti.d3.n1.d3.n2.1.2.2.3 + + + + + ti.d3.n1.d3.n2.1.2.3.1 + + + + + ti.d3.n1.d3.n2.1.2.3.2 + + + + + ti.d3.n1.d3.n2.1.2.3.3 + + + + + ti.d3.n1.d3.n2.1.3.1.1 + + + + + ti.d3.n1.d3.n2.1.3.1.2 + + + + + ti.d3.n1.d3.n2.1.3.1.3 + + + + + ti.d3.n1.d3.n2.1.3.2.1 + + + + + ti.d3.n1.d3.n2.1.3.2.2 + + + + + ti.d3.n1.d3.n2.1.3.2.3 + + + + + ti.d3.n1.d3.n2.1.3.3.1 + + + + + ti.d3.n1.d3.n2.1.3.3.2 + + + + + ti.d3.n1.d3.n2.1.3.3.3 + + + + + ti.d3.n1.d3.n2.2.1.1.1 + + + + + ti.d3.n1.d3.n2.2.1.1.2 + + + + + ti.d3.n1.d3.n2.2.1.1.3 + + + + + ti.d3.n1.d3.n2.2.1.2.1 + + + + + ti.d3.n1.d3.n2.2.1.2.2 + + + + + ti.d3.n1.d3.n2.2.1.2.3 + + + + + ti.d3.n1.d3.n2.2.1.3.1 + + + + + ti.d3.n1.d3.n2.2.1.3.2 + + + + + ti.d3.n1.d3.n2.2.1.3.3 + + + + + ti.d3.n1.d3.n2.2.2.1.1 + + + + + ti.d3.n1.d3.n2.2.2.1.2 + + + + + ti.d3.n1.d3.n2.2.2.1.3 + + + + + ti.d3.n1.d3.n2.2.2.2.1 + + + + + ti.d3.n1.d3.n2.2.2.2.2 + + + + + ti.d3.n1.d3.n2.2.2.2.3 + + + + + ti.d3.n1.d3.n2.2.2.3.1 + + + + + ti.d3.n1.d3.n2.2.2.3.2 + + + + + ti.d3.n1.d3.n2.2.2.3.3 + + + + + ti.d3.n1.d3.n2.2.3.1.1 + + + + + ti.d3.n1.d3.n2.2.3.1.2 + + + + + ti.d3.n1.d3.n2.2.3.1.3 + + + + + ti.d3.n1.d3.n2.2.3.2.1 + + + + + ti.d3.n1.d3.n2.2.3.2.2 + + + + + ti.d3.n1.d3.n2.2.3.2.3 + + + + + ti.d3.n1.d3.n2.2.3.3.1 + + + + + ti.d3.n1.d3.n2.2.3.3.2 + + + + + ti.d3.n1.d3.n2.2.3.3.3 + + + + + ti.d3.n1.d3.n2.3.1.1.1 + + + + + ti.d3.n1.d3.n2.3.1.1.2 + + + + + ti.d3.n1.d3.n2.3.1.1.3 + + + + + ti.d3.n1.d3.n2.3.1.2.1 + + + + + ti.d3.n1.d3.n2.3.1.2.2 + + + + + ti.d3.n1.d3.n2.3.1.2.3 + + + + + ti.d3.n1.d3.n2.3.1.3.1 + + + + + ti.d3.n1.d3.n2.3.1.3.2 + + + + + ti.d3.n1.d3.n2.3.1.3.3 + + + + + ti.d3.n1.d3.n2.3.2.1.1 + + + + + ti.d3.n1.d3.n2.3.2.1.2 + + + + + ti.d3.n1.d3.n2.3.2.1.3 + + + + + ti.d3.n1.d3.n2.3.2.2.1 + + + + + ti.d3.n1.d3.n2.3.2.2.2 + + + + + ti.d3.n1.d3.n2.3.2.2.3 + + + + + ti.d3.n1.d3.n2.3.2.3.1 + + + + + ti.d3.n1.d3.n2.3.2.3.2 + + + + + ti.d3.n1.d3.n2.3.2.3.3 + + + + + ti.d3.n1.d3.n2.3.3.1.1 + + + + + ti.d3.n1.d3.n2.3.3.1.2 + + + + + ti.d3.n1.d3.n2.3.3.1.3 + + + + + ti.d3.n1.d3.n2.3.3.2.1 + + + + + ti.d3.n1.d3.n2.3.3.2.2 + + + + + ti.d3.n1.d3.n2.3.3.2.3 + + + + + ti.d3.n1.d3.n2.3.3.3.1 + + + + + ti.d3.n1.d3.n2.3.3.3.2 + + + + + ti.d3.n1.d3.n2.3.3.3.3 + + + + + ti.d3.n1.d4.n1.1.1.1.1 + + + + + ti.d3.n1.d4.n1.1.1.1.2 + + + + + ti.d3.n1.d4.n1.1.1.1.3 + + + + + ti.d3.n1.d4.n1.1.1.2.1 + + + + + ti.d3.n1.d4.n1.1.1.2.2 + + + + + ti.d3.n1.d4.n1.1.1.2.3 + + + + + ti.d3.n1.d4.n1.1.1.3.1 + + + + + ti.d3.n1.d4.n1.1.1.3.2 + + + + + ti.d3.n1.d4.n1.1.1.3.3 + + + + + ti.d3.n1.d4.n1.1.2.1.1 + + + + + ti.d3.n1.d4.n1.1.2.1.2 + + + + + ti.d3.n1.d4.n1.1.2.1.3 + + + + + ti.d3.n1.d4.n1.1.2.2.1 + + + + + ti.d3.n1.d4.n1.1.2.2.2 + + + + + ti.d3.n1.d4.n1.1.2.2.3 + + + + + ti.d3.n1.d4.n1.1.2.3.1 + + + + + ti.d3.n1.d4.n1.1.2.3.2 + + + + + ti.d3.n1.d4.n1.1.2.3.3 + + + + + ti.d3.n1.d4.n1.1.3.1.1 + + + + + ti.d3.n1.d4.n1.1.3.1.2 + + + + + ti.d3.n1.d4.n1.1.3.1.3 + + + + + ti.d3.n1.d4.n1.1.3.2.1 + + + + + ti.d3.n1.d4.n1.1.3.2.2 + + + + + ti.d3.n1.d4.n1.1.3.2.3 + + + + + ti.d3.n1.d4.n1.1.3.3.1 + + + + + ti.d3.n1.d4.n1.1.3.3.2 + + + + + ti.d3.n1.d4.n1.1.3.3.3 + + + + + ti.d3.n1.d4.n1.2.1.1.1 + + + + + ti.d3.n1.d4.n1.2.1.1.2 + + + + + ti.d3.n1.d4.n1.2.1.1.3 + + + + + ti.d3.n1.d4.n1.2.1.2.1 + + + + + ti.d3.n1.d4.n1.2.1.2.2 + + + + + ti.d3.n1.d4.n1.2.1.2.3 + + + + + ti.d3.n1.d4.n1.2.1.3.1 + + + + + ti.d3.n1.d4.n1.2.1.3.2 + + + + + ti.d3.n1.d4.n1.2.1.3.3 + + + + + ti.d3.n1.d4.n1.2.2.1.1 + + + + + ti.d3.n1.d4.n1.2.2.1.2 + + + + + ti.d3.n1.d4.n1.2.2.1.3 + + + + + ti.d3.n1.d4.n1.2.2.2.1 + + + + + ti.d3.n1.d4.n1.2.2.2.2 + + + + + ti.d3.n1.d4.n1.2.2.2.3 + + + + + ti.d3.n1.d4.n1.2.2.3.1 + + + + + ti.d3.n1.d4.n1.2.2.3.2 + + + + + ti.d3.n1.d4.n1.2.2.3.3 + + + + + ti.d3.n1.d4.n1.2.3.1.1 + + + + + ti.d3.n1.d4.n1.2.3.1.2 + + + + + ti.d3.n1.d4.n1.2.3.1.3 + + + + + ti.d3.n1.d4.n1.2.3.2.1 + + + + + ti.d3.n1.d4.n1.2.3.2.2 + + + + + ti.d3.n1.d4.n1.2.3.2.3 + + + + + ti.d3.n1.d4.n1.2.3.3.1 + + + + + ti.d3.n1.d4.n1.2.3.3.2 + + + + + ti.d3.n1.d4.n1.2.3.3.3 + + + + + ti.d3.n1.d4.n1.3.1.1.1 + + + + + ti.d3.n1.d4.n1.3.1.1.2 + + + + + ti.d3.n1.d4.n1.3.1.1.3 + + + + + ti.d3.n1.d4.n1.3.1.2.1 + + + + + ti.d3.n1.d4.n1.3.1.2.2 + + + + + ti.d3.n1.d4.n1.3.1.2.3 + + + + + ti.d3.n1.d4.n1.3.1.3.1 + + + + + ti.d3.n1.d4.n1.3.1.3.2 + + + + + ti.d3.n1.d4.n1.3.1.3.3 + + + + + ti.d3.n1.d4.n1.3.2.1.1 + + + + + ti.d3.n1.d4.n1.3.2.1.2 + + + + + ti.d3.n1.d4.n1.3.2.1.3 + + + + + ti.d3.n1.d4.n1.3.2.2.1 + + + + + ti.d3.n1.d4.n1.3.2.2.2 + + + + + ti.d3.n1.d4.n1.3.2.2.3 + + + + + ti.d3.n1.d4.n1.3.2.3.1 + + + + + ti.d3.n1.d4.n1.3.2.3.2 + + + + + ti.d3.n1.d4.n1.3.2.3.3 + + + + + ti.d3.n1.d4.n1.3.3.1.1 + + + + + ti.d3.n1.d4.n1.3.3.1.2 + + + + + ti.d3.n1.d4.n1.3.3.1.3 + + + + + ti.d3.n1.d4.n1.3.3.2.1 + + + + + ti.d3.n1.d4.n1.3.3.2.2 + + + + + ti.d3.n1.d4.n1.3.3.2.3 + + + + + ti.d3.n1.d4.n1.3.3.3.1 + + + + + ti.d3.n1.d4.n1.3.3.3.2 + + + + + ti.d3.n1.d4.n1.3.3.3.3 + + + + + ti.d3.n1.d4.n2.1.1.1.1 + + + + + ti.d3.n1.d4.n2.1.1.1.2 + + + + + ti.d3.n1.d4.n2.1.1.1.3 + + + + + ti.d3.n1.d4.n2.1.1.2.1 + + + + + ti.d3.n1.d4.n2.1.1.2.2 + + + + + ti.d3.n1.d4.n2.1.1.2.3 + + + + + ti.d3.n1.d4.n2.1.1.3.1 + + + + + ti.d3.n1.d4.n2.1.1.3.2 + + + + + ti.d3.n1.d4.n2.1.1.3.3 + + + + + ti.d3.n1.d4.n2.1.2.1.1 + + + + + ti.d3.n1.d4.n2.1.2.1.2 + + + + + ti.d3.n1.d4.n2.1.2.1.3 + + + + + ti.d3.n1.d4.n2.1.2.2.1 + + + + + ti.d3.n1.d4.n2.1.2.2.2 + + + + + ti.d3.n1.d4.n2.1.2.2.3 + + + + + ti.d3.n1.d4.n2.1.2.3.1 + + + + + ti.d3.n1.d4.n2.1.2.3.2 + + + + + ti.d3.n1.d4.n2.1.2.3.3 + + + + + ti.d3.n1.d4.n2.1.3.1.1 + + + + + ti.d3.n1.d4.n2.1.3.1.2 + + + + + ti.d3.n1.d4.n2.1.3.1.3 + + + + + ti.d3.n1.d4.n2.1.3.2.1 + + + + + ti.d3.n1.d4.n2.1.3.2.2 + + + + + ti.d3.n1.d4.n2.1.3.2.3 + + + + + ti.d3.n1.d4.n2.1.3.3.1 + + + + + ti.d3.n1.d4.n2.1.3.3.2 + + + + + ti.d3.n1.d4.n2.1.3.3.3 + + + + + ti.d3.n1.d4.n2.2.1.1.1 + + + + + ti.d3.n1.d4.n2.2.1.1.2 + + + + + ti.d3.n1.d4.n2.2.1.1.3 + + + + + ti.d3.n1.d4.n2.2.1.2.1 + + + + + ti.d3.n1.d4.n2.2.1.2.2 + + + + + ti.d3.n1.d4.n2.2.1.2.3 + + + + + ti.d3.n1.d4.n2.2.1.3.1 + + + + + ti.d3.n1.d4.n2.2.1.3.2 + + + + + ti.d3.n1.d4.n2.2.1.3.3 + + + + + ti.d3.n1.d4.n2.2.2.1.1 + + + + + ti.d3.n1.d4.n2.2.2.1.2 + + + + + ti.d3.n1.d4.n2.2.2.1.3 + + + + + ti.d3.n1.d4.n2.2.2.2.1 + + + + + ti.d3.n1.d4.n2.2.2.2.2 + + + + + ti.d3.n1.d4.n2.2.2.2.3 + + + + + ti.d3.n1.d4.n2.2.2.3.1 + + + + + ti.d3.n1.d4.n2.2.2.3.2 + + + + + ti.d3.n1.d4.n2.2.2.3.3 + + + + + ti.d3.n1.d4.n2.2.3.1.1 + + + + + ti.d3.n1.d4.n2.2.3.1.2 + + + + + ti.d3.n1.d4.n2.2.3.1.3 + + + + + ti.d3.n1.d4.n2.2.3.2.1 + + + + + ti.d3.n1.d4.n2.2.3.2.2 + + + + + ti.d3.n1.d4.n2.2.3.2.3 + + + + + ti.d3.n1.d4.n2.2.3.3.1 + + + + + ti.d3.n1.d4.n2.2.3.3.2 + + + + + ti.d3.n1.d4.n2.2.3.3.3 + + + + + ti.d3.n1.d4.n2.3.1.1.1 + + + + + ti.d3.n1.d4.n2.3.1.1.2 + + + + + ti.d3.n1.d4.n2.3.1.1.3 + + + + + ti.d3.n1.d4.n2.3.1.2.1 + + + + + ti.d3.n1.d4.n2.3.1.2.2 + + + + + ti.d3.n1.d4.n2.3.1.2.3 + + + + + ti.d3.n1.d4.n2.3.1.3.1 + + + + + ti.d3.n1.d4.n2.3.1.3.2 + + + + + ti.d3.n1.d4.n2.3.1.3.3 + + + + + ti.d3.n1.d4.n2.3.2.1.1 + + + + + ti.d3.n1.d4.n2.3.2.1.2 + + + + + ti.d3.n1.d4.n2.3.2.1.3 + + + + + ti.d3.n1.d4.n2.3.2.2.1 + + + + + ti.d3.n1.d4.n2.3.2.2.2 + + + + + ti.d3.n1.d4.n2.3.2.2.3 + + + + + ti.d3.n1.d4.n2.3.2.3.1 + + + + + ti.d3.n1.d4.n2.3.2.3.2 + + + + + ti.d3.n1.d4.n2.3.2.3.3 + + + + + ti.d3.n1.d4.n2.3.3.1.1 + + + + + ti.d3.n1.d4.n2.3.3.1.2 + + + + + ti.d3.n1.d4.n2.3.3.1.3 + + + + + ti.d3.n1.d4.n2.3.3.2.1 + + + + + ti.d3.n1.d4.n2.3.3.2.2 + + + + + ti.d3.n1.d4.n2.3.3.2.3 + + + + + ti.d3.n1.d4.n2.3.3.3.1 + + + + + ti.d3.n1.d4.n2.3.3.3.2 + + + + + ti.d3.n1.d4.n2.3.3.3.3 + + + + + ti.d3.n2.d1.n1.1.1.1.1 + + + + + ti.d3.n2.d1.n1.1.1.1.2 + + + + + ti.d3.n2.d1.n1.1.1.1.3 + + + + + ti.d3.n2.d1.n1.1.1.2.1 + + + + + ti.d3.n2.d1.n1.1.1.2.2 + + + + + ti.d3.n2.d1.n1.1.1.2.3 + + + + + ti.d3.n2.d1.n1.1.1.3.1 + + + + + ti.d3.n2.d1.n1.1.1.3.2 + + + + + ti.d3.n2.d1.n1.1.1.3.3 + + + + + ti.d3.n2.d1.n1.1.2.1.1 + + + + + ti.d3.n2.d1.n1.1.2.1.2 + + + + + ti.d3.n2.d1.n1.1.2.1.3 + + + + + ti.d3.n2.d1.n1.1.2.2.1 + + + + + ti.d3.n2.d1.n1.1.2.2.2 + + + + + ti.d3.n2.d1.n1.1.2.2.3 + + + + + ti.d3.n2.d1.n1.1.2.3.1 + + + + + ti.d3.n2.d1.n1.1.2.3.2 + + + + + ti.d3.n2.d1.n1.1.2.3.3 + + + + + ti.d3.n2.d1.n1.1.3.1.1 + + + + + ti.d3.n2.d1.n1.1.3.1.2 + + + + + ti.d3.n2.d1.n1.1.3.1.3 + + + + + ti.d3.n2.d1.n1.1.3.2.1 + + + + + ti.d3.n2.d1.n1.1.3.2.2 + + + + + ti.d3.n2.d1.n1.1.3.2.3 + + + + + ti.d3.n2.d1.n1.1.3.3.1 + + + + + ti.d3.n2.d1.n1.1.3.3.2 + + + + + ti.d3.n2.d1.n1.1.3.3.3 + + + + + ti.d3.n2.d1.n1.2.1.1.1 + + + + + ti.d3.n2.d1.n1.2.1.1.2 + + + + + ti.d3.n2.d1.n1.2.1.1.3 + + + + + ti.d3.n2.d1.n1.2.1.2.1 + + + + + ti.d3.n2.d1.n1.2.1.2.2 + + + + + ti.d3.n2.d1.n1.2.1.2.3 + + + + + ti.d3.n2.d1.n1.2.1.3.1 + + + + + ti.d3.n2.d1.n1.2.1.3.2 + + + + + ti.d3.n2.d1.n1.2.1.3.3 + + + + + ti.d3.n2.d1.n1.2.2.1.1 + + + + + ti.d3.n2.d1.n1.2.2.1.2 + + + + + ti.d3.n2.d1.n1.2.2.1.3 + + + + + ti.d3.n2.d1.n1.2.2.2.1 + + + + + ti.d3.n2.d1.n1.2.2.2.2 + + + + + ti.d3.n2.d1.n1.2.2.2.3 + + + + + ti.d3.n2.d1.n1.2.2.3.1 + + + + + ti.d3.n2.d1.n1.2.2.3.2 + + + + + ti.d3.n2.d1.n1.2.2.3.3 + + + + + ti.d3.n2.d1.n1.2.3.1.1 + + + + + ti.d3.n2.d1.n1.2.3.1.2 + + + + + ti.d3.n2.d1.n1.2.3.1.3 + + + + + ti.d3.n2.d1.n1.2.3.2.1 + + + + + ti.d3.n2.d1.n1.2.3.2.2 + + + + + ti.d3.n2.d1.n1.2.3.2.3 + + + + + ti.d3.n2.d1.n1.2.3.3.1 + + + + + ti.d3.n2.d1.n1.2.3.3.2 + + + + + ti.d3.n2.d1.n1.2.3.3.3 + + + + + ti.d3.n2.d1.n1.3.1.1.1 + + + + + ti.d3.n2.d1.n1.3.1.1.2 + + + + + ti.d3.n2.d1.n1.3.1.1.3 + + + + + ti.d3.n2.d1.n1.3.1.2.1 + + + + + ti.d3.n2.d1.n1.3.1.2.2 + + + + + ti.d3.n2.d1.n1.3.1.2.3 + + + + + ti.d3.n2.d1.n1.3.1.3.1 + + + + + ti.d3.n2.d1.n1.3.1.3.2 + + + + + ti.d3.n2.d1.n1.3.1.3.3 + + + + + ti.d3.n2.d1.n1.3.2.1.1 + + + + + ti.d3.n2.d1.n1.3.2.1.2 + + + + + ti.d3.n2.d1.n1.3.2.1.3 + + + + + ti.d3.n2.d1.n1.3.2.2.1 + + + + + ti.d3.n2.d1.n1.3.2.2.2 + + + + + ti.d3.n2.d1.n1.3.2.2.3 + + + + + ti.d3.n2.d1.n1.3.2.3.1 + + + + + ti.d3.n2.d1.n1.3.2.3.2 + + + + + ti.d3.n2.d1.n1.3.2.3.3 + + + + + ti.d3.n2.d1.n1.3.3.1.1 + + + + + ti.d3.n2.d1.n1.3.3.1.2 + + + + + ti.d3.n2.d1.n1.3.3.1.3 + + + + + ti.d3.n2.d1.n1.3.3.2.1 + + + + + ti.d3.n2.d1.n1.3.3.2.2 + + + + + ti.d3.n2.d1.n1.3.3.2.3 + + + + + ti.d3.n2.d1.n1.3.3.3.1 + + + + + ti.d3.n2.d1.n1.3.3.3.2 + + + + + ti.d3.n2.d1.n1.3.3.3.3 + + + + + ti.d3.n2.d1.n2.1.1.1.1 + + + + + ti.d3.n2.d1.n2.1.1.1.2 + + + + + ti.d3.n2.d1.n2.1.1.1.3 + + + + + ti.d3.n2.d1.n2.1.1.2.1 + + + + + ti.d3.n2.d1.n2.1.1.2.2 + + + + + ti.d3.n2.d1.n2.1.1.2.3 + + + + + ti.d3.n2.d1.n2.1.1.3.1 + + + + + ti.d3.n2.d1.n2.1.1.3.2 + + + + + ti.d3.n2.d1.n2.1.1.3.3 + + + + + ti.d3.n2.d1.n2.1.2.1.1 + + + + + ti.d3.n2.d1.n2.1.2.1.2 + + + + + ti.d3.n2.d1.n2.1.2.1.3 + + + + + ti.d3.n2.d1.n2.1.2.2.1 + + + + + ti.d3.n2.d1.n2.1.2.2.2 + + + + + ti.d3.n2.d1.n2.1.2.2.3 + + + + + ti.d3.n2.d1.n2.1.2.3.1 + + + + + ti.d3.n2.d1.n2.1.2.3.2 + + + + + ti.d3.n2.d1.n2.1.2.3.3 + + + + + ti.d3.n2.d1.n2.1.3.1.1 + + + + + ti.d3.n2.d1.n2.1.3.1.2 + + + + + ti.d3.n2.d1.n2.1.3.1.3 + + + + + ti.d3.n2.d1.n2.1.3.2.1 + + + + + ti.d3.n2.d1.n2.1.3.2.2 + + + + + ti.d3.n2.d1.n2.1.3.2.3 + + + + + ti.d3.n2.d1.n2.1.3.3.1 + + + + + ti.d3.n2.d1.n2.1.3.3.2 + + + + + ti.d3.n2.d1.n2.1.3.3.3 + + + + + ti.d3.n2.d1.n2.2.1.1.1 + + + + + ti.d3.n2.d1.n2.2.1.1.2 + + + + + ti.d3.n2.d1.n2.2.1.1.3 + + + + + ti.d3.n2.d1.n2.2.1.2.1 + + + + + ti.d3.n2.d1.n2.2.1.2.2 + + + + + ti.d3.n2.d1.n2.2.1.2.3 + + + + + ti.d3.n2.d1.n2.2.1.3.1 + + + + + ti.d3.n2.d1.n2.2.1.3.2 + + + + + ti.d3.n2.d1.n2.2.1.3.3 + + + + + ti.d3.n2.d1.n2.2.2.1.1 + + + + + ti.d3.n2.d1.n2.2.2.1.2 + + + + + ti.d3.n2.d1.n2.2.2.1.3 + + + + + ti.d3.n2.d1.n2.2.2.2.1 + + + + + ti.d3.n2.d1.n2.2.2.2.2 + + + + + ti.d3.n2.d1.n2.2.2.2.3 + + + + + ti.d3.n2.d1.n2.2.2.3.1 + + + + + ti.d3.n2.d1.n2.2.2.3.2 + + + + + ti.d3.n2.d1.n2.2.2.3.3 + + + + + ti.d3.n2.d1.n2.2.3.1.1 + + + + + ti.d3.n2.d1.n2.2.3.1.2 + + + + + ti.d3.n2.d1.n2.2.3.1.3 + + + + + ti.d3.n2.d1.n2.2.3.2.1 + + + + + ti.d3.n2.d1.n2.2.3.2.2 + + + + + ti.d3.n2.d1.n2.2.3.2.3 + + + + + ti.d3.n2.d1.n2.2.3.3.1 + + + + + ti.d3.n2.d1.n2.2.3.3.2 + + + + + ti.d3.n2.d1.n2.2.3.3.3 + + + + + ti.d3.n2.d1.n2.3.1.1.1 + + + + + ti.d3.n2.d1.n2.3.1.1.2 + + + + + ti.d3.n2.d1.n2.3.1.1.3 + + + + + ti.d3.n2.d1.n2.3.1.2.1 + + + + + ti.d3.n2.d1.n2.3.1.2.2 + + + + + ti.d3.n2.d1.n2.3.1.2.3 + + + + + ti.d3.n2.d1.n2.3.1.3.1 + + + + + ti.d3.n2.d1.n2.3.1.3.2 + + + + + ti.d3.n2.d1.n2.3.1.3.3 + + + + + ti.d3.n2.d1.n2.3.2.1.1 + + + + + ti.d3.n2.d1.n2.3.2.1.2 + + + + + ti.d3.n2.d1.n2.3.2.1.3 + + + + + ti.d3.n2.d1.n2.3.2.2.1 + + + + + ti.d3.n2.d1.n2.3.2.2.2 + + + + + ti.d3.n2.d1.n2.3.2.2.3 + + + + + ti.d3.n2.d1.n2.3.2.3.1 + + + + + ti.d3.n2.d1.n2.3.2.3.2 + + + + + ti.d3.n2.d1.n2.3.2.3.3 + + + + + ti.d3.n2.d1.n2.3.3.1.1 + + + + + ti.d3.n2.d1.n2.3.3.1.2 + + + + + ti.d3.n2.d1.n2.3.3.1.3 + + + + + ti.d3.n2.d1.n2.3.3.2.1 + + + + + ti.d3.n2.d1.n2.3.3.2.2 + + + + + ti.d3.n2.d1.n2.3.3.2.3 + + + + + ti.d3.n2.d1.n2.3.3.3.1 + + + + + ti.d3.n2.d1.n2.3.3.3.2 + + + + + ti.d3.n2.d1.n2.3.3.3.3 + + + + + ti.d3.n2.d2.n1.1.1.1.1 + + + + + ti.d3.n2.d2.n1.1.1.1.2 + + + + + ti.d3.n2.d2.n1.1.1.1.3 + + + + + ti.d3.n2.d2.n1.1.1.2.1 + + + + + ti.d3.n2.d2.n1.1.1.2.2 + + + + + ti.d3.n2.d2.n1.1.1.2.3 + + + + + ti.d3.n2.d2.n1.1.1.3.1 + + + + + ti.d3.n2.d2.n1.1.1.3.2 + + + + + ti.d3.n2.d2.n1.1.1.3.3 + + + + + ti.d3.n2.d2.n1.1.2.1.1 + + + + + ti.d3.n2.d2.n1.1.2.1.2 + + + + + ti.d3.n2.d2.n1.1.2.1.3 + + + + + ti.d3.n2.d2.n1.1.2.2.1 + + + + + ti.d3.n2.d2.n1.1.2.2.2 + + + + + ti.d3.n2.d2.n1.1.2.2.3 + + + + + ti.d3.n2.d2.n1.1.2.3.1 + + + + + ti.d3.n2.d2.n1.1.2.3.2 + + + + + ti.d3.n2.d2.n1.1.2.3.3 + + + + + ti.d3.n2.d2.n1.1.3.1.1 + + + + + ti.d3.n2.d2.n1.1.3.1.2 + + + + + ti.d3.n2.d2.n1.1.3.1.3 + + + + + ti.d3.n2.d2.n1.1.3.2.1 + + + + + ti.d3.n2.d2.n1.1.3.2.2 + + + + + ti.d3.n2.d2.n1.1.3.2.3 + + + + + ti.d3.n2.d2.n1.1.3.3.1 + + + + + ti.d3.n2.d2.n1.1.3.3.2 + + + + + ti.d3.n2.d2.n1.1.3.3.3 + + + + + ti.d3.n2.d2.n1.2.1.1.1 + + + + + ti.d3.n2.d2.n1.2.1.1.2 + + + + + ti.d3.n2.d2.n1.2.1.1.3 + + + + + ti.d3.n2.d2.n1.2.1.2.1 + + + + + ti.d3.n2.d2.n1.2.1.2.2 + + + + + ti.d3.n2.d2.n1.2.1.2.3 + + + + + ti.d3.n2.d2.n1.2.1.3.1 + + + + + ti.d3.n2.d2.n1.2.1.3.2 + + + + + ti.d3.n2.d2.n1.2.1.3.3 + + + + + ti.d3.n2.d2.n1.2.2.1.1 + + + + + ti.d3.n2.d2.n1.2.2.1.2 + + + + + ti.d3.n2.d2.n1.2.2.1.3 + + + + + ti.d3.n2.d2.n1.2.2.2.1 + + + + + ti.d3.n2.d2.n1.2.2.2.2 + + + + + ti.d3.n2.d2.n1.2.2.2.3 + + + + + ti.d3.n2.d2.n1.2.2.3.1 + + + + + ti.d3.n2.d2.n1.2.2.3.2 + + + + + ti.d3.n2.d2.n1.2.2.3.3 + + + + + ti.d3.n2.d2.n1.2.3.1.1 + + + + + ti.d3.n2.d2.n1.2.3.1.2 + + + + + ti.d3.n2.d2.n1.2.3.1.3 + + + + + ti.d3.n2.d2.n1.2.3.2.1 + + + + + ti.d3.n2.d2.n1.2.3.2.2 + + + + + ti.d3.n2.d2.n1.2.3.2.3 + + + + + ti.d3.n2.d2.n1.2.3.3.1 + + + + + ti.d3.n2.d2.n1.2.3.3.2 + + + + + ti.d3.n2.d2.n1.2.3.3.3 + + + + + ti.d3.n2.d2.n1.3.1.1.1 + + + + + ti.d3.n2.d2.n1.3.1.1.2 + + + + + ti.d3.n2.d2.n1.3.1.1.3 + + + + + ti.d3.n2.d2.n1.3.1.2.1 + + + + + ti.d3.n2.d2.n1.3.1.2.2 + + + + + ti.d3.n2.d2.n1.3.1.2.3 + + + + + ti.d3.n2.d2.n1.3.1.3.1 + + + + + ti.d3.n2.d2.n1.3.1.3.2 + + + + + ti.d3.n2.d2.n1.3.1.3.3 + + + + + ti.d3.n2.d2.n1.3.2.1.1 + + + + + ti.d3.n2.d2.n1.3.2.1.2 + + + + + ti.d3.n2.d2.n1.3.2.1.3 + + + + + ti.d3.n2.d2.n1.3.2.2.1 + + + + + ti.d3.n2.d2.n1.3.2.2.2 + + + + + ti.d3.n2.d2.n1.3.2.2.3 + + + + + ti.d3.n2.d2.n1.3.2.3.1 + + + + + ti.d3.n2.d2.n1.3.2.3.2 + + + + + ti.d3.n2.d2.n1.3.2.3.3 + + + + + ti.d3.n2.d2.n1.3.3.1.1 + + + + + ti.d3.n2.d2.n1.3.3.1.2 + + + + + ti.d3.n2.d2.n1.3.3.1.3 + + + + + ti.d3.n2.d2.n1.3.3.2.1 + + + + + ti.d3.n2.d2.n1.3.3.2.2 + + + + + ti.d3.n2.d2.n1.3.3.2.3 + + + + + ti.d3.n2.d2.n1.3.3.3.1 + + + + + ti.d3.n2.d2.n1.3.3.3.2 + + + + + ti.d3.n2.d2.n1.3.3.3.3 + + + + + ti.d3.n2.d2.n2.1.1.1.1 + + + + + ti.d3.n2.d2.n2.1.1.1.2 + + + + + ti.d3.n2.d2.n2.1.1.1.3 + + + + + ti.d3.n2.d2.n2.1.1.2.1 + + + + + ti.d3.n2.d2.n2.1.1.2.2 + + + + + ti.d3.n2.d2.n2.1.1.2.3 + + + + + ti.d3.n2.d2.n2.1.1.3.1 + + + + + ti.d3.n2.d2.n2.1.1.3.2 + + + + + ti.d3.n2.d2.n2.1.1.3.3 + + + + + ti.d3.n2.d2.n2.1.2.1.1 + + + + + ti.d3.n2.d2.n2.1.2.1.2 + + + + + ti.d3.n2.d2.n2.1.2.1.3 + + + + + ti.d3.n2.d2.n2.1.2.2.1 + + + + + ti.d3.n2.d2.n2.1.2.2.2 + + + + + ti.d3.n2.d2.n2.1.2.2.3 + + + + + ti.d3.n2.d2.n2.1.2.3.1 + + + + + ti.d3.n2.d2.n2.1.2.3.2 + + + + + ti.d3.n2.d2.n2.1.2.3.3 + + + + + ti.d3.n2.d2.n2.1.3.1.1 + + + + + ti.d3.n2.d2.n2.1.3.1.2 + + + + + ti.d3.n2.d2.n2.1.3.1.3 + + + + + ti.d3.n2.d2.n2.1.3.2.1 + + + + + ti.d3.n2.d2.n2.1.3.2.2 + + + + + ti.d3.n2.d2.n2.1.3.2.3 + + + + + ti.d3.n2.d2.n2.1.3.3.1 + + + + + ti.d3.n2.d2.n2.1.3.3.2 + + + + + ti.d3.n2.d2.n2.1.3.3.3 + + + + + ti.d3.n2.d2.n2.2.1.1.1 + + + + + ti.d3.n2.d2.n2.2.1.1.2 + + + + + ti.d3.n2.d2.n2.2.1.1.3 + + + + + ti.d3.n2.d2.n2.2.1.2.1 + + + + + ti.d3.n2.d2.n2.2.1.2.2 + + + + + ti.d3.n2.d2.n2.2.1.2.3 + + + + + ti.d3.n2.d2.n2.2.1.3.1 + + + + + ti.d3.n2.d2.n2.2.1.3.2 + + + + + ti.d3.n2.d2.n2.2.1.3.3 + + + + + ti.d3.n2.d2.n2.2.2.1.1 + + + + + ti.d3.n2.d2.n2.2.2.1.2 + + + + + ti.d3.n2.d2.n2.2.2.1.3 + + + + + ti.d3.n2.d2.n2.2.2.2.1 + + + + + ti.d3.n2.d2.n2.2.2.2.2 + + + + + ti.d3.n2.d2.n2.2.2.2.3 + + + + + ti.d3.n2.d2.n2.2.2.3.1 + + + + + ti.d3.n2.d2.n2.2.2.3.2 + + + + + ti.d3.n2.d2.n2.2.2.3.3 + + + + + ti.d3.n2.d2.n2.2.3.1.1 + + + + + ti.d3.n2.d2.n2.2.3.1.2 + + + + + ti.d3.n2.d2.n2.2.3.1.3 + + + + + ti.d3.n2.d2.n2.2.3.2.1 + + + + + ti.d3.n2.d2.n2.2.3.2.2 + + + + + ti.d3.n2.d2.n2.2.3.2.3 + + + + + ti.d3.n2.d2.n2.2.3.3.1 + + + + + ti.d3.n2.d2.n2.2.3.3.2 + + + + + ti.d3.n2.d2.n2.2.3.3.3 + + + + + ti.d3.n2.d2.n2.3.1.1.1 + + + + + ti.d3.n2.d2.n2.3.1.1.2 + + + + + ti.d3.n2.d2.n2.3.1.1.3 + + + + + ti.d3.n2.d2.n2.3.1.2.1 + + + + + ti.d3.n2.d2.n2.3.1.2.2 + + + + + ti.d3.n2.d2.n2.3.1.2.3 + + + + + ti.d3.n2.d2.n2.3.1.3.1 + + + + + ti.d3.n2.d2.n2.3.1.3.2 + + + + + ti.d3.n2.d2.n2.3.1.3.3 + + + + + ti.d3.n2.d2.n2.3.2.1.1 + + + + + ti.d3.n2.d2.n2.3.2.1.2 + + + + + ti.d3.n2.d2.n2.3.2.1.3 + + + + + ti.d3.n2.d2.n2.3.2.2.1 + + + + + ti.d3.n2.d2.n2.3.2.2.2 + + + + + ti.d3.n2.d2.n2.3.2.2.3 + + + + + ti.d3.n2.d2.n2.3.2.3.1 + + + + + ti.d3.n2.d2.n2.3.2.3.2 + + + + + ti.d3.n2.d2.n2.3.2.3.3 + + + + + ti.d3.n2.d2.n2.3.3.1.1 + + + + + ti.d3.n2.d2.n2.3.3.1.2 + + + + + ti.d3.n2.d2.n2.3.3.1.3 + + + + + ti.d3.n2.d2.n2.3.3.2.1 + + + + + ti.d3.n2.d2.n2.3.3.2.2 + + + + + ti.d3.n2.d2.n2.3.3.2.3 + + + + + ti.d3.n2.d2.n2.3.3.3.1 + + + + + ti.d3.n2.d2.n2.3.3.3.2 + + + + + ti.d3.n2.d2.n2.3.3.3.3 + + + + + ti.d3.n2.d3.n1.1.1.1.1 + + + + + ti.d3.n2.d3.n1.1.1.1.2 + + + + + ti.d3.n2.d3.n1.1.1.1.3 + + + + + ti.d3.n2.d3.n1.1.1.2.1 + + + + + ti.d3.n2.d3.n1.1.1.2.2 + + + + + ti.d3.n2.d3.n1.1.1.2.3 + + + + + ti.d3.n2.d3.n1.1.1.3.1 + + + + + ti.d3.n2.d3.n1.1.1.3.2 + + + + + ti.d3.n2.d3.n1.1.1.3.3 + + + + + ti.d3.n2.d3.n1.1.2.1.1 + + + + + ti.d3.n2.d3.n1.1.2.1.2 + + + + + ti.d3.n2.d3.n1.1.2.1.3 + + + + + ti.d3.n2.d3.n1.1.2.2.1 + + + + + ti.d3.n2.d3.n1.1.2.2.2 + + + + + ti.d3.n2.d3.n1.1.2.2.3 + + + + + ti.d3.n2.d3.n1.1.2.3.1 + + + + + ti.d3.n2.d3.n1.1.2.3.2 + + + + + ti.d3.n2.d3.n1.1.2.3.3 + + + + + ti.d3.n2.d3.n1.1.3.1.1 + + + + + ti.d3.n2.d3.n1.1.3.1.2 + + + + + ti.d3.n2.d3.n1.1.3.1.3 + + + + + ti.d3.n2.d3.n1.1.3.2.1 + + + + + ti.d3.n2.d3.n1.1.3.2.2 + + + + + ti.d3.n2.d3.n1.1.3.2.3 + + + + + ti.d3.n2.d3.n1.1.3.3.1 + + + + + ti.d3.n2.d3.n1.1.3.3.2 + + + + + ti.d3.n2.d3.n1.1.3.3.3 + + + + + ti.d3.n2.d3.n1.2.1.1.1 + + + + + ti.d3.n2.d3.n1.2.1.1.2 + + + + + ti.d3.n2.d3.n1.2.1.1.3 + + + + + ti.d3.n2.d3.n1.2.1.2.1 + + + + + ti.d3.n2.d3.n1.2.1.2.2 + + + + + ti.d3.n2.d3.n1.2.1.2.3 + + + + + ti.d3.n2.d3.n1.2.1.3.1 + + + + + ti.d3.n2.d3.n1.2.1.3.2 + + + + + ti.d3.n2.d3.n1.2.1.3.3 + + + + + ti.d3.n2.d3.n1.2.2.1.1 + + + + + ti.d3.n2.d3.n1.2.2.1.2 + + + + + ti.d3.n2.d3.n1.2.2.1.3 + + + + + ti.d3.n2.d3.n1.2.2.2.1 + + + + + ti.d3.n2.d3.n1.2.2.2.2 + + + + + ti.d3.n2.d3.n1.2.2.2.3 + + + + + ti.d3.n2.d3.n1.2.2.3.1 + + + + + ti.d3.n2.d3.n1.2.2.3.2 + + + + + ti.d3.n2.d3.n1.2.2.3.3 + + + + + ti.d3.n2.d3.n1.2.3.1.1 + + + + + ti.d3.n2.d3.n1.2.3.1.2 + + + + + ti.d3.n2.d3.n1.2.3.1.3 + + + + + ti.d3.n2.d3.n1.2.3.2.1 + + + + + ti.d3.n2.d3.n1.2.3.2.2 + + + + + ti.d3.n2.d3.n1.2.3.2.3 + + + + + ti.d3.n2.d3.n1.2.3.3.1 + + + + + ti.d3.n2.d3.n1.2.3.3.2 + + + + + ti.d3.n2.d3.n1.2.3.3.3 + + + + + ti.d3.n2.d3.n1.3.1.1.1 + + + + + ti.d3.n2.d3.n1.3.1.1.2 + + + + + ti.d3.n2.d3.n1.3.1.1.3 + + + + + ti.d3.n2.d3.n1.3.1.2.1 + + + + + ti.d3.n2.d3.n1.3.1.2.2 + + + + + ti.d3.n2.d3.n1.3.1.2.3 + + + + + ti.d3.n2.d3.n1.3.1.3.1 + + + + + ti.d3.n2.d3.n1.3.1.3.2 + + + + + ti.d3.n2.d3.n1.3.1.3.3 + + + + + ti.d3.n2.d3.n1.3.2.1.1 + + + + + ti.d3.n2.d3.n1.3.2.1.2 + + + + + ti.d3.n2.d3.n1.3.2.1.3 + + + + + ti.d3.n2.d3.n1.3.2.2.1 + + + + + ti.d3.n2.d3.n1.3.2.2.2 + + + + + ti.d3.n2.d3.n1.3.2.2.3 + + + + + ti.d3.n2.d3.n1.3.2.3.1 + + + + + ti.d3.n2.d3.n1.3.2.3.2 + + + + + ti.d3.n2.d3.n1.3.2.3.3 + + + + + ti.d3.n2.d3.n1.3.3.1.1 + + + + + ti.d3.n2.d3.n1.3.3.1.2 + + + + + ti.d3.n2.d3.n1.3.3.1.3 + + + + + ti.d3.n2.d3.n1.3.3.2.1 + + + + + ti.d3.n2.d3.n1.3.3.2.2 + + + + + ti.d3.n2.d3.n1.3.3.2.3 + + + + + ti.d3.n2.d3.n1.3.3.3.1 + + + + + ti.d3.n2.d3.n1.3.3.3.2 + + + + + ti.d3.n2.d3.n1.3.3.3.3 + + + + + ti.d3.n2.d4.n1.1.1.1.1 + + + + + ti.d3.n2.d4.n1.1.1.1.2 + + + + + ti.d3.n2.d4.n1.1.1.1.3 + + + + + ti.d3.n2.d4.n1.1.1.2.1 + + + + + ti.d3.n2.d4.n1.1.1.2.2 + + + + + ti.d3.n2.d4.n1.1.1.2.3 + + + + + ti.d3.n2.d4.n1.1.1.3.1 + + + + + ti.d3.n2.d4.n1.1.1.3.2 + + + + + ti.d3.n2.d4.n1.1.1.3.3 + + + + + ti.d3.n2.d4.n1.1.2.1.1 + + + + + ti.d3.n2.d4.n1.1.2.1.2 + + + + + ti.d3.n2.d4.n1.1.2.1.3 + + + + + ti.d3.n2.d4.n1.1.2.2.1 + + + + + ti.d3.n2.d4.n1.1.2.2.2 + + + + + ti.d3.n2.d4.n1.1.2.2.3 + + + + + ti.d3.n2.d4.n1.1.2.3.1 + + + + + ti.d3.n2.d4.n1.1.2.3.2 + + + + + ti.d3.n2.d4.n1.1.2.3.3 + + + + + ti.d3.n2.d4.n1.1.3.1.1 + + + + + ti.d3.n2.d4.n1.1.3.1.2 + + + + + ti.d3.n2.d4.n1.1.3.1.3 + + + + + ti.d3.n2.d4.n1.1.3.2.1 + + + + + ti.d3.n2.d4.n1.1.3.2.2 + + + + + ti.d3.n2.d4.n1.1.3.2.3 + + + + + ti.d3.n2.d4.n1.1.3.3.1 + + + + + ti.d3.n2.d4.n1.1.3.3.2 + + + + + ti.d3.n2.d4.n1.1.3.3.3 + + + + + ti.d3.n2.d4.n1.2.1.1.1 + + + + + ti.d3.n2.d4.n1.2.1.1.2 + + + + + ti.d3.n2.d4.n1.2.1.1.3 + + + + + ti.d3.n2.d4.n1.2.1.2.1 + + + + + ti.d3.n2.d4.n1.2.1.2.2 + + + + + ti.d3.n2.d4.n1.2.1.2.3 + + + + + ti.d3.n2.d4.n1.2.1.3.1 + + + + + ti.d3.n2.d4.n1.2.1.3.2 + + + + + ti.d3.n2.d4.n1.2.1.3.3 + + + + + ti.d3.n2.d4.n1.2.2.1.1 + + + + + ti.d3.n2.d4.n1.2.2.1.2 + + + + + ti.d3.n2.d4.n1.2.2.1.3 + + + + + ti.d3.n2.d4.n1.2.2.2.1 + + + + + ti.d3.n2.d4.n1.2.2.2.2 + + + + + ti.d3.n2.d4.n1.2.2.2.3 + + + + + ti.d3.n2.d4.n1.2.2.3.1 + + + + + ti.d3.n2.d4.n1.2.2.3.2 + + + + + ti.d3.n2.d4.n1.2.2.3.3 + + + + + ti.d3.n2.d4.n1.2.3.1.1 + + + + + ti.d3.n2.d4.n1.2.3.1.2 + + + + + ti.d3.n2.d4.n1.2.3.1.3 + + + + + ti.d3.n2.d4.n1.2.3.2.1 + + + + + ti.d3.n2.d4.n1.2.3.2.2 + + + + + ti.d3.n2.d4.n1.2.3.2.3 + + + + + ti.d3.n2.d4.n1.2.3.3.1 + + + + + ti.d3.n2.d4.n1.2.3.3.2 + + + + + ti.d3.n2.d4.n1.2.3.3.3 + + + + + ti.d3.n2.d4.n1.3.1.1.1 + + + + + ti.d3.n2.d4.n1.3.1.1.2 + + + + + ti.d3.n2.d4.n1.3.1.1.3 + + + + + ti.d3.n2.d4.n1.3.1.2.1 + + + + + ti.d3.n2.d4.n1.3.1.2.2 + + + + + ti.d3.n2.d4.n1.3.1.2.3 + + + + + ti.d3.n2.d4.n1.3.1.3.1 + + + + + ti.d3.n2.d4.n1.3.1.3.2 + + + + + ti.d3.n2.d4.n1.3.1.3.3 + + + + + ti.d3.n2.d4.n1.3.2.1.1 + + + + + ti.d3.n2.d4.n1.3.2.1.2 + + + + + ti.d3.n2.d4.n1.3.2.1.3 + + + + + ti.d3.n2.d4.n1.3.2.2.1 + + + + + ti.d3.n2.d4.n1.3.2.2.2 + + + + + ti.d3.n2.d4.n1.3.2.2.3 + + + + + ti.d3.n2.d4.n1.3.2.3.1 + + + + + ti.d3.n2.d4.n1.3.2.3.2 + + + + + ti.d3.n2.d4.n1.3.2.3.3 + + + + + ti.d3.n2.d4.n1.3.3.1.1 + + + + + ti.d3.n2.d4.n1.3.3.1.2 + + + + + ti.d3.n2.d4.n1.3.3.1.3 + + + + + ti.d3.n2.d4.n1.3.3.2.1 + + + + + ti.d3.n2.d4.n1.3.3.2.2 + + + + + ti.d3.n2.d4.n1.3.3.2.3 + + + + + ti.d3.n2.d4.n1.3.3.3.1 + + + + + ti.d3.n2.d4.n1.3.3.3.2 + + + + + ti.d3.n2.d4.n1.3.3.3.3 + + + + + ti.d3.n2.d4.n2.1.1.1.1 + + + + + ti.d3.n2.d4.n2.1.1.1.2 + + + + + ti.d3.n2.d4.n2.1.1.1.3 + + + + + ti.d3.n2.d4.n2.1.1.2.1 + + + + + ti.d3.n2.d4.n2.1.1.2.2 + + + + + ti.d3.n2.d4.n2.1.1.2.3 + + + + + ti.d3.n2.d4.n2.1.1.3.1 + + + + + ti.d3.n2.d4.n2.1.1.3.2 + + + + + ti.d3.n2.d4.n2.1.1.3.3 + + + + + ti.d3.n2.d4.n2.1.2.1.1 + + + + + ti.d3.n2.d4.n2.1.2.1.2 + + + + + ti.d3.n2.d4.n2.1.2.1.3 + + + + + ti.d3.n2.d4.n2.1.2.2.1 + + + + + ti.d3.n2.d4.n2.1.2.2.2 + + + + + ti.d3.n2.d4.n2.1.2.2.3 + + + + + ti.d3.n2.d4.n2.1.2.3.1 + + + + + ti.d3.n2.d4.n2.1.2.3.2 + + + + + ti.d3.n2.d4.n2.1.2.3.3 + + + + + ti.d3.n2.d4.n2.1.3.1.1 + + + + + ti.d3.n2.d4.n2.1.3.1.2 + + + + + ti.d3.n2.d4.n2.1.3.1.3 + + + + + ti.d3.n2.d4.n2.1.3.2.1 + + + + + ti.d3.n2.d4.n2.1.3.2.2 + + + + + ti.d3.n2.d4.n2.1.3.2.3 + + + + + ti.d3.n2.d4.n2.1.3.3.1 + + + + + ti.d3.n2.d4.n2.1.3.3.2 + + + + + ti.d3.n2.d4.n2.1.3.3.3 + + + + + ti.d3.n2.d4.n2.2.1.1.1 + + + + + ti.d3.n2.d4.n2.2.1.1.2 + + + + + ti.d3.n2.d4.n2.2.1.1.3 + + + + + ti.d3.n2.d4.n2.2.1.2.1 + + + + + ti.d3.n2.d4.n2.2.1.2.2 + + + + + ti.d3.n2.d4.n2.2.1.2.3 + + + + + ti.d3.n2.d4.n2.2.1.3.1 + + + + + ti.d3.n2.d4.n2.2.1.3.2 + + + + + ti.d3.n2.d4.n2.2.1.3.3 + + + + + ti.d3.n2.d4.n2.2.2.1.1 + + + + + ti.d3.n2.d4.n2.2.2.1.2 + + + + + ti.d3.n2.d4.n2.2.2.1.3 + + + + + ti.d3.n2.d4.n2.2.2.2.1 + + + + + ti.d3.n2.d4.n2.2.2.2.2 + + + + + ti.d3.n2.d4.n2.2.2.2.3 + + + + + ti.d3.n2.d4.n2.2.2.3.1 + + + + + ti.d3.n2.d4.n2.2.2.3.2 + + + + + ti.d3.n2.d4.n2.2.2.3.3 + + + + + ti.d3.n2.d4.n2.2.3.1.1 + + + + + ti.d3.n2.d4.n2.2.3.1.2 + + + + + ti.d3.n2.d4.n2.2.3.1.3 + + + + + ti.d3.n2.d4.n2.2.3.2.1 + + + + + ti.d3.n2.d4.n2.2.3.2.2 + + + + + ti.d3.n2.d4.n2.2.3.2.3 + + + + + ti.d3.n2.d4.n2.2.3.3.1 + + + + + ti.d3.n2.d4.n2.2.3.3.2 + + + + + ti.d3.n2.d4.n2.2.3.3.3 + + + + + ti.d3.n2.d4.n2.3.1.1.1 + + + + + ti.d3.n2.d4.n2.3.1.1.2 + + + + + ti.d3.n2.d4.n2.3.1.1.3 + + + + + ti.d3.n2.d4.n2.3.1.2.1 + + + + + ti.d3.n2.d4.n2.3.1.2.2 + + + + + ti.d3.n2.d4.n2.3.1.2.3 + + + + + ti.d3.n2.d4.n2.3.1.3.1 + + + + + ti.d3.n2.d4.n2.3.1.3.2 + + + + + ti.d3.n2.d4.n2.3.1.3.3 + + + + + ti.d3.n2.d4.n2.3.2.1.1 + + + + + ti.d3.n2.d4.n2.3.2.1.2 + + + + + ti.d3.n2.d4.n2.3.2.1.3 + + + + + ti.d3.n2.d4.n2.3.2.2.1 + + + + + ti.d3.n2.d4.n2.3.2.2.2 + + + + + ti.d3.n2.d4.n2.3.2.2.3 + + + + + ti.d3.n2.d4.n2.3.2.3.1 + + + + + ti.d3.n2.d4.n2.3.2.3.2 + + + + + ti.d3.n2.d4.n2.3.2.3.3 + + + + + ti.d3.n2.d4.n2.3.3.1.1 + + + + + ti.d3.n2.d4.n2.3.3.1.2 + + + + + ti.d3.n2.d4.n2.3.3.1.3 + + + + + ti.d3.n2.d4.n2.3.3.2.1 + + + + + ti.d3.n2.d4.n2.3.3.2.2 + + + + + ti.d3.n2.d4.n2.3.3.2.3 + + + + + ti.d3.n2.d4.n2.3.3.3.1 + + + + + ti.d3.n2.d4.n2.3.3.3.2 + + + + + ti.d3.n2.d4.n2.3.3.3.3 + + + + + ti.d4.n1.d1.n1.1.1.1.1 + + + + + ti.d4.n1.d1.n1.1.1.1.2 + + + + + ti.d4.n1.d1.n1.1.1.1.3 + + + + + ti.d4.n1.d1.n1.1.1.2.1 + + + + + ti.d4.n1.d1.n1.1.1.2.2 + + + + + ti.d4.n1.d1.n1.1.1.2.3 + + + + + ti.d4.n1.d1.n1.1.1.3.1 + + + + + ti.d4.n1.d1.n1.1.1.3.2 + + + + + ti.d4.n1.d1.n1.1.1.3.3 + + + + + ti.d4.n1.d1.n1.1.2.1.1 + + + + + ti.d4.n1.d1.n1.1.2.1.2 + + + + + ti.d4.n1.d1.n1.1.2.1.3 + + + + + ti.d4.n1.d1.n1.1.2.2.1 + + + + + ti.d4.n1.d1.n1.1.2.2.2 + + + + + ti.d4.n1.d1.n1.1.2.2.3 + + + + + ti.d4.n1.d1.n1.1.2.3.1 + + + + + ti.d4.n1.d1.n1.1.2.3.2 + + + + + ti.d4.n1.d1.n1.1.2.3.3 + + + + + ti.d4.n1.d1.n1.1.3.1.1 + + + + + ti.d4.n1.d1.n1.1.3.1.2 + + + + + ti.d4.n1.d1.n1.1.3.1.3 + + + + + ti.d4.n1.d1.n1.1.3.2.1 + + + + + ti.d4.n1.d1.n1.1.3.2.2 + + + + + ti.d4.n1.d1.n1.1.3.2.3 + + + + + ti.d4.n1.d1.n1.1.3.3.1 + + + + + ti.d4.n1.d1.n1.1.3.3.2 + + + + + ti.d4.n1.d1.n1.1.3.3.3 + + + + + ti.d4.n1.d1.n1.2.1.1.1 + + + + + ti.d4.n1.d1.n1.2.1.1.2 + + + + + ti.d4.n1.d1.n1.2.1.1.3 + + + + + ti.d4.n1.d1.n1.2.1.2.1 + + + + + ti.d4.n1.d1.n1.2.1.2.2 + + + + + ti.d4.n1.d1.n1.2.1.2.3 + + + + + ti.d4.n1.d1.n1.2.1.3.1 + + + + + ti.d4.n1.d1.n1.2.1.3.2 + + + + + ti.d4.n1.d1.n1.2.1.3.3 + + + + + ti.d4.n1.d1.n1.2.2.1.1 + + + + + ti.d4.n1.d1.n1.2.2.1.2 + + + + + ti.d4.n1.d1.n1.2.2.1.3 + + + + + ti.d4.n1.d1.n1.2.2.2.1 + + + + + ti.d4.n1.d1.n1.2.2.2.2 + + + + + ti.d4.n1.d1.n1.2.2.2.3 + + + + + ti.d4.n1.d1.n1.2.2.3.1 + + + + + ti.d4.n1.d1.n1.2.2.3.2 + + + + + ti.d4.n1.d1.n1.2.2.3.3 + + + + + ti.d4.n1.d1.n1.2.3.1.1 + + + + + ti.d4.n1.d1.n1.2.3.1.2 + + + + + ti.d4.n1.d1.n1.2.3.1.3 + + + + + ti.d4.n1.d1.n1.2.3.2.1 + + + + + ti.d4.n1.d1.n1.2.3.2.2 + + + + + ti.d4.n1.d1.n1.2.3.2.3 + + + + + ti.d4.n1.d1.n1.2.3.3.1 + + + + + ti.d4.n1.d1.n1.2.3.3.2 + + + + + ti.d4.n1.d1.n1.2.3.3.3 + + + + + ti.d4.n1.d1.n1.3.1.1.1 + + + + + ti.d4.n1.d1.n1.3.1.1.2 + + + + + ti.d4.n1.d1.n1.3.1.1.3 + + + + + ti.d4.n1.d1.n1.3.1.2.1 + + + + + ti.d4.n1.d1.n1.3.1.2.2 + + + + + ti.d4.n1.d1.n1.3.1.2.3 + + + + + ti.d4.n1.d1.n1.3.1.3.1 + + + + + ti.d4.n1.d1.n1.3.1.3.2 + + + + + ti.d4.n1.d1.n1.3.1.3.3 + + + + + ti.d4.n1.d1.n1.3.2.1.1 + + + + + ti.d4.n1.d1.n1.3.2.1.2 + + + + + ti.d4.n1.d1.n1.3.2.1.3 + + + + + ti.d4.n1.d1.n1.3.2.2.1 + + + + + ti.d4.n1.d1.n1.3.2.2.2 + + + + + ti.d4.n1.d1.n1.3.2.2.3 + + + + + ti.d4.n1.d1.n1.3.2.3.1 + + + + + ti.d4.n1.d1.n1.3.2.3.2 + + + + + ti.d4.n1.d1.n1.3.2.3.3 + + + + + ti.d4.n1.d1.n1.3.3.1.1 + + + + + ti.d4.n1.d1.n1.3.3.1.2 + + + + + ti.d4.n1.d1.n1.3.3.1.3 + + + + + ti.d4.n1.d1.n1.3.3.2.1 + + + + + ti.d4.n1.d1.n1.3.3.2.2 + + + + + ti.d4.n1.d1.n1.3.3.2.3 + + + + + ti.d4.n1.d1.n1.3.3.3.1 + + + + + ti.d4.n1.d1.n1.3.3.3.2 + + + + + ti.d4.n1.d1.n1.3.3.3.3 + + + + + ti.d4.n1.d1.n2.1.1.1.1 + + + + + ti.d4.n1.d1.n2.1.1.1.2 + + + + + ti.d4.n1.d1.n2.1.1.1.3 + + + + + ti.d4.n1.d1.n2.1.1.2.1 + + + + + ti.d4.n1.d1.n2.1.1.2.2 + + + + + ti.d4.n1.d1.n2.1.1.2.3 + + + + + ti.d4.n1.d1.n2.1.1.3.1 + + + + + ti.d4.n1.d1.n2.1.1.3.2 + + + + + ti.d4.n1.d1.n2.1.1.3.3 + + + + + ti.d4.n1.d1.n2.1.2.1.1 + + + + + ti.d4.n1.d1.n2.1.2.1.2 + + + + + ti.d4.n1.d1.n2.1.2.1.3 + + + + + ti.d4.n1.d1.n2.1.2.2.1 + + + + + ti.d4.n1.d1.n2.1.2.2.2 + + + + + ti.d4.n1.d1.n2.1.2.2.3 + + + + + ti.d4.n1.d1.n2.1.2.3.1 + + + + + ti.d4.n1.d1.n2.1.2.3.2 + + + + + ti.d4.n1.d1.n2.1.2.3.3 + + + + + ti.d4.n1.d1.n2.1.3.1.1 + + + + + ti.d4.n1.d1.n2.1.3.1.2 + + + + + ti.d4.n1.d1.n2.1.3.1.3 + + + + + ti.d4.n1.d1.n2.1.3.2.1 + + + + + ti.d4.n1.d1.n2.1.3.2.2 + + + + + ti.d4.n1.d1.n2.1.3.2.3 + + + + + ti.d4.n1.d1.n2.1.3.3.1 + + + + + ti.d4.n1.d1.n2.1.3.3.2 + + + + + ti.d4.n1.d1.n2.1.3.3.3 + + + + + ti.d4.n1.d1.n2.2.1.1.1 + + + + + ti.d4.n1.d1.n2.2.1.1.2 + + + + + ti.d4.n1.d1.n2.2.1.1.3 + + + + + ti.d4.n1.d1.n2.2.1.2.1 + + + + + ti.d4.n1.d1.n2.2.1.2.2 + + + + + ti.d4.n1.d1.n2.2.1.2.3 + + + + + ti.d4.n1.d1.n2.2.1.3.1 + + + + + ti.d4.n1.d1.n2.2.1.3.2 + + + + + ti.d4.n1.d1.n2.2.1.3.3 + + + + + ti.d4.n1.d1.n2.2.2.1.1 + + + + + ti.d4.n1.d1.n2.2.2.1.2 + + + + + ti.d4.n1.d1.n2.2.2.1.3 + + + + + ti.d4.n1.d1.n2.2.2.2.1 + + + + + ti.d4.n1.d1.n2.2.2.2.2 + + + + + ti.d4.n1.d1.n2.2.2.2.3 + + + + + ti.d4.n1.d1.n2.2.2.3.1 + + + + + ti.d4.n1.d1.n2.2.2.3.2 + + + + + ti.d4.n1.d1.n2.2.2.3.3 + + + + + ti.d4.n1.d1.n2.2.3.1.1 + + + + + ti.d4.n1.d1.n2.2.3.1.2 + + + + + ti.d4.n1.d1.n2.2.3.1.3 + + + + + ti.d4.n1.d1.n2.2.3.2.1 + + + + + ti.d4.n1.d1.n2.2.3.2.2 + + + + + ti.d4.n1.d1.n2.2.3.2.3 + + + + + ti.d4.n1.d1.n2.2.3.3.1 + + + + + ti.d4.n1.d1.n2.2.3.3.2 + + + + + ti.d4.n1.d1.n2.2.3.3.3 + + + + + ti.d4.n1.d1.n2.3.1.1.1 + + + + + ti.d4.n1.d1.n2.3.1.1.2 + + + + + ti.d4.n1.d1.n2.3.1.1.3 + + + + + ti.d4.n1.d1.n2.3.1.2.1 + + + + + ti.d4.n1.d1.n2.3.1.2.2 + + + + + ti.d4.n1.d1.n2.3.1.2.3 + + + + + ti.d4.n1.d1.n2.3.1.3.1 + + + + + ti.d4.n1.d1.n2.3.1.3.2 + + + + + ti.d4.n1.d1.n2.3.1.3.3 + + + + + ti.d4.n1.d1.n2.3.2.1.1 + + + + + ti.d4.n1.d1.n2.3.2.1.2 + + + + + ti.d4.n1.d1.n2.3.2.1.3 + + + + + ti.d4.n1.d1.n2.3.2.2.1 + + + + + ti.d4.n1.d1.n2.3.2.2.2 + + + + + ti.d4.n1.d1.n2.3.2.2.3 + + + + + ti.d4.n1.d1.n2.3.2.3.1 + + + + + ti.d4.n1.d1.n2.3.2.3.2 + + + + + ti.d4.n1.d1.n2.3.2.3.3 + + + + + ti.d4.n1.d1.n2.3.3.1.1 + + + + + ti.d4.n1.d1.n2.3.3.1.2 + + + + + ti.d4.n1.d1.n2.3.3.1.3 + + + + + ti.d4.n1.d1.n2.3.3.2.1 + + + + + ti.d4.n1.d1.n2.3.3.2.2 + + + + + ti.d4.n1.d1.n2.3.3.2.3 + + + + + ti.d4.n1.d1.n2.3.3.3.1 + + + + + ti.d4.n1.d1.n2.3.3.3.2 + + + + + ti.d4.n1.d1.n2.3.3.3.3 + + + + + ti.d4.n1.d2.n1.1.1.1.1 + + + + + ti.d4.n1.d2.n1.1.1.1.2 + + + + + ti.d4.n1.d2.n1.1.1.1.3 + + + + + ti.d4.n1.d2.n1.1.1.2.1 + + + + + ti.d4.n1.d2.n1.1.1.2.2 + + + + + ti.d4.n1.d2.n1.1.1.2.3 + + + + + ti.d4.n1.d2.n1.1.1.3.1 + + + + + ti.d4.n1.d2.n1.1.1.3.2 + + + + + ti.d4.n1.d2.n1.1.1.3.3 + + + + + ti.d4.n1.d2.n1.1.2.1.1 + + + + + ti.d4.n1.d2.n1.1.2.1.2 + + + + + ti.d4.n1.d2.n1.1.2.1.3 + + + + + ti.d4.n1.d2.n1.1.2.2.1 + + + + + ti.d4.n1.d2.n1.1.2.2.2 + + + + + ti.d4.n1.d2.n1.1.2.2.3 + + + + + ti.d4.n1.d2.n1.1.2.3.1 + + + + + ti.d4.n1.d2.n1.1.2.3.2 + + + + + ti.d4.n1.d2.n1.1.2.3.3 + + + + + ti.d4.n1.d2.n1.1.3.1.1 + + + + + ti.d4.n1.d2.n1.1.3.1.2 + + + + + ti.d4.n1.d2.n1.1.3.1.3 + + + + + ti.d4.n1.d2.n1.1.3.2.1 + + + + + ti.d4.n1.d2.n1.1.3.2.2 + + + + + ti.d4.n1.d2.n1.1.3.2.3 + + + + + ti.d4.n1.d2.n1.1.3.3.1 + + + + + ti.d4.n1.d2.n1.1.3.3.2 + + + + + ti.d4.n1.d2.n1.1.3.3.3 + + + + + ti.d4.n1.d2.n1.2.1.1.1 + + + + + ti.d4.n1.d2.n1.2.1.1.2 + + + + + ti.d4.n1.d2.n1.2.1.1.3 + + + + + ti.d4.n1.d2.n1.2.1.2.1 + + + + + ti.d4.n1.d2.n1.2.1.2.2 + + + + + ti.d4.n1.d2.n1.2.1.2.3 + + + + + ti.d4.n1.d2.n1.2.1.3.1 + + + + + ti.d4.n1.d2.n1.2.1.3.2 + + + + + ti.d4.n1.d2.n1.2.1.3.3 + + + + + ti.d4.n1.d2.n1.2.2.1.1 + + + + + ti.d4.n1.d2.n1.2.2.1.2 + + + + + ti.d4.n1.d2.n1.2.2.1.3 + + + + + ti.d4.n1.d2.n1.2.2.2.1 + + + + + ti.d4.n1.d2.n1.2.2.2.2 + + + + + ti.d4.n1.d2.n1.2.2.2.3 + + + + + ti.d4.n1.d2.n1.2.2.3.1 + + + + + ti.d4.n1.d2.n1.2.2.3.2 + + + + + ti.d4.n1.d2.n1.2.2.3.3 + + + + + ti.d4.n1.d2.n1.2.3.1.1 + + + + + ti.d4.n1.d2.n1.2.3.1.2 + + + + + ti.d4.n1.d2.n1.2.3.1.3 + + + + + ti.d4.n1.d2.n1.2.3.2.1 + + + + + ti.d4.n1.d2.n1.2.3.2.2 + + + + + ti.d4.n1.d2.n1.2.3.2.3 + + + + + ti.d4.n1.d2.n1.2.3.3.1 + + + + + ti.d4.n1.d2.n1.2.3.3.2 + + + + + ti.d4.n1.d2.n1.2.3.3.3 + + + + + ti.d4.n1.d2.n1.3.1.1.1 + + + + + ti.d4.n1.d2.n1.3.1.1.2 + + + + + ti.d4.n1.d2.n1.3.1.1.3 + + + + + ti.d4.n1.d2.n1.3.1.2.1 + + + + + ti.d4.n1.d2.n1.3.1.2.2 + + + + + ti.d4.n1.d2.n1.3.1.2.3 + + + + + ti.d4.n1.d2.n1.3.1.3.1 + + + + + ti.d4.n1.d2.n1.3.1.3.2 + + + + + ti.d4.n1.d2.n1.3.1.3.3 + + + + + ti.d4.n1.d2.n1.3.2.1.1 + + + + + ti.d4.n1.d2.n1.3.2.1.2 + + + + + ti.d4.n1.d2.n1.3.2.1.3 + + + + + ti.d4.n1.d2.n1.3.2.2.1 + + + + + ti.d4.n1.d2.n1.3.2.2.2 + + + + + ti.d4.n1.d2.n1.3.2.2.3 + + + + + ti.d4.n1.d2.n1.3.2.3.1 + + + + + ti.d4.n1.d2.n1.3.2.3.2 + + + + + ti.d4.n1.d2.n1.3.2.3.3 + + + + + ti.d4.n1.d2.n1.3.3.1.1 + + + + + ti.d4.n1.d2.n1.3.3.1.2 + + + + + ti.d4.n1.d2.n1.3.3.1.3 + + + + + ti.d4.n1.d2.n1.3.3.2.1 + + + + + ti.d4.n1.d2.n1.3.3.2.2 + + + + + ti.d4.n1.d2.n1.3.3.2.3 + + + + + ti.d4.n1.d2.n1.3.3.3.1 + + + + + ti.d4.n1.d2.n1.3.3.3.2 + + + + + ti.d4.n1.d2.n1.3.3.3.3 + + + + + ti.d4.n1.d2.n2.1.1.1.1 + + + + + ti.d4.n1.d2.n2.1.1.1.2 + + + + + ti.d4.n1.d2.n2.1.1.1.3 + + + + + ti.d4.n1.d2.n2.1.1.2.1 + + + + + ti.d4.n1.d2.n2.1.1.2.2 + + + + + ti.d4.n1.d2.n2.1.1.2.3 + + + + + ti.d4.n1.d2.n2.1.1.3.1 + + + + + ti.d4.n1.d2.n2.1.1.3.2 + + + + + ti.d4.n1.d2.n2.1.1.3.3 + + + + + ti.d4.n1.d2.n2.1.2.1.1 + + + + + ti.d4.n1.d2.n2.1.2.1.2 + + + + + ti.d4.n1.d2.n2.1.2.1.3 + + + + + ti.d4.n1.d2.n2.1.2.2.1 + + + + + ti.d4.n1.d2.n2.1.2.2.2 + + + + + ti.d4.n1.d2.n2.1.2.2.3 + + + + + ti.d4.n1.d2.n2.1.2.3.1 + + + + + ti.d4.n1.d2.n2.1.2.3.2 + + + + + ti.d4.n1.d2.n2.1.2.3.3 + + + + + ti.d4.n1.d2.n2.1.3.1.1 + + + + + ti.d4.n1.d2.n2.1.3.1.2 + + + + + ti.d4.n1.d2.n2.1.3.1.3 + + + + + ti.d4.n1.d2.n2.1.3.2.1 + + + + + ti.d4.n1.d2.n2.1.3.2.2 + + + + + ti.d4.n1.d2.n2.1.3.2.3 + + + + + ti.d4.n1.d2.n2.1.3.3.1 + + + + + ti.d4.n1.d2.n2.1.3.3.2 + + + + + ti.d4.n1.d2.n2.1.3.3.3 + + + + + ti.d4.n1.d2.n2.2.1.1.1 + + + + + ti.d4.n1.d2.n2.2.1.1.2 + + + + + ti.d4.n1.d2.n2.2.1.1.3 + + + + + ti.d4.n1.d2.n2.2.1.2.1 + + + + + ti.d4.n1.d2.n2.2.1.2.2 + + + + + ti.d4.n1.d2.n2.2.1.2.3 + + + + + ti.d4.n1.d2.n2.2.1.3.1 + + + + + ti.d4.n1.d2.n2.2.1.3.2 + + + + + ti.d4.n1.d2.n2.2.1.3.3 + + + + + ti.d4.n1.d2.n2.2.2.1.1 + + + + + ti.d4.n1.d2.n2.2.2.1.2 + + + + + ti.d4.n1.d2.n2.2.2.1.3 + + + + + ti.d4.n1.d2.n2.2.2.2.1 + + + + + ti.d4.n1.d2.n2.2.2.2.2 + + + + + ti.d4.n1.d2.n2.2.2.2.3 + + + + + ti.d4.n1.d2.n2.2.2.3.1 + + + + + ti.d4.n1.d2.n2.2.2.3.2 + + + + + ti.d4.n1.d2.n2.2.2.3.3 + + + + + ti.d4.n1.d2.n2.2.3.1.1 + + + + + ti.d4.n1.d2.n2.2.3.1.2 + + + + + ti.d4.n1.d2.n2.2.3.1.3 + + + + + ti.d4.n1.d2.n2.2.3.2.1 + + + + + ti.d4.n1.d2.n2.2.3.2.2 + + + + + ti.d4.n1.d2.n2.2.3.2.3 + + + + + ti.d4.n1.d2.n2.2.3.3.1 + + + + + ti.d4.n1.d2.n2.2.3.3.2 + + + + + ti.d4.n1.d2.n2.2.3.3.3 + + + + + ti.d4.n1.d2.n2.3.1.1.1 + + + + + ti.d4.n1.d2.n2.3.1.1.2 + + + + + ti.d4.n1.d2.n2.3.1.1.3 + + + + + ti.d4.n1.d2.n2.3.1.2.1 + + + + + ti.d4.n1.d2.n2.3.1.2.2 + + + + + ti.d4.n1.d2.n2.3.1.2.3 + + + + + ti.d4.n1.d2.n2.3.1.3.1 + + + + + ti.d4.n1.d2.n2.3.1.3.2 + + + + + ti.d4.n1.d2.n2.3.1.3.3 + + + + + ti.d4.n1.d2.n2.3.2.1.1 + + + + + ti.d4.n1.d2.n2.3.2.1.2 + + + + + ti.d4.n1.d2.n2.3.2.1.3 + + + + + ti.d4.n1.d2.n2.3.2.2.1 + + + + + ti.d4.n1.d2.n2.3.2.2.2 + + + + + ti.d4.n1.d2.n2.3.2.2.3 + + + + + ti.d4.n1.d2.n2.3.2.3.1 + + + + + ti.d4.n1.d2.n2.3.2.3.2 + + + + + ti.d4.n1.d2.n2.3.2.3.3 + + + + + ti.d4.n1.d2.n2.3.3.1.1 + + + + + ti.d4.n1.d2.n2.3.3.1.2 + + + + + ti.d4.n1.d2.n2.3.3.1.3 + + + + + ti.d4.n1.d2.n2.3.3.2.1 + + + + + ti.d4.n1.d2.n2.3.3.2.2 + + + + + ti.d4.n1.d2.n2.3.3.2.3 + + + + + ti.d4.n1.d2.n2.3.3.3.1 + + + + + ti.d4.n1.d2.n2.3.3.3.2 + + + + + ti.d4.n1.d2.n2.3.3.3.3 + + + + + ti.d4.n1.d3.n1.1.1.1.1 + + + + + ti.d4.n1.d3.n1.1.1.1.2 + + + + + ti.d4.n1.d3.n1.1.1.1.3 + + + + + ti.d4.n1.d3.n1.1.1.2.1 + + + + + ti.d4.n1.d3.n1.1.1.2.2 + + + + + ti.d4.n1.d3.n1.1.1.2.3 + + + + + ti.d4.n1.d3.n1.1.1.3.1 + + + + + ti.d4.n1.d3.n1.1.1.3.2 + + + + + ti.d4.n1.d3.n1.1.1.3.3 + + + + + ti.d4.n1.d3.n1.1.2.1.1 + + + + + ti.d4.n1.d3.n1.1.2.1.2 + + + + + ti.d4.n1.d3.n1.1.2.1.3 + + + + + ti.d4.n1.d3.n1.1.2.2.1 + + + + + ti.d4.n1.d3.n1.1.2.2.2 + + + + + ti.d4.n1.d3.n1.1.2.2.3 + + + + + ti.d4.n1.d3.n1.1.2.3.1 + + + + + ti.d4.n1.d3.n1.1.2.3.2 + + + + + ti.d4.n1.d3.n1.1.2.3.3 + + + + + ti.d4.n1.d3.n1.1.3.1.1 + + + + + ti.d4.n1.d3.n1.1.3.1.2 + + + + + ti.d4.n1.d3.n1.1.3.1.3 + + + + + ti.d4.n1.d3.n1.1.3.2.1 + + + + + ti.d4.n1.d3.n1.1.3.2.2 + + + + + ti.d4.n1.d3.n1.1.3.2.3 + + + + + ti.d4.n1.d3.n1.1.3.3.1 + + + + + ti.d4.n1.d3.n1.1.3.3.2 + + + + + ti.d4.n1.d3.n1.1.3.3.3 + + + + + ti.d4.n1.d3.n1.2.1.1.1 + + + + + ti.d4.n1.d3.n1.2.1.1.2 + + + + + ti.d4.n1.d3.n1.2.1.1.3 + + + + + ti.d4.n1.d3.n1.2.1.2.1 + + + + + ti.d4.n1.d3.n1.2.1.2.2 + + + + + ti.d4.n1.d3.n1.2.1.2.3 + + + + + ti.d4.n1.d3.n1.2.1.3.1 + + + + + ti.d4.n1.d3.n1.2.1.3.2 + + + + + ti.d4.n1.d3.n1.2.1.3.3 + + + + + ti.d4.n1.d3.n1.2.2.1.1 + + + + + ti.d4.n1.d3.n1.2.2.1.2 + + + + + ti.d4.n1.d3.n1.2.2.1.3 + + + + + ti.d4.n1.d3.n1.2.2.2.1 + + + + + ti.d4.n1.d3.n1.2.2.2.2 + + + + + ti.d4.n1.d3.n1.2.2.2.3 + + + + + ti.d4.n1.d3.n1.2.2.3.1 + + + + + ti.d4.n1.d3.n1.2.2.3.2 + + + + + ti.d4.n1.d3.n1.2.2.3.3 + + + + + ti.d4.n1.d3.n1.2.3.1.1 + + + + + ti.d4.n1.d3.n1.2.3.1.2 + + + + + ti.d4.n1.d3.n1.2.3.1.3 + + + + + ti.d4.n1.d3.n1.2.3.2.1 + + + + + ti.d4.n1.d3.n1.2.3.2.2 + + + + + ti.d4.n1.d3.n1.2.3.2.3 + + + + + ti.d4.n1.d3.n1.2.3.3.1 + + + + + ti.d4.n1.d3.n1.2.3.3.2 + + + + + ti.d4.n1.d3.n1.2.3.3.3 + + + + + ti.d4.n1.d3.n1.3.1.1.1 + + + + + ti.d4.n1.d3.n1.3.1.1.2 + + + + + ti.d4.n1.d3.n1.3.1.1.3 + + + + + ti.d4.n1.d3.n1.3.1.2.1 + + + + + ti.d4.n1.d3.n1.3.1.2.2 + + + + + ti.d4.n1.d3.n1.3.1.2.3 + + + + + ti.d4.n1.d3.n1.3.1.3.1 + + + + + ti.d4.n1.d3.n1.3.1.3.2 + + + + + ti.d4.n1.d3.n1.3.1.3.3 + + + + + ti.d4.n1.d3.n1.3.2.1.1 + + + + + ti.d4.n1.d3.n1.3.2.1.2 + + + + + ti.d4.n1.d3.n1.3.2.1.3 + + + + + ti.d4.n1.d3.n1.3.2.2.1 + + + + + ti.d4.n1.d3.n1.3.2.2.2 + + + + + ti.d4.n1.d3.n1.3.2.2.3 + + + + + ti.d4.n1.d3.n1.3.2.3.1 + + + + + ti.d4.n1.d3.n1.3.2.3.2 + + + + + ti.d4.n1.d3.n1.3.2.3.3 + + + + + ti.d4.n1.d3.n1.3.3.1.1 + + + + + ti.d4.n1.d3.n1.3.3.1.2 + + + + + ti.d4.n1.d3.n1.3.3.1.3 + + + + + ti.d4.n1.d3.n1.3.3.2.1 + + + + + ti.d4.n1.d3.n1.3.3.2.2 + + + + + ti.d4.n1.d3.n1.3.3.2.3 + + + + + ti.d4.n1.d3.n1.3.3.3.1 + + + + + ti.d4.n1.d3.n1.3.3.3.2 + + + + + ti.d4.n1.d3.n1.3.3.3.3 + + + + + ti.d4.n1.d3.n2.1.1.1.1 + + + + + ti.d4.n1.d3.n2.1.1.1.2 + + + + + ti.d4.n1.d3.n2.1.1.1.3 + + + + + ti.d4.n1.d3.n2.1.1.2.1 + + + + + ti.d4.n1.d3.n2.1.1.2.2 + + + + + ti.d4.n1.d3.n2.1.1.2.3 + + + + + ti.d4.n1.d3.n2.1.1.3.1 + + + + + ti.d4.n1.d3.n2.1.1.3.2 + + + + + ti.d4.n1.d3.n2.1.1.3.3 + + + + + ti.d4.n1.d3.n2.1.2.1.1 + + + + + ti.d4.n1.d3.n2.1.2.1.2 + + + + + ti.d4.n1.d3.n2.1.2.1.3 + + + + + ti.d4.n1.d3.n2.1.2.2.1 + + + + + ti.d4.n1.d3.n2.1.2.2.2 + + + + + ti.d4.n1.d3.n2.1.2.2.3 + + + + + ti.d4.n1.d3.n2.1.2.3.1 + + + + + ti.d4.n1.d3.n2.1.2.3.2 + + + + + ti.d4.n1.d3.n2.1.2.3.3 + + + + + ti.d4.n1.d3.n2.1.3.1.1 + + + + + ti.d4.n1.d3.n2.1.3.1.2 + + + + + ti.d4.n1.d3.n2.1.3.1.3 + + + + + ti.d4.n1.d3.n2.1.3.2.1 + + + + + ti.d4.n1.d3.n2.1.3.2.2 + + + + + ti.d4.n1.d3.n2.1.3.2.3 + + + + + ti.d4.n1.d3.n2.1.3.3.1 + + + + + ti.d4.n1.d3.n2.1.3.3.2 + + + + + ti.d4.n1.d3.n2.1.3.3.3 + + + + + ti.d4.n1.d3.n2.2.1.1.1 + + + + + ti.d4.n1.d3.n2.2.1.1.2 + + + + + ti.d4.n1.d3.n2.2.1.1.3 + + + + + ti.d4.n1.d3.n2.2.1.2.1 + + + + + ti.d4.n1.d3.n2.2.1.2.2 + + + + + ti.d4.n1.d3.n2.2.1.2.3 + + + + + ti.d4.n1.d3.n2.2.1.3.1 + + + + + ti.d4.n1.d3.n2.2.1.3.2 + + + + + ti.d4.n1.d3.n2.2.1.3.3 + + + + + ti.d4.n1.d3.n2.2.2.1.1 + + + + + ti.d4.n1.d3.n2.2.2.1.2 + + + + + ti.d4.n1.d3.n2.2.2.1.3 + + + + + ti.d4.n1.d3.n2.2.2.2.1 + + + + + ti.d4.n1.d3.n2.2.2.2.2 + + + + + ti.d4.n1.d3.n2.2.2.2.3 + + + + + ti.d4.n1.d3.n2.2.2.3.1 + + + + + ti.d4.n1.d3.n2.2.2.3.2 + + + + + ti.d4.n1.d3.n2.2.2.3.3 + + + + + ti.d4.n1.d3.n2.2.3.1.1 + + + + + ti.d4.n1.d3.n2.2.3.1.2 + + + + + ti.d4.n1.d3.n2.2.3.1.3 + + + + + ti.d4.n1.d3.n2.2.3.2.1 + + + + + ti.d4.n1.d3.n2.2.3.2.2 + + + + + ti.d4.n1.d3.n2.2.3.2.3 + + + + + ti.d4.n1.d3.n2.2.3.3.1 + + + + + ti.d4.n1.d3.n2.2.3.3.2 + + + + + ti.d4.n1.d3.n2.2.3.3.3 + + + + + ti.d4.n1.d3.n2.3.1.1.1 + + + + + ti.d4.n1.d3.n2.3.1.1.2 + + + + + ti.d4.n1.d3.n2.3.1.1.3 + + + + + ti.d4.n1.d3.n2.3.1.2.1 + + + + + ti.d4.n1.d3.n2.3.1.2.2 + + + + + ti.d4.n1.d3.n2.3.1.2.3 + + + + + ti.d4.n1.d3.n2.3.1.3.1 + + + + + ti.d4.n1.d3.n2.3.1.3.2 + + + + + ti.d4.n1.d3.n2.3.1.3.3 + + + + + ti.d4.n1.d3.n2.3.2.1.1 + + + + + ti.d4.n1.d3.n2.3.2.1.2 + + + + + ti.d4.n1.d3.n2.3.2.1.3 + + + + + ti.d4.n1.d3.n2.3.2.2.1 + + + + + ti.d4.n1.d3.n2.3.2.2.2 + + + + + ti.d4.n1.d3.n2.3.2.2.3 + + + + + ti.d4.n1.d3.n2.3.2.3.1 + + + + + ti.d4.n1.d3.n2.3.2.3.2 + + + + + ti.d4.n1.d3.n2.3.2.3.3 + + + + + ti.d4.n1.d3.n2.3.3.1.1 + + + + + ti.d4.n1.d3.n2.3.3.1.2 + + + + + ti.d4.n1.d3.n2.3.3.1.3 + + + + + ti.d4.n1.d3.n2.3.3.2.1 + + + + + ti.d4.n1.d3.n2.3.3.2.2 + + + + + ti.d4.n1.d3.n2.3.3.2.3 + + + + + ti.d4.n1.d3.n2.3.3.3.1 + + + + + ti.d4.n1.d3.n2.3.3.3.2 + + + + + ti.d4.n1.d3.n2.3.3.3.3 + + + + + ti.d4.n1.d4.n2.1.1.1.1 + + + + + ti.d4.n1.d4.n2.1.1.1.2 + + + + + ti.d4.n1.d4.n2.1.1.1.3 + + + + + ti.d4.n1.d4.n2.1.1.2.1 + + + + + ti.d4.n1.d4.n2.1.1.2.2 + + + + + ti.d4.n1.d4.n2.1.1.2.3 + + + + + ti.d4.n1.d4.n2.1.1.3.1 + + + + + ti.d4.n1.d4.n2.1.1.3.2 + + + + + ti.d4.n1.d4.n2.1.1.3.3 + + + + + ti.d4.n1.d4.n2.1.2.1.1 + + + + + ti.d4.n1.d4.n2.1.2.1.2 + + + + + ti.d4.n1.d4.n2.1.2.1.3 + + + + + ti.d4.n1.d4.n2.1.2.2.1 + + + + + ti.d4.n1.d4.n2.1.2.2.2 + + + + + ti.d4.n1.d4.n2.1.2.2.3 + + + + + ti.d4.n1.d4.n2.1.2.3.1 + + + + + ti.d4.n1.d4.n2.1.2.3.2 + + + + + ti.d4.n1.d4.n2.1.2.3.3 + + + + + ti.d4.n1.d4.n2.1.3.1.1 + + + + + ti.d4.n1.d4.n2.1.3.1.2 + + + + + ti.d4.n1.d4.n2.1.3.1.3 + + + + + ti.d4.n1.d4.n2.1.3.2.1 + + + + + ti.d4.n1.d4.n2.1.3.2.2 + + + + + ti.d4.n1.d4.n2.1.3.2.3 + + + + + ti.d4.n1.d4.n2.1.3.3.1 + + + + + ti.d4.n1.d4.n2.1.3.3.2 + + + + + ti.d4.n1.d4.n2.1.3.3.3 + + + + + ti.d4.n1.d4.n2.2.1.1.1 + + + + + ti.d4.n1.d4.n2.2.1.1.2 + + + + + ti.d4.n1.d4.n2.2.1.1.3 + + + + + ti.d4.n1.d4.n2.2.1.2.1 + + + + + ti.d4.n1.d4.n2.2.1.2.2 + + + + + ti.d4.n1.d4.n2.2.1.2.3 + + + + + ti.d4.n1.d4.n2.2.1.3.1 + + + + + ti.d4.n1.d4.n2.2.1.3.2 + + + + + ti.d4.n1.d4.n2.2.1.3.3 + + + + + ti.d4.n1.d4.n2.2.2.1.1 + + + + + ti.d4.n1.d4.n2.2.2.1.2 + + + + + ti.d4.n1.d4.n2.2.2.1.3 + + + + + ti.d4.n1.d4.n2.2.2.2.1 + + + + + ti.d4.n1.d4.n2.2.2.2.2 + + + + + ti.d4.n1.d4.n2.2.2.2.3 + + + + + ti.d4.n1.d4.n2.2.2.3.1 + + + + + ti.d4.n1.d4.n2.2.2.3.2 + + + + + ti.d4.n1.d4.n2.2.2.3.3 + + + + + ti.d4.n1.d4.n2.2.3.1.1 + + + + + ti.d4.n1.d4.n2.2.3.1.2 + + + + + ti.d4.n1.d4.n2.2.3.1.3 + + + + + ti.d4.n1.d4.n2.2.3.2.1 + + + + + ti.d4.n1.d4.n2.2.3.2.2 + + + + + ti.d4.n1.d4.n2.2.3.2.3 + + + + + ti.d4.n1.d4.n2.2.3.3.1 + + + + + ti.d4.n1.d4.n2.2.3.3.2 + + + + + ti.d4.n1.d4.n2.2.3.3.3 + + + + + ti.d4.n1.d4.n2.3.1.1.1 + + + + + ti.d4.n1.d4.n2.3.1.1.2 + + + + + ti.d4.n1.d4.n2.3.1.1.3 + + + + + ti.d4.n1.d4.n2.3.1.2.1 + + + + + ti.d4.n1.d4.n2.3.1.2.2 + + + + + ti.d4.n1.d4.n2.3.1.2.3 + + + + + ti.d4.n1.d4.n2.3.1.3.1 + + + + + ti.d4.n1.d4.n2.3.1.3.2 + + + + + ti.d4.n1.d4.n2.3.1.3.3 + + + + + ti.d4.n1.d4.n2.3.2.1.1 + + + + + ti.d4.n1.d4.n2.3.2.1.2 + + + + + ti.d4.n1.d4.n2.3.2.1.3 + + + + + ti.d4.n1.d4.n2.3.2.2.1 + + + + + ti.d4.n1.d4.n2.3.2.2.2 + + + + + ti.d4.n1.d4.n2.3.2.2.3 + + + + + ti.d4.n1.d4.n2.3.2.3.1 + + + + + ti.d4.n1.d4.n2.3.2.3.2 + + + + + ti.d4.n1.d4.n2.3.2.3.3 + + + + + ti.d4.n1.d4.n2.3.3.1.1 + + + + + ti.d4.n1.d4.n2.3.3.1.2 + + + + + ti.d4.n1.d4.n2.3.3.1.3 + + + + + ti.d4.n1.d4.n2.3.3.2.1 + + + + + ti.d4.n1.d4.n2.3.3.2.2 + + + + + ti.d4.n1.d4.n2.3.3.2.3 + + + + + ti.d4.n1.d4.n2.3.3.3.1 + + + + + ti.d4.n1.d4.n2.3.3.3.2 + + + + + ti.d4.n1.d4.n2.3.3.3.3 + + + + + ti.d4.n2.d1.n1.1.1.1.1 + + + + + ti.d4.n2.d1.n1.1.1.1.2 + + + + + ti.d4.n2.d1.n1.1.1.1.3 + + + + + ti.d4.n2.d1.n1.1.1.2.1 + + + + + ti.d4.n2.d1.n1.1.1.2.2 + + + + + ti.d4.n2.d1.n1.1.1.2.3 + + + + + ti.d4.n2.d1.n1.1.1.3.1 + + + + + ti.d4.n2.d1.n1.1.1.3.2 + + + + + ti.d4.n2.d1.n1.1.1.3.3 + + + + + ti.d4.n2.d1.n1.1.2.1.1 + + + + + ti.d4.n2.d1.n1.1.2.1.2 + + + + + ti.d4.n2.d1.n1.1.2.1.3 + + + + + ti.d4.n2.d1.n1.1.2.2.1 + + + + + ti.d4.n2.d1.n1.1.2.2.2 + + + + + ti.d4.n2.d1.n1.1.2.2.3 + + + + + ti.d4.n2.d1.n1.1.2.3.1 + + + + + ti.d4.n2.d1.n1.1.2.3.2 + + + + + ti.d4.n2.d1.n1.1.2.3.3 + + + + + ti.d4.n2.d1.n1.1.3.1.1 + + + + + ti.d4.n2.d1.n1.1.3.1.2 + + + + + ti.d4.n2.d1.n1.1.3.1.3 + + + + + ti.d4.n2.d1.n1.1.3.2.1 + + + + + ti.d4.n2.d1.n1.1.3.2.2 + + + + + ti.d4.n2.d1.n1.1.3.2.3 + + + + + ti.d4.n2.d1.n1.1.3.3.1 + + + + + ti.d4.n2.d1.n1.1.3.3.2 + + + + + ti.d4.n2.d1.n1.1.3.3.3 + + + + + ti.d4.n2.d1.n1.2.1.1.1 + + + + + ti.d4.n2.d1.n1.2.1.1.2 + + + + + ti.d4.n2.d1.n1.2.1.1.3 + + + + + ti.d4.n2.d1.n1.2.1.2.1 + + + + + ti.d4.n2.d1.n1.2.1.2.2 + + + + + ti.d4.n2.d1.n1.2.1.2.3 + + + + + ti.d4.n2.d1.n1.2.1.3.1 + + + + + ti.d4.n2.d1.n1.2.1.3.2 + + + + + ti.d4.n2.d1.n1.2.1.3.3 + + + + + ti.d4.n2.d1.n1.2.2.1.1 + + + + + ti.d4.n2.d1.n1.2.2.1.2 + + + + + ti.d4.n2.d1.n1.2.2.1.3 + + + + + ti.d4.n2.d1.n1.2.2.2.1 + + + + + ti.d4.n2.d1.n1.2.2.2.2 + + + + + ti.d4.n2.d1.n1.2.2.2.3 + + + + + ti.d4.n2.d1.n1.2.2.3.1 + + + + + ti.d4.n2.d1.n1.2.2.3.2 + + + + + ti.d4.n2.d1.n1.2.2.3.3 + + + + + ti.d4.n2.d1.n1.2.3.1.1 + + + + + ti.d4.n2.d1.n1.2.3.1.2 + + + + + ti.d4.n2.d1.n1.2.3.1.3 + + + + + ti.d4.n2.d1.n1.2.3.2.1 + + + + + ti.d4.n2.d1.n1.2.3.2.2 + + + + + ti.d4.n2.d1.n1.2.3.2.3 + + + + + ti.d4.n2.d1.n1.2.3.3.1 + + + + + ti.d4.n2.d1.n1.2.3.3.2 + + + + + ti.d4.n2.d1.n1.2.3.3.3 + + + + + ti.d4.n2.d1.n1.3.1.1.1 + + + + + ti.d4.n2.d1.n1.3.1.1.2 + + + + + ti.d4.n2.d1.n1.3.1.1.3 + + + + + ti.d4.n2.d1.n1.3.1.2.1 + + + + + ti.d4.n2.d1.n1.3.1.2.2 + + + + + ti.d4.n2.d1.n1.3.1.2.3 + + + + + ti.d4.n2.d1.n1.3.1.3.1 + + + + + ti.d4.n2.d1.n1.3.1.3.2 + + + + + ti.d4.n2.d1.n1.3.1.3.3 + + + + + ti.d4.n2.d1.n1.3.2.1.1 + + + + + ti.d4.n2.d1.n1.3.2.1.2 + + + + + ti.d4.n2.d1.n1.3.2.1.3 + + + + + ti.d4.n2.d1.n1.3.2.2.1 + + + + + ti.d4.n2.d1.n1.3.2.2.2 + + + + + ti.d4.n2.d1.n1.3.2.2.3 + + + + + ti.d4.n2.d1.n1.3.2.3.1 + + + + + ti.d4.n2.d1.n1.3.2.3.2 + + + + + ti.d4.n2.d1.n1.3.2.3.3 + + + + + ti.d4.n2.d1.n1.3.3.1.1 + + + + + ti.d4.n2.d1.n1.3.3.1.2 + + + + + ti.d4.n2.d1.n1.3.3.1.3 + + + + + ti.d4.n2.d1.n1.3.3.2.1 + + + + + ti.d4.n2.d1.n1.3.3.2.2 + + + + + ti.d4.n2.d1.n1.3.3.2.3 + + + + + ti.d4.n2.d1.n1.3.3.3.1 + + + + + ti.d4.n2.d1.n1.3.3.3.2 + + + + + ti.d4.n2.d1.n1.3.3.3.3 + + + + + ti.d4.n2.d1.n2.1.1.1.1 + + + + + ti.d4.n2.d1.n2.1.1.1.2 + + + + + ti.d4.n2.d1.n2.1.1.1.3 + + + + + ti.d4.n2.d1.n2.1.1.2.1 + + + + + ti.d4.n2.d1.n2.1.1.2.2 + + + + + ti.d4.n2.d1.n2.1.1.2.3 + + + + + ti.d4.n2.d1.n2.1.1.3.1 + + + + + ti.d4.n2.d1.n2.1.1.3.2 + + + + + ti.d4.n2.d1.n2.1.1.3.3 + + + + + ti.d4.n2.d1.n2.1.2.1.1 + + + + + ti.d4.n2.d1.n2.1.2.1.2 + + + + + ti.d4.n2.d1.n2.1.2.1.3 + + + + + ti.d4.n2.d1.n2.1.2.2.1 + + + + + ti.d4.n2.d1.n2.1.2.2.2 + + + + + ti.d4.n2.d1.n2.1.2.2.3 + + + + + ti.d4.n2.d1.n2.1.2.3.1 + + + + + ti.d4.n2.d1.n2.1.2.3.2 + + + + + ti.d4.n2.d1.n2.1.2.3.3 + + + + + ti.d4.n2.d1.n2.1.3.1.1 + + + + + ti.d4.n2.d1.n2.1.3.1.2 + + + + + ti.d4.n2.d1.n2.1.3.1.3 + + + + + ti.d4.n2.d1.n2.1.3.2.1 + + + + + ti.d4.n2.d1.n2.1.3.2.2 + + + + + ti.d4.n2.d1.n2.1.3.2.3 + + + + + ti.d4.n2.d1.n2.1.3.3.1 + + + + + ti.d4.n2.d1.n2.1.3.3.2 + + + + + ti.d4.n2.d1.n2.1.3.3.3 + + + + + ti.d4.n2.d1.n2.2.1.1.1 + + + + + ti.d4.n2.d1.n2.2.1.1.2 + + + + + ti.d4.n2.d1.n2.2.1.1.3 + + + + + ti.d4.n2.d1.n2.2.1.2.1 + + + + + ti.d4.n2.d1.n2.2.1.2.2 + + + + + ti.d4.n2.d1.n2.2.1.2.3 + + + + + ti.d4.n2.d1.n2.2.1.3.1 + + + + + ti.d4.n2.d1.n2.2.1.3.2 + + + + + ti.d4.n2.d1.n2.2.1.3.3 + + + + + ti.d4.n2.d1.n2.2.2.1.1 + + + + + ti.d4.n2.d1.n2.2.2.1.2 + + + + + ti.d4.n2.d1.n2.2.2.1.3 + + + + + ti.d4.n2.d1.n2.2.2.2.1 + + + + + ti.d4.n2.d1.n2.2.2.2.2 + + + + + ti.d4.n2.d1.n2.2.2.2.3 + + + + + ti.d4.n2.d1.n2.2.2.3.1 + + + + + ti.d4.n2.d1.n2.2.2.3.2 + + + + + ti.d4.n2.d1.n2.2.2.3.3 + + + + + ti.d4.n2.d1.n2.2.3.1.1 + + + + + ti.d4.n2.d1.n2.2.3.1.2 + + + + + ti.d4.n2.d1.n2.2.3.1.3 + + + + + ti.d4.n2.d1.n2.2.3.2.1 + + + + + ti.d4.n2.d1.n2.2.3.2.2 + + + + + ti.d4.n2.d1.n2.2.3.2.3 + + + + + ti.d4.n2.d1.n2.2.3.3.1 + + + + + ti.d4.n2.d1.n2.2.3.3.2 + + + + + ti.d4.n2.d1.n2.2.3.3.3 + + + + + ti.d4.n2.d1.n2.3.1.1.1 + + + + + ti.d4.n2.d1.n2.3.1.1.2 + + + + + ti.d4.n2.d1.n2.3.1.1.3 + + + + + ti.d4.n2.d1.n2.3.1.2.1 + + + + + ti.d4.n2.d1.n2.3.1.2.2 + + + + + ti.d4.n2.d1.n2.3.1.2.3 + + + + + ti.d4.n2.d1.n2.3.1.3.1 + + + + + ti.d4.n2.d1.n2.3.1.3.2 + + + + + ti.d4.n2.d1.n2.3.1.3.3 + + + + + ti.d4.n2.d1.n2.3.2.1.1 + + + + + ti.d4.n2.d1.n2.3.2.1.2 + + + + + ti.d4.n2.d1.n2.3.2.1.3 + + + + + ti.d4.n2.d1.n2.3.2.2.1 + + + + + ti.d4.n2.d1.n2.3.2.2.2 + + + + + ti.d4.n2.d1.n2.3.2.2.3 + + + + + ti.d4.n2.d1.n2.3.2.3.1 + + + + + ti.d4.n2.d1.n2.3.2.3.2 + + + + + ti.d4.n2.d1.n2.3.2.3.3 + + + + + ti.d4.n2.d1.n2.3.3.1.1 + + + + + ti.d4.n2.d1.n2.3.3.1.2 + + + + + ti.d4.n2.d1.n2.3.3.1.3 + + + + + ti.d4.n2.d1.n2.3.3.2.1 + + + + + ti.d4.n2.d1.n2.3.3.2.2 + + + + + ti.d4.n2.d1.n2.3.3.2.3 + + + + + ti.d4.n2.d1.n2.3.3.3.1 + + + + + ti.d4.n2.d1.n2.3.3.3.2 + + + + + ti.d4.n2.d1.n2.3.3.3.3 + + + + + ti.d4.n2.d2.n1.1.1.1.1 + + + + + ti.d4.n2.d2.n1.1.1.1.2 + + + + + ti.d4.n2.d2.n1.1.1.1.3 + + + + + ti.d4.n2.d2.n1.1.1.2.1 + + + + + ti.d4.n2.d2.n1.1.1.2.2 + + + + + ti.d4.n2.d2.n1.1.1.2.3 + + + + + ti.d4.n2.d2.n1.1.1.3.1 + + + + + ti.d4.n2.d2.n1.1.1.3.2 + + + + + ti.d4.n2.d2.n1.1.1.3.3 + + + + + ti.d4.n2.d2.n1.1.2.1.1 + + + + + ti.d4.n2.d2.n1.1.2.1.2 + + + + + ti.d4.n2.d2.n1.1.2.1.3 + + + + + ti.d4.n2.d2.n1.1.2.2.1 + + + + + ti.d4.n2.d2.n1.1.2.2.2 + + + + + ti.d4.n2.d2.n1.1.2.2.3 + + + + + ti.d4.n2.d2.n1.1.2.3.1 + + + + + ti.d4.n2.d2.n1.1.2.3.2 + + + + + ti.d4.n2.d2.n1.1.2.3.3 + + + + + ti.d4.n2.d2.n1.1.3.1.1 + + + + + ti.d4.n2.d2.n1.1.3.1.2 + + + + + ti.d4.n2.d2.n1.1.3.1.3 + + + + + ti.d4.n2.d2.n1.1.3.2.1 + + + + + ti.d4.n2.d2.n1.1.3.2.2 + + + + + ti.d4.n2.d2.n1.1.3.2.3 + + + + + ti.d4.n2.d2.n1.1.3.3.1 + + + + + ti.d4.n2.d2.n1.1.3.3.2 + + + + + ti.d4.n2.d2.n1.1.3.3.3 + + + + + ti.d4.n2.d2.n1.2.1.1.1 + + + + + ti.d4.n2.d2.n1.2.1.1.2 + + + + + ti.d4.n2.d2.n1.2.1.1.3 + + + + + ti.d4.n2.d2.n1.2.1.2.1 + + + + + ti.d4.n2.d2.n1.2.1.2.2 + + + + + ti.d4.n2.d2.n1.2.1.2.3 + + + + + ti.d4.n2.d2.n1.2.1.3.1 + + + + + ti.d4.n2.d2.n1.2.1.3.2 + + + + + ti.d4.n2.d2.n1.2.1.3.3 + + + + + ti.d4.n2.d2.n1.2.2.1.1 + + + + + ti.d4.n2.d2.n1.2.2.1.2 + + + + + ti.d4.n2.d2.n1.2.2.1.3 + + + + + ti.d4.n2.d2.n1.2.2.2.1 + + + + + ti.d4.n2.d2.n1.2.2.2.2 + + + + + ti.d4.n2.d2.n1.2.2.2.3 + + + + + ti.d4.n2.d2.n1.2.2.3.1 + + + + + ti.d4.n2.d2.n1.2.2.3.2 + + + + + ti.d4.n2.d2.n1.2.2.3.3 + + + + + ti.d4.n2.d2.n1.2.3.1.1 + + + + + ti.d4.n2.d2.n1.2.3.1.2 + + + + + ti.d4.n2.d2.n1.2.3.1.3 + + + + + ti.d4.n2.d2.n1.2.3.2.1 + + + + + ti.d4.n2.d2.n1.2.3.2.2 + + + + + ti.d4.n2.d2.n1.2.3.2.3 + + + + + ti.d4.n2.d2.n1.2.3.3.1 + + + + + ti.d4.n2.d2.n1.2.3.3.2 + + + + + ti.d4.n2.d2.n1.2.3.3.3 + + + + + ti.d4.n2.d2.n1.3.1.1.1 + + + + + ti.d4.n2.d2.n1.3.1.1.2 + + + + + ti.d4.n2.d2.n1.3.1.1.3 + + + + + ti.d4.n2.d2.n1.3.1.2.1 + + + + + ti.d4.n2.d2.n1.3.1.2.2 + + + + + ti.d4.n2.d2.n1.3.1.2.3 + + + + + ti.d4.n2.d2.n1.3.1.3.1 + + + + + ti.d4.n2.d2.n1.3.1.3.2 + + + + + ti.d4.n2.d2.n1.3.1.3.3 + + + + + ti.d4.n2.d2.n1.3.2.1.1 + + + + + ti.d4.n2.d2.n1.3.2.1.2 + + + + + ti.d4.n2.d2.n1.3.2.1.3 + + + + + ti.d4.n2.d2.n1.3.2.2.1 + + + + + ti.d4.n2.d2.n1.3.2.2.2 + + + + + ti.d4.n2.d2.n1.3.2.2.3 + + + + + ti.d4.n2.d2.n1.3.2.3.1 + + + + + ti.d4.n2.d2.n1.3.2.3.2 + + + + + ti.d4.n2.d2.n1.3.2.3.3 + + + + + ti.d4.n2.d2.n1.3.3.1.1 + + + + + ti.d4.n2.d2.n1.3.3.1.2 + + + + + ti.d4.n2.d2.n1.3.3.1.3 + + + + + ti.d4.n2.d2.n1.3.3.2.1 + + + + + ti.d4.n2.d2.n1.3.3.2.2 + + + + + ti.d4.n2.d2.n1.3.3.2.3 + + + + + ti.d4.n2.d2.n1.3.3.3.1 + + + + + ti.d4.n2.d2.n1.3.3.3.2 + + + + + ti.d4.n2.d2.n1.3.3.3.3 + + + + + ti.d4.n2.d2.n2.1.1.1.1 + + + + + ti.d4.n2.d2.n2.1.1.1.2 + + + + + ti.d4.n2.d2.n2.1.1.1.3 + + + + + ti.d4.n2.d2.n2.1.1.2.1 + + + + + ti.d4.n2.d2.n2.1.1.2.2 + + + + + ti.d4.n2.d2.n2.1.1.2.3 + + + + + ti.d4.n2.d2.n2.1.1.3.1 + + + + + ti.d4.n2.d2.n2.1.1.3.2 + + + + + ti.d4.n2.d2.n2.1.1.3.3 + + + + + ti.d4.n2.d2.n2.1.2.1.1 + + + + + ti.d4.n2.d2.n2.1.2.1.2 + + + + + ti.d4.n2.d2.n2.1.2.1.3 + + + + + ti.d4.n2.d2.n2.1.2.2.1 + + + + + ti.d4.n2.d2.n2.1.2.2.2 + + + + + ti.d4.n2.d2.n2.1.2.2.3 + + + + + ti.d4.n2.d2.n2.1.2.3.1 + + + + + ti.d4.n2.d2.n2.1.2.3.2 + + + + + ti.d4.n2.d2.n2.1.2.3.3 + + + + + ti.d4.n2.d2.n2.1.3.1.1 + + + + + ti.d4.n2.d2.n2.1.3.1.2 + + + + + ti.d4.n2.d2.n2.1.3.1.3 + + + + + ti.d4.n2.d2.n2.1.3.2.1 + + + + + ti.d4.n2.d2.n2.1.3.2.2 + + + + + ti.d4.n2.d2.n2.1.3.2.3 + + + + + ti.d4.n2.d2.n2.1.3.3.1 + + + + + ti.d4.n2.d2.n2.1.3.3.2 + + + + + ti.d4.n2.d2.n2.1.3.3.3 + + + + + ti.d4.n2.d2.n2.2.1.1.1 + + + + + ti.d4.n2.d2.n2.2.1.1.2 + + + + + ti.d4.n2.d2.n2.2.1.1.3 + + + + + ti.d4.n2.d2.n2.2.1.2.1 + + + + + ti.d4.n2.d2.n2.2.1.2.2 + + + + + ti.d4.n2.d2.n2.2.1.2.3 + + + + + ti.d4.n2.d2.n2.2.1.3.1 + + + + + ti.d4.n2.d2.n2.2.1.3.2 + + + + + ti.d4.n2.d2.n2.2.1.3.3 + + + + + ti.d4.n2.d2.n2.2.2.1.1 + + + + + ti.d4.n2.d2.n2.2.2.1.2 + + + + + ti.d4.n2.d2.n2.2.2.1.3 + + + + + ti.d4.n2.d2.n2.2.2.2.1 + + + + + ti.d4.n2.d2.n2.2.2.2.2 + + + + + ti.d4.n2.d2.n2.2.2.2.3 + + + + + ti.d4.n2.d2.n2.2.2.3.1 + + + + + ti.d4.n2.d2.n2.2.2.3.2 + + + + + ti.d4.n2.d2.n2.2.2.3.3 + + + + + ti.d4.n2.d2.n2.2.3.1.1 + + + + + ti.d4.n2.d2.n2.2.3.1.2 + + + + + ti.d4.n2.d2.n2.2.3.1.3 + + + + + ti.d4.n2.d2.n2.2.3.2.1 + + + + + ti.d4.n2.d2.n2.2.3.2.2 + + + + + ti.d4.n2.d2.n2.2.3.2.3 + + + + + ti.d4.n2.d2.n2.2.3.3.1 + + + + + ti.d4.n2.d2.n2.2.3.3.2 + + + + + ti.d4.n2.d2.n2.2.3.3.3 + + + + + ti.d4.n2.d2.n2.3.1.1.1 + + + + + ti.d4.n2.d2.n2.3.1.1.2 + + + + + ti.d4.n2.d2.n2.3.1.1.3 + + + + + ti.d4.n2.d2.n2.3.1.2.1 + + + + + ti.d4.n2.d2.n2.3.1.2.2 + + + + + ti.d4.n2.d2.n2.3.1.2.3 + + + + + ti.d4.n2.d2.n2.3.1.3.1 + + + + + ti.d4.n2.d2.n2.3.1.3.2 + + + + + ti.d4.n2.d2.n2.3.1.3.3 + + + + + ti.d4.n2.d2.n2.3.2.1.1 + + + + + ti.d4.n2.d2.n2.3.2.1.2 + + + + + ti.d4.n2.d2.n2.3.2.1.3 + + + + + ti.d4.n2.d2.n2.3.2.2.1 + + + + + ti.d4.n2.d2.n2.3.2.2.2 + + + + + ti.d4.n2.d2.n2.3.2.2.3 + + + + + ti.d4.n2.d2.n2.3.2.3.1 + + + + + ti.d4.n2.d2.n2.3.2.3.2 + + + + + ti.d4.n2.d2.n2.3.2.3.3 + + + + + ti.d4.n2.d2.n2.3.3.1.1 + + + + + ti.d4.n2.d2.n2.3.3.1.2 + + + + + ti.d4.n2.d2.n2.3.3.1.3 + + + + + ti.d4.n2.d2.n2.3.3.2.1 + + + + + ti.d4.n2.d2.n2.3.3.2.2 + + + + + ti.d4.n2.d2.n2.3.3.2.3 + + + + + ti.d4.n2.d2.n2.3.3.3.1 + + + + + ti.d4.n2.d2.n2.3.3.3.2 + + + + + ti.d4.n2.d2.n2.3.3.3.3 + + + + + ti.d4.n2.d3.n1.1.1.1.1 + + + + + ti.d4.n2.d3.n1.1.1.1.2 + + + + + ti.d4.n2.d3.n1.1.1.1.3 + + + + + ti.d4.n2.d3.n1.1.1.2.1 + + + + + ti.d4.n2.d3.n1.1.1.2.2 + + + + + ti.d4.n2.d3.n1.1.1.2.3 + + + + + ti.d4.n2.d3.n1.1.1.3.1 + + + + + ti.d4.n2.d3.n1.1.1.3.2 + + + + + ti.d4.n2.d3.n1.1.1.3.3 + + + + + ti.d4.n2.d3.n1.1.2.1.1 + + + + + ti.d4.n2.d3.n1.1.2.1.2 + + + + + ti.d4.n2.d3.n1.1.2.1.3 + + + + + ti.d4.n2.d3.n1.1.2.2.1 + + + + + ti.d4.n2.d3.n1.1.2.2.2 + + + + + ti.d4.n2.d3.n1.1.2.2.3 + + + + + ti.d4.n2.d3.n1.1.2.3.1 + + + + + ti.d4.n2.d3.n1.1.2.3.2 + + + + + ti.d4.n2.d3.n1.1.2.3.3 + + + + + ti.d4.n2.d3.n1.1.3.1.1 + + + + + ti.d4.n2.d3.n1.1.3.1.2 + + + + + ti.d4.n2.d3.n1.1.3.1.3 + + + + + ti.d4.n2.d3.n1.1.3.2.1 + + + + + ti.d4.n2.d3.n1.1.3.2.2 + + + + + ti.d4.n2.d3.n1.1.3.2.3 + + + + + ti.d4.n2.d3.n1.1.3.3.1 + + + + + ti.d4.n2.d3.n1.1.3.3.2 + + + + + ti.d4.n2.d3.n1.1.3.3.3 + + + + + ti.d4.n2.d3.n1.2.1.1.1 + + + + + ti.d4.n2.d3.n1.2.1.1.2 + + + + + ti.d4.n2.d3.n1.2.1.1.3 + + + + + ti.d4.n2.d3.n1.2.1.2.1 + + + + + ti.d4.n2.d3.n1.2.1.2.2 + + + + + ti.d4.n2.d3.n1.2.1.2.3 + + + + + ti.d4.n2.d3.n1.2.1.3.1 + + + + + ti.d4.n2.d3.n1.2.1.3.2 + + + + + ti.d4.n2.d3.n1.2.1.3.3 + + + + + ti.d4.n2.d3.n1.2.2.1.1 + + + + + ti.d4.n2.d3.n1.2.2.1.2 + + + + + ti.d4.n2.d3.n1.2.2.1.3 + + + + + ti.d4.n2.d3.n1.2.2.2.1 + + + + + ti.d4.n2.d3.n1.2.2.2.2 + + + + + ti.d4.n2.d3.n1.2.2.2.3 + + + + + ti.d4.n2.d3.n1.2.2.3.1 + + + + + ti.d4.n2.d3.n1.2.2.3.2 + + + + + ti.d4.n2.d3.n1.2.2.3.3 + + + + + ti.d4.n2.d3.n1.2.3.1.1 + + + + + ti.d4.n2.d3.n1.2.3.1.2 + + + + + ti.d4.n2.d3.n1.2.3.1.3 + + + + + ti.d4.n2.d3.n1.2.3.2.1 + + + + + ti.d4.n2.d3.n1.2.3.2.2 + + + + + ti.d4.n2.d3.n1.2.3.2.3 + + + + + ti.d4.n2.d3.n1.2.3.3.1 + + + + + ti.d4.n2.d3.n1.2.3.3.2 + + + + + ti.d4.n2.d3.n1.2.3.3.3 + + + + + ti.d4.n2.d3.n1.3.1.1.1 + + + + + ti.d4.n2.d3.n1.3.1.1.2 + + + + + ti.d4.n2.d3.n1.3.1.1.3 + + + + + ti.d4.n2.d3.n1.3.1.2.1 + + + + + ti.d4.n2.d3.n1.3.1.2.2 + + + + + ti.d4.n2.d3.n1.3.1.2.3 + + + + + ti.d4.n2.d3.n1.3.1.3.1 + + + + + ti.d4.n2.d3.n1.3.1.3.2 + + + + + ti.d4.n2.d3.n1.3.1.3.3 + + + + + ti.d4.n2.d3.n1.3.2.1.1 + + + + + ti.d4.n2.d3.n1.3.2.1.2 + + + + + ti.d4.n2.d3.n1.3.2.1.3 + + + + + ti.d4.n2.d3.n1.3.2.2.1 + + + + + ti.d4.n2.d3.n1.3.2.2.2 + + + + + ti.d4.n2.d3.n1.3.2.2.3 + + + + + ti.d4.n2.d3.n1.3.2.3.1 + + + + + ti.d4.n2.d3.n1.3.2.3.2 + + + + + ti.d4.n2.d3.n1.3.2.3.3 + + + + + ti.d4.n2.d3.n1.3.3.1.1 + + + + + ti.d4.n2.d3.n1.3.3.1.2 + + + + + ti.d4.n2.d3.n1.3.3.1.3 + + + + + ti.d4.n2.d3.n1.3.3.2.1 + + + + + ti.d4.n2.d3.n1.3.3.2.2 + + + + + ti.d4.n2.d3.n1.3.3.2.3 + + + + + ti.d4.n2.d3.n1.3.3.3.1 + + + + + ti.d4.n2.d3.n1.3.3.3.2 + + + + + ti.d4.n2.d3.n1.3.3.3.3 + + + + + ti.d4.n2.d3.n2.1.1.1.1 + + + + + ti.d4.n2.d3.n2.1.1.1.2 + + + + + ti.d4.n2.d3.n2.1.1.1.3 + + + + + ti.d4.n2.d3.n2.1.1.2.1 + + + + + ti.d4.n2.d3.n2.1.1.2.2 + + + + + ti.d4.n2.d3.n2.1.1.2.3 + + + + + ti.d4.n2.d3.n2.1.1.3.1 + + + + + ti.d4.n2.d3.n2.1.1.3.2 + + + + + ti.d4.n2.d3.n2.1.1.3.3 + + + + + ti.d4.n2.d3.n2.1.2.1.1 + + + + + ti.d4.n2.d3.n2.1.2.1.2 + + + + + ti.d4.n2.d3.n2.1.2.1.3 + + + + + ti.d4.n2.d3.n2.1.2.2.1 + + + + + ti.d4.n2.d3.n2.1.2.2.2 + + + + + ti.d4.n2.d3.n2.1.2.2.3 + + + + + ti.d4.n2.d3.n2.1.2.3.1 + + + + + ti.d4.n2.d3.n2.1.2.3.2 + + + + + ti.d4.n2.d3.n2.1.2.3.3 + + + + + ti.d4.n2.d3.n2.1.3.1.1 + + + + + ti.d4.n2.d3.n2.1.3.1.2 + + + + + ti.d4.n2.d3.n2.1.3.1.3 + + + + + ti.d4.n2.d3.n2.1.3.2.1 + + + + + ti.d4.n2.d3.n2.1.3.2.2 + + + + + ti.d4.n2.d3.n2.1.3.2.3 + + + + + ti.d4.n2.d3.n2.1.3.3.1 + + + + + ti.d4.n2.d3.n2.1.3.3.2 + + + + + ti.d4.n2.d3.n2.1.3.3.3 + + + + + ti.d4.n2.d3.n2.2.1.1.1 + + + + + ti.d4.n2.d3.n2.2.1.1.2 + + + + + ti.d4.n2.d3.n2.2.1.1.3 + + + + + ti.d4.n2.d3.n2.2.1.2.1 + + + + + ti.d4.n2.d3.n2.2.1.2.2 + + + + + ti.d4.n2.d3.n2.2.1.2.3 + + + + + ti.d4.n2.d3.n2.2.1.3.1 + + + + + ti.d4.n2.d3.n2.2.1.3.2 + + + + + ti.d4.n2.d3.n2.2.1.3.3 + + + + + ti.d4.n2.d3.n2.2.2.1.1 + + + + + ti.d4.n2.d3.n2.2.2.1.2 + + + + + ti.d4.n2.d3.n2.2.2.1.3 + + + + + ti.d4.n2.d3.n2.2.2.2.1 + + + + + ti.d4.n2.d3.n2.2.2.2.2 + + + + + ti.d4.n2.d3.n2.2.2.2.3 + + + + + ti.d4.n2.d3.n2.2.2.3.1 + + + + + ti.d4.n2.d3.n2.2.2.3.2 + + + + + ti.d4.n2.d3.n2.2.2.3.3 + + + + + ti.d4.n2.d3.n2.2.3.1.1 + + + + + ti.d4.n2.d3.n2.2.3.1.2 + + + + + ti.d4.n2.d3.n2.2.3.1.3 + + + + + ti.d4.n2.d3.n2.2.3.2.1 + + + + + ti.d4.n2.d3.n2.2.3.2.2 + + + + + ti.d4.n2.d3.n2.2.3.2.3 + + + + + ti.d4.n2.d3.n2.2.3.3.1 + + + + + ti.d4.n2.d3.n2.2.3.3.2 + + + + + ti.d4.n2.d3.n2.2.3.3.3 + + + + + ti.d4.n2.d3.n2.3.1.1.1 + + + + + ti.d4.n2.d3.n2.3.1.1.2 + + + + + ti.d4.n2.d3.n2.3.1.1.3 + + + + + ti.d4.n2.d3.n2.3.1.2.1 + + + + + ti.d4.n2.d3.n2.3.1.2.2 + + + + + ti.d4.n2.d3.n2.3.1.2.3 + + + + + ti.d4.n2.d3.n2.3.1.3.1 + + + + + ti.d4.n2.d3.n2.3.1.3.2 + + + + + ti.d4.n2.d3.n2.3.1.3.3 + + + + + ti.d4.n2.d3.n2.3.2.1.1 + + + + + ti.d4.n2.d3.n2.3.2.1.2 + + + + + ti.d4.n2.d3.n2.3.2.1.3 + + + + + ti.d4.n2.d3.n2.3.2.2.1 + + + + + ti.d4.n2.d3.n2.3.2.2.2 + + + + + ti.d4.n2.d3.n2.3.2.2.3 + + + + + ti.d4.n2.d3.n2.3.2.3.1 + + + + + ti.d4.n2.d3.n2.3.2.3.2 + + + + + ti.d4.n2.d3.n2.3.2.3.3 + + + + + ti.d4.n2.d3.n2.3.3.1.1 + + + + + ti.d4.n2.d3.n2.3.3.1.2 + + + + + ti.d4.n2.d3.n2.3.3.1.3 + + + + + ti.d4.n2.d3.n2.3.3.2.1 + + + + + ti.d4.n2.d3.n2.3.3.2.2 + + + + + ti.d4.n2.d3.n2.3.3.2.3 + + + + + ti.d4.n2.d3.n2.3.3.3.1 + + + + + ti.d4.n2.d3.n2.3.3.3.2 + + + + + ti.d4.n2.d3.n2.3.3.3.3 + + + + + ti.d4.n2.d4.n1.1.1.1.1 + + + + + ti.d4.n2.d4.n1.1.1.1.2 + + + + + ti.d4.n2.d4.n1.1.1.1.3 + + + + + ti.d4.n2.d4.n1.1.1.2.1 + + + + + ti.d4.n2.d4.n1.1.1.2.2 + + + + + ti.d4.n2.d4.n1.1.1.2.3 + + + + + ti.d4.n2.d4.n1.1.1.3.1 + + + + + ti.d4.n2.d4.n1.1.1.3.2 + + + + + ti.d4.n2.d4.n1.1.1.3.3 + + + + + ti.d4.n2.d4.n1.1.2.1.1 + + + + + ti.d4.n2.d4.n1.1.2.1.2 + + + + + ti.d4.n2.d4.n1.1.2.1.3 + + + + + ti.d4.n2.d4.n1.1.2.2.1 + + + + + ti.d4.n2.d4.n1.1.2.2.2 + + + + + ti.d4.n2.d4.n1.1.2.2.3 + + + + + ti.d4.n2.d4.n1.1.2.3.1 + + + + + ti.d4.n2.d4.n1.1.2.3.2 + + + + + ti.d4.n2.d4.n1.1.2.3.3 + + + + + ti.d4.n2.d4.n1.1.3.1.1 + + + + + ti.d4.n2.d4.n1.1.3.1.2 + + + + + ti.d4.n2.d4.n1.1.3.1.3 + + + + + ti.d4.n2.d4.n1.1.3.2.1 + + + + + ti.d4.n2.d4.n1.1.3.2.2 + + + + + ti.d4.n2.d4.n1.1.3.2.3 + + + + + ti.d4.n2.d4.n1.1.3.3.1 + + + + + ti.d4.n2.d4.n1.1.3.3.2 + + + + + ti.d4.n2.d4.n1.1.3.3.3 + + + + + ti.d4.n2.d4.n1.2.1.1.1 + + + + + ti.d4.n2.d4.n1.2.1.1.2 + + + + + ti.d4.n2.d4.n1.2.1.1.3 + + + + + ti.d4.n2.d4.n1.2.1.2.1 + + + + + ti.d4.n2.d4.n1.2.1.2.2 + + + + + ti.d4.n2.d4.n1.2.1.2.3 + + + + + ti.d4.n2.d4.n1.2.1.3.1 + + + + + ti.d4.n2.d4.n1.2.1.3.2 + + + + + ti.d4.n2.d4.n1.2.1.3.3 + + + + + ti.d4.n2.d4.n1.2.2.1.1 + + + + + ti.d4.n2.d4.n1.2.2.1.2 + + + + + ti.d4.n2.d4.n1.2.2.1.3 + + + + + ti.d4.n2.d4.n1.2.2.2.1 + + + + + ti.d4.n2.d4.n1.2.2.2.2 + + + + + ti.d4.n2.d4.n1.2.2.2.3 + + + + + ti.d4.n2.d4.n1.2.2.3.1 + + + + + ti.d4.n2.d4.n1.2.2.3.2 + + + + + ti.d4.n2.d4.n1.2.2.3.3 + + + + + ti.d4.n2.d4.n1.2.3.1.1 + + + + + ti.d4.n2.d4.n1.2.3.1.2 + + + + + ti.d4.n2.d4.n1.2.3.1.3 + + + + + ti.d4.n2.d4.n1.2.3.2.1 + + + + + ti.d4.n2.d4.n1.2.3.2.2 + + + + + ti.d4.n2.d4.n1.2.3.2.3 + + + + + ti.d4.n2.d4.n1.2.3.3.1 + + + + + ti.d4.n2.d4.n1.2.3.3.2 + + + + + ti.d4.n2.d4.n1.2.3.3.3 + + + + + ti.d4.n2.d4.n1.3.1.1.1 + + + + + ti.d4.n2.d4.n1.3.1.1.2 + + + + + ti.d4.n2.d4.n1.3.1.1.3 + + + + + ti.d4.n2.d4.n1.3.1.2.1 + + + + + ti.d4.n2.d4.n1.3.1.2.2 + + + + + ti.d4.n2.d4.n1.3.1.2.3 + + + + + ti.d4.n2.d4.n1.3.1.3.1 + + + + + ti.d4.n2.d4.n1.3.1.3.2 + + + + + ti.d4.n2.d4.n1.3.1.3.3 + + + + + ti.d4.n2.d4.n1.3.2.1.1 + + + + + ti.d4.n2.d4.n1.3.2.1.2 + + + + + ti.d4.n2.d4.n1.3.2.1.3 + + + + + ti.d4.n2.d4.n1.3.2.2.1 + + + + + ti.d4.n2.d4.n1.3.2.2.2 + + + + + ti.d4.n2.d4.n1.3.2.2.3 + + + + + ti.d4.n2.d4.n1.3.2.3.1 + + + + + ti.d4.n2.d4.n1.3.2.3.2 + + + + + ti.d4.n2.d4.n1.3.2.3.3 + + + + + ti.d4.n2.d4.n1.3.3.1.1 + + + + + ti.d4.n2.d4.n1.3.3.1.2 + + + + + ti.d4.n2.d4.n1.3.3.1.3 + + + + + ti.d4.n2.d4.n1.3.3.2.1 + + + + + ti.d4.n2.d4.n1.3.3.2.2 + + + + + ti.d4.n2.d4.n1.3.3.2.3 + + + + + ti.d4.n2.d4.n1.3.3.3.1 + + + + + ti.d4.n2.d4.n1.3.3.3.2 + + + + + ti.d4.n2.d4.n1.3.3.3.3 + + + + + to.d1.n1.1.1.1.1 + + + + + to.d1.n1.1.1.1.2 + + + + + to.d1.n1.1.1.1.3 + + + + + to.d1.n1.1.1.2.1 + + + + + to.d1.n1.1.1.2.2 + + + + + to.d1.n1.1.1.2.3 + + + + + to.d1.n1.1.1.3.1 + + + + + to.d1.n1.1.1.3.2 + + + + + to.d1.n1.1.1.3.3 + + + + + to.d1.n1.1.2.1.1 + + + + + to.d1.n1.1.2.1.2 + + + + + to.d1.n1.1.2.1.3 + + + + + to.d1.n1.1.2.2.1 + + + + + to.d1.n1.1.2.2.2 + + + + + to.d1.n1.1.2.2.3 + + + + + to.d1.n1.1.2.3.1 + + + + + to.d1.n1.1.2.3.2 + + + + + to.d1.n1.1.2.3.3 + + + + + to.d1.n1.1.3.1.1 + + + + + to.d1.n1.1.3.1.2 + + + + + to.d1.n1.1.3.1.3 + + + + + to.d1.n1.1.3.2.1 + + + + + to.d1.n1.1.3.2.2 + + + + + to.d1.n1.1.3.2.3 + + + + + to.d1.n1.1.3.3.1 + + + + + to.d1.n1.1.3.3.2 + + + + + to.d1.n1.1.3.3.3 + + + + + to.d1.n1.2.1.1.1 + + + + + to.d1.n1.2.1.1.2 + + + + + to.d1.n1.2.1.1.3 + + + + + to.d1.n1.2.1.2.1 + + + + + to.d1.n1.2.1.2.2 + + + + + to.d1.n1.2.1.2.3 + + + + + to.d1.n1.2.1.3.1 + + + + + to.d1.n1.2.1.3.2 + + + + + to.d1.n1.2.1.3.3 + + + + + to.d1.n1.2.2.1.1 + + + + + to.d1.n1.2.2.1.2 + + + + + to.d1.n1.2.2.1.3 + + + + + to.d1.n1.2.2.2.1 + + + + + to.d1.n1.2.2.2.2 + + + + + to.d1.n1.2.2.2.3 + + + + + to.d1.n1.2.2.3.1 + + + + + to.d1.n1.2.2.3.2 + + + + + to.d1.n1.2.2.3.3 + + + + + to.d1.n1.2.3.1.1 + + + + + to.d1.n1.2.3.1.2 + + + + + to.d1.n1.2.3.1.3 + + + + + to.d1.n1.2.3.2.1 + + + + + to.d1.n1.2.3.2.2 + + + + + to.d1.n1.2.3.2.3 + + + + + to.d1.n1.2.3.3.1 + + + + + to.d1.n1.2.3.3.2 + + + + + to.d1.n1.2.3.3.3 + + + + + to.d1.n1.3.1.1.1 + + + + + to.d1.n1.3.1.1.2 + + + + + to.d1.n1.3.1.1.3 + + + + + to.d1.n1.3.1.2.1 + + + + + to.d1.n1.3.1.2.2 + + + + + to.d1.n1.3.1.2.3 + + + + + to.d1.n1.3.1.3.1 + + + + + to.d1.n1.3.1.3.2 + + + + + to.d1.n1.3.1.3.3 + + + + + to.d1.n1.3.2.1.1 + + + + + to.d1.n1.3.2.1.2 + + + + + to.d1.n1.3.2.1.3 + + + + + to.d1.n1.3.2.2.1 + + + + + to.d1.n1.3.2.2.2 + + + + + to.d1.n1.3.2.2.3 + + + + + to.d1.n1.3.2.3.1 + + + + + to.d1.n1.3.2.3.2 + + + + + to.d1.n1.3.2.3.3 + + + + + to.d1.n1.3.3.1.1 + + + + + to.d1.n1.3.3.1.2 + + + + + to.d1.n1.3.3.1.3 + + + + + to.d1.n1.3.3.2.1 + + + + + to.d1.n1.3.3.2.2 + + + + + to.d1.n1.3.3.2.3 + + + + + to.d1.n1.3.3.3.1 + + + + + to.d1.n1.3.3.3.2 + + + + + to.d1.n1.3.3.3.3 + + + + + to.d1.n2.1.1.1.1 + + + + + to.d1.n2.1.1.1.2 + + + + + to.d1.n2.1.1.1.3 + + + + + to.d1.n2.1.1.2.1 + + + + + to.d1.n2.1.1.2.2 + + + + + to.d1.n2.1.1.2.3 + + + + + to.d1.n2.1.1.3.1 + + + + + to.d1.n2.1.1.3.2 + + + + + to.d1.n2.1.1.3.3 + + + + + to.d1.n2.1.2.1.1 + + + + + to.d1.n2.1.2.1.2 + + + + + to.d1.n2.1.2.1.3 + + + + + to.d1.n2.1.2.2.1 + + + + + to.d1.n2.1.2.2.2 + + + + + to.d1.n2.1.2.2.3 + + + + + to.d1.n2.1.2.3.1 + + + + + to.d1.n2.1.2.3.2 + + + + + to.d1.n2.1.2.3.3 + + + + + to.d1.n2.1.3.1.1 + + + + + to.d1.n2.1.3.1.2 + + + + + to.d1.n2.1.3.1.3 + + + + + to.d1.n2.1.3.2.1 + + + + + to.d1.n2.1.3.2.2 + + + + + to.d1.n2.1.3.2.3 + + + + + to.d1.n2.1.3.3.1 + + + + + to.d1.n2.1.3.3.2 + + + + + to.d1.n2.1.3.3.3 + + + + + to.d1.n2.2.1.1.1 + + + + + to.d1.n2.2.1.1.2 + + + + + to.d1.n2.2.1.1.3 + + + + + to.d1.n2.2.1.2.1 + + + + + to.d1.n2.2.1.2.2 + + + + + to.d1.n2.2.1.2.3 + + + + + to.d1.n2.2.1.3.1 + + + + + to.d1.n2.2.1.3.2 + + + + + to.d1.n2.2.1.3.3 + + + + + to.d1.n2.2.2.1.1 + + + + + to.d1.n2.2.2.1.2 + + + + + to.d1.n2.2.2.1.3 + + + + + to.d1.n2.2.2.2.1 + + + + + to.d1.n2.2.2.2.2 + + + + + to.d1.n2.2.2.2.3 + + + + + to.d1.n2.2.2.3.1 + + + + + to.d1.n2.2.2.3.2 + + + + + to.d1.n2.2.2.3.3 + + + + + to.d1.n2.2.3.1.1 + + + + + to.d1.n2.2.3.1.2 + + + + + to.d1.n2.2.3.1.3 + + + + + to.d1.n2.2.3.2.1 + + + + + to.d1.n2.2.3.2.2 + + + + + to.d1.n2.2.3.2.3 + + + + + to.d1.n2.2.3.3.1 + + + + + to.d1.n2.2.3.3.2 + + + + + to.d1.n2.2.3.3.3 + + + + + to.d1.n2.3.1.1.1 + + + + + to.d1.n2.3.1.1.2 + + + + + to.d1.n2.3.1.1.3 + + + + + to.d1.n2.3.1.2.1 + + + + + to.d1.n2.3.1.2.2 + + + + + to.d1.n2.3.1.2.3 + + + + + to.d1.n2.3.1.3.1 + + + + + to.d1.n2.3.1.3.2 + + + + + to.d1.n2.3.1.3.3 + + + + + to.d1.n2.3.2.1.1 + + + + + to.d1.n2.3.2.1.2 + + + + + to.d1.n2.3.2.1.3 + + + + + to.d1.n2.3.2.2.1 + + + + + to.d1.n2.3.2.2.2 + + + + + to.d1.n2.3.2.2.3 + + + + + to.d1.n2.3.2.3.1 + + + + + to.d1.n2.3.2.3.2 + + + + + to.d1.n2.3.2.3.3 + + + + + to.d1.n2.3.3.1.1 + + + + + to.d1.n2.3.3.1.2 + + + + + to.d1.n2.3.3.1.3 + + + + + to.d1.n2.3.3.2.1 + + + + + to.d1.n2.3.3.2.2 + + + + + to.d1.n2.3.3.2.3 + + + + + to.d1.n2.3.3.3.1 + + + + + to.d1.n2.3.3.3.2 + + + + + to.d1.n2.3.3.3.3 + + + + + to.d2.n1.1.1.1.1 + + + + + to.d2.n1.1.1.1.2 + + + + + to.d2.n1.1.1.1.3 + + + + + to.d2.n1.1.1.2.1 + + + + + to.d2.n1.1.1.2.2 + + + + + to.d2.n1.1.1.2.3 + + + + + to.d2.n1.1.1.3.1 + + + + + to.d2.n1.1.1.3.2 + + + + + to.d2.n1.1.1.3.3 + + + + + to.d2.n1.1.2.1.1 + + + + + to.d2.n1.1.2.1.2 + + + + + to.d2.n1.1.2.1.3 + + + + + to.d2.n1.1.2.2.1 + + + + + to.d2.n1.1.2.2.2 + + + + + to.d2.n1.1.2.2.3 + + + + + to.d2.n1.1.2.3.1 + + + + + to.d2.n1.1.2.3.2 + + + + + to.d2.n1.1.2.3.3 + + + + + to.d2.n1.1.3.1.1 + + + + + to.d2.n1.1.3.1.2 + + + + + to.d2.n1.1.3.1.3 + + + + + to.d2.n1.1.3.2.1 + + + + + to.d2.n1.1.3.2.2 + + + + + to.d2.n1.1.3.2.3 + + + + + to.d2.n1.1.3.3.1 + + + + + to.d2.n1.1.3.3.2 + + + + + to.d2.n1.1.3.3.3 + + + + + to.d2.n1.2.1.1.1 + + + + + to.d2.n1.2.1.1.2 + + + + + to.d2.n1.2.1.1.3 + + + + + to.d2.n1.2.1.2.1 + + + + + to.d2.n1.2.1.2.2 + + + + + to.d2.n1.2.1.2.3 + + + + + to.d2.n1.2.1.3.1 + + + + + to.d2.n1.2.1.3.2 + + + + + to.d2.n1.2.1.3.3 + + + + + to.d2.n1.2.2.1.1 + + + + + to.d2.n1.2.2.1.2 + + + + + to.d2.n1.2.2.1.3 + + + + + to.d2.n1.2.2.2.1 + + + + + to.d2.n1.2.2.2.2 + + + + + to.d2.n1.2.2.2.3 + + + + + to.d2.n1.2.2.3.1 + + + + + to.d2.n1.2.2.3.2 + + + + + to.d2.n1.2.2.3.3 + + + + + to.d2.n1.2.3.1.1 + + + + + to.d2.n1.2.3.1.2 + + + + + to.d2.n1.2.3.1.3 + + + + + to.d2.n1.2.3.2.1 + + + + + to.d2.n1.2.3.2.2 + + + + + to.d2.n1.2.3.2.3 + + + + + to.d2.n1.2.3.3.1 + + + + + to.d2.n1.2.3.3.2 + + + + + to.d2.n1.2.3.3.3 + + + + + to.d2.n1.3.1.1.1 + + + + + to.d2.n1.3.1.1.2 + + + + + to.d2.n1.3.1.1.3 + + + + + to.d2.n1.3.1.2.1 + + + + + to.d2.n1.3.1.2.2 + + + + + to.d2.n1.3.1.2.3 + + + + + to.d2.n1.3.1.3.1 + + + + + to.d2.n1.3.1.3.2 + + + + + to.d2.n1.3.1.3.3 + + + + + to.d2.n1.3.2.1.1 + + + + + to.d2.n1.3.2.1.2 + + + + + to.d2.n1.3.2.1.3 + + + + + to.d2.n1.3.2.2.1 + + + + + to.d2.n1.3.2.2.2 + + + + + to.d2.n1.3.2.2.3 + + + + + to.d2.n1.3.2.3.1 + + + + + to.d2.n1.3.2.3.2 + + + + + to.d2.n1.3.2.3.3 + + + + + to.d2.n1.3.3.1.1 + + + + + to.d2.n1.3.3.1.2 + + + + + to.d2.n1.3.3.1.3 + + + + + to.d2.n1.3.3.2.1 + + + + + to.d2.n1.3.3.2.2 + + + + + to.d2.n1.3.3.2.3 + + + + + to.d2.n1.3.3.3.1 + + + + + to.d2.n1.3.3.3.2 + + + + + to.d2.n1.3.3.3.3 + + + + + to.d2.n2.1.1.1.1 + + + + + to.d2.n2.1.1.1.2 + + + + + to.d2.n2.1.1.1.3 + + + + + to.d2.n2.1.1.2.1 + + + + + to.d2.n2.1.1.2.2 + + + + + to.d2.n2.1.1.2.3 + + + + + to.d2.n2.1.1.3.1 + + + + + to.d2.n2.1.1.3.2 + + + + + to.d2.n2.1.1.3.3 + + + + + to.d2.n2.1.2.1.1 + + + + + to.d2.n2.1.2.1.2 + + + + + to.d2.n2.1.2.1.3 + + + + + to.d2.n2.1.2.2.1 + + + + + to.d2.n2.1.2.2.2 + + + + + to.d2.n2.1.2.2.3 + + + + + to.d2.n2.1.2.3.1 + + + + + to.d2.n2.1.2.3.2 + + + + + to.d2.n2.1.2.3.3 + + + + + to.d2.n2.1.3.1.1 + + + + + to.d2.n2.1.3.1.2 + + + + + to.d2.n2.1.3.1.3 + + + + + to.d2.n2.1.3.2.1 + + + + + to.d2.n2.1.3.2.2 + + + + + to.d2.n2.1.3.2.3 + + + + + to.d2.n2.1.3.3.1 + + + + + to.d2.n2.1.3.3.2 + + + + + to.d2.n2.1.3.3.3 + + + + + to.d2.n2.2.1.1.1 + + + + + to.d2.n2.2.1.1.2 + + + + + to.d2.n2.2.1.1.3 + + + + + to.d2.n2.2.1.2.1 + + + + + to.d2.n2.2.1.2.2 + + + + + to.d2.n2.2.1.2.3 + + + + + to.d2.n2.2.1.3.1 + + + + + to.d2.n2.2.1.3.2 + + + + + to.d2.n2.2.1.3.3 + + + + + to.d2.n2.2.2.1.1 + + + + + to.d2.n2.2.2.1.2 + + + + + to.d2.n2.2.2.1.3 + + + + + to.d2.n2.2.2.2.1 + + + + + to.d2.n2.2.2.2.2 + + + + + to.d2.n2.2.2.2.3 + + + + + to.d2.n2.2.2.3.1 + + + + + to.d2.n2.2.2.3.2 + + + + + to.d2.n2.2.2.3.3 + + + + + to.d2.n2.2.3.1.1 + + + + + to.d2.n2.2.3.1.2 + + + + + to.d2.n2.2.3.1.3 + + + + + to.d2.n2.2.3.2.1 + + + + + to.d2.n2.2.3.2.2 + + + + + to.d2.n2.2.3.2.3 + + + + + to.d2.n2.2.3.3.1 + + + + + to.d2.n2.2.3.3.2 + + + + + to.d2.n2.2.3.3.3 + + + + + to.d2.n2.3.1.1.1 + + + + + to.d2.n2.3.1.1.2 + + + + + to.d2.n2.3.1.1.3 + + + + + to.d2.n2.3.1.2.1 + + + + + to.d2.n2.3.1.2.2 + + + + + to.d2.n2.3.1.2.3 + + + + + to.d2.n2.3.1.3.1 + + + + + to.d2.n2.3.1.3.2 + + + + + to.d2.n2.3.1.3.3 + + + + + to.d2.n2.3.2.1.1 + + + + + to.d2.n2.3.2.1.2 + + + + + to.d2.n2.3.2.1.3 + + + + + to.d2.n2.3.2.2.1 + + + + + to.d2.n2.3.2.2.2 + + + + + to.d2.n2.3.2.2.3 + + + + + to.d2.n2.3.2.3.1 + + + + + to.d2.n2.3.2.3.2 + + + + + to.d2.n2.3.2.3.3 + + + + + to.d2.n2.3.3.1.1 + + + + + to.d2.n2.3.3.1.2 + + + + + to.d2.n2.3.3.1.3 + + + + + to.d2.n2.3.3.2.1 + + + + + to.d2.n2.3.3.2.2 + + + + + to.d2.n2.3.3.2.3 + + + + + to.d2.n2.3.3.3.1 + + + + + to.d2.n2.3.3.3.2 + + + + + to.d2.n2.3.3.3.3 + + + + + to.d3.n1.1.1.1.1 + + + + + to.d3.n1.1.1.1.2 + + + + + to.d3.n1.1.1.1.3 + + + + + to.d3.n1.1.1.2.1 + + + + + to.d3.n1.1.1.2.2 + + + + + to.d3.n1.1.1.2.3 + + + + + to.d3.n1.1.1.3.1 + + + + + to.d3.n1.1.1.3.2 + + + + + to.d3.n1.1.1.3.3 + + + + + to.d3.n1.1.2.1.1 + + + + + to.d3.n1.1.2.1.2 + + + + + to.d3.n1.1.2.1.3 + + + + + to.d3.n1.1.2.2.1 + + + + + to.d3.n1.1.2.2.2 + + + + + to.d3.n1.1.2.2.3 + + + + + to.d3.n1.1.2.3.1 + + + + + to.d3.n1.1.2.3.2 + + + + + to.d3.n1.1.2.3.3 + + + + + to.d3.n1.1.3.1.1 + + + + + to.d3.n1.1.3.1.2 + + + + + to.d3.n1.1.3.1.3 + + + + + to.d3.n1.1.3.2.1 + + + + + to.d3.n1.1.3.2.2 + + + + + to.d3.n1.1.3.2.3 + + + + + to.d3.n1.1.3.3.1 + + + + + to.d3.n1.1.3.3.2 + + + + + to.d3.n1.1.3.3.3 + + + + + to.d3.n1.2.1.1.1 + + + + + to.d3.n1.2.1.1.2 + + + + + to.d3.n1.2.1.1.3 + + + + + to.d3.n1.2.1.2.1 + + + + + to.d3.n1.2.1.2.2 + + + + + to.d3.n1.2.1.2.3 + + + + + to.d3.n1.2.1.3.1 + + + + + to.d3.n1.2.1.3.2 + + + + + to.d3.n1.2.1.3.3 + + + + + to.d3.n1.2.2.1.1 + + + + + to.d3.n1.2.2.1.2 + + + + + to.d3.n1.2.2.1.3 + + + + + to.d3.n1.2.2.2.1 + + + + + to.d3.n1.2.2.2.2 + + + + + to.d3.n1.2.2.2.3 + + + + + to.d3.n1.2.2.3.1 + + + + + to.d3.n1.2.2.3.2 + + + + + to.d3.n1.2.2.3.3 + + + + + to.d3.n1.2.3.1.1 + + + + + to.d3.n1.2.3.1.2 + + + + + to.d3.n1.2.3.1.3 + + + + + to.d3.n1.2.3.2.1 + + + + + to.d3.n1.2.3.2.2 + + + + + to.d3.n1.2.3.2.3 + + + + + to.d3.n1.2.3.3.1 + + + + + to.d3.n1.2.3.3.2 + + + + + to.d3.n1.2.3.3.3 + + + + + to.d3.n1.3.1.1.1 + + + + + to.d3.n1.3.1.1.2 + + + + + to.d3.n1.3.1.1.3 + + + + + to.d3.n1.3.1.2.1 + + + + + to.d3.n1.3.1.2.2 + + + + + to.d3.n1.3.1.2.3 + + + + + to.d3.n1.3.1.3.1 + + + + + to.d3.n1.3.1.3.2 + + + + + to.d3.n1.3.1.3.3 + + + + + to.d3.n1.3.2.1.1 + + + + + to.d3.n1.3.2.1.2 + + + + + to.d3.n1.3.2.1.3 + + + + + to.d3.n1.3.2.2.1 + + + + + to.d3.n1.3.2.2.2 + + + + + to.d3.n1.3.2.2.3 + + + + + to.d3.n1.3.2.3.1 + + + + + to.d3.n1.3.2.3.2 + + + + + to.d3.n1.3.2.3.3 + + + + + to.d3.n1.3.3.1.1 + + + + + to.d3.n1.3.3.1.2 + + + + + to.d3.n1.3.3.1.3 + + + + + to.d3.n1.3.3.2.1 + + + + + to.d3.n1.3.3.2.2 + + + + + to.d3.n1.3.3.2.3 + + + + + to.d3.n1.3.3.3.1 + + + + + to.d3.n1.3.3.3.2 + + + + + to.d3.n1.3.3.3.3 + + + + + to.d3.n2.1.1.1.1 + + + + + to.d3.n2.1.1.1.2 + + + + + to.d3.n2.1.1.1.3 + + + + + to.d3.n2.1.1.2.1 + + + + + to.d3.n2.1.1.2.2 + + + + + to.d3.n2.1.1.2.3 + + + + + to.d3.n2.1.1.3.1 + + + + + to.d3.n2.1.1.3.2 + + + + + to.d3.n2.1.1.3.3 + + + + + to.d3.n2.1.2.1.1 + + + + + to.d3.n2.1.2.1.2 + + + + + to.d3.n2.1.2.1.3 + + + + + to.d3.n2.1.2.2.1 + + + + + to.d3.n2.1.2.2.2 + + + + + to.d3.n2.1.2.2.3 + + + + + to.d3.n2.1.2.3.1 + + + + + to.d3.n2.1.2.3.2 + + + + + to.d3.n2.1.2.3.3 + + + + + to.d3.n2.1.3.1.1 + + + + + to.d3.n2.1.3.1.2 + + + + + to.d3.n2.1.3.1.3 + + + + + to.d3.n2.1.3.2.1 + + + + + to.d3.n2.1.3.2.2 + + + + + to.d3.n2.1.3.2.3 + + + + + to.d3.n2.1.3.3.1 + + + + + to.d3.n2.1.3.3.2 + + + + + to.d3.n2.1.3.3.3 + + + + + to.d3.n2.2.1.1.1 + + + + + to.d3.n2.2.1.1.2 + + + + + to.d3.n2.2.1.1.3 + + + + + to.d3.n2.2.1.2.1 + + + + + to.d3.n2.2.1.2.2 + + + + + to.d3.n2.2.1.2.3 + + + + + to.d3.n2.2.1.3.1 + + + + + to.d3.n2.2.1.3.2 + + + + + to.d3.n2.2.1.3.3 + + + + + to.d3.n2.2.2.1.1 + + + + + to.d3.n2.2.2.1.2 + + + + + to.d3.n2.2.2.1.3 + + + + + to.d3.n2.2.2.2.1 + + + + + to.d3.n2.2.2.2.2 + + + + + to.d3.n2.2.2.2.3 + + + + + to.d3.n2.2.2.3.1 + + + + + to.d3.n2.2.2.3.2 + + + + + to.d3.n2.2.2.3.3 + + + + + to.d3.n2.2.3.1.1 + + + + + to.d3.n2.2.3.1.2 + + + + + to.d3.n2.2.3.1.3 + + + + + to.d3.n2.2.3.2.1 + + + + + to.d3.n2.2.3.2.2 + + + + + to.d3.n2.2.3.2.3 + + + + + to.d3.n2.2.3.3.1 + + + + + to.d3.n2.2.3.3.2 + + + + + to.d3.n2.2.3.3.3 + + + + + to.d3.n2.3.1.1.1 + + + + + to.d3.n2.3.1.1.2 + + + + + to.d3.n2.3.1.1.3 + + + + + to.d3.n2.3.1.2.1 + + + + + to.d3.n2.3.1.2.2 + + + + + to.d3.n2.3.1.2.3 + + + + + to.d3.n2.3.1.3.1 + + + + + to.d3.n2.3.1.3.2 + + + + + to.d3.n2.3.1.3.3 + + + + + to.d3.n2.3.2.1.1 + + + + + to.d3.n2.3.2.1.2 + + + + + to.d3.n2.3.2.1.3 + + + + + to.d3.n2.3.2.2.1 + + + + + to.d3.n2.3.2.2.2 + + + + + to.d3.n2.3.2.2.3 + + + + + to.d3.n2.3.2.3.1 + + + + + to.d3.n2.3.2.3.2 + + + + + to.d3.n2.3.2.3.3 + + + + + to.d3.n2.3.3.1.1 + + + + + to.d3.n2.3.3.1.2 + + + + + to.d3.n2.3.3.1.3 + + + + + to.d3.n2.3.3.2.1 + + + + + to.d3.n2.3.3.2.2 + + + + + to.d3.n2.3.3.2.3 + + + + + to.d3.n2.3.3.3.1 + + + + + to.d3.n2.3.3.3.2 + + + + + to.d3.n2.3.3.3.3 + + + + + to.d4.n1.1.1.1.1 + + + + + to.d4.n1.1.1.1.2 + + + + + to.d4.n1.1.1.1.3 + + + + + to.d4.n1.1.1.2.1 + + + + + to.d4.n1.1.1.2.2 + + + + + to.d4.n1.1.1.2.3 + + + + + to.d4.n1.1.1.3.1 + + + + + to.d4.n1.1.1.3.2 + + + + + to.d4.n1.1.1.3.3 + + + + + to.d4.n1.1.2.1.1 + + + + + to.d4.n1.1.2.1.2 + + + + + to.d4.n1.1.2.1.3 + + + + + to.d4.n1.1.2.2.1 + + + + + to.d4.n1.1.2.2.2 + + + + + to.d4.n1.1.2.2.3 + + + + + to.d4.n1.1.2.3.1 + + + + + to.d4.n1.1.2.3.2 + + + + + to.d4.n1.1.2.3.3 + + + + + to.d4.n1.1.3.1.1 + + + + + to.d4.n1.1.3.1.2 + + + + + to.d4.n1.1.3.1.3 + + + + + to.d4.n1.1.3.2.1 + + + + + to.d4.n1.1.3.2.2 + + + + + to.d4.n1.1.3.2.3 + + + + + to.d4.n1.1.3.3.1 + + + + + to.d4.n1.1.3.3.2 + + + + + to.d4.n1.1.3.3.3 + + + + + to.d4.n1.2.1.1.1 + + + + + to.d4.n1.2.1.1.2 + + + + + to.d4.n1.2.1.1.3 + + + + + to.d4.n1.2.1.2.1 + + + + + to.d4.n1.2.1.2.2 + + + + + to.d4.n1.2.1.2.3 + + + + + to.d4.n1.2.1.3.1 + + + + + to.d4.n1.2.1.3.2 + + + + + to.d4.n1.2.1.3.3 + + + + + to.d4.n1.2.2.1.1 + + + + + to.d4.n1.2.2.1.2 + + + + + to.d4.n1.2.2.1.3 + + + + + to.d4.n1.2.2.2.1 + + + + + to.d4.n1.2.2.2.2 + + + + + to.d4.n1.2.2.2.3 + + + + + to.d4.n1.2.2.3.1 + + + + + to.d4.n1.2.2.3.2 + + + + + to.d4.n1.2.2.3.3 + + + + + to.d4.n1.2.3.1.1 + + + + + to.d4.n1.2.3.1.2 + + + + + to.d4.n1.2.3.1.3 + + + + + to.d4.n1.2.3.2.1 + + + + + to.d4.n1.2.3.2.2 + + + + + to.d4.n1.2.3.2.3 + + + + + to.d4.n1.2.3.3.1 + + + + + to.d4.n1.2.3.3.2 + + + + + to.d4.n1.2.3.3.3 + + + + + to.d4.n1.3.1.1.1 + + + + + to.d4.n1.3.1.1.2 + + + + + to.d4.n1.3.1.1.3 + + + + + to.d4.n1.3.1.2.1 + + + + + to.d4.n1.3.1.2.2 + + + + + to.d4.n1.3.1.2.3 + + + + + to.d4.n1.3.1.3.1 + + + + + to.d4.n1.3.1.3.2 + + + + + to.d4.n1.3.1.3.3 + + + + + to.d4.n1.3.2.1.1 + + + + + to.d4.n1.3.2.1.2 + + + + + to.d4.n1.3.2.1.3 + + + + + to.d4.n1.3.2.2.1 + + + + + to.d4.n1.3.2.2.2 + + + + + to.d4.n1.3.2.2.3 + + + + + to.d4.n1.3.2.3.1 + + + + + to.d4.n1.3.2.3.2 + + + + + to.d4.n1.3.2.3.3 + + + + + to.d4.n1.3.3.1.1 + + + + + to.d4.n1.3.3.1.2 + + + + + to.d4.n1.3.3.1.3 + + + + + to.d4.n1.3.3.2.1 + + + + + to.d4.n1.3.3.2.2 + + + + + to.d4.n1.3.3.2.3 + + + + + to.d4.n1.3.3.3.1 + + + + + to.d4.n1.3.3.3.2 + + + + + to.d4.n1.3.3.3.3 + + + + + to.d4.n2.1.1.1.1 + + + + + to.d4.n2.1.1.1.2 + + + + + to.d4.n2.1.1.1.3 + + + + + to.d4.n2.1.1.2.1 + + + + + to.d4.n2.1.1.2.2 + + + + + to.d4.n2.1.1.2.3 + + + + + to.d4.n2.1.1.3.1 + + + + + to.d4.n2.1.1.3.2 + + + + + to.d4.n2.1.1.3.3 + + + + + to.d4.n2.1.2.1.1 + + + + + to.d4.n2.1.2.1.2 + + + + + to.d4.n2.1.2.1.3 + + + + + to.d4.n2.1.2.2.1 + + + + + to.d4.n2.1.2.2.2 + + + + + to.d4.n2.1.2.2.3 + + + + + to.d4.n2.1.2.3.1 + + + + + to.d4.n2.1.2.3.2 + + + + + to.d4.n2.1.2.3.3 + + + + + to.d4.n2.1.3.1.1 + + + + + to.d4.n2.1.3.1.2 + + + + + to.d4.n2.1.3.1.3 + + + + + to.d4.n2.1.3.2.1 + + + + + to.d4.n2.1.3.2.2 + + + + + to.d4.n2.1.3.2.3 + + + + + to.d4.n2.1.3.3.1 + + + + + to.d4.n2.1.3.3.2 + + + + + to.d4.n2.1.3.3.3 + + + + + to.d4.n2.2.1.1.1 + + + + + to.d4.n2.2.1.1.2 + + + + + to.d4.n2.2.1.1.3 + + + + + to.d4.n2.2.1.2.1 + + + + + to.d4.n2.2.1.2.2 + + + + + to.d4.n2.2.1.2.3 + + + + + to.d4.n2.2.1.3.1 + + + + + to.d4.n2.2.1.3.2 + + + + + to.d4.n2.2.1.3.3 + + + + + to.d4.n2.2.2.1.1 + + + + + to.d4.n2.2.2.1.2 + + + + + to.d4.n2.2.2.1.3 + + + + + to.d4.n2.2.2.2.1 + + + + + to.d4.n2.2.2.2.2 + + + + + to.d4.n2.2.2.2.3 + + + + + to.d4.n2.2.2.3.1 + + + + + to.d4.n2.2.2.3.2 + + + + + to.d4.n2.2.2.3.3 + + + + + to.d4.n2.2.3.1.1 + + + + + to.d4.n2.2.3.1.2 + + + + + to.d4.n2.2.3.1.3 + + + + + to.d4.n2.2.3.2.1 + + + + + to.d4.n2.2.3.2.2 + + + + + to.d4.n2.2.3.2.3 + + + + + to.d4.n2.2.3.3.1 + + + + + to.d4.n2.2.3.3.2 + + + + + to.d4.n2.2.3.3.3 + + + + + to.d4.n2.3.1.1.1 + + + + + to.d4.n2.3.1.1.2 + + + + + to.d4.n2.3.1.1.3 + + + + + to.d4.n2.3.1.2.1 + + + + + to.d4.n2.3.1.2.2 + + + + + to.d4.n2.3.1.2.3 + + + + + to.d4.n2.3.1.3.1 + + + + + to.d4.n2.3.1.3.2 + + + + + to.d4.n2.3.1.3.3 + + + + + to.d4.n2.3.2.1.1 + + + + + to.d4.n2.3.2.1.2 + + + + + to.d4.n2.3.2.1.3 + + + + + to.d4.n2.3.2.2.1 + + + + + to.d4.n2.3.2.2.2 + + + + + to.d4.n2.3.2.2.3 + + + + + to.d4.n2.3.2.3.1 + + + + + to.d4.n2.3.2.3.2 + + + + + to.d4.n2.3.2.3.3 + + + + + to.d4.n2.3.3.1.1 + + + + + to.d4.n2.3.3.1.2 + + + + + to.d4.n2.3.3.1.3 + + + + + to.d4.n2.3.3.2.1 + + + + + to.d4.n2.3.3.2.2 + + + + + to.d4.n2.3.3.2.3 + + + + + to.d4.n2.3.3.3.1 + + + + + to.d4.n2.3.3.3.2 + + + + + to.d4.n2.3.3.3.3 + + + + + tt.d1.n1.1.1.1.1 + + + + + tt.d1.n1.1.1.1.2 + + + + + tt.d1.n1.1.1.1.3 + + + + + tt.d1.n1.1.1.2.1 + + + + + tt.d1.n1.1.1.2.2 + + + + + tt.d1.n1.1.1.2.3 + + + + + tt.d1.n1.1.1.3.1 + + + + + tt.d1.n1.1.1.3.2 + + + + + tt.d1.n1.1.1.3.3 + + + + + tt.d1.n1.1.2.1.1 + + + + + tt.d1.n1.1.2.1.2 + + + + + tt.d1.n1.1.2.1.3 + + + + + tt.d1.n1.1.2.2.1 + + + + + tt.d1.n1.1.2.2.2 + + + + + tt.d1.n1.1.2.2.3 + + + + + tt.d1.n1.1.2.3.1 + + + + + tt.d1.n1.1.2.3.2 + + + + + tt.d1.n1.1.2.3.3 + + + + + tt.d1.n1.1.3.1.1 + + + + + tt.d1.n1.1.3.1.2 + + + + + tt.d1.n1.1.3.1.3 + + + + + tt.d1.n1.1.3.2.1 + + + + + tt.d1.n1.1.3.2.2 + + + + + tt.d1.n1.1.3.2.3 + + + + + tt.d1.n1.1.3.3.1 + + + + + tt.d1.n1.1.3.3.2 + + + + + tt.d1.n1.1.3.3.3 + + + + + tt.d1.n1.4.1.1.1 + + + + + tt.d1.n1.4.1.1.2 + + + + + tt.d1.n1.4.1.1.3 + + + + + tt.d1.n1.4.1.2.1 + + + + + tt.d1.n1.4.1.2.2 + + + + + tt.d1.n1.4.1.2.3 + + + + + tt.d1.n1.4.1.3.1 + + + + + tt.d1.n1.4.1.3.2 + + + + + tt.d1.n1.4.1.3.3 + + + + + tt.d1.n1.4.2.1.1 + + + + + tt.d1.n1.4.2.1.2 + + + + + tt.d1.n1.4.2.1.3 + + + + + tt.d1.n1.4.2.2.1 + + + + + tt.d1.n1.4.2.2.2 + + + + + tt.d1.n1.4.2.2.3 + + + + + tt.d1.n1.4.2.3.1 + + + + + tt.d1.n1.4.2.3.2 + + + + + tt.d1.n1.4.2.3.3 + + + + + tt.d1.n1.4.3.1.1 + + + + + tt.d1.n1.4.3.1.2 + + + + + tt.d1.n1.4.3.1.3 + + + + + tt.d1.n1.4.3.2.1 + + + + + tt.d1.n1.4.3.2.2 + + + + + tt.d1.n1.4.3.2.3 + + + + + tt.d1.n1.4.3.3.1 + + + + + tt.d1.n1.4.3.3.2 + + + + + tt.d1.n1.4.3.3.3 + + + + + tt.d2.n1.1.1.1.1 + + + + + tt.d2.n1.1.1.1.2 + + + + + tt.d2.n1.1.1.1.3 + + + + + tt.d2.n1.1.1.2.1 + + + + + tt.d2.n1.1.1.2.2 + + + + + tt.d2.n1.1.1.2.3 + + + + + tt.d2.n1.1.1.3.1 + + + + + tt.d2.n1.1.1.3.2 + + + + + tt.d2.n1.1.1.3.3 + + + + + tt.d2.n1.1.4.1.1 + + + + + tt.d2.n1.1.4.1.2 + + + + + tt.d2.n1.1.4.1.3 + + + + + tt.d2.n1.1.4.2.1 + + + + + tt.d2.n1.1.4.2.2 + + + + + tt.d2.n1.1.4.2.3 + + + + + tt.d2.n1.1.4.3.1 + + + + + tt.d2.n1.1.4.3.2 + + + + + tt.d2.n1.1.4.3.3 + + + + + tt.d2.n1.2.1.1.1 + + + + + tt.d2.n1.2.1.1.2 + + + + + tt.d2.n1.2.1.1.3 + + + + + tt.d2.n1.2.1.2.1 + + + + + tt.d2.n1.2.1.2.2 + + + + + tt.d2.n1.2.1.2.3 + + + + + tt.d2.n1.2.1.3.1 + + + + + tt.d2.n1.2.1.3.2 + + + + + tt.d2.n1.2.1.3.3 + + + + + tt.d2.n1.2.4.1.1 + + + + + tt.d2.n1.2.4.1.2 + + + + + tt.d2.n1.2.4.1.3 + + + + + tt.d2.n1.2.4.2.1 + + + + + tt.d2.n1.2.4.2.2 + + + + + tt.d2.n1.2.4.2.3 + + + + + tt.d2.n1.2.4.3.1 + + + + + tt.d2.n1.2.4.3.2 + + + + + tt.d2.n1.2.4.3.3 + + + + + tt.d2.n1.3.1.1.1 + + + + + tt.d2.n1.3.1.1.2 + + + + + tt.d2.n1.3.1.1.3 + + + + + tt.d2.n1.3.1.2.1 + + + + + tt.d2.n1.3.1.2.2 + + + + + tt.d2.n1.3.1.2.3 + + + + + tt.d2.n1.3.1.3.1 + + + + + tt.d2.n1.3.1.3.2 + + + + + tt.d2.n1.3.1.3.3 + + + + + tt.d2.n1.3.4.1.1 + + + + + tt.d2.n1.3.4.1.2 + + + + + tt.d2.n1.3.4.1.3 + + + + + tt.d2.n1.3.4.2.1 + + + + + tt.d2.n1.3.4.2.2 + + + + + tt.d2.n1.3.4.2.3 + + + + + tt.d2.n1.3.4.3.1 + + + + + tt.d2.n1.3.4.3.2 + + + + + tt.d2.n1.3.4.3.3 + + + + + tt.d3.n1.1.1.1.1 + + + + + tt.d3.n1.1.1.1.2 + + + + + tt.d3.n1.1.1.1.3 + + + + + tt.d3.n1.1.1.4.1 + + + + + tt.d3.n1.1.1.4.2 + + + + + tt.d3.n1.1.1.4.3 + + + + + tt.d3.n1.1.2.1.1 + + + + + tt.d3.n1.1.2.1.2 + + + + + tt.d3.n1.1.2.1.3 + + + + + tt.d3.n1.1.2.4.1 + + + + + tt.d3.n1.1.2.4.2 + + + + + tt.d3.n1.1.2.4.3 + + + + + tt.d3.n1.1.3.1.1 + + + + + tt.d3.n1.1.3.1.2 + + + + + tt.d3.n1.1.3.1.3 + + + + + tt.d3.n1.1.3.4.1 + + + + + tt.d3.n1.1.3.4.2 + + + + + tt.d3.n1.1.3.4.3 + + + + + tt.d3.n1.2.1.1.1 + + + + + tt.d3.n1.2.1.1.2 + + + + + tt.d3.n1.2.1.1.3 + + + + + tt.d3.n1.2.1.4.1 + + + + + tt.d3.n1.2.1.4.2 + + + + + tt.d3.n1.2.1.4.3 + + + + + tt.d3.n1.2.2.1.1 + + + + + tt.d3.n1.2.2.1.2 + + + + + tt.d3.n1.2.2.1.3 + + + + + tt.d3.n1.2.2.4.1 + + + + + tt.d3.n1.2.2.4.2 + + + + + tt.d3.n1.2.2.4.3 + + + + + tt.d3.n1.2.3.1.1 + + + + + tt.d3.n1.2.3.1.2 + + + + + tt.d3.n1.2.3.1.3 + + + + + tt.d3.n1.2.3.4.1 + + + + + tt.d3.n1.2.3.4.2 + + + + + tt.d3.n1.2.3.4.3 + + + + + tt.d3.n1.3.1.1.1 + + + + + tt.d3.n1.3.1.1.2 + + + + + tt.d3.n1.3.1.1.3 + + + + + tt.d3.n1.3.1.4.1 + + + + + tt.d3.n1.3.1.4.2 + + + + + tt.d3.n1.3.1.4.3 + + + + + tt.d3.n1.3.2.1.1 + + + + + tt.d3.n1.3.2.1.2 + + + + + tt.d3.n1.3.2.1.3 + + + + + tt.d3.n1.3.2.4.1 + + + + + tt.d3.n1.3.2.4.2 + + + + + tt.d3.n1.3.2.4.3 + + + + + tt.d3.n1.3.3.1.1 + + + + + tt.d3.n1.3.3.1.2 + + + + + tt.d3.n1.3.3.1.3 + + + + + tt.d3.n1.3.3.4.1 + + + + + tt.d3.n1.3.3.4.2 + + + + + tt.d3.n1.3.3.4.3 + + + + + tt.d4.n1.1.1.1.1 + + + + + tt.d4.n1.1.1.1.4 + + + + + tt.d4.n1.1.1.2.1 + + + + + tt.d4.n1.1.1.2.4 + + + + + tt.d4.n1.1.1.3.1 + + + + + tt.d4.n1.1.1.3.4 + + + + + tt.d4.n1.1.2.1.1 + + + + + tt.d4.n1.1.2.1.4 + + + + + tt.d4.n1.1.2.2.1 + + + + + tt.d4.n1.1.2.2.4 + + + + + tt.d4.n1.1.2.3.1 + + + + + tt.d4.n1.1.2.3.4 + + + + + tt.d4.n1.1.3.1.1 + + + + + tt.d4.n1.1.3.1.4 + + + + + tt.d4.n1.1.3.2.1 + + + + + tt.d4.n1.1.3.2.4 + + + + + tt.d4.n1.1.3.3.1 + + + + + tt.d4.n1.1.3.3.4 + + + + + tt.d4.n1.2.1.1.1 + + + + + tt.d4.n1.2.1.1.4 + + + + + tt.d4.n1.2.1.2.1 + + + + + tt.d4.n1.2.1.2.4 + + + + + tt.d4.n1.2.1.3.1 + + + + + tt.d4.n1.2.1.3.4 + + + + + tt.d4.n1.2.2.1.1 + + + + + tt.d4.n1.2.2.1.4 + + + + + tt.d4.n1.2.2.2.1 + + + + + tt.d4.n1.2.2.2.4 + + + + + tt.d4.n1.2.2.3.1 + + + + + tt.d4.n1.2.2.3.4 + + + + + tt.d4.n1.2.3.1.1 + + + + + tt.d4.n1.2.3.1.4 + + + + + tt.d4.n1.2.3.2.1 + + + + + tt.d4.n1.2.3.2.4 + + + + + tt.d4.n1.2.3.3.1 + + + + + tt.d4.n1.2.3.3.4 + + + + + tt.d4.n1.3.1.1.1 + + + + + tt.d4.n1.3.1.1.4 + + + + + tt.d4.n1.3.1.2.1 + + + + + tt.d4.n1.3.1.2.4 + + + + + tt.d4.n1.3.1.3.1 + + + + + tt.d4.n1.3.1.3.4 + + + + + tt.d4.n1.3.2.1.1 + + + + + tt.d4.n1.3.2.1.4 + + + + + tt.d4.n1.3.2.2.1 + + + + + tt.d4.n1.3.2.2.4 + + + + + tt.d4.n1.3.2.3.1 + + + + + tt.d4.n1.3.2.3.4 + + + + + tt.d4.n1.3.3.1.1 + + + + + tt.d4.n1.3.3.1.4 + + + + + tt.d4.n1.3.3.2.1 + + + + + tt.d4.n1.3.3.2.4 + + + + + tt.d4.n1.3.3.3.1 + + + + + tt.d4.n1.3.3.3.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/gspn/HypercubeGrid/hc5k3p3b15.pnml.REMOVED.git-id b/examples/gspn/HypercubeGrid/hc5k3p3b15.pnml.REMOVED.git-id new file mode 100644 index 000000000..d765f7a34 --- /dev/null +++ b/examples/gspn/HypercubeGrid/hc5k3p3b15.pnml.REMOVED.git-id @@ -0,0 +1 @@ +1dcc3a0045e4d0f9358f9ee04e70c6f0107929be \ No newline at end of file diff --git a/examples/gspn/ibm319/IBM319.pnml b/examples/gspn/ibm319/IBM319.pnml new file mode 100644 index 000000000..351004036 --- /dev/null +++ b/examples/gspn/ibm319/IBM319.pnml @@ -0,0 +1,5554 @@ + + + + + + + alpha + + + 1 + + + + + merge.s00002240.activated + + + 0 + + + + + merge.s00001160.activated + + + 0 + + + + + merge.s00001061.activated + + + 0 + + + + + merge.s00002241.activated + + + 0 + + + + + merge.s00001161.activated + + + 0 + + + + + merge.s00001162.activated + + + 0 + + + + + merge.s00002238.activated + + + 0 + + + + + merge.s00002239.activated + + + 0 + + + + + join.s00001163.input.s00001052 + + + 0 + + + + + join.s00001164.input.s00001052 + + + 0 + + + + + callToProcess.s00002882.inputCriterion.s00001053.used + + + 0 + + + + + join.s00001164.input.s00001127 + + + 0 + + + + + join.s00001163.input.s00001128 + + + 0 + + + + + callToProcess.s00002944.inputCriterion.s00001053.used + + + 0 + + + + + callToProcess.s00002943.inputCriterion.s00001053.used + + + 0 + + + + + callToProcess.s00002038.inputCriterion.s00001053.used + + + 0 + + + + + merge.s00002240.input.s00001052 + + + 0 + + + + + merge.s00001160.input.s00001052 + + + 0 + + + + + merge.s00001061.input.s00001052 + + + 0 + + + + + merge.s00002241.input.s00001052 + + + 0 + + + + + merge.s00001161.input.s00001052 + + + 0 + + + + + merge.s00001162.input.s00001052 + + + 0 + + + + + merge.s00002240.input.s00001127 + + + 0 + + + + + callToProcess.s00002802.inputCriterion.s00001053.used + + + 0 + + + + + merge.s00002241.input.s00001127 + + + 0 + + + + + callToProcess.s00001108.inputCriterion.s00001053.used + + + 0 + + + + + merge.s00001160.input.s00001129 + + + 0 + + + + + callToProcess.s00002121.inputCriterion.s00001053.used + + + 0 + + + + + merge.s00002238.input.s00001052 + + + 0 + + + + + callToTask.s00002869.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002896.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002959.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002949.inputCriterion.s00001053.used + + + 0 + + + + + merge.s00002239.input.s00001128 + + + 0 + + + + + merge.s00002239.input.s00001129 + + + 0 + + + + + callToTask.s00002958.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002957.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002966.inputCriterion.s00001053.used + + + 0 + + + + + decision.s00003020.activated + + + 0 + + + + + decision.s00003021.activated + + + 0 + + + + + decision.s00003022.activated + + + 0 + + + + + decision.s00001123.activated + + + 0 + + + + + decision.s00001126.activated + + + 0 + + + + + decision.s00002055.activated + + + 0 + + + + + decision.s00002056.activated + + + 0 + + + + + decision.s00001840.activated + + + 0 + + + + + decision.s00001841.activated + + + 0 + + + + + decision.s00001157.activated + + + 0 + + + + + decision.s00002760.activated + + + 0 + + + + + decision.s00001158.activated + + + 0 + + + + + decision.s00002761.activated + + + 0 + + + + + decision.s00001159.activated + + + 0 + + + + + decision.s00002762.activated + + + 0 + + + + + decision.s00002948.activated + + + 0 + + + + + join.s00001163.activated.s00001062 + + + 0 + + + + + join.s00001164.activated.s00001062 + + + 0 + + + + + fork.s00001403.activated.s00001073 + + + 0 + + + + + join.s00001163.activated.s00001064 + + + 0 + + + + + fork.s00001071.activated.s00001073 + + + 0 + + + + + join.s00001164.activated.s00001064 + + + 0 + + + + + join.s00001163.activated.s00001065 + + + 0 + + + + + fork.s00001403.activated.s00001075 + + + 0 + + + + + fork.s00001071.activated.s00001075 + + + 0 + + + + + fork.s00001298.activated.s00001073 + + + 0 + + + + + fork.s00001298.activated.s00001075 + + + 0 + + + + + fork.s00001298.activated.s00001078 + + + 0 + + + + + decision.s00001123.input.s00001052 + + + 0 + + + + + decision.s00001126.input.s00001052 + + + 0 + + + + + decision.s00002055.input.s00001052 + + + 0 + + + + + callToTask.s00002929.inputCriterion.s00001053.used + + + 0 + + + + + decision.s00001841.input.s00001052 + + + 0 + + + + + callToTask.s00002956.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002965.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002667.inputCriterion.s00001053.used + + + 0 + + + + + endNode.s00001401.input.default + + + 0 + + + + + endNode.s00001057.input.default + + + 0 + + + + + callToTask.s00002063.input.s00001052 + + + 0 + + + + + callToTask.s00001406.input.s00001052 + + + 0 + + + + + callToTask.s00002930.input.s00001052 + + + 0 + + + + + callToTask.s00002931.input.s00001052 + + + 0 + + + + + callToTask.s00002950.input.s00001052 + + + 0 + + + + + callToTask.s00002932.input.s00001052 + + + 0 + + + + + callToTask.s00002955.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002954.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00001168.input.s00001052 + + + 0 + + + + + callToTask.s00002960.input.s00001052 + + + 0 + + + + + callToTask.s00002951.input.s00001052 + + + 0 + + + + + callToTask.s00002961.input.s00001052 + + + 0 + + + + + callToTask.s00002952.input.s00001052 + + + 0 + + + + + callToTask.s00002962.input.s00001052 + + + 0 + + + + + callToTask.s00002953.input.s00001052 + + + 0 + + + + + callToTask.s00002963.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00001168.input.s00001127 + + + 0 + + + + + callToTask.s00002963.input.s00001052 + + + 0 + + + + + callToTask.s00002960.input.s00001127 + + + 0 + + + + + callToTask.s00002954.input.s00001052 + + + 0 + + + + + callToTask.s00002953.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002964.input.s00001052 + + + 0 + + + + + callToTask.s00002962.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002952.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002961.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002667.input.s00001052 + + + 0 + + + + + callToTask.s00001168.input.s00001066 + + + 0 + + + + + callToTask.s00002965.input.s00001052 + + + 0 + + + + + callToTask.s00002870.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002956.input.s00001052 + + + 0 + + + + + callToTask.s00002951.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002929.input.s00001052 + + + 0 + + + + + callToTask.s00002966.input.s00001052 + + + 0 + + + + + callToTask.s00002960.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002957.input.s00001052 + + + 0 + + + + + callToTask.s00001168.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00001168.input.s00001068 + + + 0 + + + + + callToTask.s00001852.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002824.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002950.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002930.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002959.input.s00001052 + + + 0 + + + + + callToTask.s00002254.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002869.input.s00001052 + + + 0 + + + + + callToTask.s00001406.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002063.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002044.inputCriterion.s00001053.used + + + 0 + + + + + callToProcess.s00002499.output.s00001054 + + + 0 + + + + + callToProcess.s00002882.output.s00001054 + + + 0 + + + + + callToProcess.s00002944.output.s00001054 + + + 0 + + + + + callToProcess.s00002038.output.s00001077 + + + 0 + + + + + callToProcess.s00002943.output.s00001054 + + + 0 + + + + + callToTask.s00002869.input.s00001066 + + + 0 + + + + + callToTask.s00002063.output.s00001054 + + + 0 + + + + + callToTask.s00001406.output.s00001054 + + + 0 + + + + + callToTask.s00002254.output.s00001054 + + + 0 + + + + + callToTask.s00002930.output.s00001054 + + + 0 + + + + + callToTask.s00002931.output.s00001054 + + + 0 + + + + + callToTask.s00002044.output.s00001077 + + + 0 + + + + + callToTask.s00002950.output.s00001054 + + + 0 + + + + + callToTask.s00002932.output.s00001054 + + + 0 + + + + + callToProcess.s00002802.output.s00001054 + + + 0 + + + + + callToTask.s00001852.output.s00001054 + + + 0 + + + + + callToProcess.s00001108.output.s00001054 + + + 0 + + + + + callToTask.s00001168.output.s00001054 + + + 0 + + + + + callToTask.s00002960.output.s00001054 + + + 0 + + + + + callToTask.s00002951.output.s00001054 + + + 0 + + + + + callToTask.s00002870.output.s00001054 + + + 0 + + + + + callToTask.s00002961.output.s00001054 + + + 0 + + + + + callToTask.s00002952.output.s00001054 + + + 0 + + + + + callToTask.s00002962.output.s00001054 + + + 0 + + + + + callToProcess.s00002121.output.s00001054 + + + 0 + + + + + callToTask.s00002963.output.s00001054 + + + 0 + + + + + callToTask.s00002954.output.s00001054 + + + 0 + + + + + callToProcess.s00002499.input.s00001052 + + + 0 + + + + + callToTask.s00002964.output.s00001054 + + + 0 + + + + + callToTask.s00002955.output.s00001054 + + + 0 + + + + + callToProcess.s00001108.input.s00001052 + + + 0 + + + + + callToTask.s00002958.output.s00001077 + + + 0 + + + + + callToTask.s00002824.output.s00001077 + + + 0 + + + + + callToTask.s00002667.output.s00001054 + + + 0 + + + + + callToTask.s00002869.output.s00001054 + + + 0 + + + + + callToTask.s00002965.output.s00001054 + + + 0 + + + + + callToTask.s00002896.output.s00001054 + + + 0 + + + + + callToTask.s00002956.output.s00001054 + + + 0 + + + + + callToTask.s00002959.output.s00001054 + + + 0 + + + + + callToTask.s00002929.output.s00001054 + + + 0 + + + + + callToTask.s00002949.output.s00001054 + + + 0 + + + + + callToTask.s00002966.output.s00001054 + + + 0 + + + + + callToTask.s00002953.output.s00001077 + + + 0 + + + + + callToTask.s00002957.output.s00001054 + + + 0 + + + + + callToTask.s00002958.output.s00001054 + + + 0 + + + + + callToTask.s00002962.output.s00001077 + + + 0 + + + + + callToTask.s00002952.output.s00001077 + + + 0 + + + + + callToTask.s00002961.output.s00001077 + + + 0 + + + + + callToTask.s00002870.output.s00001077 + + + 0 + + + + + callToTask.s00002963.output.s00001077 + + + 0 + + + + + callToTask.s00002951.output.s00001077 + + + 0 + + + + + callToTask.s00002954.output.s00001077 + + + 0 + + + + + callToTask.s00002960.output.s00001077 + + + 0 + + + + + callToTask.s00001852.output.s00001077 + + + 0 + + + + + callToTask.s00002964.output.s00001077 + + + 0 + + + + + callToTask.s00002955.output.s00001077 + + + 0 + + + + + callToTask.s00002667.output.s00001077 + + + 0 + + + + + callToTask.s00002965.output.s00001077 + + + 0 + + + + + callToTask.s00002956.output.s00001077 + + + 0 + + + + + callToTask.s00002929.output.s00001077 + + + 0 + + + + + callToTask.s00002966.output.s00001077 + + + 0 + + + + + callToTask.s00002957.output.s00001077 + + + 0 + + + + + callToTask.s00002932.output.s00001077 + + + 0 + + + + + callToTask.s00002949.output.s00001077 + + + 0 + + + + + callToTask.s00002959.output.s00001077 + + + 0 + + + + + callToTask.s00002896.output.s00001077 + + + 0 + + + + + callToTask.s00002869.output.s00001077 + + + 0 + + + + + callToTask.s00002950.output.s00001077 + + + 0 + + + + + process.s00000343##s00003019.input.s00001109 + + + 0 + + + + + callToTask.s00002931.output.s00001077 + + + 0 + + + + + callToProcess.s00002499.input.s00001066 + + + 0 + + + + + callToTask.s00002930.output.s00001077 + + + 0 + + + + + callToTask.s00001406.output.s00001077 + + + 0 + + + + + callToProcess.s00002121.output.s00001077 + + + 0 + + + + + callToTask.s00002063.output.s00001077 + + + 0 + + + + + callToProcess.s00001108.output.s00001077 + + + 0 + + + + + callToProcess.s00002802.output.s00001077 + + + 0 + + + + + callToTask.s00002959.input.s00001066 + + + 0 + + + + + callToTask.s00002957.input.s00001066 + + + 0 + + + + + callToTask.s00002966.input.s00001066 + + + 0 + + + + + callToTask.s00002929.input.s00001066 + + + 0 + + + + + process.s00000343##s00003019.output.s00001249 + + + 0 + + + + + callToProcess.s00002943.output.s00001077 + + + 0 + + + + + callToProcess.s00002944.output.s00001077 + + + 0 + + + + + callToTask.s00002956.input.s00001066 + + + 0 + + + + + callToProcess.s00002882.output.s00001077 + + + 0 + + + + + callToProcess.s00002499.output.s00001083 + + + 0 + + + + + callToTask.s00002965.input.s00001066 + + + 0 + + + + + callToTask.s00002667.input.s00001066 + + + 0 + + + + + callToTask.s00002964.input.s00001066 + + + 0 + + + + + callToTask.s00002954.input.s00001066 + + + 0 + + + + + callToTask.s00002963.input.s00001066 + + + 0 + + + + + callToTask.s00002931.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002953.input.s00001066 + + + 0 + + + + + callToTask.s00002932.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002960.input.s00001068 + + + 0 + + + + + callToTask.s00002962.input.s00001066 + + + 0 + + + + + callToTask.s00002952.input.s00001066 + + + 0 + + + + + callToTask.s00002961.input.s00001066 + + + 0 + + + + + callToTask.s00002951.input.s00001066 + + + 0 + + + + + callToTask.s00002960.input.s00001066 + + + 0 + + + + + callToTask.s00002932.input.s00001066 + + + 0 + + + + + callToTask.s00002950.input.s00001066 + + + 0 + + + + + callToTask.s00002960.input.s00001128 + + + 0 + + + + + callToTask.s00002931.input.s00001066 + + + 0 + + + + + callToTask.s00002930.input.s00001066 + + + 0 + + + + + callToTask.s00001406.input.s00001066 + + + 0 + + + + + callToTask.s00002964.inputCriterion.s00001053.used + + + 0 + + + + + callToTask.s00002063.input.s00001066 + + + 0 + + + + + decision.s00001841.input.s00001066 + + + 0 + + + + + decision.s00002055.input.s00001066 + + + 0 + + + + + decision.s00001126.input.s00001066 + + + 0 + + + + + decision.s00001123.input.s00001066 + + + 0 + + + + + merge.s00002239.input.s00001068 + + + 0 + + + + + merge.s00002238.input.s00001068 + + + 0 + + + + + merge.s00002239.input.s00001066 + + + 0 + + + + + merge.s00001162.input.s00001068 + + + 0 + + + + + merge.s00001161.input.s00001068 + + + 0 + + + + + merge.s00001061.input.s00001068 + + + 0 + + + + + merge.s00001160.input.s00001068 + + + 0 + + + + + merge.s00002241.input.s00001066 + + + 0 + + + + + merge.s00002240.input.s00001066 + + + 0 + + + + + merge.s00001160.input.s00001127 + + + 0 + + + + + join.s00001164.input.s00001068 + + + 0 + + + + + join.s00001164.input.s00001066 + + + 0 + + + + + join.s00001163.input.s00001066 + + + 0 + + + + + join.s00001163.input.s00001127 + + + 0 + + + + + callToProcess.s00002499.inputCriterion.s00001053.used + + + 0 + + + + + process.s00000343##s00003019.outputCriterion.s00001055_omega + + + 0 + + + + + fork.s00001403.fire.s00001073 + + + + + fork.s00001071.fire.s00001073 + + + + + fork.s00001403.fire.s00001075 + + + + + fork.s00001071.fire.s00001075 + + + + + join.s00001163.fire.s00001069 + + + + + join.s00001164.fire.s00001069 + + + + + fork.s00001298.fire.s00001073 + + + + + fork.s00001298.fire.s00001075 + + + + + fork.s00001298.fire.s00001078 + + + + + merge.s00002240.fire.s00001069 + + + + + merge.s00001160.fire.s00001069 + + + + + merge.s00001061.fire.s00001069 + + + + + merge.s00002241.fire.s00001069 + + + + + merge.s00001161.fire.s00001069 + + + + + merge.s00001162.fire.s00001069 + + + + + merge.s00002238.fire.s00001069 + + + + + merge.s00002239.fire.s00001069 + + + + + decision.s00003020.fire.s00001073 + + + + + decision.s00003021.fire.s00001073 + + + + + decision.s00003022.fire.s00001073 + + + + + decision.s00003020.fire.s00001075 + + + + + decision.s00001123.fire.s00001073 + + + + + decision.s00003021.fire.s00001075 + + + + + decision.s00003022.fire.s00001075 + + + + + decision.s00001123.fire.s00001075 + + + + + decision.s00001126.fire.s00001073 + + + + + decision.s00003021.fire.s00001078 + + + + + decision.s00002055.fire.s00001073 + + + + + decision.s00001840.fire.s00001081 + + + + + decision.s00001126.fire.s00001075 + + + + + decision.s00002056.fire.s00001073 + + + + + decision.s00001840.fire.s00001073 + + + + + decision.s00002055.fire.s00001075 + + + + + decision.s00001841.fire.s00001073 + + + + + decision.s00001157.fire.s00001073 + + + + + decision.s00002760.fire.s00001073 + + + + + decision.s00002056.fire.s00001075 + + + + + decision.s00001840.fire.s00001075 + + + + + decision.s00001158.fire.s00001073 + + + + + decision.s00002761.fire.s00001073 + + + + + decision.s00001841.fire.s00001075 + + + + + decision.s00001159.fire.s00001073 + + + + + decision.s00001157.fire.s00001075 + + + + + decision.s00002762.fire.s00001073 + + + + + decision.s00002760.fire.s00001075 + + + + + decision.s00001158.fire.s00001075 + + + + + decision.s00002761.fire.s00001075 + + + + + decision.s00001840.fire.s00001078 + + + + + decision.s00001159.fire.s00001075 + + + + + decision.s00002762.fire.s00001075 + + + + + join.s00001163.activate.s00001062 + + + + + fork.s00001403.activate.s00001072 + + + + + join.s00001164.activate.s00001062 + + + + + fork.s00001071.activate.s00001072 + + + + + decision.s00002948.fire.s00001073 + + + + + join.s00001163.activate.s00001064 + + + + + join.s00001164.activate.s00001064 + + + + + join.s00001163.activate.s00001065 + + + + + decision.s00002948.fire.s00001075 + + + + + fork.s00001298.activate.s00001072 + + + + + merge.s00002240.activate.s00001062 + + + + + merge.s00001160.activate.s00001062 + + + + + merge.s00001061.activate.s00001062 + + + + + merge.s00002241.activate.s00001062 + + + + + merge.s00001161.activate.s00001062 + + + + + merge.s00002240.activate.s00001064 + + + + + merge.s00001162.activate.s00001062 + + + + + merge.s00001160.activate.s00001064 + + + + + merge.s00001061.activate.s00001064 + + + + + merge.s00002241.activate.s00001064 + + + + + merge.s00001161.activate.s00001064 + + + + + merge.s00001160.activate.s00001065 + + + + + merge.s00001162.activate.s00001064 + + + + + merge.s00002238.activate.s00001062 + + + + + merge.s00002239.activate.s00001062 + + + + + merge.s00002238.activate.s00001064 + + + + + merge.s00002239.activate.s00001064 + + + + + merge.s00002239.activate.s00001065 + + + + + decision.s00003020.activate.s00001072 + + + + + decision.s00003021.activate.s00001072 + + + + + decision.s00003022.activate.s00001072 + + + + + decision.s00001123.activate.s00001072 + + + + + decision.s00001126.activate.s00001072 + + + + + decision.s00002055.activate.s00001072 + + + + + decision.s00002056.activate.s00001072 + + + + + decision.s00001840.activate.s00001072 + + + + + decision.s00001841.activate.s00001072 + + + + + decision.s00001157.activate.s00001072 + + + + + decision.s00002760.activate.s00001072 + + + + + decision.s00001158.activate.s00001072 + + + + + decision.s00002761.activate.s00001072 + + + + + decision.s00001159.activate.s00001072 + + + + + decision.s00002762.activate.s00001072 + + + + + decision.s00002948.activate.s00001072 + + + + + callToTask.s00002044.inputCriterion.s00001053 + + + + + callToTask.s00002063.inputCriterion.s00001053 + + + + + callToTask.s00001406.inputCriterion.s00001053 + + + + + callToTask.s00002254.inputCriterion.s00001053 + + + + + callToTask.s00002930.inputCriterion.s00001053 + + + + + callToTask.s00002931.inputCriterion.s00001053 + + + + + callToTask.s00002950.inputCriterion.s00001053 + + + + + callToTask.s00002932.inputCriterion.s00001053 + + + + + callToTask.s00002824.inputCriterion.s00001053 + + + + + callToTask.s00001852.inputCriterion.s00001053 + + + + + callToTask.s00001168.inputCriterion.s00001053 + + + + + callToTask.s00002960.inputCriterion.s00001053 + + + + + callToTask.s00002951.inputCriterion.s00001053 + + + + + callToTask.s00002870.inputCriterion.s00001053 + + + + + callToTask.s00002961.inputCriterion.s00001053 + + + + + callToTask.s00002952.inputCriterion.s00001053 + + + + + callToTask.s00002962.inputCriterion.s00001053 + + + + + callToTask.s00002953.inputCriterion.s00001053 + + + + + callToTask.s00002963.inputCriterion.s00001053 + + + + + callToTask.s00002954.inputCriterion.s00001053 + + + + + callToTask.s00002964.inputCriterion.s00001053 + + + + + callToTask.s00002955.inputCriterion.s00001053 + + + + + callToTask.s00002667.inputCriterion.s00001053 + + + + + callToTask.s00002965.inputCriterion.s00001053 + + + + + callToTask.s00002956.inputCriterion.s00001053 + + + + + callToTask.s00002929.inputCriterion.s00001053 + + + + + callToTask.s00002966.inputCriterion.s00001053 + + + + + callToTask.s00002957.inputCriterion.s00001053 + + + + + callToTask.s00002958.inputCriterion.s00001053 + + + + + callToTask.s00002949.inputCriterion.s00001053 + + + + + callToTask.s00002959.inputCriterion.s00001053 + + + + + callToTask.s00002896.inputCriterion.s00001053 + + + + + callToTask.s00002869.inputCriterion.s00001053 + + + + + callToTask.s00002044.outputCriterion.s00001055 + + + + + callToTask.s00002063.outputCriterion.s00001055 + + + + + callToTask.s00001406.outputCriterion.s00001055 + + + + + callToTask.s00002254.outputCriterion.s00001055 + + + + + callToTask.s00002930.outputCriterion.s00001055 + + + + + callToTask.s00002931.outputCriterion.s00001055 + + + + + callToTask.s00002950.outputCriterion.s00001055 + + + + + callToTask.s00002932.outputCriterion.s00001055 + + + + + callToTask.s00002824.outputCriterion.s00001055 + + + + + callToTask.s00001852.outputCriterion.s00001055 + + + + + callToTask.s00001168.outputCriterion.s00001055 + + + + + callToTask.s00002960.outputCriterion.s00001055 + + + + + callToTask.s00002951.outputCriterion.s00001055 + + + + + callToTask.s00002870.outputCriterion.s00001055 + + + + + callToTask.s00002961.outputCriterion.s00001055 + + + + + callToTask.s00002952.outputCriterion.s00001055 + + + + + callToTask.s00002962.outputCriterion.s00001055 + + + + + callToTask.s00002953.outputCriterion.s00001055 + + + + + callToTask.s00002963.outputCriterion.s00001055 + + + + + callToTask.s00002954.outputCriterion.s00001055 + + + + + callToTask.s00002964.outputCriterion.s00001055 + + + + + callToTask.s00002955.outputCriterion.s00001055 + + + + + callToTask.s00002667.outputCriterion.s00001055 + + + + + callToTask.s00002965.outputCriterion.s00001055 + + + + + callToTask.s00002956.outputCriterion.s00001055 + + + + + callToTask.s00002929.outputCriterion.s00001055 + + + + + callToTask.s00002966.outputCriterion.s00001055 + + + + + callToTask.s00002957.outputCriterion.s00001055 + + + + + callToTask.s00002958.outputCriterion.s00001055 + + + + + callToTask.s00002949.outputCriterion.s00001055 + + + + + callToTask.s00002959.outputCriterion.s00001055 + + + + + callToTask.s00002896.outputCriterion.s00001055 + + + + + callToTask.s00002869.outputCriterion.s00001055 + + + + + callToProcess.s00002121.inputCriterion.s00001053 + + + + + callToProcess.s00001108.inputCriterion.s00001053 + + + + + callToProcess.s00002802.inputCriterion.s00001053 + + + + + callToProcess.s00002038.inputCriterion.s00001053 + + + + + process.s00000343##s00003019.inputCriterion.s00001053 + + + + + callToProcess.s00002943.inputCriterion.s00001053 + + + + + callToProcess.s00002944.inputCriterion.s00001053 + + + + + callToProcess.s00002882.inputCriterion.s00001053 + + + + + callToProcess.s00002499.inputCriterion.s00001053 + + + + + callToProcess.s00002121.outputCriterion.s00001055 + + + + + callToProcess.s00001108.outputCriterion.s00001055 + + + + + callToProcess.s00002802.outputCriterion.s00001055 + + + + + callToProcess.s00002038.outputCriterion.s00001055 + + + + + process.s00000343##s00003019.outputCriterion.s00001055 + + + + + callToProcess.s00002943.outputCriterion.s00001055 + + + + + callToProcess.s00002944.outputCriterion.s00001055 + + + + + callToProcess.s00002882.outputCriterion.s00001055 + + + + + callToProcess.s00002499.outputCriterion.s00001055 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + 1 + + + + + IBM319-PT-none + + + diff --git a/examples/gspn/pnpro_test1/project01.PNPRO b/examples/gspn/pnpro_test1/project01.PNPRO new file mode 100644 index 000000000..d5c530dd6 --- /dev/null +++ b/examples/gspn/pnpro_test1/project01.PNPRO @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/examples/gspn/tiny/tiny01.pnml b/examples/gspn/tiny/tiny01.pnml new file mode 100644 index 000000000..792bb9698 --- /dev/null +++ b/examples/gspn/tiny/tiny01.pnml @@ -0,0 +1,148 @@ + + + + + Default,1 + + + + + Default,1 + + + + + Default,0 + + + + + Default,0 + + + + + Default,0 + + + + + Default,0 + + + + + Default,0 + + + + + 1 + + + false + + + + + 2 + + + false + + + + + 3 + + + false + + + + + 4 + + + true + + + + + 5 + + + true + + + 2 + + + + + Default,1 + + + + + + Default,1 + + + + + + Default,1 + + + + + + Default,1 + + + + + + Default,1 + + + + + + Default,1 + + + + + + Default,1 + + + + + + Default,1 + + + + + + Default,1 + + + + + + Default,1 + + + + + + Default,1 + + + + + \ No newline at end of file diff --git a/examples/gspn/workflow_cluster/workflow_cluster.pnml b/examples/gspn/workflow_cluster/workflow_cluster.pnml new file mode 100644 index 000000000..86ad2298e --- /dev/null +++ b/examples/gspn/workflow_cluster/workflow_cluster.pnml @@ -0,0 +1,1236 @@ + + + + + + + + + + BackboneDown + + + + + + Default,0 + + + + + + 0 + + + + + + + + BackboneInRepair + + + + + + Default,0 + + + + + + 0 + + + + + + + + BackboneUp + + + + + + Default,1 + + + + + + 0 + + + + + + + + LeftSwitchDown + + + + + + Default,0 + + + + + + 0 + + + + + + + + LeftSwitchInRepair + + + + + + Default,0 + + + + + + 0 + + + + + + + + LeftSwitchUp + + + + + + Default,1 + + + + + + 0 + + + + + + + + LeftWorkStationDown + + + + + + Default,0 + + + + + + 0 + + + + + + + + LeftWorkStationInRepair + + + + + + Default,0 + + + + + + 0 + + + + + + + + LeftWorkStationUp + + + + + + Default,1 + + + + + + 0 + + + + + + + + RepairUnitAvailable + + + + + + Default,1 + + + + + + 0 + + + + + + + + RightSwitchDown + + + + + + Default,0 + + + + + + 0 + + + + + + + + RightSwitchInRepair + + + + + + Default,0 + + + + + + 0 + + + + + + + + RightSwitchUp + + + + + + Default,1 + + + + + + 0 + + + + + + + + RightWorkStationDown + + + + + + Default,0 + + + + + + 0 + + + + + + + + RightWorkstationInRepair + + + + + + Default,0 + + + + + + 0 + + + + + + + + RightWorkStationUp + + + + + + Default,1 + + + + + + 0 + + + + + + + + BackboneFail + + + + + + 0 + + + 2.0E-4 + + + true + + + false + + + 1 + + + + + + + + BackboneInspect + + + + + + 0 + + + 1.0 + + + false + + + false + + + 1 + + + + + + + + BackboneRepair + + + + + + 0 + + + 0.125 + + + true + + + false + + + 1 + + + + + + + + LeftSwitchFail + + + + + + 0 + + + 2.5E-4 + + + true + + + false + + + 1 + + + + + + + + LeftSwitchInspect + + + + + + 0 + + + 1.0 + + + false + + + false + + + 1 + + + + + + + + LeftSwitichRepair + + + + + + 0 + + + 0.25 + + + true + + + false + + + 1 + + + + + + + + LeftWorkstationFail + + + + + + 0 + + + 0.0020 + + + true + + + false + + + 1 + + + + + + + + LeftWorkstationInspect + + + + + + 0 + + + 1.0 + + + false + + + false + + + 1 + + + + + + + + LeftWorkstationRepair + + + + + + 0 + + + 2.0 + + + true + + + false + + + 1 + + + + + + + + RightSwitchFail + + + + + + 0 + + + 2.5E-4 + + + true + + + false + + + 1 + + + + + + + + RightSwitchInspect + + + + + + 0 + + + 1.0 + + + false + + + false + + + 1 + + + + + + + + RightSwitchRepair + + + + + + 0 + + + 0.25 + + + true + + + false + + + 1 + + + + + + + + RightWorkstationFail + + + + + + 0 + + + 0.0020 + + + true + + + false + + + 1 + + + + + + + + RightWorkstationInspect + + + + + + 0 + + + 1.0 + + + false + + + false + + + 1 + + + + + + + + RightWorkstationRepair + + + + + + 0 + + + 2.0 + + + true + + + false + + + 1 + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + + + Default,1 + + + + false + + + + + + + \ No newline at end of file diff --git a/examples/jani-examples/beb.jani b/examples/jani-examples/beb.jani deleted file mode 100755 index df2d43c66..000000000 --- a/examples/jani-examples/beb.jani +++ /dev/null @@ -1,2604 +0,0 @@ -{ - "jani-version": 1, - "name": "modelName", - "type": "mdp", - "actions": [ - { - "name": "tick" - }, - { - "name": "tack" - }, - { - "name": "tock" - } - ], - "variables": [ - { - "name": "cr", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 2 - }, - "initial-value": 0 - }, - { - "name": "line_seized", - "type": "bool", - "initial-value": false - }, - { - "name": "gave_up", - "type": "bool", - "initial-value": false - } - ], - "properties": [ - { - "name": "LineSeized", - "reach": "line_seized", - "type": "probability-max-query" - }, - { - "name": "GaveUp", - "reach": "gave_up", - "type": "probability-max-query" - } - ], - "automata": [ - { - "name": "Clock", - "variables": [], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_1" - } - ] - }, - { - "location": "l_1", - "action": "tack", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_2" - } - ] - }, - { - "location": "l_2", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "cr", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "tock", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0" - } - ] - } - ] - }, - { - "name": "Host", - "variables": [ - { - "name": "na", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 3 - }, - "initial-value": 0 - }, - { - "name": "ev", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 4 - }, - "initial-value": 2 - }, - { - "name": "wt", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 4 - }, - "initial-value": 0 - } - ], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - }, - { - "name": "l_4" - }, - { - "name": "l_5" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "action": "tick", - "guard": { - "op": ">", - "args": [ - "wt", - 0 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "wt", - "value": { - "op": "-", - "args": [ - "wt", - 1 - ] - } - } - ] - } - ] - }, - { - "location": "l_0", - "guard": { - "op": "≤", - "args": [ - "wt", - 0 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "cr", - "value": { - "op": "min", - "args": [ - 2, - { - "op": "+", - "args": [ - "cr", - 1 - ] - } - ] - } - } - ] - } - ] - }, - { - "location": "l_1", - "action": "tack", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3" - } - ] - }, - { - "location": "l_2", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_4" - } - ] - }, - { - "location": "l_3", - "action": "tock", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0" - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "=", - "args": [ - "cr", - 1 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_5", - "assignments": [ - { - "ref": "line_seized", - "value": true - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "≥", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_5", - "assignments": [ - { - "ref": "gave_up", - "value": true - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 0 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 1 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 1 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 2 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 3 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 3 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 1 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 3 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 2 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 3 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 1 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 2 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 3 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - } - ] - }, - { - "name": "Host_1", - "variables": [ - { - "name": "na", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 3 - }, - "initial-value": 0 - }, - { - "name": "ev", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 4 - }, - "initial-value": 2 - }, - { - "name": "wt", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 4 - }, - "initial-value": 0 - } - ], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - }, - { - "name": "l_4" - }, - { - "name": "l_5" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "action": "tick", - "guard": { - "op": ">", - "args": [ - "wt", - 0 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "wt", - "value": { - "op": "-", - "args": [ - "wt", - 1 - ] - } - } - ] - } - ] - }, - { - "location": "l_0", - "guard": { - "op": "≤", - "args": [ - "wt", - 0 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "cr", - "value": { - "op": "min", - "args": [ - 2, - { - "op": "+", - "args": [ - "cr", - 1 - ] - } - ] - } - } - ] - } - ] - }, - { - "location": "l_1", - "action": "tack", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3" - } - ] - }, - { - "location": "l_2", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_4" - } - ] - }, - { - "location": "l_3", - "action": "tock", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0" - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "=", - "args": [ - "cr", - 1 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_5", - "assignments": [ - { - "ref": "line_seized", - "value": true - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "≥", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_5", - "assignments": [ - { - "ref": "gave_up", - "value": true - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 0 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 1 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 1 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 2 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 3 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 3 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 1 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 3 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 2 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 3 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 1 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 2 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 3 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - } - ] - }, - { - "name": "Host_2", - "variables": [ - { - "name": "na", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 3 - }, - "initial-value": 0 - }, - { - "name": "ev", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 4 - }, - "initial-value": 2 - }, - { - "name": "wt", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 4 - }, - "initial-value": 0 - } - ], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - }, - { - "name": "l_4" - }, - { - "name": "l_5" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "action": "tick", - "guard": { - "op": ">", - "args": [ - "wt", - 0 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "wt", - "value": { - "op": "-", - "args": [ - "wt", - 1 - ] - } - } - ] - } - ] - }, - { - "location": "l_0", - "guard": { - "op": "≤", - "args": [ - "wt", - 0 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "cr", - "value": { - "op": "min", - "args": [ - 2, - { - "op": "+", - "args": [ - "cr", - 1 - ] - } - ] - } - } - ] - } - ] - }, - { - "location": "l_1", - "action": "tack", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3" - } - ] - }, - { - "location": "l_2", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_4" - } - ] - }, - { - "location": "l_3", - "action": "tock", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0" - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "=", - "args": [ - "cr", - 1 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_5", - "assignments": [ - { - "ref": "line_seized", - "value": true - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "≥", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_5", - "assignments": [ - { - "ref": "gave_up", - "value": true - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 0 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 1 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 1 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 2 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 3 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 3 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 1 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 3 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 2 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "na", - 3 - ] - }, - { - "op": "≠", - "args": [ - "cr", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - { - "op": "max", - "args": [ - 0, - { - "op": "-", - "args": [ - "ev", - 1 - ] - } - ] - }, - 3 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 0 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 1 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 2 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 4 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "na", - "value": { - "op": "+", - "args": [ - "na", - 1 - ] - } - }, - { - "ref": "wt", - "value": 3 - }, - { - "ref": "ev", - "value": { - "op": "min", - "args": [ - { - "op": "*", - "args": [ - 2, - "ev" - ] - }, - 4 - ] - } - } - ] - } - ] - } - ] - } - ], - "system": { - "composition": "parallel", - "elements": [ - { - "composition": "parallel", - "elements": [ - { - "composition": "parallel", - "elements": [ - "Clock", - "Host" - ], - "alphabet": [ - "tick", - "tack", - "tock" - ] - }, - "Host_1" - ], - "alphabet": [ - "tick", - "tack", - "tock" - ] - }, - "Host_2" - ], - "alphabet": [ - "tick", - "tack", - "tock" - ] - } -} \ No newline at end of file diff --git a/examples/jani-examples/beb.jani.txt b/examples/jani-examples/beb.jani.txt deleted file mode 100755 index ca4a540d1..000000000 --- a/examples/jani-examples/beb.jani.txt +++ /dev/null @@ -1,27 +0,0 @@ -Peak memory usage: 38 MB -Analysis results for beb.jani - -+ State space exploration - States: 4528 - Transitions: 4874 - Branches: 6899 - Time: 0.0 s - Rate: 92408 states/s - -+ LineSeized - Probability: 0.9166259765625 - Time: 0.1 s - - + Value iteration - Final error: 0 - Iterations: 8 - Time: 0.0 s - -+ GaveUp - Probability: 0.0833740234375 - Time: 0.0 s - - + Value iteration - Final error: 0 - Iterations: 9 - Time: 0.0 s diff --git a/examples/jani-examples/beb.modest b/examples/jani-examples/beb.modest deleted file mode 100755 index 44f06b30e..000000000 --- a/examples/jani-examples/beb.modest +++ /dev/null @@ -1,64 +0,0 @@ -// Modest MDP model of the bounded exponential backoff procedure (BEB) -// [BFHH11] -action tick, tack, tock; - -const int K = 4; // maximum value for backoff -const int N = 3; // number of tries before giving up -const int H = 3; // number of hosts (must correspond to the number of Host() instantiations in the global composition) - -int(0..2) cr; // count how many hosts attempt to seize the line in a slot (zero, one, many) -bool line_seized; -bool gave_up; - -property LineSeized = Pmax(<> line_seized); // some host managed to seize the line before any other gave up -property GaveUp = Pmax(<> gave_up); // some host gave up before any other managed to seize the line (does not work with POR) - -process Clock() -{ - tick; tack; tau {= cr = 0 =}; tock; Clock() -} - -process Host() -{ - int(0..N) na; // nr_attempts 0..N - int(0..K) ev = 2; // exp_val 0..K - int(0..K) wt; // slots_to_wait 0..K - - do - { - if(wt > 0) - { - // wait this slot - tick {= wt-- =} - } - else - { - tau {= cr = min(2, cr + 1) =}; // attempt to seize the line - tick; - if(cr == 1) - { - // someone managed to seize the line - tau {= line_seized = true =}; stop - } - else if(na >= N) - { - // maximum number of attempts exceeded - tau {= gave_up = true =}; stop - } - else - { - // backoff - tau {= na++, wt = DiscreteUniform(0, max(0, ev - 1)), ev = min(2 * ev, K) =} - } - }; - tack; tock - } -} - -par -{ -:: Clock() -:: Host() -:: Host() -:: Host() -} diff --git a/examples/jani-examples/beb.modest.txt b/examples/jani-examples/beb.modest.txt deleted file mode 100755 index cbaee0f3d..000000000 --- a/examples/jani-examples/beb.modest.txt +++ /dev/null @@ -1,27 +0,0 @@ -Peak memory usage: 39 MB -Analysis results for beb.modest - -+ State space exploration - States: 4528 - Transitions: 4874 - Branches: 6899 - Time: 0.0 s - Rate: 94333 states/s - -+ LineSeized - Probability: 0.9166259765625 - Time: 0.1 s - - + Value iteration - Final error: 0 - Iterations: 8 - Time: 0.0 s - -+ GaveUp - Probability: 0.0833740234375 - Time: 0.0 s - - + Value iteration - Final error: 0 - Iterations: 9 - Time: 0.0 s diff --git a/examples/jani-examples/brp.jani b/examples/jani-examples/brp.jani deleted file mode 100755 index bd5d91a38..000000000 --- a/examples/jani-examples/brp.jani +++ /dev/null @@ -1,2092 +0,0 @@ -{ - "jani-version": 1, - "name": "modelName", - "type": "mdp", - "actions": [ - { - "name": "put" - }, - { - "name": "get" - }, - { - "name": "put_k" - }, - { - "name": "get_k" - }, - { - "name": "put_l" - }, - { - "name": "get_l" - }, - { - "name": "new_file" - }, - { - "name": "s_ok" - }, - { - "name": "s_dk" - }, - { - "name": "s_nok" - }, - { - "name": "s_restart" - }, - { - "name": "r_ok" - }, - { - "name": "r_inc" - }, - { - "name": "r_fst" - }, - { - "name": "r_nok" - }, - { - "name": "r_timeout" - }, - { - "name": "error" - }, - { - "name": "tick" - } - ], - "variables": [ - { - "name": "ff", - "type": "bool", - "initial-value": false - }, - { - "name": "lf", - "type": "bool", - "initial-value": false - }, - { - "name": "ab", - "type": "bool", - "initial-value": false - }, - { - "name": "i", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 16 - }, - "initial-value": 0 - }, - { - "name": "inTransitK", - "type": "bool", - "initial-value": false - }, - { - "name": "inTransitL", - "type": "bool", - "initial-value": false - }, - { - "name": "first_file_done", - "type": "bool", - "initial-value": false - }, - { - "name": "get_k_seen", - "type": "bool", - "initial-value": false - }, - { - "name": "s_ok_seen", - "type": "bool", - "initial-value": false - }, - { - "name": "s_nok_seen", - "type": "bool", - "initial-value": false - }, - { - "name": "s_dk_seen", - "type": "bool", - "initial-value": false - }, - { - "name": "s_restart_seen", - "type": "bool", - "initial-value": false - }, - { - "name": "r_ok_seen", - "type": "bool", - "initial-value": false - }, - { - "name": "r_timeout_seen", - "type": "bool", - "initial-value": false - }, - { - "name": "premature_timeout", - "type": "bool", - "initial-value": false - }, - { - "name": "channel_k_overflow", - "type": "bool", - "initial-value": false - }, - { - "name": "channel_l_overflow", - "type": "bool", - "initial-value": false - }, - { - "name": "Sender_location", - "type": "int", - "initial-value": 0 - }, - { - "name": "Receiver_location", - "type": "int", - "initial-value": 0 - }, - { - "name": "ChannelK_location", - "type": "int", - "initial-value": 0 - }, - { - "name": "ChannelL_location", - "type": "int", - "initial-value": 0 - }, - { - "name": "Observer_location", - "type": "int", - "initial-value": 0 - } - ], - "properties": [ - { - "name": "P_A", - "reach": { - "op": "∧", - "args": [ - "s_nok_seen", - "r_ok_seen" - ] - }, - "type": "probability-max-query" - }, - { - "name": "P_B", - "reach": { - "op": "∧", - "args": [ - "s_ok_seen", - { - "op": "!", - "args": [ - "r_ok_seen" - ] - } - ] - }, - "type": "probability-max-query" - }, - { - "name": "P_1", - "reach": { - "op": "∨", - "args": [ - "s_nok_seen", - "s_dk_seen" - ] - }, - "type": "probability-max-query" - }, - { - "name": "P_2", - "reach": "s_dk_seen", - "type": "probability-max-query" - }, - { - "name": "P_3", - "reach": { - "op": "∧", - "args": [ - "s_nok_seen", - { - "op": ">", - "args": [ - "i", - 8 - ] - } - ] - }, - "type": "probability-max-query" - }, - { - "name": "P_4", - "reach": { - "op": "∧", - "args": [ - { - "op": "∨", - "args": [ - { - "op": "∨", - "args": [ - "s_ok_seen", - "s_nok_seen" - ] - }, - "s_dk_seen" - ] - }, - { - "op": "!", - "args": [ - "get_k_seen" - ] - } - ] - }, - "type": "probability-max-query" - } - ], - "automata": [ - { - "name": "Sender", - "variables": [ - { - "name": "bit", - "type": "bool", - "initial-value": false - }, - { - "name": "rc", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 2 - }, - "initial-value": 0 - }, - { - "name": "c", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 16 - }, - "initial-value": 0 - } - ], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - }, - { - "name": "l_4" - }, - { - "name": "l_5" - }, - { - "name": "l_6" - }, - { - "name": "l_7" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "guard": { - "op": "<", - "args": [ - "i", - 16 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "i", - "value": { - "op": "+", - "args": [ - "i", - 1 - ] - } - }, - { - "ref": "Sender_location", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "s_ok", - "guard": { - "op": "=", - "args": [ - "i", - 16 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "first_file_done", - "value": true - }, - { - "ref": "Sender_location", - "value": 2 - }, - { - "ref": "c", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "tick", - "guard": { - "op": "∧", - "args": [ - { - "op": "≥", - "args": [ - "i", - 16 - ] - }, - { - "op": "<", - "args": [ - "c", - 0 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 16 - ] - } - } - ] - } - ] - }, - { - "location": "l_1", - "action": "put_k", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "ff", - "value": { - "op": "=", - "args": [ - "i", - 1 - ] - } - }, - { - "ref": "lf", - "value": { - "op": "=", - "args": [ - "i", - 16 - ] - } - }, - { - "ref": "ab", - "value": "bit" - }, - { - "ref": "c", - "value": 0 - }, - { - "ref": "Sender_location", - "value": 3 - } - ] - } - ] - }, - { - "location": "l_1", - "action": "tick", - "guard": { - "op": "<", - "args": [ - "c", - 0 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 16 - ] - } - } - ] - } - ] - }, - { - "location": "l_2", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_4", - "assignments": [ - { - "ref": "Sender_location", - "value": 4 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "get_l", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_5", - "assignments": [ - { - "ref": "bit", - "value": { - "op": "!", - "args": [ - "bit" - ] - } - }, - { - "ref": "rc", - "value": 0 - }, - { - "ref": "c", - "value": 0 - }, - { - "ref": "Sender_location", - "value": 5 - } - ] - } - ] - }, - { - "location": "l_3", - "guard": { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "rc", - 2 - ] - }, - { - "op": "≥", - "args": [ - "c", - 3 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "rc", - "value": { - "op": "+", - "args": [ - "rc", - 1 - ] - } - }, - { - "ref": "c", - "value": 0 - }, - { - "ref": "Sender_location", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "s_nok", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "<", - "args": [ - "i", - 16 - ] - }, - { - "op": "≥", - "args": [ - "rc", - 2 - ] - } - ] - }, - { - "op": "≥", - "args": [ - "c", - 3 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_6", - "assignments": [ - { - "ref": "rc", - "value": 0 - }, - { - "ref": "c", - "value": 0 - }, - { - "ref": "Sender_location", - "value": 6 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "s_dk", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "≥", - "args": [ - "i", - 16 - ] - }, - { - "op": "≥", - "args": [ - "rc", - 2 - ] - } - ] - }, - { - "op": "≥", - "args": [ - "c", - 3 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_6", - "assignments": [ - { - "ref": "rc", - "value": 0 - }, - { - "ref": "c", - "value": 0 - }, - { - "ref": "Sender_location", - "value": 6 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "tick", - "guard": { - "op": "<", - "args": [ - "c", - 3 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 16 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_4" - } - ] - }, - { - "location": "l_5", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "Sender_location", - "value": 7 - } - ] - } - ] - }, - { - "location": "l_6", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_7", - "assignments": [ - { - "ref": "Sender_location", - "value": 8 - } - ] - } - ] - }, - { - "location": "l_7", - "action": "s_restart", - "guard": { - "op": "≥", - "args": [ - "c", - 15 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_4", - "assignments": [ - { - "ref": "bit", - "value": false - }, - { - "ref": "first_file_done", - "value": true - }, - { - "ref": "Sender_location", - "value": 4 - }, - { - "ref": "c", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_7", - "action": "tick", - "guard": { - "op": "<", - "args": [ - "c", - 15 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_7", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 16 - ] - } - } - ] - } - ] - } - ] - }, - { - "name": "Receiver", - "variables": [ - { - "name": "r_ff", - "type": "bool", - "initial-value": false - }, - { - "name": "r_lf", - "type": "bool", - "initial-value": false - }, - { - "name": "r_ab", - "type": "bool", - "initial-value": false - }, - { - "name": "bit", - "type": "bool", - "initial-value": false - }, - { - "name": "c", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 16 - }, - "initial-value": 0 - } - ], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - }, - { - "name": "l_4" - }, - { - "name": "l_5" - }, - { - "name": "l_6" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "action": "get_k", - "guard": "ff", - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "c", - "value": 0 - }, - { - "ref": "bit", - "value": "ab" - }, - { - "ref": "r_ff", - "value": "ff" - }, - { - "ref": "r_lf", - "value": "lf" - }, - { - "ref": "r_ab", - "value": "ab" - }, - { - "ref": "Receiver_location", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "get_k", - "guard": { - "op": "!", - "args": [ - "ff" - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "premature_timeout", - "value": true - }, - { - "ref": "Receiver_location", - "value": 2 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0" - } - ] - }, - { - "location": "l_1", - "action": "put_l", - "guard": { - "op": "≠", - "args": [ - "r_ab", - "bit" - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "Receiver_location", - "value": 3 - } - ] - } - ] - }, - { - "location": "l_1", - "action": "r_ok", - "guard": { - "op": "∧", - "args": [ - "r_lf", - { - "op": "=", - "args": [ - "r_ab", - "bit" - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_4", - "assignments": [ - { - "ref": "Receiver_location", - "value": 4 - } - ] - } - ] - }, - { - "location": "l_1", - "action": "r_fst", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - "r_ff", - { - "op": "!", - "args": [ - "r_lf" - ] - } - ] - }, - { - "op": "=", - "args": [ - "r_ab", - "bit" - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_4", - "assignments": [ - { - "ref": "Receiver_location", - "value": 4 - } - ] - } - ] - }, - { - "location": "l_1", - "action": "r_inc", - "guard": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "!", - "args": [ - "r_ff" - ] - }, - { - "op": "!", - "args": [ - "r_lf" - ] - } - ] - }, - { - "op": "=", - "args": [ - "r_ab", - "bit" - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_4", - "assignments": [ - { - "ref": "Receiver_location", - "value": 4 - } - ] - } - ] - }, - { - "location": "l_1", - "action": "tick", - "guard": { - "op": "<", - "args": [ - "c", - 0 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 16 - ] - } - } - ] - } - ] - }, - { - "location": "l_2", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_2" - } - ] - }, - { - "location": "l_3", - "action": "get_k", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "c", - "value": 0 - }, - { - "ref": "r_ff", - "value": "ff" - }, - { - "ref": "r_lf", - "value": "lf" - }, - { - "ref": "r_ab", - "value": "ab" - }, - { - "ref": "Receiver_location", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "r_timeout", - "guard": { - "op": "∧", - "args": [ - "r_lf", - { - "op": "=", - "args": [ - "c", - 15 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_5", - "assignments": [ - { - "ref": "Receiver_location", - "value": 5 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "r_nok", - "guard": { - "op": "∧", - "args": [ - { - "op": "!", - "args": [ - "r_lf" - ] - }, - { - "op": "=", - "args": [ - "c", - 15 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_6", - "assignments": [ - { - "ref": "Receiver_location", - "value": 6 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "tick", - "guard": { - "op": "<", - "args": [ - "c", - 15 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 16 - ] - } - } - ] - } - ] - }, - { - "location": "l_4", - "action": "put_l", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "bit", - "value": { - "op": "!", - "args": [ - "bit" - ] - } - }, - { - "ref": "Receiver_location", - "value": 3 - } - ] - } - ] - }, - { - "location": "l_4", - "action": "tick", - "guard": { - "op": "<", - "args": [ - "c", - 0 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_4", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 16 - ] - } - } - ] - } - ] - }, - { - "location": "l_5", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "r_ff", - "value": false - }, - { - "ref": "r_lf", - "value": false - }, - { - "ref": "r_ab", - "value": false - }, - { - "ref": "bit", - "value": false - }, - { - "ref": "c", - "value": 0 - }, - { - "ref": "Receiver_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_5", - "action": "tick", - "guard": { - "op": "<", - "args": [ - "c", - 15 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_5", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 16 - ] - } - } - ] - } - ] - }, - { - "location": "l_6", - "action": "r_timeout", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_5", - "assignments": [ - { - "ref": "Receiver_location", - "value": 5 - } - ] - } - ] - }, - { - "location": "l_6", - "action": "tick", - "guard": { - "op": "<", - "args": [ - "c", - 15 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_6", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 16 - ] - } - } - ] - } - ] - } - ] - }, - { - "name": "ChannelK", - "variables": [ - { - "name": "c", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 2 - }, - "initial-value": 0 - } - ], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "action": "put_k", - "guard": true, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 49, - 50 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "c", - "value": 0 - }, - { - "ref": "inTransitK", - "value": true - }, - { - "ref": "ChannelK_location", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 50 - ] - }, - "location": "l_0", - "assignments": [ - { - "ref": "ChannelK_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0" - } - ] - }, - { - "location": "l_1", - "action": "get_k", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "inTransitK", - "value": false - }, - { - "ref": "c", - "value": 0 - }, - { - "ref": "ChannelK_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_1", - "action": "put_k", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "channel_k_overflow", - "value": true - }, - { - "ref": "ChannelK_location", - "value": 2 - }, - { - "ref": "c", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_1", - "action": "tick", - "guard": { - "op": "<", - "args": [ - "c", - 1 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 2 - ] - } - } - ] - } - ] - }, - { - "location": "l_2", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_2" - } - ] - } - ] - }, - { - "name": "ChannelL", - "variables": [ - { - "name": "c", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 2 - }, - "initial-value": 0 - } - ], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "action": "put_l", - "guard": true, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 99, - 100 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "c", - "value": 0 - }, - { - "ref": "inTransitL", - "value": true - }, - { - "ref": "ChannelL_location", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 100 - ] - }, - "location": "l_0", - "assignments": [ - { - "ref": "ChannelL_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0" - } - ] - }, - { - "location": "l_1", - "action": "get_l", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "inTransitL", - "value": false - }, - { - "ref": "c", - "value": 0 - }, - { - "ref": "ChannelL_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_1", - "action": "put_l", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "channel_l_overflow", - "value": true - }, - { - "ref": "ChannelL_location", - "value": 2 - }, - { - "ref": "c", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_1", - "action": "tick", - "guard": { - "op": "<", - "args": [ - "c", - 1 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_1", - "assignments": [ - { - "ref": "c", - "value": { - "op": "min", - "args": [ - { - "op": "+", - "args": [ - "c", - 1 - ] - }, - 2 - ] - } - } - ] - } - ] - }, - { - "location": "l_2", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_2" - } - ] - } - ] - }, - { - "name": "Observer", - "variables": [], - "locations": [ - { - "name": "l_0" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "action": "get_k", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "get_k_seen", - "value": true - }, - { - "ref": "Observer_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "s_ok", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "s_ok_seen", - "value": true - }, - { - "ref": "Observer_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "s_nok", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "s_nok_seen", - "value": true - }, - { - "ref": "Observer_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "s_dk", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "s_dk_seen", - "value": true - }, - { - "ref": "Observer_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "s_restart", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "s_restart_seen", - "value": true - }, - { - "ref": "Observer_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "r_ok", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "r_ok_seen", - "value": true - }, - { - "ref": "Observer_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "r_timeout", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0", - "assignments": [ - { - "ref": "r_timeout_seen", - "value": true - }, - { - "ref": "Observer_location", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_0", - "action": "tick", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_0" - } - ] - } - ] - } - ], - "system": { - "composition": "parallel", - "elements": [ - { - "composition": "parallel", - "elements": [ - { - "composition": "parallel", - "elements": [ - { - "composition": "parallel", - "elements": [ - "Sender", - "Receiver" - ], - "alphabet": [ - "tick" - ] - }, - "ChannelK" - ], - "alphabet": [ - "put_k", - "get_k", - "tick" - ] - }, - "ChannelL" - ], - "alphabet": [ - "get_l", - "put_l", - "tick" - ] - }, - "Observer" - ], - "alphabet": [ - "s_nok", - "s_dk", - "s_ok", - "s_restart", - "get_k", - "r_ok", - "r_timeout", - "tick" - ] - } -} \ No newline at end of file diff --git a/examples/jani-examples/brp.jani.txt b/examples/jani-examples/brp.jani.txt deleted file mode 100755 index 9c0fcd322..000000000 --- a/examples/jani-examples/brp.jani.txt +++ /dev/null @@ -1,63 +0,0 @@ -Peak memory usage: 39 MB -Analysis results for brp.jani - -+ State space exploration - States: 3959 - Transitions: 4244 - Branches: 4593 - Time: 0.1 s - Rate: 74698 states/s - -+ P_A - Probability: 0 - Time: 0.0 s - - + Value iteration - Final error: 0 - Iterations: 1 - Time: 0.0 s - -+ P_B - Probability: 0 - Time: 0.0 s - - + Value iteration - Final error: 0 - Iterations: 1 - Time: 0.0 s - -+ P_1 - Probability: 0.000423333443357766 - Time: 0.0 s - - + Value iteration - Final error: 2.35005704803786E-07 - Iterations: 13 - Time: 0.0 s - -+ P_2 - Probability: 2.64530890961023E-05 - Time: 0.0 s - - + Value iteration - Final error: 2.05561452068843E-07 - Iterations: 14 - Time: 0.0 s - -+ P_3 - Probability: 0.000185191226393368 - Time: 0.0 s - - + Value iteration - Final error: 3.32462409056221E-07 - Iterations: 13 - Time: 0.0 s - -+ P_4 - Probability: 8E-06 - Time: 0.0 s - - + Value iteration - Final error: 0 - Iterations: 2 - Time: 0.0 s diff --git a/examples/jani-examples/brp.modest b/examples/jani-examples/brp.modest deleted file mode 100755 index 64743232f..000000000 --- a/examples/jani-examples/brp.modest +++ /dev/null @@ -1,213 +0,0 @@ -// Modest PTA model of the bounded retransmission protocol (BRP) -// [HH09], http://www.modestchecker.net/CaseStudies/BRP/ -action put, get, put_k, get_k, put_l, get_l; -action new_file; -action s_ok, s_dk, s_nok, s_restart; -action r_ok, r_inc, r_fst, r_nok, r_timeout; -exception error; - -const int N = 16; // number of frames per file -const int MAX = 2; // maximum number of retransmissions per frame -const int TD = 1; // transmission delay -const int TS = 2 * TD + 1; // sender timeout -const int TR = 2 * MAX * TS + 3 * TD; // receiver timeout -const int SYNC = TR; - -bool ff, lf, ab; // channel data: first/last frame, alternating bit -int(0..N) i; // sender chunk counter -bool inTransitK = false; -bool inTransitL = false; - -bool first_file_done = false; -bool get_k_seen, s_ok_seen, s_nok_seen, s_dk_seen, s_restart_seen, r_ok_seen, r_timeout_seen; - -// Invariant (timed) properties (from [BrpOnTime], the TA model) -bool premature_timeout, channel_k_overflow, channel_l_overflow; -// "there is at most one message in transit for each channel" -property T_1 = A[] (!(channel_k_overflow || channel_l_overflow)); -// "there is at most one message in transit in total" -property T_2 = A[] (!(inTransitK && inTransitL)); -// Assumption (A1): "no premature timeouts" -property T_A1 = A[] (!premature_timeout); -// Assumption (A2): "sender starts new file only after receiver reacted to failure" -// Note that receiver can only notice failure if it received at least one chunk, i.e. get_k_seen -property T_A2 = A[] (!s_restart_seen || !get_k_seen || r_timeout_seen); - -// Probabilistic reachability properties (from [D'AJJL01], the RAPTURE/PRISM model) -// property A of [D'AJJL01]: "the maximum probability that eventually the sender reports -// a certain unsuccessful transmission but the receiver got the complete file" -property P_A = Pmax(<>(s_nok_seen && r_ok_seen)); -// property B of [D'AJJL01]: "the maximum probability that eventually the sender reports -// a certain successful transmission but the receiver did not get the complete file" -property P_B = Pmax(<>(s_ok_seen && !r_ok_seen)); -// property 1 of [D'AJJL01]: "the maximum probability that eventually the sender -// does not report a successful transmission" -property P_1 = Pmax(<>(s_nok_seen || s_dk_seen)); -// property 2 of [D'AJJL01]: "the maximum probability that eventually the sender -// reports an uncertainty on the success of the transmission" -property P_2 = Pmax(<>(s_dk_seen)); -// property 3 of [D'AJJL01]: "the maximum probability that eventually the sender -// reports an unsuccessful transmission after more than 8 chunks have been sent successfully" -property P_3 = Pmax(<>(s_nok_seen && i > 8)); -// property 4 of [D'AJJL01]: "the maximum probability that eventually the receiver -// does not receive any chunk and the sender tried to send a chunk" -property P_4 = Pmax(<>((s_ok_seen || s_nok_seen || s_dk_seen) && !get_k_seen)); - - -process Sender() -{ - bool bit; - int(0..MAX) rc; - clock c; - - try - { - do { - :: when urgent(i < N) {= i++ =}; - do - { - // send frame - invariant(c <= 0) put_k {= ff = (i == 1), lf = (i == N), ab = bit, c = 0 =}; - invariant(c <= TS) alt { - :: // receive ack - get_l {= bit = !bit, rc = 0, c = 0 =}; - urgent break - :: // timeout - when(c >= TS) - if(rc < MAX) - { - // retry - {= rc++, c = 0 =} - } - else if(i < N) - { - // no retries left - s_nok {= rc = 0, c = 0 =}; - urgent throw(error) - } - else - { - // no retries left - s_dk {= rc = 0, c = 0 =}; - urgent throw(error) - } - } - } - :: when(i == N) - // file transmission successfully completed - invariant(c <= 0) s_ok {= first_file_done = true =}; - urgent break - } - } - catch error - { - // File transfer did not succeed: wait, then restart with next file - invariant(c <= SYNC) when(c >= SYNC) - s_restart {= bit = false, first_file_done = true =} - } -} - -process Receiver() -{ - bool r_ff, r_lf, r_ab; - bool bit; - clock c; - - // receive first frame - if(ff) { get_k {= c = 0, bit = ab, r_ff = ff, r_lf = lf, r_ab = ab =} } - else { get_k {= c = 0, premature_timeout = true =}; stop }; - do - { - invariant(c <= 0) - { - if(r_ab != bit) - { - // repetition, re-ack - put_l - } - else - { - // report frame - if(r_lf) { r_ok } - else if(r_ff) { r_fst } - else { r_inc }; - put_l {= bit = !bit =} - } - }; - invariant(c <= TR) - { - alt { - :: // receive next frame - get_k {= c = 0, r_ff = ff, r_lf = lf, r_ab = ab =} - :: // timeout - when(c == TR) - if(r_lf) - { - // we just got the last frame, though - r_timeout; break - } - else - { - r_nok; - // abort transfer - r_timeout; break - } - } - } - }; - Receiver() -} - -process ChannelK() -{ - clock c; - - put_k palt - { - :98: {= c = 0, inTransitK = true =}; - invariant(c <= TD) alt { - :: get_k {= inTransitK = false =} - :: put_k {= channel_k_overflow = true =}; stop - } - : 2: {==} - }; - ChannelK() -} - -process ChannelL() -{ - clock c; - - put_l palt - { - :99: {= c = 0, inTransitL = true =}; - invariant(c <= TD) alt { - :: get_l {= inTransitL = false =} - :: put_l {= channel_l_overflow = true =}; stop - } - : 1: {==} - }; - ChannelL() -} - -process Observer() -{ - alt { - :: get_k {= get_k_seen = true =} - :: s_ok {= s_ok_seen = true =} - :: s_nok {= s_nok_seen = true =} - :: s_dk {= s_dk_seen = true =} - :: s_restart {= s_restart_seen = true =} - :: r_ok {= r_ok_seen = true =} - :: r_timeout {= r_timeout_seen = true =} - }; - Observer() -} - -par { -:: Sender() -:: Receiver() -:: ChannelK() -:: ChannelL() -:: Observer() -} diff --git a/examples/jani-examples/brp.modest.txt b/examples/jani-examples/brp.modest.txt deleted file mode 100755 index 6ec6b0c5e..000000000 --- a/examples/jani-examples/brp.modest.txt +++ /dev/null @@ -1,63 +0,0 @@ -Peak memory usage: 40 MB -Analysis results for brp.modest - -+ State space exploration - States: 3959 - Transitions: 4244 - Branches: 4593 - Time: 0.1 s - Rate: 73315 states/s - -+ P_A - Probability: 0 - Time: 0.1 s - - + Value iteration - Final error: 0 - Iterations: 1 - Time: 0.0 s - -+ P_B - Probability: 0 - Time: 0.0 s - - + Value iteration - Final error: 0 - Iterations: 1 - Time: 0.0 s - -+ P_1 - Probability: 0.000423333443357766 - Time: 0.0 s - - + Value iteration - Final error: 2.35005704803786E-07 - Iterations: 13 - Time: 0.0 s - -+ P_2 - Probability: 2.64530890961023E-05 - Time: 0.0 s - - + Value iteration - Final error: 2.05561452068843E-07 - Iterations: 14 - Time: 0.0 s - -+ P_3 - Probability: 0.000185191226393368 - Time: 0.0 s - - + Value iteration - Final error: 3.32462409056221E-07 - Iterations: 13 - Time: 0.0 s - -+ P_4 - Probability: 8E-06 - Time: 0.0 s - - + Value iteration - Final error: 0 - Iterations: 2 - Time: 0.0 s diff --git a/examples/jani-examples/consensus-6.jani b/examples/jani-examples/consensus-6.jani deleted file mode 100755 index 58acabfef..000000000 --- a/examples/jani-examples/consensus-6.jani +++ /dev/null @@ -1,2129 +0,0 @@ -{ - "jani-version": 1, - "name": "modelName", - "type": "mdp", - "actions": [ - { - "name": "done" - } - ], - "variables": [ - { - "name": "counter", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 60 - }, - "initial-value": 30 - }, - { - "name": "fin1", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "fin2", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "fin3", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "fin4", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "fin5", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "fin6", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "coin1", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "coin2", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "coin3", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "coin4", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "coin5", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - }, - { - "name": "coin6", - "type": { - "kind": "bounded", - "base": "int", - "lower-bound": 0, - "upper-bound": 1 - }, - "initial-value": 0 - } - ], - "rewards": [ - { - "name": "coin_flips" - } - ], - "properties": [ - { - "name": "C1", - "bound": 1, - "op": "≥", - "reach": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "fin1", - 1 - ] - }, - { - "op": "=", - "args": [ - "fin2", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "fin3", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "fin4", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "fin5", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "fin6", - 1 - ] - } - ] - }, - "type": "probability-comparison" - }, - { - "name": "C2", - "reach": { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "fin1", - 1 - ] - }, - { - "op": "=", - "args": [ - "fin2", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "fin3", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "fin4", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "fin5", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "fin6", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "coin1", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "coin2", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "coin3", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "coin4", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "coin5", - 1 - ] - } - ] - }, - { - "op": "=", - "args": [ - "coin6", - 1 - ] - } - ] - }, - "type": "probability-min-query" - } - ], - "automata": [ - { - "name": "Tourist1", - "variables": [], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "guard": true, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin1", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin1", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin1", - 0 - ] - }, - { - "op": ">", - "args": [ - "counter", - 0 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "-", - "args": [ - "counter", - 1 - ] - } - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin1", - 1 - ] - }, - { - "op": "<", - "args": [ - "counter", - 60 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "+", - "args": [ - "counter", - 1 - ] - } - }, - { - "ref": "coin1", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≤", - "args": [ - "counter", - 6 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin1", - "value": 0 - }, - { - "ref": "fin1", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≥", - "args": [ - "counter", - 54 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin1", - "value": 1 - }, - { - "ref": "fin1", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "∧", - "args": [ - { - "op": ">", - "args": [ - "counter", - 6 - ] - }, - { - "op": "<", - "args": [ - "counter", - 54 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin1", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin1", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "done", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3" - } - ] - } - ] - }, - { - "name": "Tourist2", - "variables": [], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "guard": true, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin2", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin2", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin2", - 0 - ] - }, - { - "op": ">", - "args": [ - "counter", - 0 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "-", - "args": [ - "counter", - 1 - ] - } - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin2", - 1 - ] - }, - { - "op": "<", - "args": [ - "counter", - 60 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "+", - "args": [ - "counter", - 1 - ] - } - }, - { - "ref": "coin2", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≤", - "args": [ - "counter", - 6 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin2", - "value": 0 - }, - { - "ref": "fin2", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≥", - "args": [ - "counter", - 54 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin2", - "value": 1 - }, - { - "ref": "fin2", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "∧", - "args": [ - { - "op": ">", - "args": [ - "counter", - 6 - ] - }, - { - "op": "<", - "args": [ - "counter", - 54 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin2", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin2", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "done", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3" - } - ] - } - ] - }, - { - "name": "Tourist3", - "variables": [], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "guard": true, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin3", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin3", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin3", - 0 - ] - }, - { - "op": ">", - "args": [ - "counter", - 0 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "-", - "args": [ - "counter", - 1 - ] - } - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin3", - 1 - ] - }, - { - "op": "<", - "args": [ - "counter", - 60 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "+", - "args": [ - "counter", - 1 - ] - } - }, - { - "ref": "coin3", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≤", - "args": [ - "counter", - 6 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin3", - "value": 0 - }, - { - "ref": "fin3", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≥", - "args": [ - "counter", - 54 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin3", - "value": 1 - }, - { - "ref": "fin3", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "∧", - "args": [ - { - "op": ">", - "args": [ - "counter", - 6 - ] - }, - { - "op": "<", - "args": [ - "counter", - 54 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin3", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin3", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "done", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3" - } - ] - } - ] - }, - { - "name": "Tourist4", - "variables": [], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "guard": true, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin4", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin4", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin4", - 0 - ] - }, - { - "op": ">", - "args": [ - "counter", - 0 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "-", - "args": [ - "counter", - 1 - ] - } - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin4", - 1 - ] - }, - { - "op": "<", - "args": [ - "counter", - 60 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "+", - "args": [ - "counter", - 1 - ] - } - }, - { - "ref": "coin4", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≤", - "args": [ - "counter", - 6 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin4", - "value": 0 - }, - { - "ref": "fin4", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≥", - "args": [ - "counter", - 54 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin4", - "value": 1 - }, - { - "ref": "fin4", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "∧", - "args": [ - { - "op": ">", - "args": [ - "counter", - 6 - ] - }, - { - "op": "<", - "args": [ - "counter", - 54 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin4", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin4", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "done", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3" - } - ] - } - ] - }, - { - "name": "Tourist5", - "variables": [], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "guard": true, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin5", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin5", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin5", - 0 - ] - }, - { - "op": ">", - "args": [ - "counter", - 0 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "-", - "args": [ - "counter", - 1 - ] - } - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin5", - 1 - ] - }, - { - "op": "<", - "args": [ - "counter", - 60 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "+", - "args": [ - "counter", - 1 - ] - } - }, - { - "ref": "coin5", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≤", - "args": [ - "counter", - 6 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin5", - "value": 0 - }, - { - "ref": "fin5", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≥", - "args": [ - "counter", - 54 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin5", - "value": 1 - }, - { - "ref": "fin5", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "∧", - "args": [ - { - "op": ">", - "args": [ - "counter", - 6 - ] - }, - { - "op": "<", - "args": [ - "counter", - 54 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin5", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin5", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "done", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3" - } - ] - } - ] - }, - { - "name": "Tourist6", - "variables": [], - "locations": [ - { - "name": "l_0" - }, - { - "name": "l_1" - }, - { - "name": "l_2" - }, - { - "name": "l_3" - } - ], - "initial-location": "l_0", - "edges": [ - { - "location": "l_0", - "guard": true, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin6", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin6", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin6", - 0 - ] - }, - { - "op": ">", - "args": [ - "counter", - 0 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "-", - "args": [ - "counter", - 1 - ] - } - } - ] - } - ] - }, - { - "location": "l_1", - "guard": { - "op": "∧", - "args": [ - { - "op": "=", - "args": [ - "coin6", - 1 - ] - }, - { - "op": "<", - "args": [ - "counter", - 60 - ] - } - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_2", - "assignments": [ - { - "ref": "counter", - "value": { - "op": "+", - "args": [ - "counter", - 1 - ] - } - }, - { - "ref": "coin6", - "value": 0 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≤", - "args": [ - "counter", - 6 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin6", - "value": 0 - }, - { - "ref": "fin6", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "≥", - "args": [ - "counter", - 54 - ] - }, - "destinations": [ - { - "probability": 1, - "location": "l_3", - "assignments": [ - { - "ref": "coin6", - "value": 1 - }, - { - "ref": "fin6", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_2", - "guard": { - "op": "∧", - "args": [ - { - "op": ">", - "args": [ - "counter", - 6 - ] - }, - { - "op": "<", - "args": [ - "counter", - 54 - ] - } - ] - }, - "destinations": [ - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin6", - "value": 0 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - }, - { - "probability": { - "op": "/", - "args": [ - 1, - 2 - ] - }, - "location": "l_1", - "assignments": [ - { - "ref": "coin6", - "value": 1 - } - ], - "reward": [ - { - "ref": "coin_flips", - "value": 1 - } - ] - } - ] - }, - { - "location": "l_3", - "action": "done", - "guard": true, - "destinations": [ - { - "probability": 1, - "location": "l_3" - } - ] - } - ] - } - ], - "system": { - "composition": "parallel", - "elements": [ - { - "composition": "parallel", - "elements": [ - { - "composition": "parallel", - "elements": [ - { - "composition": "parallel", - "elements": [ - { - "composition": "parallel", - "elements": [ - "Tourist1", - "Tourist2" - ], - "alphabet": [ - "done" - ] - }, - "Tourist3" - ], - "alphabet": [ - "done" - ] - }, - "Tourist4" - ], - "alphabet": [ - "done" - ] - }, - "Tourist5" - ], - "alphabet": [ - "done" - ] - }, - "Tourist6" - ], - "alphabet": [ - "done" - ] - } -} \ No newline at end of file diff --git a/examples/jani-examples/consensus-6.jani.txt b/examples/jani-examples/consensus-6.jani.txt deleted file mode 100755 index 17509db20..000000000 --- a/examples/jani-examples/consensus-6.jani.txt +++ /dev/null @@ -1,27 +0,0 @@ -Peak memory usage: 530 MB -Analysis results for consensus-6.jani - -+ State space exploration - States: 2345194 - Transitions: 9418584 - Branches: 13891248 - Time: 8.7 s - Rate: 270964 states/s - -+ C1 - Result: True - Time for min. prob. 0 states: 1.6 s - Time for min. prob. 1 states: 0.1 s - Time: 1.7 s - Min. probability: 1 - -+ C2 - Probability: 0.395776147642961 - Time for min. prob. 0 states: 2.0 s - Time for min. prob. 1 states: 0.1 s - Time: 125.8 s - - + Value iteration - Final error: 9.96634356860147E-07 - Iterations: 2137 - Time: 123.8 s diff --git a/examples/jani-examples/consensus-6.modest b/examples/jani-examples/consensus-6.modest deleted file mode 100755 index 6b129af06..000000000 --- a/examples/jani-examples/consensus-6.modest +++ /dev/null @@ -1,157 +0,0 @@ -// Modest version of http://www.prismmodelchecker.org/casestudies/consensus_prism.php -// Command line: mcsta.exe consensus-6.modest -S Memory --nochainopt --bounded-alg StateElimination -E "K=2" - -action done; - -// constants -const int N = 6; -const int K = 4; -const int range = 2 * (K + 1) * N; -const int counter_init = (K + 1) * N; -const int left = N; -const int right = 2 * (K + 1) * N - N; - -// shared coin -int(0..range) counter = counter_init; -reward coin_flips; - -property C1 = P(<> (fin1 == 1 && fin2 == 1 && fin3 == 1 && fin4 == 1 && fin5 == 1 && fin6 == 1)) >= 1; -property C2 = Pmin(<> (fin1 == 1 && fin2 == 1 && fin3 == 1 && fin4 == 1 && fin5 == 1 && fin6 == 1 && coin1 == 1 && coin2 == 1 && coin3 == 1 && coin4 == 1 && coin5 == 1 && coin6 == 1)); - -int(0..1) fin1, fin2, fin3, fin4, fin5, fin6; -int(0..1) coin1, coin2, coin3, coin4, coin5, coin6; - -process Tourist1() -{ - process Flip() { palt { :1: {= coin1 = 0, coin_flips++ =} :1: {= coin1 = 1, coin_flips++ =} }; Write() } - process Write() { - alt { - :: when(coin1 == 0 && counter > 0) {= counter-- =}; Check() - :: when(coin1 == 1 && counter < range) {= counter++, coin1 = 0 =}; Check() - } - } - process Check() { - alt { - :: when(counter <= left) {= coin1 = 0, fin1 = 1 =}; Finished() - :: when(counter >= right) {= coin1 = 1, fin1 = 1 =}; Finished() - :: when(counter > left && counter < right) Tourist1() - } - } - process Finished() { done; Finished() } - - Flip() -} - -process Tourist2() -{ - process Flip() { palt { :1: {= coin2 = 0, coin_flips++ =} :1: {= coin2 = 1, coin_flips++ =} }; Write() } - process Write() { - alt { - :: when(coin2 == 0 && counter > 0) {= counter-- =}; Check() - :: when(coin2 == 1 && counter < range) {= counter++, coin2 = 0 =}; Check() - } - } - process Check() { - alt { - :: when(counter <= left) {= coin2 = 0, fin2 = 1 =}; Finished() - :: when(counter >= right) {= coin2 = 1, fin2 = 1 =}; Finished() - :: when(counter > left && counter < right) Tourist2() - } - } - process Finished() { done; Finished() } - - Flip() -} - -process Tourist3() -{ - process Flip() { palt { :1: {= coin3 = 0, coin_flips++ =} :1: {= coin3 = 1, coin_flips++ =} }; Write() } - process Write() { - alt { - :: when(coin3 == 0 && counter > 0) {= counter-- =}; Check() - :: when(coin3 == 1 && counter < range) {= counter++, coin3 = 0 =}; Check() - } - } - process Check() { - alt { - :: when(counter <= left) {= coin3 = 0, fin3 = 1 =}; Finished() - :: when(counter >= right) {= coin3 = 1, fin3 = 1 =}; Finished() - :: when(counter > left && counter < right) Tourist3() - } - } - process Finished() { done; Finished() } - - Flip() -} - -process Tourist4() -{ - process Flip() { palt { :1: {= coin4 = 0, coin_flips++ =} :1: {= coin4 = 1, coin_flips++ =} }; Write() } - process Write() { - alt { - :: when(coin4 == 0 && counter > 0) {= counter-- =}; Check() - :: when(coin4 == 1 && counter < range) {= counter++, coin4 = 0 =}; Check() - } - } - process Check() { - alt { - :: when(counter <= left) {= coin4 = 0, fin4 = 1 =}; Finished() - :: when(counter >= right) {= coin4 = 1, fin4 = 1 =}; Finished() - :: when(counter > left && counter < right) Tourist4() - } - } - process Finished() { done; Finished() } - - Flip() -} - -process Tourist5() -{ - process Flip() { palt { :1: {= coin5 = 0, coin_flips++ =} :1: {= coin5 = 1, coin_flips++ =} }; Write() } - process Write() { - alt { - :: when(coin5 == 0 && counter > 0) {= counter-- =}; Check() - :: when(coin5 == 1 && counter < range) {= counter++, coin5 = 0 =}; Check() - } - } - process Check() { - alt { - :: when(counter <= left) {= coin5 = 0, fin5 = 1 =}; Finished() - :: when(counter >= right) {= coin5 = 1, fin5 = 1 =}; Finished() - :: when(counter > left && counter < right) Tourist5() - } - } - process Finished() { done; Finished() } - - Flip() -} - -process Tourist6() -{ - process Flip() { palt { :1: {= coin6 = 0, coin_flips++ =} :1: {= coin6 = 1, coin_flips++ =} }; Write() } - process Write() { - alt { - :: when(coin6 == 0 && counter > 0) {= counter-- =}; Check() - :: when(coin6 == 1 && counter < range) {= counter++, coin6 = 0 =}; Check() - } - } - process Check() { - alt { - :: when(counter <= left) {= coin6 = 0, fin6 = 1 =}; Finished() - :: when(counter >= right) {= coin6 = 1, fin6 = 1 =}; Finished() - :: when(counter > left && counter < right) Tourist6() - } - } - process Finished() { done; Finished() } - - Flip() -} - -par { -:: Tourist1() -:: Tourist2() -:: Tourist3() -:: Tourist4() -:: Tourist5() -:: Tourist6() -} diff --git a/examples/jani-examples/consensus-6.modest.txt b/examples/jani-examples/consensus-6.modest.txt deleted file mode 100755 index 3ff5c0821..000000000 --- a/examples/jani-examples/consensus-6.modest.txt +++ /dev/null @@ -1,27 +0,0 @@ -Peak memory usage: 531 MB -Analysis results for consensus-6.modest - -+ State space exploration - States: 2345194 - Transitions: 9418584 - Branches: 13891248 - Time: 8.2 s - Rate: 287507 states/s - -+ C1 - Result: True - Time for min. prob. 0 states: 1.5 s - Time for min. prob. 1 states: 0.2 s - Time: 1.7 s - Min. probability: 1 - -+ C2 - Probability: 0.395776147642961 - Time for min. prob. 0 states: 2.0 s - Time for min. prob. 1 states: 0.1 s - Time: 126.8 s - - + Value iteration - Final error: 9.96634356860147E-07 - Iterations: 2137 - Time: 124.7 s diff --git a/examples/jani-examples/dice.jani b/examples/jani-examples/dice.jani deleted file mode 100755 index e9e377e15..000000000 --- a/examples/jani-examples/dice.jani +++ /dev/null @@ -1,354 +0,0 @@ -{ - "jani-version": 1, - "name": "dice", - "type" : "mdp", - "actions" : [], - "variables" : [ - { - "name": "thrownSix", - "type": "bool", - "initial-value": false - }, - { - "name": "terminated", - "type": "bool", - "initial-value": false - } - ], - "rewards" : [ - { - "name" : "step" - } - ], - "properties" : [ - { - "name" : "ProbThrowSix", - "reach" : "thrownSix", - "type": "probability-max-query" - }, - { - "name" : "StepsUntilReach", - "reach" : "terminated", - "reward": "step", - "type": "expected-reachability-reward-max-query" - } - ], - "automata" : [ - { - "name" : "dice", - "variables" : [ - { - "name" : "d", - "type" : { - "kind": "bounded", - "base": "int", - "lower-bound" : 0, - "upper-bound" : 6 - }, - "initial-value" : 0 - } - ], - "locations" : [ - { - "name" : "s0" - }, - { - "name" : "s1" - }, - { - "name" : "s2" - }, - { - "name" : "s3" - }, - { - "name" : "s4" - }, - { - "name" : "s5" - }, - { - "name" : "s6" - }, - { - "name" : "s7" - } - ], - "initial-location" : "s0", - "edges" : [ - { - "location" : "s0", - "guard" : true, - "destinations" : [ - { - "probability" : 0.5, - "location" : "s1", - "assignments" : [], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - }, - { - "probability" : 0.5, - "location" : "s2", - "assignments" : [], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - } - ] - }, - { - "location" : "s1", - "guard" : true, - "destinations" : [ - { - "probability" : 0.5, - "location" : "s3", - "assignments" : [], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - }, - { - "probability" : 0.5, - "location" : "s4", - "assignments" : [], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - } - ] - }, - { - "location" : "s2", - "guard" : true, - "destinations" : [ - { - "probability" : 0.5, - "location" : "s5", - "assignments" : [], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - }, - { - "probability" : 0.5, - "location" : "s6", - "assignments" : [], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - } - ] - }, - { - "location" : "s3", - "guard" : true, - "destinations" : [ - { - "probability" : 0.5, - "location" : "s1", - "assignments" : [], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - }, - { - "probability" : 0.5, - "location" : "s7", - "assignments" : [ - { - "ref" : "d", - "value" : 1 - }, - { - "ref" : "terminated", - "value" : true - } - ], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - } - ] - }, - { - "location" : "s4", - "guard" : true, - "destinations" : [ - { - "probability" : 0.5, - "location" : "s7", - "assignments" : [ - { - "ref" : "d", - "value" : 2 - }, - { - "ref" : "terminated", - "value" : true - } - ], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - }, - { - "probability" : 0.5, - "location" : "s7", - "assignments" : [ - { - "ref" : "d", - "value" : 3 - }, - { - "ref" : "terminated", - "value" : true - } - ], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - } - ] - }, - { - "location" : "s5", - "guard" : true, - "destinations" : [ - { - "probability" : 0.5, - "location" : "s7", - "assignments" : [ - { - "ref" : "d", - "value" : 4 - }, - { - "ref" : "terminated", - "value" : true - } - ], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - }, - { - "probability" : 0.5, - "location" : "s7", - "assignments" : [ - { - "ref" : "d", - "value" : 5 - }, - { - "ref" : "terminated", - "value" : true - } - ], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - } - ] - }, - { - "location" : "s6", - "guard" : true, - "destinations" : [ - { - "probability" : 0.5, - "location" : "s2", - "assignments" : [], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - }, - { - "probability" : 0.5, - "location" : "s7", - "assignments" : [ - { - "ref" : "d", - "value" : 6 - }, - { - "ref" : "thrownSix", - "value" : true - }, - { - "ref" : "terminated", - "value" : true - } - ], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - } - ] - }, - { - "location" : "s7", - "guard" : true, - "destinations" : [ - { - "probability" : 1, - "location" : "s7", - "assignments" : [], - "rewards" : [ - { - "ref" : "step", - "value" : 1 - } - ] - } - ] - } - ] - } - ], - "system" : "dice" -} diff --git a/examples/jani-examples/dice.jani.txt b/examples/jani-examples/dice.jani.txt deleted file mode 100755 index 2cf07a5ed..000000000 --- a/examples/jani-examples/dice.jani.txt +++ /dev/null @@ -1,29 +0,0 @@ -Peak memory usage: 36 MB -Analysis results for dice.jani - -+ State space exploration - States: 8 - Transitions: 8 - Branches: 14 - Time: 0.0 s - Rate: 190 states/s - -+ ProbThrowSix - Probability: 0.166666626930237 - Time: 0.0 s - - + Value iteration - Final error: 7.15255907834985E-07 - Iterations: 11 - Time: 0.0 s - -+ StepsUntilReach - Value: 3.66666650772095 - Time for min. prob. 0 states: 0.0 s - Time for min. prob. 1 states: 0.0 s - Time: 0.0 s - - + Value iteration - Final error: 4.08717619857464E-07 - Iterations: 12 - Time: 0.0 s diff --git a/examples/pctmc/polling6.sm b/examples/pctmc/polling6.sm new file mode 100644 index 000000000..686907565 --- /dev/null +++ b/examples/pctmc/polling6.sm @@ -0,0 +1,87 @@ +// polling example [IT90] +// gxn/dxp 26/01/00 + +ctmc + +const int N=6; + +const double mu; +const double gamma; + +//const double mu= 1; +//const double gamma= 200; +//const double lambda= mu/N; + +module server + + s : [1..6]; // station + a : [0..1]; // action: 0=polling, 1=serving + + [loop1a] (s=1)&(a=0) -> gamma : (s'=s+1); + [loop1b] (s=1)&(a=0) -> gamma : (a'=1); + [serve1] (s=1)&(a=1) -> mu : (s'=s+1)&(a'=0); + + [loop2a] (s=2)&(a=0) -> gamma : (s'=s+1); + [loop2b] (s=2)&(a=0) -> gamma : (a'=1); + [serve2] (s=2)&(a=1) -> mu : (s'=s+1)&(a'=0); + + [loop3a] (s=3)&(a=0) -> gamma : (s'=s+1); + [loop3b] (s=3)&(a=0) -> gamma : (a'=1); + [serve3] (s=3)&(a=1) -> mu : (s'=s+1)&(a'=0); + + [loop4a] (s=4)&(a=0) -> gamma : (s'=s+1); + [loop4b] (s=4)&(a=0) -> gamma : (a'=1); + [serve4] (s=4)&(a=1) -> mu : (s'=s+1)&(a'=0); + + [loop5a] (s=5)&(a=0) -> gamma : (s'=s+1); + [loop5b] (s=5)&(a=0) -> gamma : (a'=1); + [serve5] (s=5)&(a=1) -> mu : (s'=s+1)&(a'=0); + + [loop6a] (s=6)&(a=0) -> gamma : (s'=1); + [loop6b] (s=6)&(a=0) -> gamma : (a'=1); + [serve6] (s=6)&(a=1) -> mu : (s'=1)&(a'=0); + +endmodule + +module station1 + + s1 : [0..1]; + + [loop1a] (s1=0) -> 1 : (s1'=0); + [] (s1=0) -> mu/N : (s1'=1); + [loop1b] (s1=1) -> 1 : (s1'=1); + [serve1] (s1=1) -> 1 : (s1'=0); + +endmodule + +// construct further stations through renaming +module station2 = station1 [s1=s2, loop1a=loop2a, loop1b=loop2b, serve1=serve2] endmodule +module station3 = station1 [s1=s3, loop1a=loop3a, loop1b=loop3b, serve1=serve3] endmodule +module station4 = station1 [s1=s4, loop1a=loop4a, loop1b=loop4b, serve1=serve4] endmodule +module station5 = station1 [s1=s5, loop1a=loop5a, loop1b=loop5b, serve1=serve5] endmodule +module station6 = station1 [s1=s6, loop1a=loop6a, loop1b=loop6b, serve1=serve6] endmodule + +// cumulative rewards + +rewards "waiting" // expected time the station 1 is waiting to be served + s1=1 & !(s=1 & a=1) : 1; +endrewards + +rewards "served" // expected number of times station1 is served + [serve1] true : 1; +endrewards + +label "server1serving" = s=1 & a=1; +label "server5polling" = s=5 & a=0; +label "server5serving" = s=5 & a=1; + +init +s = 1 & +a = 0 & +s1 = 0 & +s2 = 0 & +s3 = 0 & +s4 = 0 & +s5 = 0 & +s6 = 0 +endinit diff --git a/examples/pdtmc/brp/brp.pm b/examples/pdtmc/brp/brp.pm index 897f9909e..031bfe978 100644 --- a/examples/pdtmc/brp/brp.pm +++ b/examples/pdtmc/brp/brp.pm @@ -133,3 +133,6 @@ module channelL [TO_Ack] (l=2) -> (l'=0); endmodule + +label "fatal" = s=5 & T; +label "false_neg" = srep=1 & rrep=3 & recv; diff --git a/examples/pdtmc/brp/brp16_2.pm b/examples/pdtmc/brp/brp16_2.pm index 2e20b7de4..0fc99d05e 100644 --- a/examples/pdtmc/brp/brp16_2.pm +++ b/examples/pdtmc/brp/brp16_2.pm @@ -133,3 +133,5 @@ module channelL [TO_Ack] (l=2) -> (l'=0); endmodule + +label "error" = s=5; diff --git a/examples/pdtmc/brp_rewards2/brp_rewards16_2.pm b/examples/pdtmc/brp_rewards2/brp_rewards16_2.pm index 0b05d22fd..7145a77ae 100644 --- a/examples/pdtmc/brp_rewards2/brp_rewards16_2.pm +++ b/examples/pdtmc/brp_rewards2/brp_rewards16_2.pm @@ -144,3 +144,5 @@ rewards endrewards +label "target" = s=5; + diff --git a/examples/pdtmc/brp_rewards2/brp_rewards2.pm b/examples/pdtmc/brp_rewards2/brp_rewards2.pm index b4cc546e1..a8e5eced1 100644 --- a/examples/pdtmc/brp_rewards2/brp_rewards2.pm +++ b/examples/pdtmc/brp_rewards2/brp_rewards2.pm @@ -143,4 +143,5 @@ rewards [TO_Ack] true : TOAck; endrewards - +label "fatal" = s=5 & T; +label "false_neg" = srep=1 & rrep=3 & recv; diff --git a/examples/pdtmc/brp_rewards4/brp_rewards16_2.pm b/examples/pdtmc/brp_rewards4/brp_rewards16_2.pm index d756a90ec..ff62fea14 100644 --- a/examples/pdtmc/brp_rewards4/brp_rewards16_2.pm +++ b/examples/pdtmc/brp_rewards4/brp_rewards16_2.pm @@ -144,3 +144,5 @@ rewards endrewards + +label "target" = s=5; \ No newline at end of file diff --git a/examples/pdtmc/brp_rewards4/brp_rewards4.pm b/examples/pdtmc/brp_rewards4/brp_rewards4.pm index 5617e839b..223993bc4 100644 --- a/examples/pdtmc/brp_rewards4/brp_rewards4.pm +++ b/examples/pdtmc/brp_rewards4/brp_rewards4.pm @@ -144,3 +144,6 @@ rewards endrewards + +label "fatal" = s=5 & T; +label "false_neg" = srep=1 & rrep=3 & recv; diff --git a/examples/pdtmc/die.pm b/examples/pdtmc/die.pm new file mode 100644 index 000000000..a2a8f57b0 --- /dev/null +++ b/examples/pdtmc/die.pm @@ -0,0 +1,35 @@ +// Knuth's model of a fair die using only fair coins +dtmc + +const double p; +const double q; + +module die + + // local state + s : [0..7] init 0; + // value of the dice + d : [0..6] init 0; + + [] s=0 -> p : (s'=1) + 1-p : (s'=2); + [] s=1 -> q : (s'=3) + 1-q : (s'=4); + [] s=2 -> q : (s'=5) + 1-q : (s'=6); + [] s=3 -> p : (s'=1) + 1-p : (s'=7) & (d'=1); + [] s=4 -> p : (s'=7) & (d'=3) + 1-p : (s'=7) & (d'=2); + [] s=5 -> p : (s'=2) + 1-p : (s'=7) & (d'=4); + [] s=6 -> p : (s'=7) & (d'=6) + 1-p : (s'=7) & (d'=5); + [] s=7 -> 1: (s'=7); + +endmodule + +rewards "coin_flips" + [] s<7 : 1; +endrewards + +label "one" = s=7&d=1; +label "two" = s=7&d=2; +label "three" = s=7&d=3; +label "four" = s=7&d=4; +label "five" = s=7&d=5; +label "six" = s=7&d=6; +label "end" = s=7; diff --git a/examples/pdtmc/twodie.pm b/examples/pdtmc/twodie.pm new file mode 100644 index 000000000..d38f75496 --- /dev/null +++ b/examples/pdtmc/twodie.pm @@ -0,0 +1,44 @@ +// Knuth's model of a fair die using only fair coins +dtmc + +const double p; +const double q; + +module die1 + + // local state + s1 : [0..7] init 0; + // value of the dice + d1 : [0..6] init 0; + + [] s1=0 -> p : (s1'=1) + 1-p : (s1'=2); + [] s1=1 -> q : (s1'=3) + 1-q : (s1'=4); + [] s1=2 -> q : (s1'=5) + 1-q : (s1'=6); + [] s1=3 -> p : (s1'=1) + 1-p : (s1'=7) & (d1'=1); + [] s1=4 -> p : (s1'=7) & (d1'=3) + 1-p : (s1'=7) & (d1'=2); + [] s1=5 -> p : (s1'=2) + 1-p : (s1'=7) & (d1'=4); + [] s1=6 -> p : (s1'=7) & (d1'=6) + 1-p : (s1'=7) & (d1'=5); + [] s1=7 -> 1: (s1'=7); + +endmodule + +module die2 = die1 [ s1=s2, s2=s1, d1=d2 ] endmodule + +rewards "coin_flips" + [] s1<7 | s2<7 : 1; +endrewards + +label "two" = s1=7 & s2=7 & d1+d2=2; +label "three" = s1=7 & s2=7 & d1+d2=3; +label "four" = s1=7 & s2=7 & d1+d2=4; +label "five" = s1=7 & s2=7 & d1+d2=5; +label "six" = s1=7 & s2=7 & d1+d2=6; +label "seven" = s1=7 & s2=7 & d1+d2=7; +label "eight" = s1=7 & s2=7 & d1+d2=8; +label "nine" = s1=7 & s2=7 & d1+d2=9; +label "ten" = s1=7 & s2=7 & d1+d2=10; +label "eleven" = s1=7 & s2=7 & d1+d2=11; +label "twelve" = s1=7 & s2=7 & d1+d2=12; +label "same" = s1=7 & s2=7 & d1=d2; + +label "end" = s1=7 & s2=7; diff --git a/examples/pgcl/coupon/coupon10-classic.pgcl b/examples/pgcl/coupon/coupon10-classic.pgcl new file mode 100644 index 000000000..d1c3cd015 --- /dev/null +++ b/examples/pgcl/coupon/coupon10-classic.pgcl @@ -0,0 +1,58 @@ +function coupon10() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + int coup5 := 0; + int coup6 := 0; + int coup7 := 0; + int coup8 := 0; + int coup9 := 0; + int coup10 := 0; + + int draw := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1) | !(coup5= 1) | !(coup6 = 1) | !(coup7 = 1) | !(coup8 = 1) | !(coup9 = 1) | !(coup10 = 1)) { + draw := unif(0,10); + draw2 := unif(0,10); + draw3 := unif(0,10); + numberDraws := numberDraws + 1; + + if(draw = 0) { + coup0 := 1; + } + if(draw = 1) { + coup1 := 1; + } + if(draw = 2) { + coup2 := 1; + } + if(draw = 3) { + coup3 := 1; + } + if(draw = 4) { + coup4 := 1; + } + if(draw = 5) { + coup5 := 1; + } + if(draw = 6) { + coup6 := 1; + } + if(draw = 7) { + coup7 := 1; + } + if(draw = 8) { + coup8 := 1; + } + if(draw = 9) { + coup9 := 1; + } + if(draw = 10) { + coup10 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon10-cost.pgcl b/examples/pgcl/coupon/coupon10-cost.pgcl new file mode 100644 index 000000000..740da760c --- /dev/null +++ b/examples/pgcl/coupon/coupon10-cost.pgcl @@ -0,0 +1,60 @@ +function coupon10() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + int coup5 := 0; + int coup6 := 0; + int coup7 := 0; + int coup8 := 0; + int coup9 := 0; + int coup10 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int cost := 1; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1) | !(coup5= 1) | !(coup6 = 1) | !(coup7 = 1) | !(coup8 = 1) | !(coup9 = 1) | !(coup10 = 1)) { + draw1 := unif(0,10); + draw2 := unif(0,10); + draw3 := unif(0,10); + cost := ceil(1.02 * cost); + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + if (draw1 = 3 | draw2 = 3 | draw3 = 3) { + coup3 := 1; + } + if (draw1 = 4 | draw2 = 4 | draw3 = 4) { + coup4 := 1; + } + if (draw1 = 5 | draw2 = 5 | draw3 = 5) { + coup5 := 1; + } + if (draw1 = 6 | draw2 = 6 | draw3 = 6) { + coup6 := 1; + } + if (draw1 = 7 | draw2 = 7 | draw3 = 7) { + coup7 := 1; + } + if (draw1 = 8 | draw2 = 8 | draw3 = 8) { + coup8 := 1; + } + if (draw1 = 9 | draw2 = 9 | draw3 = 9) { + coup9 := 1; + } + if (draw1 = 10 | draw2 = 10 | draw3 = 10) { + coup10 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon10-observe.pgcl b/examples/pgcl/coupon/coupon10-observe.pgcl new file mode 100644 index 000000000..0ccdfb6f7 --- /dev/null +++ b/examples/pgcl/coupon/coupon10-observe.pgcl @@ -0,0 +1,62 @@ +function coupon10() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + int coup5 := 0; + int coup6 := 0; + int coup7 := 0; + int coup8 := 0; + int coup9 := 0; + int coup10 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1) | !(coup5= 1) | !(coup6 = 1) | !(coup7 = 1) | !(coup8 = 1) | !(coup9 = 1) | !(coup10 = 1)) { + draw1 := unif(0,10); + draw2 := unif(0,10); + draw3 := unif(0,10); + numberDraws := numberDraws + 1; + + observe (draw1 != draw2 & draw1 != draw3 & draw2 != draw3); + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + if (draw1 = 3 | draw2 = 3 | draw3 = 3) { + coup3 := 1; + } + if (draw1 = 4 | draw2 = 4 | draw3 = 4) { + coup4 := 1; + } + if (draw1 = 5 | draw2 = 5 | draw3 = 5) { + coup5 := 1; + } + if (draw1 = 6 | draw2 = 6 | draw3 = 6) { + coup6 := 1; + } + if (draw1 = 7 | draw2 = 7 | draw3 = 7) { + coup7 := 1; + } + if (draw1 = 8 | draw2 = 8 | draw3 = 8) { + coup8 := 1; + } + if (draw1 = 9 | draw2 = 9 | draw3 = 9) { + coup9 := 1; + } + if (draw1 = 10 | draw2 = 10 | draw3 = 10) { + coup10 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon10.pgcl b/examples/pgcl/coupon/coupon10.pgcl new file mode 100644 index 000000000..95c9eae1e --- /dev/null +++ b/examples/pgcl/coupon/coupon10.pgcl @@ -0,0 +1,60 @@ +function coupon10() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + int coup5 := 0; + int coup6 := 0; + int coup7 := 0; + int coup8 := 0; + int coup9 := 0; + int coup10 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1) | !(coup5= 1) | !(coup6 = 1) | !(coup7 = 1) | !(coup8 = 1) | !(coup9 = 1) | !(coup10 = 1)) { + draw1 := unif(0,10); + draw2 := unif(0,10); + draw3 := unif(0,10); + numberDraws := numberDraws + 1; + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + if (draw1 = 3 | draw2 = 3 | draw3 = 3) { + coup3 := 1; + } + if (draw1 = 4 | draw2 = 4 | draw3 = 4) { + coup4 := 1; + } + if (draw1 = 5 | draw2 = 5 | draw3 = 5) { + coup5 := 1; + } + if (draw1 = 6 | draw2 = 6 | draw3 = 6) { + coup6 := 1; + } + if (draw1 = 7 | draw2 = 7 | draw3 = 7) { + coup7 := 1; + } + if (draw1 = 8 | draw2 = 8 | draw3 = 8) { + coup8 := 1; + } + if (draw1 = 9 | draw2 = 9 | draw3 = 9) { + coup9 := 1; + } + if (draw1 = 10 | draw2 = 10 | draw3 = 10) { + coup10 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon3-classic.pgcl b/examples/pgcl/coupon/coupon3-classic.pgcl new file mode 100644 index 000000000..b7c7d5b0d --- /dev/null +++ b/examples/pgcl/coupon/coupon3-classic.pgcl @@ -0,0 +1,24 @@ +function coupon3() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + + int draw := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1)) { + draw := unif(0,2); + numberDraws := numberDraws + 1; + + if(draw = 0) { + coup0 := 1; + } + if(draw = 1) { + coup1 := 1; + } + if(draw = 2) { + coup2 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon3-cost.pgcl b/examples/pgcl/coupon/coupon3-cost.pgcl new file mode 100644 index 000000000..6f474942a --- /dev/null +++ b/examples/pgcl/coupon/coupon3-cost.pgcl @@ -0,0 +1,28 @@ +function coupon3() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int cost := 1; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1)) { + draw1 := unif(0,2); + draw2 := unif(0,2); + draw3 := unif(0,2); + cost := ceil(1.02 * cost); + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon3-observe.pgcl b/examples/pgcl/coupon/coupon3-observe.pgcl new file mode 100644 index 000000000..6f41e7caf --- /dev/null +++ b/examples/pgcl/coupon/coupon3-observe.pgcl @@ -0,0 +1,30 @@ +function coupon3() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1)) { + draw1 := unif(0,2); + draw2 := unif(0,2); + draw3 := unif(0,2); + numberDraws := numberDraws + 1; + + observe (draw1 != draw2 & draw1 != draw3 & draw2 != draw3); + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon3.pgcl b/examples/pgcl/coupon/coupon3.pgcl new file mode 100644 index 000000000..1d4e4e7c6 --- /dev/null +++ b/examples/pgcl/coupon/coupon3.pgcl @@ -0,0 +1,28 @@ +function coupon3() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1)) { + draw1 := unif(0,2); + draw2 := unif(0,2); + draw3 := unif(0,2); + numberDraws := numberDraws + 1; + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon4-observe.pgcl b/examples/pgcl/coupon/coupon4-observe.pgcl new file mode 100644 index 000000000..fb6d5bcf6 --- /dev/null +++ b/examples/pgcl/coupon/coupon4-observe.pgcl @@ -0,0 +1,34 @@ +function coupon4() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1)) { + draw1 := unif(0,4); + draw2 := unif(0,4); + draw3 := unif(0,4); + numberDraws := numberDraws + 1; + + observe (draw1 != draw2 & draw1 != draw3 & draw2 != draw3); + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + if (draw1 = 3 | draw2 = 3 | draw3 = 3) { + coup3 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon5-classic.pgcl b/examples/pgcl/coupon/coupon5-classic.pgcl new file mode 100644 index 000000000..b27c381cf --- /dev/null +++ b/examples/pgcl/coupon/coupon5-classic.pgcl @@ -0,0 +1,32 @@ +function coupon5() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + + int draw := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1)) { + draw := unif(0,4); + numberDraws := numberDraws + 1; + + if(draw = 0) { + coup0 := 1; + } + if(draw = 1) { + coup1 := 1; + } + if(draw = 2) { + coup2 := 1; + } + if(draw = 3) { + coup3 := 1; + } + if(draw = 4) { + coup4 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon5-cost.pgcl b/examples/pgcl/coupon/coupon5-cost.pgcl new file mode 100644 index 000000000..84779cad1 --- /dev/null +++ b/examples/pgcl/coupon/coupon5-cost.pgcl @@ -0,0 +1,36 @@ +function coupon5() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int cost := 1; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1)) { + draw1 := unif(0,4); + draw2 := unif(0,4); + draw3 := unif(0,4); + cost := ceil(1.02 * cost); + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + if (draw1 = 3 | draw2 = 3 | draw3 = 3) { + coup3 := 1; + } + if (draw1 = 4 | draw2 = 4 | draw3 = 4) { + coup4 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon5-observe.pgcl b/examples/pgcl/coupon/coupon5-observe.pgcl new file mode 100644 index 000000000..734ccd127 --- /dev/null +++ b/examples/pgcl/coupon/coupon5-observe.pgcl @@ -0,0 +1,38 @@ +function coupon5() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1)) { + draw1 := unif(0,4); + draw2 := unif(0,4); + draw3 := unif(0,4); + numberDraws := numberDraws + 1; + + observe (draw1 != draw2 & draw1 != draw3 & draw2 != draw3); + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + if (draw1 = 3 | draw2 = 3 | draw3 = 3) { + coup3 := 1; + } + if (draw1 = 4 | draw2 = 4 | draw3 = 4) { + coup4 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon5.pgcl b/examples/pgcl/coupon/coupon5.pgcl new file mode 100644 index 000000000..aede63e50 --- /dev/null +++ b/examples/pgcl/coupon/coupon5.pgcl @@ -0,0 +1,36 @@ +function coupon5() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1)) { + draw1 := unif(0,4); + draw2 := unif(0,4); + draw3 := unif(0,4); + numberDraws := numberDraws + 1; + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + if (draw1 = 3 | draw2 = 3 | draw3 = 3) { + coup3 := 1; + } + if (draw1 = 4 | draw2 = 4 | draw3 = 4) { + coup4 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon7-classic.pgcl b/examples/pgcl/coupon/coupon7-classic.pgcl new file mode 100644 index 000000000..af9156ff1 --- /dev/null +++ b/examples/pgcl/coupon/coupon7-classic.pgcl @@ -0,0 +1,40 @@ +function coupon7() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + int coup5 := 0; + int coup6 := 0; + + int draw := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1) | !(coup5= 1) | !(coup6 = 1)) { + draw := unif(0,6); + numberDraws := numberDraws + 1; + + if(draw = 0) { + coup0 := 1; + } + if(draw = 1) { + coup1 := 1; + } + if(draw = 2) { + coup2 := 1; + } + if(draw = 3) { + coup3 := 1; + } + if(draw = 4) { + coup4 := 1; + } + if(draw = 5) { + coup5 := 1; + } + if(draw = 6) { + coup6 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon7-cost.pgcl b/examples/pgcl/coupon/coupon7-cost.pgcl new file mode 100644 index 000000000..d71b367ca --- /dev/null +++ b/examples/pgcl/coupon/coupon7-cost.pgcl @@ -0,0 +1,44 @@ +function coupon7() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + int coup5 := 0; + int coup6 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int cost := 1; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1) | !(coup5= 1) | !(coup6 = 1)) { + draw1 := unif(0,6); + draw2 := unif(0,6); + draw3 := unif(0,6); + cost := ceil(1.02 * cost); + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + if (draw1 = 3 | draw2 = 3 | draw3 = 3) { + coup3 := 1; + } + if (draw1 = 4 | draw2 = 4 | draw3 = 4) { + coup4 := 1; + } + if (draw1 = 5 | draw2 = 5 | draw3 = 5) { + coup5 := 1; + } + if (draw1 = 6 | draw2 = 6 | draw3 = 6) { + coup6 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon7-observe.pgcl b/examples/pgcl/coupon/coupon7-observe.pgcl new file mode 100644 index 000000000..89f74bcd9 --- /dev/null +++ b/examples/pgcl/coupon/coupon7-observe.pgcl @@ -0,0 +1,46 @@ +function coupon7() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + int coup5 := 0; + int coup6 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1) | !(coup5= 1) | !(coup6 = 1)) { + draw1 := unif(0,6); + draw2 := unif(0,6); + draw3 := unif(0,6); + numberDraws := numberDraws + 1; + + observe (draw1 != draw2 & draw1 != draw3 & draw2 != draw3); + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + if (draw1 = 3 | draw2 = 3 | draw3 = 3) { + coup3 := 1; + } + if (draw1 = 4 | draw2 = 4 | draw3 = 4) { + coup4 := 1; + } + if (draw1 = 5 | draw2 = 5 | draw3 = 5) { + coup5 := 1; + } + if (draw1 = 6 | draw2 = 6 | draw3 = 6) { + coup6 := 1; + } + } +} diff --git a/examples/pgcl/coupon/coupon7.pgcl b/examples/pgcl/coupon/coupon7.pgcl new file mode 100644 index 000000000..43bb38e99 --- /dev/null +++ b/examples/pgcl/coupon/coupon7.pgcl @@ -0,0 +1,44 @@ +function coupon7() { + int coup0 := 0; + int coup1 := 0; + int coup2 := 0; + int coup3 := 0; + int coup4 := 0; + int coup5 := 0; + int coup6 := 0; + + int draw1 := 0; + int draw2 := 0; + int draw3 := 0; + + int numberDraws := 0; + + while (!(coup0 = 1) | !(coup1 = 1) | !(coup2 = 1) | !(coup3 = 1) | !(coup4 = 1) | !(coup5= 1) | !(coup6 = 1)) { + draw1 := unif(0,6); + draw2 := unif(0,6); + draw3 := unif(0,6); + numberDraws := numberDraws + 1; + + if(draw1 = 0 | draw2 = 0 | draw3 = 0) { + coup0 := 1; + } + if(draw1 = 1 | draw2 = 1 | draw3 = 1) { + coup1 := 1; + } + if(draw1 = 2 | draw2 = 2 | draw3 = 2) { + coup2 := 1; + } + if (draw1 = 3 | draw2 = 3 | draw3 = 3) { + coup3 := 1; + } + if (draw1 = 4 | draw2 = 4 | draw3 = 4) { + coup4 := 1; + } + if (draw1 = 5 | draw2 = 5 | draw3 = 5) { + coup5 := 1; + } + if (draw1 = 6 | draw2 = 6 | draw3 = 6) { + coup6 := 1; + } + } +} diff --git a/examples/pgcl/crowds/crowds100-100-observeOther.pgcl b/examples/pgcl/crowds/crowds100-100-observeOther.pgcl new file mode 100644 index 000000000..042b1d232 --- /dev/null +++ b/examples/pgcl/crowds/crowds100-100-observeOther.pgcl @@ -0,0 +1,35 @@ +function crowds() { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 100; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [0.091] { + { + { lastSender:=0; } [1/100] { lastSender := 1; } + } + [0.8] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } + observe(observeOther > 25); +} diff --git a/examples/pgcl/crowds/crowds100-100.pgcl b/examples/pgcl/crowds/crowds100-100.pgcl new file mode 100644 index 000000000..384340bd2 --- /dev/null +++ b/examples/pgcl/crowds/crowds100-100.pgcl @@ -0,0 +1,34 @@ +function crowds() { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 100; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [0.091] { + { + { lastSender:=0; } [1/100] { lastSender := 1; } + } + [0.8] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } +} diff --git a/examples/pgcl/crowds/crowds100-60-observeOther.pgcl b/examples/pgcl/crowds/crowds100-60-observeOther.pgcl new file mode 100644 index 000000000..0578344f0 --- /dev/null +++ b/examples/pgcl/crowds/crowds100-60-observeOther.pgcl @@ -0,0 +1,35 @@ +function crowds() { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 60; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [0.091] { + { + { lastSender:=0; } [1/100] { lastSender := 1; } + } + [0.8] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } + observe(observeOther > 15); +} diff --git a/examples/pgcl/crowds/crowds100-60-param.pgcl b/examples/pgcl/crowds/crowds100-60-param.pgcl new file mode 100644 index 000000000..92bd1d051 --- /dev/null +++ b/examples/pgcl/crowds/crowds100-60-param.pgcl @@ -0,0 +1,34 @@ +function crowds(double PF, double bad) { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 60; + int observeSender := 0; // in [0, TotalRuns] + int observeOther := 0; // in [0, TotalRuns] + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [bad] { + { + { lastSender:=0; } [1/100] { lastSender := 1; } + } + [PF] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } +} diff --git a/examples/pgcl/crowds/crowds100-60.pgcl b/examples/pgcl/crowds/crowds100-60.pgcl new file mode 100644 index 000000000..5e3ccd71e --- /dev/null +++ b/examples/pgcl/crowds/crowds100-60.pgcl @@ -0,0 +1,34 @@ +function crowds() { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 60; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [0.091] { + { + { lastSender:=0; } [1/100] { lastSender := 1; } + } + [0.8] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } +} diff --git a/examples/pgcl/crowds/crowds100-80-observeOther.pgcl b/examples/pgcl/crowds/crowds100-80-observeOther.pgcl new file mode 100644 index 000000000..62a412425 --- /dev/null +++ b/examples/pgcl/crowds/crowds100-80-observeOther.pgcl @@ -0,0 +1,36 @@ +function crowds() { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 80; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [0.091] { + { + // lastSender := unif(0, 24); + { lastSender:=0; } [1/100] { lastSender := 1; } + } + [0.8] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } + observe(observeOther > 20); +} diff --git a/examples/pgcl/crowds/crowds100-80.pgcl b/examples/pgcl/crowds/crowds100-80.pgcl new file mode 100644 index 000000000..f9fa42758 --- /dev/null +++ b/examples/pgcl/crowds/crowds100-80.pgcl @@ -0,0 +1,34 @@ +function crowds() { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 80; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [0.091] { + { + { lastSender:=0; } [1/100] { lastSender := 1; } + } + [0.8] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } +} diff --git a/examples/pgcl/crowds/crowds3-3-param.pgcl b/examples/pgcl/crowds/crowds3-3-param.pgcl new file mode 100644 index 000000000..8486d0a75 --- /dev/null +++ b/examples/pgcl/crowds/crowds3-3-param.pgcl @@ -0,0 +1,34 @@ +function crowds(double PF, double bad) { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 3; + int observeSender := 0; // in [0, TotalRuns] + int observeOther := 0; // in [0, TotalRuns] + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [bad] { + { + { lastSender:=0; } [1/3] { lastSender := 1; } + } + [PF] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } +} diff --git a/examples/pgcl/crowds/crowds3-3.pgcl b/examples/pgcl/crowds/crowds3-3.pgcl new file mode 100644 index 000000000..3106f70ca --- /dev/null +++ b/examples/pgcl/crowds/crowds3-3.pgcl @@ -0,0 +1,34 @@ +function crowds() { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 3; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [0.091] { + { + { lastSender:=0; } [1/3] { lastSender := 1; } + } + [0.8] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } +} diff --git a/examples/pgcl/crowds/crowds3-5-param.pgcl b/examples/pgcl/crowds/crowds3-5-param.pgcl new file mode 100644 index 000000000..177e73cf4 --- /dev/null +++ b/examples/pgcl/crowds/crowds3-5-param.pgcl @@ -0,0 +1,33 @@ +function crowds(double PF, double bad) { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 5; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [bad] { + { lastSender:=0; } [1/3] { lastSender := 1; } + } + [PF] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } +} diff --git a/examples/pgcl/crowds/crowds3-5.pgcl b/examples/pgcl/crowds/crowds3-5.pgcl new file mode 100644 index 000000000..f43bb6505 --- /dev/null +++ b/examples/pgcl/crowds/crowds3-5.pgcl @@ -0,0 +1,34 @@ +function crowds() { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 5; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [0.091] { + { + { lastSender:=0; } [1/3] { lastSender := 1; } + } + [0.8] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } +} diff --git a/examples/pgcl/crowds/crowds5-20-param.pgcl b/examples/pgcl/crowds/crowds5-20-param.pgcl new file mode 100644 index 000000000..121c29ace --- /dev/null +++ b/examples/pgcl/crowds/crowds5-20-param.pgcl @@ -0,0 +1,34 @@ +function crowds(double PF, double bad) { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 20; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [bad] { + { + { lastSender:=0; } [1/5] { lastSender := 1; } + } + [PF] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + // Set up new run. + delivered := 0; + remainingRuns := remainingRuns - 1; + } +} diff --git a/examples/pgcl/crowds/crowds5-20.pgcl b/examples/pgcl/crowds/crowds5-20.pgcl new file mode 100644 index 000000000..c27eae6ff --- /dev/null +++ b/examples/pgcl/crowds/crowds5-20.pgcl @@ -0,0 +1,34 @@ +function crowds() { + int delivered := 0; + int lastSender := 0; + int remainingRuns := 20; + int observeSender := 0; + int observeOther := 0; + + while(remainingRuns > 0) { + while(delivered = 0) { + { + if(lastSender = 0) { + observeSender := observeSender + 1; + } else { + observeOther := observeOther + 1; + } + lastSender := 0; + delivered := 1; + } [0.091] { + { + { lastSender:=0; } [1/5] { lastSender := 1; } + } + [0.8] + { + lastSender := 0; + // When not forwarding, the message is delivered here. + delivered := 1; + } + } + } + delivered := 0; + // Set up new run. + remainingRuns := remainingRuns - 1; + } +} diff --git a/examples/pgcl/herman/herman10-det.pgcl b/examples/pgcl/herman/herman10-det.pgcl new file mode 100644 index 000000000..5c38402aa --- /dev/null +++ b/examples/pgcl/herman/herman10-det.pgcl @@ -0,0 +1,108 @@ +function herman() { + int x1 := 0; + int x2 := 0; + int x3 := 0; + int x4 := 0; + int x5 := 0; + int x6 := 0; + int x7 := 0; + int x8 := 0; + int x9 := 0; + int x10 := 0; + int oldx1 := 0; + int oldx2 := 0; + int oldx3 := 0; + int oldx4 := 0; + int oldx5 := 0; + int oldx6 := 0; + int oldx7 := 0; + int oldx8 := 0; + int oldx9 := 0; + int oldx10 := 0; + + // determine starting token setup on the ring. + {x1 := 0;} [0.5] {x1 := 1;} + {x2 := 0;} [0.5] {x2 := 1;} + {x3 := 0;} [0.5] {x3 := 1;} + {x4 := 0;} [0.5] {x4 := 1;} + {x5 := 0;} [0.5] {x5 := 1;} + {x6 := 0;} [0.5] {x6 := 1;} + {x7 := 0;} [0.5] {x7 := 1;} + {x8 := 0;} [0.5] {x8 := 1;} + {x9 := 0;} [0.5] {x9 := 1;} + {x10 := 0;} [0.5] {x10 := 1;} + + // finds a ring configuration with exactly one token in the ring. + while((x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10) != 1) { + oldx1 := x1; + oldx2 := x2; + oldx3 := x3; + oldx4 := x4; + oldx5 := x5; + oldx6 := x6; + oldx7 := x7; + oldx8 := x8; + oldx9 := x9; + oldx10 := x10; + if(x1 = oldx10) { + {x1 := 0;} [0.5] {x1 := 1;} + } else { + x1 := oldx10; + } + oldx10 := 0; + if(x2 = oldx1) { + {x2 := 0;} [0.5] {x2 := 1;} + } else { + x2 := oldx1; + } + oldx1 := 0; + if(x3 = oldx2) { + {x3 := 0;} [0.5] {x3 := 1;} + } else { + x3 := oldx2; + } + oldx2 := 0; + if(x4 = oldx3) { + {x4 := 0;} [0.5] {x4 := 1;} + } else { + x4 := oldx3; + } + oldx3 := 0; + if(x5 = oldx4) { + {x5 := 0;} [0.5] {x5 := 1;} + } else { + x5 := oldx4; + } + oldx4 := 0; + if(x6 = oldx5) { + {x6 := 0;} [0.5] {x6 := 1;} + } else { + x6 := oldx5; + } + oldx5 := 0; + if(x7 = oldx6) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x7 := oldx6; + } + oldx6 := 0; + if(x8 = oldx7) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x8 := oldx7; + } + oldx7 := 0; + if(x9 = oldx8) { + {x9 := 0;} [0.5] {x9 := 1;} + } else { + x9 := oldx8; + } + oldx8 := 0; + if(x10 = oldx9) { + {x10 := 0;} [0.5] {x10 := 1;} + } else { + x10 := oldx9; + } + oldx9 := 0; + } +} diff --git a/examples/pgcl/herman/herman10.pgcl b/examples/pgcl/herman/herman10.pgcl new file mode 100644 index 000000000..a2bb9563e --- /dev/null +++ b/examples/pgcl/herman/herman10.pgcl @@ -0,0 +1,108 @@ +function herman() { + int x1 := 0; + int x2 := 0; + int x3 := 0; + int x4 := 0; + int x5 := 0; + int x6 := 0; + int x7 := 0; + int x8 := 0; + int x9 := 0; + int x10 := 0; + int oldx1 := 0; + int oldx2 := 0; + int oldx3 := 0; + int oldx4 := 0; + int oldx5 := 0; + int oldx6 := 0; + int oldx7 := 0; + int oldx8 := 0; + int oldx9 := 0; + int oldx10 := 0; + + // determine starting token setup on the ring. + {x1 := 0;} [] {x1 := 1;} + {x2 := 0;} [] {x2 := 1;} + {x3 := 0;} [] {x3 := 1;} + {x4 := 0;} [] {x4 := 1;} + {x5 := 0;} [] {x5 := 1;} + {x6 := 0;} [] {x6 := 1;} + {x7 := 0;} [] {x7 := 1;} + {x8 := 0;} [] {x8 := 1;} + {x9 := 0;} [] {x9 := 1;} + {x10 := 0;} [] {x10 := 1;} + + // finds a ring configuration with exactly one token in the ring. + while((x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10) != 1) { + oldx1 := x1; + oldx2 := x2; + oldx3 := x3; + oldx4 := x4; + oldx5 := x5; + oldx6 := x6; + oldx7 := x7; + oldx8 := x8; + oldx9 := x9; + oldx10 := x10; + if(x1 = oldx10) { + {x1 := 0;} [0.5] {x1 := 1;} + } else { + x1 := oldx10; + } + oldx10 := 0; + if(x2 = oldx1) { + {x2 := 0;} [0.5] {x2 := 1;} + } else { + x2 := oldx1; + } + oldx1 := 0; + if(x3 = oldx2) { + {x3 := 0;} [0.5] {x3 := 1;} + } else { + x3 := oldx2; + } + oldx2 := 0; + if(x4 = oldx3) { + {x4 := 0;} [0.5] {x4 := 1;} + } else { + x4 := oldx3; + } + oldx3 := 0; + if(x5 = oldx4) { + {x5 := 0;} [0.5] {x5 := 1;} + } else { + x5 := oldx4; + } + oldx4 := 0; + if(x6 = oldx5) { + {x6 := 0;} [0.5] {x6 := 1;} + } else { + x6 := oldx5; + } + oldx5 := 0; + if(x7 = oldx6) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x7 := oldx6; + } + oldx6 := 0; + if(x8 = oldx7) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x8 := oldx7; + } + oldx7 := 0; + if(x9 = oldx8) { + {x9 := 0;} [0.5] {x9 := 1;} + } else { + x9 := oldx8; + } + oldx8 := 0; + if(x10 = oldx9) { + {x10 := 0;} [0.5] {x10 := 1;} + } else { + x10 := oldx9; + } + oldx9 := 0; + } +} diff --git a/examples/pgcl/herman/herman13-det.pgcl b/examples/pgcl/herman/herman13-det.pgcl new file mode 100644 index 000000000..744c0361e --- /dev/null +++ b/examples/pgcl/herman/herman13-det.pgcl @@ -0,0 +1,138 @@ +function herman() { + int x1 := 0; + int x2 := 0; + int x3 := 0; + int x4 := 0; + int x5 := 0; + int x6 := 0; + int x7 := 0; + int x8 := 0; + int x9 := 0; + int x10 := 0; + int x11 := 0; + int x12 := 0; + int x13 := 0; + int oldx1 := 0; + int oldx2 := 0; + int oldx3 := 0; + int oldx4 := 0; + int oldx5 := 0; + int oldx6 := 0; + int oldx7 := 0; + int oldx8 := 0; + int oldx9 := 0; + int oldx10 := 0; + int oldx11 := 0; + int oldx12 := 0; + int oldx13 := 0; + + // determine starting token setup on the ring. + {x1 := 0;} [0.5] {x1 := 1;} + {x2 := 0;} [0.5] {x2 := 1;} + {x3 := 0;} [0.5] {x3 := 1;} + {x4 := 0;} [0.5] {x4 := 1;} + {x5 := 0;} [0.5] {x5 := 1;} + {x6 := 0;} [0.5] {x6 := 1;} + {x7 := 0;} [0.5] {x7 := 1;} + {x8 := 0;} [0.5] {x8 := 1;} + {x9 := 0;} [0.5] {x9 := 1;} + {x10 := 0;} [0.5] {x10 := 1;} + {x11 := 0;} [0.5] {x11 := 1;} + {x12 := 0;} [0.5] {x12 := 1;} + {x13 := 0;} [0.5] {x13 := 1;} + + // finds a ring configuration with exactly one token in the ring. + while((x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13) != 1) { + oldx1 := x1; + oldx2 := x2; + oldx3 := x3; + oldx4 := x4; + oldx5 := x5; + oldx6 := x6; + oldx7 := x7; + oldx8 := x8; + oldx9 := x9; + oldx10 := x10; + oldx11 := x11; + oldx12 := x12; + oldx13 := x13; + if(x1 = oldx13) { + {x1 := 0;} [0.5] {x1 := 1;} + } else { + x1 := oldx13; + } + oldx13 := 0; + if(x2 = oldx1) { + {x2 := 0;} [0.5] {x2 := 1;} + } else { + x2 := oldx1; + } + oldx1 := 0; + if(x3 = oldx2) { + {x3 := 0;} [0.5] {x3 := 1;} + } else { + x3 := oldx2; + } + oldx2 := 0; + if(x4 = oldx3) { + {x4 := 0;} [0.5] {x4 := 1;} + } else { + x4 := oldx3; + } + oldx3 := 0; + if(x5 = oldx4) { + {x5 := 0;} [0.5] {x5 := 1;} + } else { + x5 := oldx4; + } + oldx4 := 0; + if(x6 = oldx5) { + {x6 := 0;} [0.5] {x6 := 1;} + } else { + x6 := oldx5; + } + oldx5 := 0; + if(x7 = oldx6) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x7 := oldx6; + } + oldx6 := 0; + if(x8 = oldx7) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x8 := oldx7; + } + oldx7 := 0; + if(x9 = oldx8) { + {x9 := 0;} [0.5] {x9 := 1;} + } else { + x9 := oldx8; + } + oldx8 := 0; + if(x10 = oldx9) { + {x10 := 0;} [0.5] {x10 := 1;} + } else { + x10 := oldx9; + } + oldx9 := 0; + if(x11 = oldx10) { + {x11 := 0;} [0.5] {x11 := 1;} + } else { + x11 := oldx10; + } + oldx10 := 0; + if(x12 = oldx11) { + {x12 := 0;} [0.5] {x12 := 1;} + } else { + x12 := oldx11; + } + oldx11 := 0; + if(x13 = oldx12) { + {x13 := 0;} [0.5] {x13 := 1;} + } else { + x13 := oldx12; + } + oldx12 := 0; + } +} diff --git a/examples/pgcl/herman/herman13.pgcl b/examples/pgcl/herman/herman13.pgcl new file mode 100644 index 000000000..057cf9568 --- /dev/null +++ b/examples/pgcl/herman/herman13.pgcl @@ -0,0 +1,138 @@ +function herman() { + int x1 := 0; + int x2 := 0; + int x3 := 0; + int x4 := 0; + int x5 := 0; + int x6 := 0; + int x7 := 0; + int x8 := 0; + int x9 := 0; + int x10 := 0; + int x11 := 0; + int x12 := 0; + int x13 := 0; + int oldx1 := 0; + int oldx2 := 0; + int oldx3 := 0; + int oldx4 := 0; + int oldx5 := 0; + int oldx6 := 0; + int oldx7 := 0; + int oldx8 := 0; + int oldx9 := 0; + int oldx10 := 0; + int oldx11 := 0; + int oldx12 := 0; + int oldx13 := 0; + + // determine starting token setup on the ring. + {x1 := 0;} [] {x1 := 1;} + {x2 := 0;} [] {x2 := 1;} + {x3 := 0;} [] {x3 := 1;} + {x4 := 0;} [] {x4 := 1;} + {x5 := 0;} [] {x5 := 1;} + {x6 := 0;} [] {x6 := 1;} + {x7 := 0;} [] {x7 := 1;} + {x8 := 0;} [] {x8 := 1;} + {x9 := 0;} [] {x9 := 1;} + {x10 := 0;} [] {x10 := 1;} + {x11 := 0;} [] {x11 := 1;} + {x12 := 0;} [] {x12 := 1;} + {x13 := 0;} [] {x13 := 1;} + + // finds a ring configuration with exactly one token in the ring. + while((x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13) != 1) { + oldx1 := x1; + oldx2 := x2; + oldx3 := x3; + oldx4 := x4; + oldx5 := x5; + oldx6 := x6; + oldx7 := x7; + oldx8 := x8; + oldx9 := x9; + oldx10 := x10; + oldx11 := x11; + oldx12 := x12; + oldx13 := x13; + if(x1 = oldx13) { + {x1 := 0;} [0.5] {x1 := 1;} + } else { + x1 := oldx13; + } + oldx13 := 0; + if(x2 = oldx1) { + {x2 := 0;} [0.5] {x2 := 1;} + } else { + x2 := oldx1; + } + oldx1 := 0; + if(x3 = oldx2) { + {x3 := 0;} [0.5] {x3 := 1;} + } else { + x3 := oldx2; + } + oldx2 := 0; + if(x4 = oldx3) { + {x4 := 0;} [0.5] {x4 := 1;} + } else { + x4 := oldx3; + } + oldx3 := 0; + if(x5 = oldx4) { + {x5 := 0;} [0.5] {x5 := 1;} + } else { + x5 := oldx4; + } + oldx4 := 0; + if(x6 = oldx5) { + {x6 := 0;} [0.5] {x6 := 1;} + } else { + x6 := oldx5; + } + oldx5 := 0; + if(x7 = oldx6) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x7 := oldx6; + } + oldx6 := 0; + if(x8 = oldx7) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x8 := oldx7; + } + oldx7 := 0; + if(x9 = oldx8) { + {x9 := 0;} [0.5] {x9 := 1;} + } else { + x9 := oldx8; + } + oldx8 := 0; + if(x10 = oldx9) { + {x10 := 0;} [0.5] {x10 := 1;} + } else { + x10 := oldx9; + } + oldx9 := 0; + if(x11 = oldx10) { + {x11 := 0;} [0.5] {x11 := 1;} + } else { + x11 := oldx10; + } + oldx10 := 0; + if(x12 = oldx11) { + {x12 := 0;} [0.5] {x12 := 1;} + } else { + x12 := oldx11; + } + oldx11 := 0; + if(x13 = oldx12) { + {x13 := 0;} [0.5] {x13 := 1;} + } else { + x13 := oldx12; + } + oldx12 := 0; + } +} diff --git a/examples/pgcl/herman/herman17-det.pgcl b/examples/pgcl/herman/herman17-det.pgcl new file mode 100644 index 000000000..f572bf2a6 --- /dev/null +++ b/examples/pgcl/herman/herman17-det.pgcl @@ -0,0 +1,178 @@ +function herman() { + int x1 := 0; + int x2 := 0; + int x3 := 0; + int x4 := 0; + int x5 := 0; + int x6 := 0; + int x7 := 0; + int x8 := 0; + int x9 := 0; + int x10 := 0; + int x11 := 0; + int x12 := 0; + int x13 := 0; + int x14 := 0; + int x15 := 0; + int x16 := 0; + int x17 := 0; + int oldx1 := 0; + int oldx2 := 0; + int oldx3 := 0; + int oldx4 := 0; + int oldx5 := 0; + int oldx6 := 0; + int oldx7 := 0; + int oldx8 := 0; + int oldx9 := 0; + int oldx10 := 0; + int oldx11 := 0; + int oldx12 := 0; + int oldx13 := 0; + int oldx14 := 0; + int oldx15 := 0; + int oldx16 := 0; + int oldx17 := 0; + + // determine starting token setup on the ring. + {x1 := 0;} [0.5] {x1 := 1;} + {x2 := 0;} [0.5] {x2 := 1;} + {x3 := 0;} [0.5] {x3 := 1;} + {x4 := 0;} [0.5] {x4 := 1;} + {x5 := 0;} [0.5] {x5 := 1;} + {x6 := 0;} [0.5] {x6 := 1;} + {x7 := 0;} [0.5] {x7 := 1;} + {x8 := 0;} [0.5] {x8 := 1;} + {x9 := 0;} [0.5] {x9 := 1;} + {x10 := 0;} [0.5] {x10 := 1;} + {x11 := 0;} [0.5] {x11 := 1;} + {x12 := 0;} [0.5] {x12 := 1;} + {x13 := 0;} [0.5] {x13 := 1;} + {x14 := 0;} [0.5] {x14 := 1;} + {x15 := 0;} [0.5] {x15 := 1;} + {x16 := 0;} [0.5] {x16 := 1;} + {x17 := 0;} [0.5] {x17 := 1;} + + // finds a ring configuration with exactly one token in the ring. + while((x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17) != 1) { + oldx1 := x1; + oldx2 := x2; + oldx3 := x3; + oldx4 := x4; + oldx5 := x5; + oldx6 := x6; + oldx7 := x7; + oldx8 := x8; + oldx9 := x9; + oldx10 := x10; + oldx11 := x11; + oldx12 := x12; + oldx13 := x13; + oldx14 := x14; + oldx15 := x15; + oldx16 := x16; + oldx17 := x17; + if(x1 = oldx17) { + {x1 := 0;} [0.5] {x1 := 1;} + } else { + x1 := oldx17; + } + oldx17 := 0; + if(x2 = oldx1) { + {x2 := 0;} [0.5] {x2 := 1;} + } else { + x2 := oldx1; + } + oldx1 := 0; + if(x3 = oldx2) { + {x3 := 0;} [0.5] {x3 := 1;} + } else { + x3 := oldx2; + } + oldx2 := 0; + if(x4 = oldx3) { + {x4 := 0;} [0.5] {x4 := 1;} + } else { + x4 := oldx3; + } + oldx3 := 0; + if(x5 = oldx4) { + {x5 := 0;} [0.5] {x5 := 1;} + } else { + x5 := oldx4; + } + oldx4 := 0; + if(x6 = oldx5) { + {x6 := 0;} [0.5] {x6 := 1;} + } else { + x6 := oldx5; + } + oldx5 := 0; + if(x7 = oldx6) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x7 := oldx6; + } + oldx6 := 0; + if(x8 = oldx7) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x8 := oldx7; + } + oldx7 := 0; + if(x9 = oldx8) { + {x9 := 0;} [0.5] {x9 := 1;} + } else { + x9 := oldx8; + } + oldx8 := 0; + if(x10 = oldx9) { + {x10 := 0;} [0.5] {x10 := 1;} + } else { + x10 := oldx9; + } + oldx9 := 0; + if(x11 = oldx10) { + {x11 := 0;} [0.5] {x11 := 1;} + } else { + x11 := oldx10; + } + oldx10 := 0; + if(x12 = oldx11) { + {x12 := 0;} [0.5] {x12 := 1;} + } else { + x12 := oldx11; + } + oldx11 := 0; + if(x13 = oldx12) { + {x13 := 0;} [0.5] {x13 := 1;} + } else { + x13 := oldx12; + } + oldx12 := 0; + if(x14 = oldx13) { + {x14 := 0;} [0.5] {x14 := 1;} + } else { + x14 := oldx13; + } + oldx13 := 0; + if(x15 = oldx14) { + {x15 := 0;} [0.5] {x15 := 1;} + } else { + x15 := oldx14; + } + oldx14 := 0; + if(x16 = oldx15) { + {x16 := 0;} [0.5] {x16 := 1;} + } else { + x16 := oldx15; + } + oldx15 := 0; + if(x17 = oldx16) { + {x17 := 0;} [0.5] {x17 := 1;} + } else { + x17 := oldx16; + } + oldx16 := 0; + } +} diff --git a/examples/pgcl/herman/herman17.pgcl b/examples/pgcl/herman/herman17.pgcl new file mode 100644 index 000000000..b8cb86176 --- /dev/null +++ b/examples/pgcl/herman/herman17.pgcl @@ -0,0 +1,178 @@ +function herman() { + int x1 := 0; + int x2 := 0; + int x3 := 0; + int x4 := 0; + int x5 := 0; + int x6 := 0; + int x7 := 0; + int x8 := 0; + int x9 := 0; + int x10 := 0; + int x11 := 0; + int x12 := 0; + int x13 := 0; + int x14 := 0; + int x15 := 0; + int x16 := 0; + int x17 := 0; + int oldx1 := 0; + int oldx2 := 0; + int oldx3 := 0; + int oldx4 := 0; + int oldx5 := 0; + int oldx6 := 0; + int oldx7 := 0; + int oldx8 := 0; + int oldx9 := 0; + int oldx10 := 0; + int oldx11 := 0; + int oldx12 := 0; + int oldx13 := 0; + int oldx14 := 0; + int oldx15 := 0; + int oldx16 := 0; + int oldx17 := 0; + + // determine starting token setup on the ring. + {x1 := 0;} [] {x1 := 1;} + {x2 := 0;} [] {x2 := 1;} + {x3 := 0;} [] {x3 := 1;} + {x4 := 0;} [] {x4 := 1;} + {x5 := 0;} [] {x5 := 1;} + {x6 := 0;} [] {x6 := 1;} + {x7 := 0;} [] {x7 := 1;} + {x8 := 0;} [] {x8 := 1;} + {x9 := 0;} [] {x9 := 1;} + {x10 := 0;} [] {x10 := 1;} + {x11 := 0;} [] {x11 := 1;} + {x12 := 0;} [] {x12 := 1;} + {x13 := 0;} [] {x13 := 1;} + {x14 := 0;} [] {x14 := 1;} + {x15 := 0;} [] {x15 := 1;} + {x16 := 0;} [] {x16 := 1;} + {x17 := 0;} [] {x17 := 1;} + + // finds a ring configuration with exactly one token in the ring. + while((x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17) != 1) { + oldx1 := x1; + oldx2 := x2; + oldx3 := x3; + oldx4 := x4; + oldx5 := x5; + oldx6 := x6; + oldx7 := x7; + oldx8 := x8; + oldx9 := x9; + oldx10 := x10; + oldx11 := x11; + oldx12 := x12; + oldx13 := x13; + oldx14 := x14; + oldx15 := x15; + oldx16 := x16; + oldx17 := x17; + if(x1 = oldx17) { + {x1 := 0;} [0.5] {x1 := 1;} + } else { + x1 := oldx17; + } + oldx17 := 0; + if(x2 = oldx1) { + {x2 := 0;} [0.5] {x2 := 1;} + } else { + x2 := oldx1; + } + oldx1 := 0; + if(x3 = oldx2) { + {x3 := 0;} [0.5] {x3 := 1;} + } else { + x3 := oldx2; + } + oldx2 := 0; + if(x4 = oldx3) { + {x4 := 0;} [0.5] {x4 := 1;} + } else { + x4 := oldx3; + } + oldx3 := 0; + if(x5 = oldx4) { + {x5 := 0;} [0.5] {x5 := 1;} + } else { + x5 := oldx4; + } + oldx4 := 0; + if(x6 = oldx5) { + {x6 := 0;} [0.5] {x6 := 1;} + } else { + x6 := oldx5; + } + oldx5 := 0; + if(x7 = oldx6) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x7 := oldx6; + } + oldx6 := 0; + if(x8 = oldx7) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x8 := oldx7; + } + oldx7 := 0; + if(x9 = oldx8) { + {x9 := 0;} [0.5] {x9 := 1;} + } else { + x9 := oldx8; + } + oldx8 := 0; + if(x10 = oldx9) { + {x10 := 0;} [0.5] {x10 := 1;} + } else { + x10 := oldx9; + } + oldx9 := 0; + if(x11 = oldx10) { + {x11 := 0;} [0.5] {x11 := 1;} + } else { + x11 := oldx10; + } + oldx10 := 0; + if(x12 = oldx11) { + {x12 := 0;} [0.5] {x12 := 1;} + } else { + x12 := oldx11; + } + oldx11 := 0; + if(x13 = oldx12) { + {x13 := 0;} [0.5] {x13 := 1;} + } else { + x13 := oldx12; + } + oldx12 := 0; + if(x14 = oldx13) { + {x14 := 0;} [0.5] {x14 := 1;} + } else { + x14 := oldx13; + } + oldx13 := 0; + if(x15 = oldx14) { + {x15 := 0;} [0.5] {x15 := 1;} + } else { + x15 := oldx14; + } + oldx14 := 0; + if(x16 = oldx15) { + {x16 := 0;} [0.5] {x16 := 1;} + } else { + x16 := oldx15; + } + oldx15 := 0; + if(x17 = oldx16) { + {x17 := 0;} [0.5] {x17 := 1;} + } else { + x17 := oldx16; + } + oldx16 := 0; + } +} diff --git a/examples/pgcl/herman/herman21-det.pgcl b/examples/pgcl/herman/herman21-det.pgcl new file mode 100644 index 000000000..a59482d9e --- /dev/null +++ b/examples/pgcl/herman/herman21-det.pgcl @@ -0,0 +1,218 @@ +function herman() { + int x1 := 0; + int x2 := 0; + int x3 := 0; + int x4 := 0; + int x5 := 0; + int x6 := 0; + int x7 := 0; + int x8 := 0; + int x9 := 0; + int x10 := 0; + int x11 := 0; + int x12 := 0; + int x13 := 0; + int x14 := 0; + int x15 := 0; + int x16 := 0; + int x17 := 0; + int x18 := 0; + int x19 := 0; + int x20 := 0; + int x21 := 0; + int oldx1 := 0; + int oldx2 := 0; + int oldx3 := 0; + int oldx4 := 0; + int oldx5 := 0; + int oldx6 := 0; + int oldx7 := 0; + int oldx8 := 0; + int oldx9 := 0; + int oldx10 := 0; + int oldx11 := 0; + int oldx12 := 0; + int oldx13 := 0; + int oldx14 := 0; + int oldx15 := 0; + int oldx16 := 0; + int oldx17 := 0; + int oldx18 := 0; + int oldx19 := 0; + int oldx20 := 0; + int oldx21 := 0; + + // determine starting token setup on the ring. + {x1 := 0;} [0.5] {x1 := 1;} + {x2 := 0;} [0.5] {x2 := 1;} + {x3 := 0;} [0.5] {x3 := 1;} + {x4 := 0;} [0.5] {x4 := 1;} + {x5 := 0;} [0.5] {x5 := 1;} + {x6 := 0;} [0.5] {x6 := 1;} + {x7 := 0;} [0.5] {x7 := 1;} + {x8 := 0;} [0.5] {x8 := 1;} + {x9 := 0;} [0.5] {x9 := 1;} + {x10 := 0;} [0.5] {x10 := 1;} + {x11 := 0;} [0.5] {x11 := 1;} + {x12 := 0;} [0.5] {x12 := 1;} + {x13 := 0;} [0.5] {x13 := 1;} + {x14 := 0;} [0.5] {x14 := 1;} + {x15 := 0;} [0.5] {x15 := 1;} + {x16 := 0;} [0.5] {x16 := 1;} + {x17 := 0;} [0.5] {x17 := 1;} + {x18 := 0;} [0.5] {x18 := 1;} + {x19 := 0;} [0.5] {x19 := 1;} + {x20 := 0;} [0.5] {x20 := 1;} + {x21 := 0;} [0.5] {x21 := 1;} + + // finds a ring configuration with exactly one token in the ring. + while((x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21) != 1) { + oldx1 := x1; + oldx2 := x2; + oldx3 := x3; + oldx4 := x4; + oldx5 := x5; + oldx6 := x6; + oldx7 := x7; + oldx8 := x8; + oldx9 := x9; + oldx10 := x10; + oldx11 := x11; + oldx12 := x12; + oldx13 := x13; + oldx14 := x14; + oldx15 := x15; + oldx16 := x16; + oldx17 := x17; + oldx18 := x18; + oldx19 := x19; + oldx20 := x20; + oldx21 := x21; + if(x1 = oldx21) { + {x1 := 0;} [0.5] {x1 := 1;} + } else { + x1 := oldx21; + } + oldx21 := 0; + if(x2 = oldx1) { + {x2 := 0;} [0.5] {x2 := 1;} + } else { + x2 := oldx1; + } + oldx1 := 0; + if(x3 = oldx2) { + {x3 := 0;} [0.5] {x3 := 1;} + } else { + x3 := oldx2; + } + oldx2 := 0; + if(x4 = oldx3) { + {x4 := 0;} [0.5] {x4 := 1;} + } else { + x4 := oldx3; + } + oldx3 := 0; + if(x5 = oldx4) { + {x5 := 0;} [0.5] {x5 := 1;} + } else { + x5 := oldx4; + } + oldx4 := 0; + if(x6 = oldx5) { + {x6 := 0;} [0.5] {x6 := 1;} + } else { + x6 := oldx5; + } + oldx5 := 0; + if(x7 = oldx6) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x7 := oldx6; + } + oldx6 := 0; + if(x8 = oldx7) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x8 := oldx7; + } + oldx7 := 0; + if(x9 = oldx8) { + {x9 := 0;} [0.5] {x9 := 1;} + } else { + x9 := oldx8; + } + oldx8 := 0; + if(x10 = oldx9) { + {x10 := 0;} [0.5] {x10 := 1;} + } else { + x10 := oldx9; + } + oldx9 := 0; + if(x11 = oldx10) { + {x11 := 0;} [0.5] {x11 := 1;} + } else { + x11 := oldx10; + } + oldx10 := 0; + if(x12 = oldx11) { + {x12 := 0;} [0.5] {x12 := 1;} + } else { + x12 := oldx11; + } + oldx11 := 0; + if(x13 = oldx12) { + {x13 := 0;} [0.5] {x13 := 1;} + } else { + x13 := oldx12; + } + oldx12 := 0; + if(x14 = oldx13) { + {x14 := 0;} [0.5] {x14 := 1;} + } else { + x14 := oldx13; + } + oldx13 := 0; + if(x15 = oldx14) { + {x15 := 0;} [0.5] {x15 := 1;} + } else { + x15 := oldx14; + } + oldx14 := 0; + if(x16 = oldx15) { + {x16 := 0;} [0.5] {x16 := 1;} + } else { + x16 := oldx15; + } + oldx15 := 0; + if(x17 = oldx16) { + {x17 := 0;} [0.5] {x17 := 1;} + } else { + x17 := oldx16; + } + oldx16 := 0; + if(x18 = oldx17) { + {x18 := 0;} [0.5] {x18 := 1;} + } else { + x18 := oldx17; + } + oldx17 := 0; + if(x19 = oldx18) { + {x19 := 0;} [0.5] {x19 := 1;} + } else { + x19 := oldx18; + } + oldx18 := 0; + if(x20 = oldx19) { + {x20 := 0;} [0.5] {x20 := 1;} + } else { + x20 := oldx19; + } + oldx19 := 0; + if(x21 = oldx20) { + {x21 := 0;} [0.5] {x21 := 1;} + } else { + x21 := oldx20; + } + oldx20 := 0; + } +} diff --git a/examples/pgcl/herman/herman21.pgcl b/examples/pgcl/herman/herman21.pgcl new file mode 100644 index 000000000..ccc00ca3f --- /dev/null +++ b/examples/pgcl/herman/herman21.pgcl @@ -0,0 +1,218 @@ +function herman() { + int x1 := 0; + int x2 := 0; + int x3 := 0; + int x4 := 0; + int x5 := 0; + int x6 := 0; + int x7 := 0; + int x8 := 0; + int x9 := 0; + int x10 := 0; + int x11 := 0; + int x12 := 0; + int x13 := 0; + int x14 := 0; + int x15 := 0; + int x16 := 0; + int x17 := 0; + int x18 := 0; + int x19 := 0; + int x20 := 0; + int x21 := 0; + int oldx1 := 0; + int oldx2 := 0; + int oldx3 := 0; + int oldx4 := 0; + int oldx5 := 0; + int oldx6 := 0; + int oldx7 := 0; + int oldx8 := 0; + int oldx9 := 0; + int oldx10 := 0; + int oldx11 := 0; + int oldx12 := 0; + int oldx13 := 0; + int oldx14 := 0; + int oldx15 := 0; + int oldx16 := 0; + int oldx17 := 0; + int oldx18 := 0; + int oldx19 := 0; + int oldx20 := 0; + int oldx21 := 0; + + // determine starting token setup on the ring. + {x1 := 0;} [] {x1 := 1;} + {x2 := 0;} [] {x2 := 1;} + {x3 := 0;} [] {x3 := 1;} + {x4 := 0;} [] {x4 := 1;} + {x5 := 0;} [] {x5 := 1;} + {x6 := 0;} [] {x6 := 1;} + {x7 := 0;} [] {x7 := 1;} + {x8 := 0;} [] {x8 := 1;} + {x9 := 0;} [] {x9 := 1;} + {x10 := 0;} [] {x10 := 1;} + {x11 := 0;} [] {x11 := 1;} + {x12 := 0;} [] {x12 := 1;} + {x13 := 0;} [] {x13 := 1;} + {x14 := 0;} [] {x14 := 1;} + {x15 := 0;} [] {x15 := 1;} + {x16 := 0;} [] {x16 := 1;} + {x17 := 0;} [] {x17 := 1;} + {x18 := 0;} [] {x18 := 1;} + {x19 := 0;} [] {x19 := 1;} + {x20 := 0;} [] {x20 := 1;} + {x21 := 0;} [] {x21 := 1;} + + // finds a ring configuration with exactly one token in the ring. + while((x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21) != 1) { + oldx1 := x1; + oldx2 := x2; + oldx3 := x3; + oldx4 := x4; + oldx5 := x5; + oldx6 := x6; + oldx7 := x7; + oldx8 := x8; + oldx9 := x9; + oldx10 := x10; + oldx11 := x11; + oldx12 := x12; + oldx13 := x13; + oldx14 := x14; + oldx15 := x15; + oldx16 := x16; + oldx17 := x17; + oldx18 := x18; + oldx19 := x19; + oldx20 := x20; + oldx21 := x21; + if(x1 = oldx21) { + {x1 := 0;} [0.5] {x1 := 1;} + } else { + x1 := oldx21; + } + oldx21 := 0; + if(x2 = oldx1) { + {x2 := 0;} [0.5] {x2 := 1;} + } else { + x2 := oldx1; + } + oldx1 := 0; + if(x3 = oldx2) { + {x3 := 0;} [0.5] {x3 := 1;} + } else { + x3 := oldx2; + } + oldx2 := 0; + if(x4 = oldx3) { + {x4 := 0;} [0.5] {x4 := 1;} + } else { + x4 := oldx3; + } + oldx3 := 0; + if(x5 = oldx4) { + {x5 := 0;} [0.5] {x5 := 1;} + } else { + x5 := oldx4; + } + oldx4 := 0; + if(x6 = oldx5) { + {x6 := 0;} [0.5] {x6 := 1;} + } else { + x6 := oldx5; + } + oldx5 := 0; + if(x7 = oldx6) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x7 := oldx6; + } + oldx6 := 0; + if(x8 = oldx7) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x8 := oldx7; + } + oldx7 := 0; + if(x9 = oldx8) { + {x9 := 0;} [0.5] {x9 := 1;} + } else { + x9 := oldx8; + } + oldx8 := 0; + if(x10 = oldx9) { + {x10 := 0;} [0.5] {x10 := 1;} + } else { + x10 := oldx9; + } + oldx9 := 0; + if(x11 = oldx10) { + {x11 := 0;} [0.5] {x11 := 1;} + } else { + x11 := oldx10; + } + oldx10 := 0; + if(x12 = oldx11) { + {x12 := 0;} [0.5] {x12 := 1;} + } else { + x12 := oldx11; + } + oldx11 := 0; + if(x13 = oldx12) { + {x13 := 0;} [0.5] {x13 := 1;} + } else { + x13 := oldx12; + } + oldx12 := 0; + if(x14 = oldx13) { + {x14 := 0;} [0.5] {x14 := 1;} + } else { + x14 := oldx13; + } + oldx13 := 0; + if(x15 = oldx14) { + {x15 := 0;} [0.5] {x15 := 1;} + } else { + x15 := oldx14; + } + oldx14 := 0; + if(x16 = oldx15) { + {x16 := 0;} [0.5] {x16 := 1;} + } else { + x16 := oldx15; + } + oldx15 := 0; + if(x17 = oldx16) { + {x17 := 0;} [0.5] {x17 := 1;} + } else { + x17 := oldx16; + } + oldx16 := 0; + if(x18 = oldx17) { + {x18 := 0;} [0.5] {x18 := 1;} + } else { + x18 := oldx17; + } + oldx17 := 0; + if(x19 = oldx18) { + {x19 := 0;} [0.5] {x19 := 1;} + } else { + x19 := oldx18; + } + oldx18 := 0; + if(x20 = oldx19) { + {x20 := 0;} [0.5] {x20 := 1;} + } else { + x20 := oldx19; + } + oldx19 := 0; + if(x21 = oldx19) { + {x21 := 0;} [0.5] {x21 := 1;} + } else { + x21 := oldx20; + } + oldx20 := 0; + } +} diff --git a/examples/pgcl/herman/herman7-det.pgcl b/examples/pgcl/herman/herman7-det.pgcl new file mode 100644 index 000000000..4374e28b0 --- /dev/null +++ b/examples/pgcl/herman/herman7-det.pgcl @@ -0,0 +1,77 @@ +function herman() { + int x1 := 0; + int x2 := 0; + int x3 := 0; + int x4 := 0; + int x5 := 0; + int x6 := 0; + int x7 := 0; + int oldx1 := 0; + int oldx2 := 0; + int oldx3 := 0; + int oldx4 := 0; + int oldx5 := 0; + int oldx6 := 0; + int oldx7 := 0; + + {x1 := 0;} [0.5] {x1 := 1;} + {x2 := 0;} [0.5] {x2 := 1;} + {x3 := 0;} [0.5] {x3 := 1;} + {x4 := 0;} [0.5] {x4 := 1;} + {x5 := 0;} [0.5] {x5 := 1;} + {x6 := 0;} [0.5] {x6 := 1;} + {x7 := 0;} [0.5] {x7 := 1;} + + // finds a ring configuration with exactly one token in the ring. + while((x1 + x2 + x3 + x4 + x5 + x6 + x7) != 1) { + oldx1 := x1; + oldx2 := x2; + oldx3 := x3; + oldx4 := x4; + oldx5 := x5; + oldx6 := x6; + oldx7 := x7; + if(x1 = oldx7) { + {x1 := 0;} [0.5] {x1 := 1;} + } else { + x1 := oldx7; + } + oldx7 := 0; + if(x2 = oldx1) { + {x2 := 0;} [0.5] {x2 := 1;} + } else { + x2 := oldx1; + } + oldx1 := 0; + if(x3 = oldx2) { + {x3 := 0;} [0.5] {x3 := 1;} + } else { + x3 := oldx2; + } + oldx2 := 0; + if(x4 = oldx3) { + {x4 := 0;} [0.5] {x4 := 1;} + } else { + x4 := oldx3; + } + oldx3 := 0; + if(x5 = oldx4) { + {x5 := 0;} [0.5] {x5 := 1;} + } else { + x5 := oldx4; + } + oldx4 := 0; + if(x6 = oldx5) { + {x6 := 0;} [0.5] {x6 := 1;} + } else { + x6 := oldx5; + } + oldx5 := 0; + if(x7 = oldx6) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x7 := oldx6; + } + oldx6 := 0; + } +} diff --git a/examples/pgcl/herman/herman7.pgcl b/examples/pgcl/herman/herman7.pgcl new file mode 100644 index 000000000..aca00ece3 --- /dev/null +++ b/examples/pgcl/herman/herman7.pgcl @@ -0,0 +1,77 @@ +function herman() { + int x1 := 0; + int x2 := 0; + int x3 := 0; + int x4 := 0; + int x5 := 0; + int x6 := 0; + int x7 := 0; + int oldx1 := 0; + int oldx2 := 0; + int oldx3 := 0; + int oldx4 := 0; + int oldx5 := 0; + int oldx6 := 0; + int oldx7 := 0; + + {x1 := 0;} [] {x1 := 1;} + {x2 := 0;} [] {x2 := 1;} + {x3 := 0;} [] {x3 := 1;} + {x4 := 0;} [] {x4 := 1;} + {x5 := 0;} [] {x5 := 1;} + {x6 := 0;} [] {x6 := 1;} + {x7 := 0;} [] {x7 := 1;} + + // finds a ring configuration with exactly one token in the ring. + while((x1 + x2 + x3 + x4 + x5 + x6 + x7) != 1) { + oldx1 := x1; + oldx2 := x2; + oldx3 := x3; + oldx4 := x4; + oldx5 := x5; + oldx6 := x6; + oldx7 := x7; + if(x1 = oldx7) { + {x1 := 0;} [0.5] {x1 := 1;} + } else { + x1 := oldx7; + } + oldx7 := 0; + if(x2 = oldx1) { + {x2 := 0;} [0.5] {x2 := 1;} + } else { + x2 := oldx1; + } + oldx1 := 0; + if(x3 = oldx2) { + {x3 := 0;} [0.5] {x3 := 1;} + } else { + x3 := oldx2; + } + oldx2 := 0; + if(x4 = oldx3) { + {x4 := 0;} [0.5] {x4 := 1;} + } else { + x4 := oldx3; + } + oldx3 := 0; + if(x5 = oldx4) { + {x5 := 0;} [0.5] {x5 := 1;} + } else { + x5 := oldx4; + } + oldx4 := 0; + if(x6 = oldx5) { + {x6 := 0;} [0.5] {x6 := 1;} + } else { + x6 := oldx5; + } + oldx5 := 0; + if(x7 = oldx6) { + {x7 := 0;} [0.5] {x7 := 1;} + } else { + x7 := oldx6; + } + oldx6 := 0; + } +} diff --git a/examples/pgcl/lotkavolterra.pgcl b/examples/pgcl/lotkavolterra.pgcl new file mode 100644 index 000000000..0397f0cac --- /dev/null +++ b/examples/pgcl/lotkavolterra.pgcl @@ -0,0 +1,49 @@ +function lotkavolterra() { + + int goats := 100; + int tigers := 4; + int dwellTime := 0; + int curTime := 0; + int b := 0; + + while(tigers > 0 & goats > 0) { + + dwellTime := 0; + b := 1; + + if(goats > 0 & tigers > 0) { + + // geometric distribution with p = 0.5 + while (b >= 1) { + {b := 1;} [0.5] {b := 0;} + dwellTime := dwellTime + 1; + } + curTime := curTime + dwellTime; + {tigers := tigers + 1;} [0.2] {{goats := goats - 1;} [0.1] {tigers := tigers - 1;}} + + } else { if(goats > 0) { + + // geometric distribution with p = 0.5 + while (b >= 1) { + {b := 1;} [0.5] {b := 0;} + dwellTime := dwellTime + 1; + } + curTime := curTime + dwellTime; + goats := goats + 1; + + } else { if(tigers > 0) { + + // geometric distribution with p = 0.5 + while (b >= 1) { + {b := 1;} [0.5] {b := 0;} + dwellTime := dwellTime + 1; + } + curTime := curTime + dwellTime; + tigers := tigers - 1; + + } } } + + } + +} + diff --git a/examples/pgcl/robot.pgcl b/examples/pgcl/robot.pgcl new file mode 100644 index 000000000..ad320ccac --- /dev/null +++ b/examples/pgcl/robot.pgcl @@ -0,0 +1,26 @@ +function robotOnGrid() { + + // robot starts in the lower left corner + int robotX := 1; int robotY := 20; + + // janitor starts in the grid middle + int janitorX := ceil(20 / 2); int janitorY := ceil(20 / 2); + + // iterates as long as the robot is not in the upper right corner + while(!(robotX = 20 & robotY = 1)) { + + // robot perfoms one step at max each iteration + // checks whether we can go to the right and the janitor is not there + if(robotX < 20 & !((janitorX = robotX + 1) & (janitorY = robotY))) { + robotX := robotX + 1; + } + // checks whether we can go up and the janitor is not there + if(robotX = 20 & !((janitorX = robotX) & (janitorY = robotY - 1))) { + robotY := robotY - 1; + } + + // moves the janitor randomly in one direction, not limited by any borders + {janitorX := janitorX + 1;}[0.25]{{janitorX := janitorX - 1;}[1/3]{{janitorY := janitorY + 1;}[0.375]{janitorY := janitorY - 1;}}} + + } +} diff --git a/examples/pmdp/brp/brp.pm b/examples/pmdp/brp/brp.pm index 2722cb0ee..0d76e95aa 100644 --- a/examples/pmdp/brp/brp.pm +++ b/examples/pmdp/brp/brp.pm @@ -136,4 +136,6 @@ module channelL endmodule +label "error" = s=5; +label "fatal" = s=5 & T; diff --git a/examples/pmdp/coin2/coin2.pm b/examples/pmdp/coin2/coin2.pm index 8baa365f4..79a25b870 100644 --- a/examples/pmdp/coin2/coin2.pm +++ b/examples/pmdp/coin2/coin2.pm @@ -47,7 +47,10 @@ endmodule module process2 = process1[pc1=pc2,coin1=coin2,p1=p2] endmodule label "finished" = pc1=3 &pc2=3 ; -label "all_coins_equal_1" = coin1=1 &coin2=1 ; +label "all_coins_equal_0" = coin1=0 & coin2=0; +label "all_coins_equal_1" = coin1=1 & coin2=1; +label "agree" = coin1 = coin2; + rewards "steps" true : 1; endrewards diff --git a/examples/pmdp/coin4/coin4.pm b/examples/pmdp/coin4/coin4.pm index bdb4bd877..d3648919f 100644 --- a/examples/pmdp/coin4/coin4.pm +++ b/examples/pmdp/coin4/coin4.pm @@ -53,6 +53,9 @@ module process4 = process1[pc1=pc4,coin1=coin4,p1=p4] endmodule label "finished" = pc1=3 &pc2=3 &pc3=3 &pc4=3; label "all_coins_equal_1" = coin1=1 &coin2=1 &coin3=1 &coin4=1 ; +label "all_coins_equal_0" = coin1=0 & coin2=0 & coin3 = 0 & coin4 = 0; +label "agree" = coin1=coin2 & coin2=coin3 & coin3 = coin4; + rewards "steps" true : 1; endrewards diff --git a/examples/pmdp/zeroconf/zeroconf.pm b/examples/pmdp/zeroconf/zeroconf.pm index 9c71181f2..682db33d4 100644 --- a/examples/pmdp/zeroconf/zeroconf.pm +++ b/examples/pmdp/zeroconf/zeroconf.pm @@ -256,3 +256,14 @@ module host0 [] l=4 -> 1 : true; endmodule + +// reward structure +const double err; // cost associated with using a IP address already in use + +rewards + [time] true : 1; + [send] l=3 & mess=0 & y=CONSEC & probes=1 & ip=1 : err; +endrewards + +label "selected_ip" = l = 4; +label "selected_ip_in_use" = l = 4 & ip = 1; diff --git a/resources/3rdparty/CMakeLists.txt b/resources/3rdparty/CMakeLists.txt index e8aa54e2d..57d36770f 100644 --- a/resources/3rdparty/CMakeLists.txt +++ b/resources/3rdparty/CMakeLists.txt @@ -329,9 +329,9 @@ add_dependencies(resources sylvan) if(${OPERATING_SYSTEM} MATCHES "Linux") find_package(Hwloc QUIET REQUIRED) - if(Hwloc_FOUND) - message(STATUS "StoRM - Linking with hwloc ${Hwloc_VERSION}") - list(APPEND STORM_LINK_LIBRARIES ${Hwloc_LIBRARIES}) + if(HWLOC_FOUND) + message(STATUS "StoRM - Linking with hwloc ${HWLOC_VERSION}") + list(APPEND STORM_LINK_LIBRARIES ${HWLOC_LIBRARIES}) else() message(FATAL_ERROR "HWLOC is required but was not found.") endif() diff --git a/resources/3rdparty/include_xerces.cmake b/resources/3rdparty/include_xerces.cmake index 73f559cec..a90d11379 100644 --- a/resources/3rdparty/include_xerces.cmake +++ b/resources/3rdparty/include_xerces.cmake @@ -19,8 +19,11 @@ if(USE_XERCES) set(XERCES_ROOT ${STORM_3RDPARTY_BINARY_DIR}/xercesc-3.1.2) set(XERCESC_INCLUDE ${XERCES_ROOT}/include) set(XERCES_LIBRARY_PATH ${XERCES_ROOT}/lib) - set(XERCESC_LIBRARIES ${XERCES_LIBRARY_PATH}/libxerces-c.a) - + if(BUILD_STATIC) + set(XERCESC_LIBRARIES ${XERCES_LIBRARY_PATH}/libxerces-c.a) + else() + set(XERCESC_LIBRARIES ${XERCES_LIBRARY_PATH}/libxerces-c${DYNAMIC_EXT}) + endif() add_dependencies(resources xercesc) endif() @@ -33,4 +36,6 @@ if(USE_XERCES) endif() find_package(CURL) list(APPEND STORM_LINK_LIBRARIES ${XERCESC_LIBRARIES} ${COREFOUNDATION_LIBRARY} ${CORESERVICES_LIBRARY} ${CURL_LIBRARIES}) +else() + message (WARNING "StoRM - Building without Xerces disables parsing XML formats (for GSPNs)") endif(USE_XERCES) diff --git a/resources/3rdparty/modernjson/CMakeLists.txt b/resources/3rdparty/modernjson/CMakeLists.txt index 18e9c651f..2c2612a7c 100755 --- a/resources/3rdparty/modernjson/CMakeLists.txt +++ b/resources/3rdparty/modernjson/CMakeLists.txt @@ -1,7 +1,9 @@ cmake_minimum_required(VERSION 3.0) # define the project -project(nlohmann_json VERSION 2.0.0 LANGUAGES CXX) +project(nlohmann_json VERSION 2.0.5 LANGUAGES CXX) + +enable_testing() option(BuildTests "Build the unit tests" ON) diff --git a/resources/3rdparty/modernjson/ChangeLog.md b/resources/3rdparty/modernjson/ChangeLog.md index f0654ea28..041d38395 100755 --- a/resources/3rdparty/modernjson/ChangeLog.md +++ b/resources/3rdparty/modernjson/ChangeLog.md @@ -1,10 +1,54 @@ # Change Log All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## [Unreleased](https://github.com/nlohmann/json/tree/HEAD) +## [v2.0.5](https://github.com/nlohmann/json/releases/tag/v2.0.5) (2016-09-14) +[Full Changelog](https://github.com/nlohmann/json/compare/v2.0.4...v2.0.5) -[Full Changelog](https://github.com/nlohmann/json/compare/v1.1.0...HEAD) +- make json\_benchmarks no longer working in 2.0.4 [\#310](https://github.com/nlohmann/json/issues/310) +- \[feature request\]: schema validator and comments [\#311](https://github.com/nlohmann/json/issues/311) + +## [v2.0.4](https://github.com/nlohmann/json/releases/tag/v2.0.4) (2016-09-11) +[Full Changelog](https://github.com/nlohmann/json/compare/v2.0.3...v2.0.4) + +- Parsing fails without space at end of file [\#306](https://github.com/nlohmann/json/issues/306) + +- Unused variable warning [\#304](https://github.com/nlohmann/json/issues/304) + +## [v2.0.3](https://github.com/nlohmann/json/releases/tag/v2.0.3) (2016-08-31) +[Full Changelog](https://github.com/nlohmann/json/compare/v2.0.2...v2.0.3) + +- Support for iterator-range parsing [\#290](https://github.com/nlohmann/json/issues/290) + +- warning C4706: assignment within conditional expression [\#295](https://github.com/nlohmann/json/issues/295) +- Horribly inconsistent behavior between const/non-const reference in operator \[\] \(\) [\#289](https://github.com/nlohmann/json/issues/289) + +- unit-constructor1.cpp: Fix floating point truncation warning [\#300](https://github.com/nlohmann/json/pull/300) ([t-b](https://github.com/t-b)) + +## [v2.0.2](https://github.com/nlohmann/json/releases/tag/v2.0.2) (2016-07-31) +[Full Changelog](https://github.com/nlohmann/json/compare/v2.0.1...v2.0.2) + +- value\(\) does not work with \_json\_pointer types [\#283](https://github.com/nlohmann/json/issues/283) +- Easy serialization of classes [\#280](https://github.com/nlohmann/json/issues/280) + +- Build error for std::int64 [\#282](https://github.com/nlohmann/json/issues/282) + +- hexify\(\) function emits conversion warning [\#270](https://github.com/nlohmann/json/issues/270) + +- let the makefile choose the correct sed [\#279](https://github.com/nlohmann/json/pull/279) ([murinicanor](https://github.com/murinicanor)) +- Update hexify to use array lookup instead of ternary \(\#270\) [\#275](https://github.com/nlohmann/json/pull/275) ([dtoma](https://github.com/dtoma)) + +## [v2.0.1](https://github.com/nlohmann/json/releases/tag/v2.0.1) (2016-06-28) +[Full Changelog](https://github.com/nlohmann/json/compare/v2.0.0...v2.0.1) + +- dump\(\) performance degradation in v2 [\#272](https://github.com/nlohmann/json/issues/272) + +- fixed a tiny typo [\#271](https://github.com/nlohmann/json/pull/271) ([thelostt](https://github.com/thelostt)) + +## [v2.0.0](https://github.com/nlohmann/json/releases/tag/v2.0.0) (2016-06-23) +[Full Changelog](https://github.com/nlohmann/json/compare/v1.1.0...v2.0.0) + +- concatenate objects [\#252](https://github.com/nlohmann/json/issues/252) - Unit test fails when doing a CMake out-of-tree build [\#241](https://github.com/nlohmann/json/issues/241) - Additional integration options [\#237](https://github.com/nlohmann/json/issues/237) - Can't use basic\_json::iterator as a base iterator for std::move\_iterator [\#233](https://github.com/nlohmann/json/issues/233) @@ -14,8 +58,12 @@ All notable changes to this project will be documented in this file. This projec - Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([mykter](https://github.com/mykter)) - Issue \#178 - Extending support to full uint64\_t/int64\_t range and unsigned type \(updated\) [\#193](https://github.com/nlohmann/json/pull/193) ([twelsby](https://github.com/twelsby)) +- json::diff generates incorrect patch when removing multiple array elements. [\#269](https://github.com/nlohmann/json/issues/269) +- -Wconversion warning [\#259](https://github.com/nlohmann/json/issues/259) +- Maybe a bug [\#258](https://github.com/nlohmann/json/issues/258) - -Wconversion warnings [\#239](https://github.com/nlohmann/json/issues/239) - ambiguous overload for 'push\_back' and 'operator+=' [\#235](https://github.com/nlohmann/json/issues/235) +- Incorrect dumping of parsed numbers with exponents, but without decimal places [\#230](https://github.com/nlohmann/json/issues/230) - double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) - Move semantics with std::initializer\_list [\#225](https://github.com/nlohmann/json/issues/225) - abort during getline in yyfill [\#223](https://github.com/nlohmann/json/issues/223) @@ -26,11 +74,18 @@ All notable changes to this project will be documented in this file. This projec - Floating point exceptions [\#181](https://github.com/nlohmann/json/issues/181) - In basic\_json::basic\_json\(const CompatibleArrayType& val\), the requirement of CompatibleArrayType is not strict enough. [\#174](https://github.com/nlohmann/json/issues/174) - Implicit assignment to std::string fails [\#144](https://github.com/nlohmann/json/issues/144) +- Fix Issue \#265 [\#266](https://github.com/nlohmann/json/pull/266) ([06needhamt](https://github.com/06needhamt)) - Issue \#195 - update Travis to Trusty due to gcc/clang strtod\(\) bug [\#196](https://github.com/nlohmann/json/pull/196) ([twelsby](https://github.com/twelsby)) +- Compiler Errors With JSON.hpp [\#265](https://github.com/nlohmann/json/issues/265) +- VS2015 compile fail [\#260](https://github.com/nlohmann/json/issues/260) +- Error when using json in g++ [\#254](https://github.com/nlohmann/json/issues/254) +- Update long-term goals [\#246](https://github.com/nlohmann/json/issues/246) +- Error compile Android NDK error: 'strtof' is not a member of 'std' [\#219](https://github.com/nlohmann/json/issues/219) - Conflicting typedef of ssize\_t on Windows 32 bit when using Boost.Python [\#204](https://github.com/nlohmann/json/issues/204) - Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) +- Define CMake/CTest tests [\#247](https://github.com/nlohmann/json/pull/247) ([robertmrk](https://github.com/robertmrk)) - Out of tree builds and a few other miscellaneous CMake cleanups. [\#242](https://github.com/nlohmann/json/pull/242) ([ChrisKitching](https://github.com/ChrisKitching)) - Implement additional integration options [\#238](https://github.com/nlohmann/json/pull/238) ([robertmrk](https://github.com/robertmrk)) - make serialization locale-independent [\#232](https://github.com/nlohmann/json/pull/232) ([nlohmann](https://github.com/nlohmann)) diff --git a/resources/3rdparty/modernjson/Makefile b/resources/3rdparty/modernjson/Makefile index 6fdc06b9d..4c96bad7f 100755 --- a/resources/3rdparty/modernjson/Makefile +++ b/resources/3rdparty/modernjson/Makefile @@ -10,18 +10,25 @@ all: json_unit # clean up clean: rm -fr json_unit json_benchmarks fuzz fuzz-testing *.dSYM + rm -fr benchmarks/files/numbers/*.json + $(MAKE) clean -Cdoc + $(MAKE) clean -Ctest ########################################################################## # unit tests ########################################################################## -# additional flags -FLAGS = -Wall -Wextra -pedantic -Weffc++ -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated -Wfloat-equal +# build unit tests +json_unit: + @$(MAKE) -C test -# build unit tests (TODO: Does this want its own makefile?) -json_unit: test/src/unit.cpp src/json.hpp test/src/catch.hpp - $(CXX) -std=c++11 $(CXXFLAGS) $(FLAGS) $(CPPFLAGS) -I src -I test $< $(LDFLAGS) -o $@ +# run unit tests +check: json_unit + test/json_unit "*" + +check-fast: json_unit + test/json_unit ########################################################################## @@ -30,7 +37,7 @@ json_unit: test/src/unit.cpp src/json.hpp test/src/catch.hpp # compile example files and check output doctest: - make check_output -C doc + $(MAKE) check_output -C doc ########################################################################## @@ -57,8 +64,10 @@ fuzz: test/src/fuzz.cpp src/json.hpp # call cppcheck on the main header file cppcheck: - cppcheck --enable=all --inconclusive --std=c++11 src/json.hpp + cppcheck --enable=warning --inconclusive --force --std=c++11 src/json.hpp --error-exitcode=1 +clang_sanitize: clean + CXX=clang++ CXXFLAGS="-g -O2 -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer" $(MAKE) ########################################################################## # maintainer targets @@ -66,7 +75,7 @@ cppcheck: # create scanner with re2c re2c: src/json.hpp.re2c - $(RE2C) --bit-vectors --nested-ifs --no-debug-info $< | $(SED) '1d' > src/json.hpp + $(RE2C) -W --bit-vectors --nested-ifs --no-debug-info $< | $(SED) '1d' > src/json.hpp # pretty printer pretty: @@ -75,7 +84,8 @@ pretty: --indent-col1-comments --pad-oper --pad-header --align-pointer=type \ --align-reference=type --add-brackets --convert-tabs --close-templates \ --lineend=linux --preserve-date --suffix=none --formatted \ - src/json.hpp src/json.hpp.re2c test/src/unit.cpp test/src/fuzz.cpp benchmarks/benchmarks.cpp doc/examples/*.cpp + src/json.hpp src/json.hpp.re2c test/src/*.cpp \ + benchmarks/benchmarks.cpp doc/examples/*.cpp ########################################################################## @@ -84,7 +94,8 @@ pretty: # benchmarks json_benchmarks: benchmarks/benchmarks.cpp benchmarks/benchpress.hpp benchmarks/cxxopts.hpp src/json.hpp - $(CXX) -std=c++11 $(CXXFLAGS) -O3 -flto -I src -I benchmarks $< $(LDFLAGS) -o $@ + cd benchmarks/files/numbers ; python generate.py + $(CXX) -std=c++11 $(CXXFLAGS) -DNDEBUG -O3 -flto -I src -I benchmarks $< $(LDFLAGS) -o $@ ./json_benchmarks @@ -92,7 +103,9 @@ json_benchmarks: benchmarks/benchmarks.cpp benchmarks/benchpress.hpp benchmarks/ # changelog ########################################################################## +NEXT_VERSION ?= "unreleased" + ChangeLog.md: - github_changelog_generator -o ChangeLog.md --simple-list --release-url https://github.com/nlohmann/json/releases/tag/%s + github_changelog_generator -o ChangeLog.md --simple-list --release-url https://github.com/nlohmann/json/releases/tag/%s --future-release $(NEXT_VERSION) gsed -i 's|https://github.com/nlohmann/json/releases/tag/HEAD|https://github.com/nlohmann/json/tree/HEAD|' ChangeLog.md gsed -i '2i All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).' ChangeLog.md diff --git a/resources/3rdparty/modernjson/README.md b/resources/3rdparty/modernjson/README.md index 0d2cbf45c..5f434e7ce 100755 --- a/resources/3rdparty/modernjson/README.md +++ b/resources/3rdparty/modernjson/README.md @@ -1,13 +1,14 @@ -![JSON for Modern C++](https://raw.githubusercontent.com/nlohmann/json/master/doc/json.gif) +[![JSON for Modern C++](https://raw.githubusercontent.com/nlohmann/json/master/doc/json.gif)](https://github.com/nlohmann/json/releases) [![Build Status](https://travis-ci.org/nlohmann/json.svg?branch=master)](https://travis-ci.org/nlohmann/json) -[![Build Status](https://ci.appveyor.com/api/projects/status/1acb366xfyg3qybk?svg=true)](https://ci.appveyor.com/project/nlohmann/json) +[![Build Status](https://ci.appveyor.com/api/projects/status/1acb366xfyg3qybk/branch/develop?svg=true)](https://ci.appveyor.com/project/nlohmann/json) [![Coverage Status](https://img.shields.io/coveralls/nlohmann/json.svg)](https://coveralls.io/r/nlohmann/json) -[![Try online](https://img.shields.io/badge/try-online-blue.svg)](http://melpon.org/wandbox/permlink/wuiuqYiYqRTdI3rG) -[![Documentation Status](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json) +[![Try online](https://img.shields.io/badge/try-online-blue.svg)](http://melpon.org/wandbox/permlink/r3wa3rI5yxgQQcrm) +[![Documentation](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/nlohmann/json/master/LICENSE.MIT) [![Github Releases](https://img.shields.io/github/release/nlohmann/json.svg)](https://github.com/nlohmann/json/releases) [![Github Issues](https://img.shields.io/github/issues/nlohmann/json.svg)](http://github.com/nlohmann/json/issues) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/289/badge)](https://bestpractices.coreinfrastructure.org/projects/289) ## Design goals @@ -15,18 +16,19 @@ There are myriads of [JSON](http://json.org) libraries out there, and each may e - **Intuitive syntax**. In languages such as Python, JSON feels like a first class data type. We used all the operator magic of modern C++ to achieve the same feeling in your code. Check out the [examples below](#examples) and you know, what I mean. -- **Trivial integration**. Our whole code consists of a single header file `json.hpp`. That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. +- **Trivial integration**. Our whole code consists of a single header file [`json.hpp`](https://github.com/nlohmann/json/blob/develop/src/json.hpp). That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. -- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/src/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks. +- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/src/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks. To maintain high quality, the project is following the [Core Infrastructure Initiative (CII) best practices](https://bestpractices.coreinfrastructure.org/projects/289). Other aspects were not so important to us: - **Memory efficiency**. Each JSON object has an overhead of one pointer (the maximal size of a union) and one enumeration element (1 byte). The default generalization uses the following C++ data types: `std::string` for strings, `int64_t`, `uint64_t` or `double` for numbers, `std::map` for objects, `std::vector` for arrays, and `bool` for Booleans. However, you can template the generalized class `basic_json` to your needs. -- **Speed**. We currently implement the parser as naive [recursive descent parser](http://en.wikipedia.org/wiki/Recursive_descent_parser) with hand coded string handling. It is fast enough, but a [LALR-parser](http://en.wikipedia.org/wiki/LALR_parser) with a decent regular expression processor should be even faster (but would consist of more files which makes the integration harder). +- **Speed**. We currently implement the parser as naive [recursive descent parser](http://en.wikipedia.org/wiki/Recursive_descent_parser) with hand coded string handling. It is fast enough, but a [LALR-parser](http://en.wikipedia.org/wiki/LALR_parser) may be even faster (but would consist of more files which makes the integration harder). See the [contribution guidelines](https://github.com/nlohmann/json/blob/master/.github/CONTRIBUTING.md#please-dont) for more information. + ## Integration The single required source, file `json.hpp` is in the `src` directory or [released here](https://github.com/nlohmann/json/releases). All you need to do is add @@ -40,49 +42,8 @@ using json = nlohmann::json; to the files you want to use JSON objects. That's it. Do not forget to set the necessary switches to enable C++11 (e.g., `-std=c++11` for GCC and Clang). -## Supported compilers - -Though it's 2016 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work: - -- GCC 4.9 - 6.0 (and possibly later) -- Clang 3.4 - 3.9 (and possibly later) -- Microsoft Visual C++ 14.0 RC (and possibly later) - -The code is currently checked with Travis for GCC 4.9, GCC - -I would be happy to learn about other compilers/versions. +:beer: If you are using OS X and [Homebrew](http://brew.sh), just type `brew tap nlohmann/json` and `brew install nlohmann_json` and you're set. If you want the bleeding edge rather than the latest release, use `brew install nlohmann_json --HEAD`. -Please note: - -- GCC 4.8 does not work because of two bugs ([55817](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55817) and [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824)) in the C++11 support. Note there is a [pull request](https://github.com/nlohmann/json/pull/212) to fix some of the issues. -- Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default. - - ``` - APP_STL := c++_shared - NDK_TOOLCHAIN_VERSION := clang3.6 - APP_CPPFLAGS += -frtti -fexceptions - ``` - -- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. - -The following compilers are currently used in [continuous integration](https://travis-ci.org/nlohmann/json): - -| Compiler | Operating System | Version String | -|-----------------|------------------------------|----------------| -| GCC 4.9.3 | Ubuntu 14.04.3 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | -| GCC 5.3.0 | Ubuntu 14.04.3 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | -| Clang 3.6.2 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.6.2-svn240577-1~exp1 (branches/release_36) (based on LLVM 3.6.2) | -| Clang 3.7.1 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.7.1-svn253571-1~exp1 (branches/release_37) (based on LLVM 3.7.1) | -| Clang 3.8.1 | Ubuntu 14.04.3 LTS | clang version 3.8.1-svn265380-1~exp1 (branches/release_38) | -| Clang 3.9.0 | Ubuntu 14.04.3 LTS | clang version 3.9.0-svn267478-1~exp1 (trunk) | -| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | -| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | -| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | -| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | -| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.0.0 (clang-700.1.76) | -| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 | Apple LLVM version 7.0.2 (clang-700.1.81) | -| Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.3.0 (clang-703.0.29) | -| Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | ## Examples @@ -165,6 +126,7 @@ json empty_object_explicit = json::object(); json array_not_object = { json::array({"currency", "USD"}), json::array({"value", 42.99}) }; ``` + ### Serialization / Deserialization You can create an object (deserialization) by appending `_json` to a string literal: @@ -173,7 +135,7 @@ You can create an object (deserialization) by appending `_json` to a string lite // create object from string literal json j = "{ \"happy\": true, \"pi\": 3.141 }"_json; -// or even nicer (thanks http://isocpp.org/blog/2015/01/json-for-modern-cpp) +// or even nicer with a raw string literal auto j2 = R"( { "happy": true, @@ -218,6 +180,7 @@ These operators work for any subclasses of `std::istream` or `std::ostream`. Please note that setting the exception bit for `failbit` is inappropriate for this use case. It will result in program termination due to the `noexcept` specifier in use. + ### STL-like access We designed the JSON class to behave just like an STL container. In fact, it satisfies the [**ReversibleContainer**](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirement. @@ -285,6 +248,7 @@ int fob_present = o.count("fob"); // 0 o.erase("foo"); ``` + ### Conversion from STL containers Any sequence container (`std::array`, `std::vector`, `std::deque`, `std::forward_list`, `std::list`) whose values can be used to construct JSON types (e.g., integers, floating point numbers, Booleans, string types, or again STL containers described in this section) can be used to create a JSON array. The same holds for similar associative containers (`std::set`, `std::multiset`, `std::unordered_set`, `std::unordered_multiset`), but in these cases the order of the elements of the array depends how the elements are ordered in the respective STL container. @@ -327,7 +291,7 @@ json j_umset(c_umset); // both entries for "one" are used // maybe ["one", "two", "one", "four"] ``` -Likewise, any associative key-value containers (`std::map`, `std::multimap`, `std::unordered_map`, `std::unordered_multimap`) whose keys are can construct an `std::string` and whose values can be used to construct JSON types (see examples above) can be used to to create a JSON object. Note that in case of multimaps only one key is used in the JSON object and the value depends on the internal order of the STL container. +Likewise, any associative key-value containers (`std::map`, `std::multimap`, `std::unordered_map`, `std::unordered_multimap`) whose keys can construct an `std::string` and whose values can be used to construct JSON types (see examples above) can be used to to create a JSON object. Note that in case of multimaps only one key is used in the JSON object and the value depends on the internal order of the STL container. ```cpp std::map c_map { {"one", 1}, {"two", 2}, {"three", 3} }; @@ -347,12 +311,51 @@ json j_ummap(c_ummap); // only one entry for key "three" is used // maybe {"one": true, "two": true, "three": true} ``` +### JSON Pointer and JSON Patch + +The library supports **JSON Pointer** ([RFC 6901](https://tools.ietf.org/html/rfc6901)) as alternative means to address structured values. On top of this, **JSON Patch** ([RFC 6902](https://tools.ietf.org/html/rfc6902)) allows to describe differences between two JSON values - effectively allowing patch and diff operations known from Unix. + +```cpp +// a JSON value +json j_original = R"({ + "baz": ["one", "two", "three"], + "foo": "bar" +})"_json; + +// access members with a JSON pointer (RFC 6901) +j_original["/baz/1"_json_pointer]; +// "two" + +// a JSON patch (RFC 6902) +json j_patch = R"([ + { "op": "replace", "path": "/baz", "value": "boo" }, + { "op": "add", "path": "/hello", "value": ["world"] }, + { "op": "remove", "path": "/foo"} +])"_json; + +// apply the patch +json j_result = j_original.patch(j_patch); +// { +// "baz": "boo", +// "hello": ["world"] +// } + +// calculate a JSON patch from two JSON values +json::diff(j_result, j_original); +// [ +// { "op":" replace", "path": "/baz", "value": ["one", "two", "three"] }, +// { "op": "remove","path": "/hello" }, +// { "op": "add", "path": "/foo", "value": "bar" } +// ] +``` + + ### Implicit conversions The type of the JSON object is determined automatically by the expression to store. Likewise, the stored value is implicitly converted. ```cpp -/// strings +// strings std::string s1 = "Hello, world!"; json js = s1; std::string s2 = js; @@ -380,6 +383,57 @@ int vi = jn.get(); // etc. ``` + +## Supported compilers + +Though it's 2016 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work: + +- GCC 4.9 - 6.0 (and possibly later) +- Clang 3.4 - 3.9 (and possibly later) +- Microsoft Visual C++ 2015 / Build Tools 14.0.25123.0 (and possibly later) + +I would be happy to learn about other compilers/versions. + +Please note: + +- GCC 4.8 does not work because of two bugs ([55817](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55817) and [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824)) in the C++11 support. Note there is a [pull request](https://github.com/nlohmann/json/pull/212) to fix some of the issues. +- Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default. + + ``` + APP_STL := c++_shared + NDK_TOOLCHAIN_VERSION := clang3.6 + APP_CPPFLAGS += -frtti -fexceptions + ``` + + The code compiles successfully with [Android NDK](https://developer.android.com/ndk/index.html?hl=ml), Revision 9 - 11 (and possibly later) and [CrystaX's Android NDK](https://www.crystax.net/en/android/ndk) version 10. + +- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219). + +The following compilers are currently used in continuous integration at [Travis](https://travis-ci.org/nlohmann/json) and [AppVeyor](https://ci.appveyor.com/project/nlohmann/json): + +| Compiler | Operating System | Version String | +|-----------------|------------------------------|----------------| +| GCC 4.9.3 | Ubuntu 14.04.4 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | +| GCC 5.3.0 | Ubuntu 14.04.4 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | +| GCC 6.1.1 | Ubuntu 14.04.4 LTS | g++-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511 | +| Clang 3.6.0 | Ubuntu 14.04.4 LTS | clang version 3.6.0 (tags/RELEASE_360/final) | +| Clang 3.6.1 | Ubuntu 14.04.4 LTS | clang version 3.6.1 (tags/RELEASE_361/final) | +| Clang 3.6.2 | Ubuntu 14.04.4 LTS | clang version 3.6.2 (tags/RELEASE_362/final) | +| Clang 3.7.0 | Ubuntu 14.04.4 LTS | clang version 3.7.0 (tags/RELEASE_370/final) | +| Clang 3.7.1 | Ubuntu 14.04.4 LTS | clang version 3.7.1 (tags/RELEASE_371/final) | +| Clang 3.8.0 | Ubuntu 14.04.4 LTS | clang version 3.8.0 (tags/RELEASE_380/final) | +| Clang 3.8.1 | Ubuntu 14.04.4 LTS | clang version 3.8.1 (tags/RELEASE_381/final) | +| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | +| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | +| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | +| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | +| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | +| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | +| Clang Xcode 7.3 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Clang Xcode 8.0 | Darwin Kernel Version 15.6.0 (OSX 10.11.6) | Apple LLVM version 8.0.0 (clang-800.0.38) | +| Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | + + ## License @@ -388,11 +442,12 @@ The class is licensed under the [MIT License](http://opensource.org/licenses/MIT Copyright © 2013-2016 [Niels Lohmann](http://nlohmann.me) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ## Thanks @@ -433,24 +488,31 @@ I deeply appreciate the help of the following people. - [zewt](https://github.com/zewt) added useful notes to the README file about Android. - [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake. - [Chris Kitching](https://github.com/ChrisKitching) cleaned up the CMake files. +- [Tom Needham](https://github.com/06needhamt) fixed a subtle bug with MSVC 2015 which was also proposed by [Michael K.](https://github.com/Epidal). +- [Mário Feroldi](https://github.com/thelostt) fixed a small typo. +- [duncanwerner](https://github.com/duncanwerner) found a really embarrassing performance regression in the 2.0.0 release. +- [Damien](https://github.com/dtoma) fixed one of the last conversion warnings. +- [Thomas Braun](https://github.com/t-b) fixed a warning in a test case. +- [Théo DELRIEU](https://github.com/theodelrieu) patiently and constructively oversaw the long way toward [iterator-range parsing](https://github.com/nlohmann/json/issues/290). Thanks a lot for helping out! + ## Notes -- The code contains numerous debug **assertions** which can be switched off by defining the preprocessor macro `NDEBUG`, see the [documentation of `assert`](http://en.cppreference.com/w/cpp/error/assert). +- The code contains numerous debug **assertions** which can be switched off by defining the preprocessor macro `NDEBUG`, see the [documentation of `assert`](http://en.cppreference.com/w/cpp/error/assert). In particular, note [`operator[]`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a2e26bd0b0168abb61f67ad5bcd5b9fa1.html#a2e26bd0b0168abb61f67ad5bcd5b9fa1) implements **unchecked access** for const objects: If the given key is not present, the behavior is undefined (think of a dereferenced null pointer) and yields an [assertion failure](https://github.com/nlohmann/json/issues/289) if assertions are switched on. If you are not sure whether an element in an object exists, use checked access with the [`at()` function](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a674de1ee73e6bf4843fc5dc1351fb726.html#a674de1ee73e6bf4843fc5dc1351fb726). - As the exact type of a number is not defined in the [JSON specification](http://rfc7159.net/rfc7159), this library tries to choose the best fitting C++ number type automatically. As a result, the type `double` may be used to store numbers which may yield [**floating-point exceptions**](https://github.com/nlohmann/json/issues/181) in certain rare situations if floating-point exceptions have been unmasked in the calling code. These exceptions are not caused by the library and need to be fixed in the calling code, such as by re-masking the exceptions prior to calling library functions. + ## Execute unit tests To compile and run the tests, you need to execute ```sh -$ make -$ ./json_unit "*" +$ make check =============================================================================== -All tests passed (5568705 assertions in 31 test cases) +All tests passed (8905161 assertions in 35 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/resources/3rdparty/modernjson/appveyor.yml b/resources/3rdparty/modernjson/appveyor.yml index 59b9dd15e..3960f4db4 100755 --- a/resources/3rdparty/modernjson/appveyor.yml +++ b/resources/3rdparty/modernjson/appveyor.yml @@ -7,5 +7,4 @@ build_script: - cmake . -G "Visual Studio 14 2015" - cmake --build . --config Release test_script: -- test\Release\json_unit.exe -- test\Release\json_unit.exe "*" +- ctest -C Release -V diff --git a/resources/3rdparty/modernjson/benchmarks/benchmarks.cpp b/resources/3rdparty/modernjson/benchmarks/benchmarks.cpp deleted file mode 100755 index 1f5eb5e33..000000000 --- a/resources/3rdparty/modernjson/benchmarks/benchmarks.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#define BENCHPRESS_CONFIG_MAIN - -#include -#include -#include - -BENCHMARK("parse jeopardy.json", [](benchpress::context* ctx) -{ - for (size_t i = 0; i < ctx->num_iterations(); ++i) - { - std::ifstream input_file("benchmarks/files/jeopardy/jeopardy.json"); - nlohmann::json j; - j << input_file; - } -}) - -BENCHMARK("parse canada.json", [](benchpress::context* ctx) -{ - for (size_t i = 0; i < ctx->num_iterations(); ++i) - { - std::ifstream input_file("benchmarks/files/nativejson-benchmark/canada.json"); - nlohmann::json j; - j << input_file; - } -}) - -BENCHMARK("parse citm_catalog.json", [](benchpress::context* ctx) -{ - for (size_t i = 0; i < ctx->num_iterations(); ++i) - { - std::ifstream input_file("benchmarks/files/nativejson-benchmark/citm_catalog.json"); - nlohmann::json j; - j << input_file; - } -}) - -BENCHMARK("parse twitter.json", [](benchpress::context* ctx) -{ - for (size_t i = 0; i < ctx->num_iterations(); ++i) - { - std::ifstream input_file("benchmarks/files/nativejson-benchmark/twitter.json"); - nlohmann::json j; - j << input_file; - } -}) - -BENCHMARK("dump jeopardy.json", [](benchpress::context* ctx) -{ - std::ifstream input_file("benchmarks/files/jeopardy/jeopardy.json"); - nlohmann::json j; - j << input_file; - std::ofstream output_file("jeopardy.dump.json"); - - ctx->reset_timer(); - for (size_t i = 0; i < ctx->num_iterations(); ++i) - { - output_file << j; - } - - std::remove("jeopardy.dump.json"); -}) - -BENCHMARK("dump jeopardy.json with indent", [](benchpress::context* ctx) -{ - std::ifstream input_file("benchmarks/files/jeopardy/jeopardy.json"); - nlohmann::json j; - j << input_file; - std::ofstream output_file("jeopardy.dump.json"); - - ctx->reset_timer(); - for (size_t i = 0; i < ctx->num_iterations(); ++i) - { - output_file << std::setw(4) << j; - } - - std::remove("jeopardy.dump.json"); -}) diff --git a/resources/3rdparty/modernjson/benchmarks/benchpress.hpp b/resources/3rdparty/modernjson/benchmarks/benchpress.hpp deleted file mode 100755 index d68e4aff3..000000000 --- a/resources/3rdparty/modernjson/benchmarks/benchpress.hpp +++ /dev/null @@ -1,401 +0,0 @@ -/* -* Copyright (C) 2015 Christopher Gilbert. -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ -#ifndef BENCHPRESS_HPP -#define BENCHPRESS_HPP - -#include // max, min -#include // atomic_intmax_t -#include // high_resolution_timer, duration -#include // function -#include // setw -#include // cout -#include // regex, regex_match -#include // stringstream -#include // string -#include // thread -#include // vector - -namespace benchpress { - -/* - * The options class encapsulates all options for running benchmarks. - * - * When including benchpress, a main function can be emitted which includes a command-line parser for building an - * options object. However from time-to-time it may be necessary for the developer to have to build their own main - * stub and construct the options object manually. - * - * options opts; - * opts - * .bench(".*") - * .benchtime(1) - * .cpu(4); - */ -class options { - std::string d_bench; - size_t d_benchtime; - size_t d_cpu; -public: - options() - : d_bench(".*") - , d_benchtime(1) - , d_cpu(std::thread::hardware_concurrency()) - {} - options& bench(const std::string& bench) { - d_bench = bench; - return *this; - } - options& benchtime(size_t benchtime) { - d_benchtime = benchtime; - return *this; - } - options& cpu(size_t cpu) { - d_cpu = cpu; - return *this; - } - std::string get_bench() const { - return d_bench; - } - size_t get_benchtime() const { - return d_benchtime; - } - size_t get_cpu() const { - return d_cpu; - } -}; - -class context; - -/* - * The benchmark_info class is used to store a function name / pointer pair. - * - * benchmark_info bi("example", [](benchpress::context* b) { - * // benchmark function - * }); - */ -class benchmark_info { - std::string d_name; - std::function d_func; - -public: - benchmark_info(std::string name, std::function func) - : d_name(name) - , d_func(func) - {} - - std::string get_name() const { return d_name; } - std::function get_func() const { return d_func; } -}; - -/* - * The registration class is responsible for providing a single global point of reference for registering - * benchmark functions. - * - * registration::get_ptr()->register_benchmark(info); - */ -class registration { - static registration* d_this; - std::vector d_benchmarks; - -public: - static registration* get_ptr() { - if (nullptr == d_this) { - d_this = new registration(); - } - return d_this; - } - - void register_benchmark(benchmark_info& info) { - d_benchmarks.push_back(info); - } - - std::vector get_benchmarks() { return d_benchmarks; } -}; - -/* - * The auto_register class is a helper used to register benchmarks. - */ -class auto_register { -public: - auto_register(const std::string& name, std::function func) { - benchmark_info info(name, func); - registration::get_ptr()->register_benchmark(info); - } -}; - -#define CONCAT(x, y) x ## y -#define CONCAT2(x, y) CONCAT(x, y) - -// The BENCHMARK macro is a helper for creating benchmark functions and automatically registering them with the -// registration class. -#define BENCHMARK(x, f) benchpress::auto_register CONCAT2(register_, __LINE__)((x), (f)); - -// This macro will prevent the compiler from removing a redundant code path which has no side-effects. -#define DISABLE_REDUNDANT_CODE_OPT() { asm(""); } - -/* - * The result class is responsible for producing a printable string representation of a benchmark run. - */ -class result { - size_t d_num_iterations; - std::chrono::nanoseconds d_duration; - size_t d_num_bytes; - -public: - result(size_t num_iterations, std::chrono::nanoseconds duration, size_t num_bytes) - : d_num_iterations(num_iterations) - , d_duration(duration) - , d_num_bytes(num_bytes) - {} - - size_t get_ns_per_op() const { - if (d_num_iterations <= 0) { - return 0; - } - return d_duration.count() / d_num_iterations; - } - - double get_mb_per_s() const { - if (d_num_iterations <= 0 || d_duration.count() <= 0 || d_num_bytes <= 0) { - return 0; - } - return ((double(d_num_bytes) * double(d_num_iterations) / double(1e6)) / - double(std::chrono::duration_cast(d_duration).count())); - } - - std::string to_string() const { - std::stringstream tmp; - tmp << std::setw(12) << std::right << d_num_iterations; - size_t npo = get_ns_per_op(); - tmp << std::setw(12) << std::right << npo << std::setw(0) << " ns/op"; - double mbs = get_mb_per_s(); - if (mbs > 0.0) { - tmp << std::setw(12) << std::right << mbs << std::setw(0) << " MB/s"; - } - return std::string(tmp.str()); - } -}; - -/* - * The parallel_context class is responsible for providing a thread-safe context for parallel benchmark code. - */ -class parallel_context { - std::atomic_intmax_t d_num_iterations; -public: - parallel_context(size_t num_iterations) - : d_num_iterations(num_iterations) - {} - - bool next() { - return (d_num_iterations.fetch_sub(1) > 0); - } -}; - -/* - * The context class is responsible for providing an interface for capturing benchmark metrics to benchmark functions. - */ -class context { - bool d_timer_on; - std::chrono::high_resolution_clock::time_point d_start; - std::chrono::nanoseconds d_duration; - std::chrono::seconds d_benchtime; - size_t d_num_iterations; - size_t d_num_threads; - size_t d_num_bytes; - benchmark_info d_benchmark; - -public: - context(const benchmark_info& info, const options& opts) - : d_timer_on(false) - , d_start() - , d_duration() - , d_benchtime(std::chrono::seconds(opts.get_benchtime())) - , d_num_iterations(1) - , d_num_threads(opts.get_cpu()) - , d_num_bytes(0) - , d_benchmark(info) - {} - - size_t num_iterations() const { return d_num_iterations; } - - void set_num_threads(size_t n) { d_num_threads = n; } - size_t num_threads() const { return d_num_threads; } - - void start_timer() { - if (!d_timer_on) { - d_start = std::chrono::high_resolution_clock::now(); - d_timer_on = true; - } - } - void stop_timer() { - if (d_timer_on) { - d_duration += std::chrono::high_resolution_clock::now() - d_start; - d_timer_on = false; - } - } - void reset_timer() { - if (d_timer_on) { - d_start = std::chrono::high_resolution_clock::now(); - } - d_duration = std::chrono::nanoseconds::zero(); - } - - void set_bytes(int64_t bytes) { d_num_bytes = bytes; } - - size_t get_ns_per_op() { - if (d_num_iterations <= 0) { - return 0; - } - return d_duration.count() / d_num_iterations; - } - - void run_n(size_t n) { - d_num_iterations = n; - reset_timer(); - start_timer(); - d_benchmark.get_func()(this); - stop_timer(); - } - - void run_parallel(std::function f) { - parallel_context pc(d_num_iterations); - std::vector threads; - for (size_t i = 0; i < d_num_threads; ++i) { - threads.push_back(std::thread([&pc,&f]() -> void { - f(&pc); - })); - } - for(auto& thread : threads){ - thread.join(); - } - } - - result run() { - size_t n = 1; - run_n(n); - while (d_duration < d_benchtime && n < 1e9) { - size_t last = n; - if (get_ns_per_op() == 0) { - n = 1e9; - } else { - n = d_duration.count() / get_ns_per_op(); - } - n = std::max(std::min(n+n/2, 100*last), last+1); - n = round_up(n); - run_n(n); - } - return result(n, d_duration, d_num_bytes); - } - -private: - template - T round_down_10(T n) { - int tens = 0; - while (n > 10) { - n /= 10; - tens++; - } - int result = 1; - for (int i = 0; i < tens; ++i) { - result *= 10; - } - return result; - } - - template - T round_up(T n) { - T base = round_down_10(n); - if (n < (2 * base)) { - return 2 * base; - } - if (n < (5 * base)) { - return 5 * base; - } - return 10 * base; - } -}; - -/* - * The run_benchmarks function will run the registered benchmarks. - */ -void run_benchmarks(const options& opts) { - std::regex match_r(opts.get_bench()); - auto benchmarks = registration::get_ptr()->get_benchmarks(); - for (auto& info : benchmarks) { - if (std::regex_match(info.get_name(), match_r)) { - context c(info, opts); - auto r = c.run(); - std::cout << std::setw(35) << std::left << info.get_name() << r.to_string() << std::endl; - } - } -} - -} // namespace benchpress - -/* - * If BENCHPRESS_CONFIG_MAIN is defined when the file is included then a main function will be emitted which provides a - * command-line parser and then executes run_benchmarks. - */ -#ifdef BENCHPRESS_CONFIG_MAIN -#include "cxxopts.hpp" -benchpress::registration* benchpress::registration::d_this; -int main(int argc, char** argv) { - std::chrono::high_resolution_clock::time_point bp_start = std::chrono::high_resolution_clock::now(); - benchpress::options bench_opts; - try { - cxxopts::Options cmd_opts(argv[0], " - command line options"); - cmd_opts.add_options() - ("bench", "run benchmarks matching the regular expression", cxxopts::value() - ->default_value(".*")) - ("benchtime", "run enough iterations of each benchmark to take t seconds", cxxopts::value() - ->default_value("1")) - ("cpu", "specify the number of threads to use for parallel benchmarks", cxxopts::value() - ->default_value(std::to_string(std::thread::hardware_concurrency()))) - ("help", "print help") - ; - cmd_opts.parse(argc, argv); - if (cmd_opts.count("help")) { - std::cout << cmd_opts.help({""}) << std::endl; - exit(0); - } - if (cmd_opts.count("bench")) { - bench_opts.bench(cmd_opts["bench"].as()); - } - if (cmd_opts.count("benchtime")) { - bench_opts.benchtime(cmd_opts["benchtime"].as()); - } - if (cmd_opts.count("cpu")) { - bench_opts.cpu(cmd_opts["cpu"].as()); - } - } catch (const cxxopts::OptionException& e) { - std::cout << "error parsing options: " << e.what() << std::endl; - exit(1); - } - benchpress::run_benchmarks(bench_opts); - float duration = std::chrono::duration_cast( - std::chrono::high_resolution_clock::now() - bp_start - ).count() / 1000.f; - std::cout << argv[0] << " " << duration << "s" << std::endl; - return 0; -} -#endif - -#endif // BENCHPRESS_HPP \ No newline at end of file diff --git a/resources/3rdparty/modernjson/benchmarks/cxxopts.hpp b/resources/3rdparty/modernjson/benchmarks/cxxopts.hpp deleted file mode 100755 index 94dd31cad..000000000 --- a/resources/3rdparty/modernjson/benchmarks/cxxopts.hpp +++ /dev/null @@ -1,1312 +0,0 @@ -/* - -Copyright (c) 2014 Jarryd Beck - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/ - -#ifndef CXX_OPTS_HPP -#define CXX_OPTS_HPP - -#if defined(__GNUC__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnon-virtual-dtor" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -//when we ask cxxopts to use Unicode, help strings are processed using ICU, -//which results in the correct lengths being computed for strings when they -//are formatted for the help output -//it is necessary to make sure that can be found by the -//compiler, and that icu-uc is linked in to the binary. - -#ifdef CXXOPTS_USE_UNICODE -#include - -namespace cxxopts -{ - typedef icu::UnicodeString String; - - inline - String - toLocalString(std::string s) - { - return icu::UnicodeString::fromUTF8(s); - } - - class UnicodeStringIterator : public - std::iterator - { - public: - - UnicodeStringIterator(const icu::UnicodeString* s, int32_t pos) - : s(s) - , i(pos) - { - } - - value_type - operator*() const - { - return s->char32At(i); - } - - bool - operator==(const UnicodeStringIterator& rhs) const - { - return s == rhs.s && i == rhs.i; - } - - bool - operator!=(const UnicodeStringIterator& rhs) const - { - return !(*this == rhs); - } - - UnicodeStringIterator& - operator++() - { - ++i; - return *this; - } - - UnicodeStringIterator - operator+(int32_t v) - { - return UnicodeStringIterator(s, i + v); - } - - private: - const icu::UnicodeString* s; - int32_t i; - }; - - inline - String& - stringAppend(String&s, String a) - { - return s.append(std::move(a)); - } - - inline - String& - stringAppend(String& s, int n, UChar32 c) - { - for (int i = 0; i != n; ++i) - { - s.append(c); - } - - return s; - } - - template - String& - stringAppend(String& s, Iterator begin, Iterator end) - { - while (begin != end) - { - s.append(*begin); - ++begin; - } - - return s; - } - - inline - size_t - stringLength(const String& s) - { - return s.length(); - } - - inline - std::string - toUTF8String(const String& s) - { - std::string result; - s.toUTF8String(result); - - return result; - } -} - -namespace std -{ - cxxopts::UnicodeStringIterator - begin(const icu::UnicodeString& s) - { - return cxxopts::UnicodeStringIterator(&s, 0); - } - - cxxopts::UnicodeStringIterator - end(const icu::UnicodeString& s) - { - return cxxopts::UnicodeStringIterator(&s, s.length()); - } -} - -//ifdef CXXOPTS_USE_UNICODE -#else - -namespace cxxopts -{ - typedef std::string String; - - template - T - toLocalString(T&& t) - { - return t; - } - - inline - size_t - stringLength(const String& s) - { - return s.length(); - } - - inline - String& - stringAppend(String&s, String a) - { - return s.append(std::move(a)); - } - - inline - String& - stringAppend(String& s, size_t n, char c) - { - return s.append(n, c); - } - - template - String& - stringAppend(String& s, Iterator begin, Iterator end) - { - return s.append(begin, end); - } - - template - std::string - toUTF8String(T&& t) - { - return std::forward(t); - } - -} - -//ifdef CXXOPTS_USE_UNICODE -#endif - -namespace cxxopts -{ - class Value : public std::enable_shared_from_this - { - public: - - virtual void - parse(const std::string& text) const = 0; - - virtual void - parse() const = 0; - - virtual bool - has_arg() const = 0; - - virtual bool - has_default() const = 0; - - virtual bool - has_implicit() const = 0; - - virtual std::string - get_default_value() const = 0; - - virtual std::string - get_implicit_value() const = 0; - - virtual std::shared_ptr - default_value(const std::string& value) = 0; - - virtual std::shared_ptr - implicit_value(const std::string& value) = 0; - }; - - class OptionException : public std::exception - { - public: - OptionException(const std::string& message) - : m_message(message) - { - } - - virtual const char* - what() const noexcept - { - return m_message.c_str(); - } - - private: - std::string m_message; - }; - - class OptionSpecException : public OptionException - { - public: - - OptionSpecException(const std::string& message) - : OptionException(message) - { - } - }; - - class OptionParseException : public OptionException - { - public: - OptionParseException(const std::string& message) - : OptionException(message) - { - } - }; - - class option_exists_error : public OptionSpecException - { - public: - option_exists_error(const std::string& option) - : OptionSpecException(u8"Option ‘" + option + u8"’ already exists") - { - } - }; - - class invalid_option_format_error : public OptionSpecException - { - public: - invalid_option_format_error(const std::string& format) - : OptionSpecException(u8"Invalid option format ‘" + format + u8"’") - { - } - }; - - class option_not_exists_exception : public OptionParseException - { - public: - option_not_exists_exception(const std::string& option) - : OptionParseException(u8"Option ‘" + option + u8"’ does not exist") - { - } - }; - - class missing_argument_exception : public OptionParseException - { - public: - missing_argument_exception(const std::string& option) - : OptionParseException(u8"Option ‘" + option + u8"’ is missing an argument") - { - } - }; - - class option_requires_argument_exception : public OptionParseException - { - public: - option_requires_argument_exception(const std::string& option) - : OptionParseException(u8"Option ‘" + option + u8"’ requires an argument") - { - } - }; - - class option_not_has_argument_exception : public OptionParseException - { - public: - option_not_has_argument_exception - ( - const std::string& option, - const std::string& arg - ) - : OptionParseException( - u8"Option ‘" + option + u8"’ does not take an argument, but argument‘" - + arg + "’ given") - { - } - }; - - class option_not_present_exception : public OptionParseException - { - public: - option_not_present_exception(const std::string& option) - : OptionParseException(u8"Option ‘" + option + u8"’ not present") - { - } - }; - - class argument_incorrect_type : public OptionParseException - { - public: - argument_incorrect_type - ( - const std::string& arg - ) - : OptionParseException( - u8"Argument ‘" + arg + u8"’ failed to parse" - ) - { - } - }; - - namespace values - { - template - void - parse_value(const std::string& text, T& value) - { - std::istringstream is(text); - if (!(is >> value)) - { - std::cerr << "cannot parse empty value" << std::endl; - throw argument_incorrect_type(text); - } - - if (is.rdbuf()->in_avail() != 0) - { - throw argument_incorrect_type(text); - } - } - - template - void - parse_value(const std::string& text, std::vector& value) - { - T v; - parse_value(text, v); - value.push_back(v); - } - - inline - void - parse_value(const std::string& /*text*/, bool& value) - { - //TODO recognise on, off, yes, no, enable, disable - //so that we can write --long=yes explicitly - value = true; - } - - inline - void - parse_value(const std::string& text, std::string& value) - { - value = text; - } - - template - struct value_has_arg - { - static constexpr bool value = true; - }; - - template <> - struct value_has_arg - { - static constexpr bool value = false; - }; - - template - class standard_value : public Value - { - public: - standard_value() - : m_result(std::make_shared()) - , m_store(m_result.get()) - { - } - - standard_value(T* t) - : m_store(t) - { - } - - void - parse(const std::string& text) const - { - if (m_implicit && text.empty()) - { - parse_value(m_implicit_value, *m_store); - } - else - { - parse_value(text, *m_store); - } - } - - void - parse() const - { - parse_value(m_default_value, *m_store); - } - - bool - has_arg() const - { - return value_has_arg::value; - } - - bool - has_default() const - { - return m_default; - } - - bool - has_implicit() const - { - return m_implicit; - } - - virtual std::shared_ptr - default_value(const std::string& value){ - m_default = true; - m_default_value = value; - return shared_from_this(); - } - - virtual std::shared_ptr - implicit_value(const std::string& value){ - m_implicit = true; - m_implicit_value = value; - return shared_from_this(); - } - - std::string - get_default_value() const - { - return m_default_value; - } - - std::string - get_implicit_value() const - { - return m_implicit_value; - } - - const T& - get() const - { - if (m_store == nullptr) - { - return *m_result; - } - else - { - return *m_store; - } - } - - protected: - std::shared_ptr m_result; - T* m_store; - bool m_default = false; - std::string m_default_value; - bool m_implicit = false; - std::string m_implicit_value; - }; - } - - template - std::shared_ptr - value() - { - return std::make_shared>(); - } - - template - std::shared_ptr - value(T& t) - { - return std::make_shared>(&t); - } - - class OptionAdder; - - class OptionDetails - { - public: - OptionDetails - ( - const String& description, - std::shared_ptr value - ) - : m_desc(description) - , m_value(value) - , m_count(0) - { - } - - const String& - description() const - { - return m_desc; - } - - bool - has_arg() const - { - return m_value->has_arg(); - } - - void - parse(const std::string& text) - { - m_value->parse(text); - ++m_count; - } - - void - parse_default() - { - m_value->parse(); - ++m_count; - } - - int - count() const - { - return m_count; - } - - const Value& value() const { - return *m_value; - } - - template - const T& - as() const - { -#ifdef CXXOPTS_NO_RTTI - return static_cast&>(*m_value).get(); -#else - return dynamic_cast&>(*m_value).get(); -#endif - } - - private: - String m_desc; - std::shared_ptr m_value; - int m_count; - }; - - struct HelpOptionDetails - { - std::string s; - std::string l; - String desc; - bool has_arg; - bool has_default; - std::string default_value; - bool has_implicit; - std::string implicit_value; - std::string arg_help; - }; - - struct HelpGroupDetails - { - std::string name; - std::string description; - std::vector options; - }; - - class Options - { - public: - - Options(std::string program, std::string help_string = "") - : m_program(std::move(program)) - , m_help_string(toLocalString(std::move(help_string))) - { - } - - inline - void - parse(int& argc, char**& argv); - - inline - OptionAdder - add_options(std::string group = ""); - - inline - void - add_option - ( - const std::string& group, - const std::string& s, - const std::string& l, - std::string desc, - std::shared_ptr value, - std::string arg_help - ); - - int - count(const std::string& o) const - { - auto iter = m_options.find(o); - if (iter == m_options.end()) - { - return 0; - } - - return iter->second->count(); - } - - const OptionDetails& - operator[](const std::string& option) const - { - auto iter = m_options.find(option); - - if (iter == m_options.end()) - { - throw option_not_present_exception(option); - } - - return *iter->second; - } - - //parse positional arguments into the given option - inline - void - parse_positional(std::string option); - - inline - std::string - help(const std::vector& groups = {""}) const; - - inline - const std::vector - groups() const; - - inline - const HelpGroupDetails& - group_help(const std::string& group) const; - - private: - - inline - void - add_one_option - ( - const std::string& option, - std::shared_ptr details - ); - - inline - bool - consume_positional(std::string a); - - inline - void - add_to_option(const std::string& option, const std::string& arg); - - inline - void - parse_option - ( - std::shared_ptr value, - const std::string& name, - const std::string& arg = "" - ); - - inline - void - checked_parse_arg - ( - int argc, - char* argv[], - int& current, - std::shared_ptr value, - const std::string& name - ); - - inline - String - help_one_group(const std::string& group) const; - - std::string m_program; - String m_help_string; - - std::map> m_options; - std::string m_positional; - - //mapping from groups to help options - std::map m_help; - }; - - class OptionAdder - { - public: - - OptionAdder(Options& options, std::string group) - : m_options(options), m_group(std::move(group)) - { - } - - inline - OptionAdder& - operator() - ( - const std::string& opts, - const std::string& desc, - std::shared_ptr value - = ::cxxopts::value(), - std::string arg_help = "" - ); - - private: - Options& m_options; - std::string m_group; - }; - -} - -namespace cxxopts -{ - - namespace - { - - constexpr int OPTION_LONGEST = 30; - constexpr int OPTION_DESC_GAP = 2; - - std::basic_regex option_matcher - ("--([[:alnum:]][-_[:alnum:]]+)(=(.*))?|-([a-zA-Z]+)"); - - std::basic_regex option_specifier - ("(([a-zA-Z]),)?([a-zA-Z0-9][-_a-zA-Z0-9]+)"); - - String - format_option - ( - const HelpOptionDetails& o - ) - { - auto& s = o.s; - auto& l = o.l; - - String result = " "; - - if (s.size() > 0) - { - result += "-" + toLocalString(s) + ","; - } - else - { - result += " "; - } - - if (l.size() > 0) - { - result += " --" + toLocalString(l); - } - - if (o.has_arg) - { - auto arg = o.arg_help.size() > 0 ? toLocalString(o.arg_help) : "arg"; - - if (o.has_implicit) - { - result += " [=" + arg + "(=" + toLocalString(o.implicit_value) + ")]"; - } - else - { - result += " " + arg; - } - } - - return result; - } - - String - format_description - ( - const HelpOptionDetails& o, - size_t start, - size_t width - ) - { - auto desc = o.desc; - - if (o.has_default) - { - desc += toLocalString(" (default:" + o.default_value + ")"); - } - - String result; - - auto current = std::begin(desc); - auto startLine = current; - auto lastSpace = current; - - auto size = size_t{}; - - while (current != std::end(desc)) - { - if (*current == ' ') - { - lastSpace = current; - } - - if (size > width) - { - if (lastSpace == startLine) - { - stringAppend(result, startLine, current + 1); - stringAppend(result, "\n"); - stringAppend(result, start, ' '); - startLine = current + 1; - lastSpace = startLine; - } - else - { - stringAppend(result, startLine, lastSpace); - stringAppend(result, "\n"); - stringAppend(result, start, ' '); - startLine = lastSpace + 1; - } - size = 0; - } - else - { - ++size; - } - - ++current; - } - - //append whatever is left - stringAppend(result, startLine, current); - - return result; - } - } - -OptionAdder -Options::add_options(std::string group) -{ - return OptionAdder(*this, std::move(group)); -} - -OptionAdder& -OptionAdder::operator() -( - const std::string& opts, - const std::string& desc, - std::shared_ptr value, - std::string arg_help -) -{ - std::match_results result; - std::regex_match(opts.c_str(), result, option_specifier); - - if (result.empty()) - { - throw invalid_option_format_error(opts); - } - - const auto& s = result[2]; - const auto& l = result[3]; - - m_options.add_option(m_group, s.str(), l.str(), desc, value, - std::move(arg_help)); - - return *this; -} - -void -Options::parse_option -( - std::shared_ptr value, - const std::string& /*name*/, - const std::string& arg -) -{ - value->parse(arg); -} - -void -Options::checked_parse_arg -( - int argc, - char* argv[], - int& current, - std::shared_ptr value, - const std::string& name -) -{ - if (current + 1 >= argc) - { - if (value->value().has_implicit()) - { - parse_option(value, name, ""); - } - else - { - throw missing_argument_exception(name); - } - } - else - { - if (argv[current + 1][0] == '-' && value->value().has_implicit()) - { - parse_option(value, name, ""); - } - else - { - parse_option(value, name, argv[current + 1]); - ++current; - } - } -} - -void -Options::add_to_option(const std::string& option, const std::string& arg) -{ - auto iter = m_options.find(option); - - if (iter == m_options.end()) - { - throw option_not_exists_exception(option); - } - - parse_option(iter->second, option, arg); -} - -bool -Options::consume_positional(std::string a) -{ - if (m_positional.size() > 0) - { - add_to_option(m_positional, a); - return true; - } - else - { - return false; - } -} - -void -Options::parse_positional(std::string option) -{ - m_positional = std::move(option); -} - -void -Options::parse(int& argc, char**& argv) -{ - int current = 1; - - int nextKeep = 1; - - while (current != argc) - { - std::match_results result; - std::regex_match(argv[current], result, option_matcher); - - if (result.empty()) - { - //not a flag - - //if true is returned here then it was consumed, otherwise it is - //ignored - if (consume_positional(argv[current])) - { - } - else - { - argv[nextKeep] = argv[current]; - ++nextKeep; - } - //if we return from here then it was parsed successfully, so continue - } - else - { - //short or long option? - if (result[4].length() != 0) - { - const std::string& s = result[4]; - - for (std::size_t i = 0; i != s.size(); ++i) - { - std::string name(1, s[i]); - auto iter = m_options.find(name); - - if (iter == m_options.end()) - { - throw option_not_exists_exception(name); - } - - auto value = iter->second; - - //if no argument then just add it - if (!value->has_arg()) - { - parse_option(value, name); - } - else - { - //it must be the last argument - if (i + 1 == s.size()) - { - checked_parse_arg(argc, argv, current, value, name); - } - else if (value->value().has_implicit()) - { - parse_option(value, name, ""); - } - else - { - //error - throw option_requires_argument_exception(name); - } - } - } - } - else if (result[1].length() != 0) - { - const std::string& name = result[1]; - - auto iter = m_options.find(name); - - if (iter == m_options.end()) - { - throw option_not_exists_exception(name); - } - - auto opt = iter->second; - - //equals provided for long option? - if (result[3].length() != 0) - { - //parse the option given - - //but if it doesn't take an argument, this is an error - if (!opt->has_arg()) - { - throw option_not_has_argument_exception(name, result[3]); - } - - parse_option(opt, name, result[3]); - } - else - { - if (opt->has_arg()) - { - //parse the next argument - checked_parse_arg(argc, argv, current, opt, name); - } - else - { - //parse with empty argument - parse_option(opt, name); - } - } - } - - } - - ++current; - } - - for (auto& opt : m_options) - { - auto& detail = opt.second; - auto& value = detail->value(); - - if(!detail->count() && value.has_default()){ - detail->parse_default(); - } - } - - argc = nextKeep; -} - -void -Options::add_option -( - const std::string& group, - const std::string& s, - const std::string& l, - std::string desc, - std::shared_ptr value, - std::string arg_help -) -{ - auto stringDesc = toLocalString(std::move(desc)); - auto option = std::make_shared(stringDesc, value); - - if (s.size() > 0) - { - add_one_option(s, option); - } - - if (l.size() > 0) - { - add_one_option(l, option); - } - - //add the help details - auto& options = m_help[group]; - - options.options.emplace_back(HelpOptionDetails{s, l, stringDesc, - value->has_arg(), - value->has_default(), value->get_default_value(), - value->has_implicit(), value->get_implicit_value(), - std::move(arg_help)}); -} - -void -Options::add_one_option -( - const std::string& option, - std::shared_ptr details -) -{ - auto in = m_options.emplace(option, details); - - if (!in.second) - { - throw option_exists_error(option); - } -} - -String -Options::help_one_group(const std::string& g) const -{ - typedef std::vector> OptionHelp; - - auto group = m_help.find(g); - if (group == m_help.end()) - { - return ""; - } - - OptionHelp format; - - size_t longest = 0; - - String result; - - if (!g.empty()) - { - result += toLocalString(" " + g + " options:\n\n"); - } - - for (const auto& o : group->second.options) - { - auto s = format_option(o); - longest = std::max(longest, stringLength(s)); - format.push_back(std::make_pair(s, String())); - } - - longest = std::min(longest, static_cast(OPTION_LONGEST)); - - //widest allowed description - auto allowed = size_t{76} - longest - OPTION_DESC_GAP; - - auto fiter = format.begin(); - for (const auto& o : group->second.options) - { - auto d = format_description(o, longest + OPTION_DESC_GAP, allowed); - - result += fiter->first; - if (stringLength(fiter->first) > longest) - { - result += "\n"; - result += toLocalString(std::string(longest + OPTION_DESC_GAP, ' ')); - } - else - { - result += toLocalString(std::string(longest + OPTION_DESC_GAP - - stringLength(fiter->first), - ' ')); - } - result += d; - result += "\n"; - - ++fiter; - } - - return result; -} - -std::string -Options::help(const std::vector& groups) const -{ - String result = "Usage:\n " + toLocalString(m_program) + " [OPTION...]" - + m_help_string + "\n\n"; - - for (std::size_t i = 0; i < groups.size(); ++i) - { - result += help_one_group(groups[i]); - if (i < groups.size() - 1) - { - result += "\n"; - } - } - - return toUTF8String(result); -} - -const std::vector -Options::groups() const -{ - std::vector g; - - std::transform( - m_help.begin(), - m_help.end(), - std::back_inserter(g), - [] (const std::map::value_type& pair) - { - return pair.first; - } - ); - - return g; -} - -const HelpGroupDetails& -Options::group_help(const std::string& group) const -{ - return m_help.at(group); -} - -} - -#if defined(__GNU__) -#pragma GCC diagnostic pop -#endif - -#endif //CXX_OPTS_HPP \ No newline at end of file diff --git a/resources/3rdparty/modernjson/benchmarks/files/jeopardy/jeopardy.json.REMOVED.git-id b/resources/3rdparty/modernjson/benchmarks/files/jeopardy/jeopardy.json.REMOVED.git-id deleted file mode 100644 index b44db16f0..000000000 --- a/resources/3rdparty/modernjson/benchmarks/files/jeopardy/jeopardy.json.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -a533fde78ce50a11f6189907f9e0392095222fe2 \ No newline at end of file diff --git a/resources/3rdparty/modernjson/benchmarks/files/nativejson-benchmark/canada.json b/resources/3rdparty/modernjson/benchmarks/files/nativejson-benchmark/canada.json deleted file mode 100755 index 04f63b405..000000000 --- a/resources/3rdparty/modernjson/benchmarks/files/nativejson-benchmark/canada.json +++ /dev/null @@ -1,9 +0,0 @@ -{ "type": "FeatureCollection", - "features": [ -{ - "type": "Feature", -"properties": { "name": "Canada" }, -"geometry": {"type":"Polygon","coordinates":[[[-65.613616999999977,43.420273000000009],[-65.619720000000029,43.418052999999986],[-65.625,43.421379000000059],[-65.636123999999882,43.449714999999969],[-65.633056999999951,43.474709000000132],[-65.611389000000031,43.513054000000068],[-65.605835000000013,43.516105999999979],[-65.598343,43.515830999999935],[-65.566101000000003,43.508331000000055],[-65.561935000000005,43.504439999999988],[-65.55999799999995,43.499718000000087],[-65.573333999999988,43.476379000000065],[-65.593612999999948,43.444153000000028],[-65.613616999999977,43.420273000000009]],[[-59.816947999999911,43.928328999999962],[-59.841667000000029,43.918602000000021],[-59.866393999999957,43.909987999999998],[-59.879722999999956,43.906654000000003],[-59.895835999999974,43.904160000000047],[-59.919448999999929,43.901099999999985],[-59.953330999999991,43.898604999999975],[-60.013617999999951,43.903320000000008],[-60.028609999999958,43.905548000000124],[-60.078338999999914,43.917496000000028],[-60.103888999999981,43.926659000000029],[-60.121666000000005,43.934990000000084],[-60.129997000000003,43.941933000000063],[-60.124167999999997,43.945267000000058],[-60.095000999999968,43.939430000000129],[-60.017776000000026,43.925827000000083],[-59.975554999999986,43.921936000000017],[-59.966942000000017,43.921936000000017],[-59.915000999999961,43.925552000000096],[-59.861945999999989,43.934433000000013],[-59.841385000000002,43.938880999999981],[-59.80972300000002,43.950828999999999],[-59.793334999999956,43.959435000000099],[-59.777221999999938,43.968048000000067],[-59.755279999999971,43.979431000000091],[-59.724716000000001,43.991104000000121],[-59.727775999999949,43.986382000000049],[-59.736389000000031,43.979156000000103],[-59.753615999999965,43.964995999999985],[-59.762504999999919,43.957771000000093],[-59.782501000000025,43.944434999999999],[-59.793059999999969,43.93832400000008],[-59.816947999999911,43.928328999999962]],[[-66.282775999999956,44.289719000000105],[-66.314437999999996,44.250548999999978],[-66.322234999999978,44.252777000000094],[-66.324448000000018,44.25750000000005],[-66.323897999999986,44.263329000000113],[-66.310271999999998,44.289993000000038],[-66.303054999999915,44.300545000000056],[-66.294723999999917,44.310271999999998],[-66.228333000000021,44.385826000000009],[-66.21945199999999,44.394713999999965],[-66.214447000000007,44.397774000000027],[-66.206389999999942,44.395271000000037],[-66.204726999999934,44.384995000000004],[-66.205275999999969,44.379433000000063],[-66.208053999999947,44.372765000000072],[-66.214721999999938,44.36360900000011],[-66.249725000000012,44.327217000000132],[-66.282775999999956,44.289719000000105]],[[-66.886123999999995,44.614440999999999],[-66.900283999999999,44.61332699999997],[-66.904174999999952,44.618049999999982],[-66.904449,44.622489999999971],[-66.884734999999978,44.68332700000002],[-66.858611999999937,44.743050000000039],[-66.837783999999942,44.770827999999995],[-66.833327999999938,44.774994000000049],[-66.803329000000019,44.798881999999992],[-66.798049999999932,44.802490000000091],[-66.786666999999852,44.808044000000109],[-66.779723999999931,44.809158000000082],[-66.772507000000019,44.809158000000082],[-66.767226999999934,44.805549999999982],[-66.764724999999999,44.801102000000014],[-66.757781999999963,44.792496000000085],[-66.734726000000023,44.729156000000103],[-66.736938000000009,44.717209000000139],[-66.740279999999927,44.70777099999998],[-66.761123999999995,44.676102000000128],[-66.765015000000005,44.671378999999945],[-66.875274999999931,44.619438000000059],[-66.886123999999995,44.614440999999999]],[[-61.199996999999996,45.558327000000077],[-61.204720000000009,45.555267000000072],[-61.212775999999963,45.556656000000032],[-61.219993999999986,45.559990000000028],[-61.224167000000023,45.564156000000139],[-61.222220999999934,45.569443000000035],[-61.21416499999998,45.568886000000134],[-61.208610999999962,45.56721500000009],[-61.202498999999989,45.563324000000023],[-61.199996999999996,45.558327000000077]],[[-60.993889000000024,45.45777099999998],[-61.00028199999997,45.455826000000002],[-61.007781999999963,45.457214000000079],[-61.019446999999957,45.463882000000069],[-61.101943999999946,45.523048000000017],[-61.105835000000013,45.526939000000084],[-61.108337000000006,45.540833000000021],[-61.104445999999939,45.546387000000038],[-61.098609999999951,45.549164000000076],[-61.023612999999955,45.574997000000053],[-61.017220000000009,45.575272000000041],[-60.936942999999985,45.576659999999947],[-60.908051,45.576103000000046],[-60.900275999999906,45.575554000000125],[-60.879996999999946,45.560547000000099],[-60.878608999999869,45.555824000000143],[-60.883888000000013,45.550544999999943],[-60.889167999999984,45.548332000000016],[-60.910277999999948,45.546104000000071],[-60.936110999999983,45.539161999999976],[-60.947495000000004,45.533607000000075],[-60.952498999999932,45.529990999999995],[-60.962501999999915,45.519989000000066],[-60.96305799999999,45.514998999999989],[-60.961669999999913,45.510277000000087],[-60.958611000000019,45.505829000000119],[-60.950553999999954,45.497771999999998],[-60.993889000000024,45.45777099999998]],[[-63.246391000000017,46.435547000000042],[-63.25389100000001,46.435265000000129],[-63.26167299999986,46.436378000000047],[-63.269446999999957,46.439713000000097],[-63.285004000000015,46.450829000000056],[-63.27055399999989,46.450271999999984],[-63.245834000000002,46.442764000000125],[-63.240836999999999,46.438599000000124],[-63.246391000000017,46.435547000000042]],[[-71.111114999999984,46.850548000000003],[-71.118606999999997,46.850273000000016],[-71.127486999999917,46.851662000000033],[-71.130279999999914,46.856102000000021],[-71.128326000000015,46.862213000000111],[-71.121383999999978,46.874161000000129],[-71.098891999999978,46.898048000000017],[-71.078339000000028,46.913605000000075],[-70.936935000000005,46.992493000000024],[-70.896666999999866,47.013329000000056],[-70.87222300000002,47.024162000000047],[-70.860001000000011,47.02777100000003],[-70.845276000000013,47.029160000000047],[-70.836394999999982,47.02777100000003],[-70.818893000000003,47.02276599999999],[-70.81361400000003,47.019440000000145],[-70.809158000000025,47.01527400000009],[-70.807495000000017,47.00999500000006],[-70.809432999999956,47.004439999999988],[-70.814437999999996,46.998329000000126],[-70.877212999999983,46.931107000000111],[-70.887512000000015,46.923607000000004],[-70.904174999999952,46.913605000000075],[-71.009170999999924,46.871101000000067],[-71.033324999999934,46.862494999999967],[-71.040832999999964,46.860549999999989],[-71.082229999999925,46.853325000000098],[-71.111114999999984,46.850548000000003]],[[-60.445273999999984,46.861664000000133],[-60.436942999999985,46.861107000000061],[-60.352782999999988,46.861664000000133],[-60.345832999999857,46.862494999999967],[-60.334441999999967,46.868881000000101],[-60.326110999999969,46.868323999999973],[-60.320838999999978,46.864441000000056],[-60.309440999999936,46.851105000000132],[-60.302223000000026,46.837493999999936],[-60.301392000000021,46.831940000000145],[-60.304442999999935,46.815269000000114],[-60.322776999999917,46.736382000000049],[-60.327224999999885,46.724991000000045],[-60.478881999999942,46.389992000000063],[-60.535277999999948,46.321663000000058],[-60.589438999999857,46.25499700000006],[-60.609169000000009,46.201934999999935],[-60.590331999999933,46.207821000000081],[-60.587001999999984,46.209488000000135],[-60.57150299999995,46.228653000000122],[-60.553329000000019,46.248878000000047],[-60.551391999999964,46.25499700000006],[-60.543335000000013,46.266663000000051],[-60.528053,46.278602999999919],[-60.479720999999984,46.311104000000057],[-60.46805599999999,46.316665999999998],[-60.44388600000002,46.326942000000088],[-60.430557000000022,46.33138299999996],[-60.424171000000001,46.331665000000044],[-60.416388999999867,46.328049000000021],[-60.412216000000001,46.31888600000002],[-60.417777999999942,46.285827999999981],[-60.419997999999964,46.279991000000052],[-60.42472099999992,46.27526899999998],[-60.438048999999921,46.270828000000051],[-60.454719999999952,46.262215000000083],[-60.470550999999944,46.251105999999993],[-60.53583100000003,46.192436000000043],[-60.59027900000001,46.138603000000103],[-60.600280999999939,46.130271999999991],[-60.61611199999993,46.120827000000133],[-60.645836000000031,46.106102000000021],[-60.687774999999874,46.088326000000052],[-60.701110999999912,46.08526599999999],[-60.788895000000025,46.066666000000055],[-60.86333499999995,46.052490000000034],[-60.986114999999927,45.982491000000095],[-61.023887999999943,45.969437000000028],[-61.080283999999949,45.951660000000004],[-61.087776000000019,45.95138500000013],[-61.095832999999971,45.952217000000076],[-61.105003000000011,45.954712000000086],[-61.113059999999905,45.955268999999987],[-61.117774999999938,45.950828999999999],[-61.126944999999978,45.928329000000133],[-61.125556999999958,45.923607000000061],[-61.118332000000009,45.923049999999932],[-61.056999000000019,45.931216999999947],[-61.052834000000018,45.931881000000033],[-61.017497999999989,45.940712000000076],[-61.014835000000005,45.943382000000042],[-60.989165999999955,45.95638300000013],[-60.987777999999935,45.962494000000049],[-60.984168999999952,45.967490999999939],[-60.957221999999945,45.984992999999974],[-60.940551999999911,45.994438000000059],[-60.892776000000026,46.01527400000009],[-60.853057999999976,46.03138000000007],[-60.770835999999917,46.057495000000074],[-60.757506999999919,46.060546999999985],[-60.743056999999965,46.061661000000015],[-60.735557999999912,46.058044000000052],[-60.734169000000009,46.05332199999998],[-60.734169000000009,46.047493000000145],[-60.807502999999997,45.931107000000111],[-60.870276999999987,45.910820000000058],[-60.898055999999997,45.906654000000117],[-60.956947000000014,45.903046000000018],[-61.042888999999946,45.891327000000103],[-61.047053999999946,45.890659000000085],[-61.050555999999972,45.888991999999973],[-61.053390999999976,45.886162000000127],[-61.096663999999976,45.860275000000001],[-61.097777999999948,45.854713000000061],[-61.094718999999998,45.850273000000016],[-61.087776000000019,45.847487999999998],[-61.079726999999991,45.84693900000002],[-61.073059000000001,45.84804500000007],[-61.060829000000012,45.852776000000006],[-61.049445999999989,45.858330000000024],[-61.026107999999965,45.86971299999999],[-60.989997999999957,45.881934999999999],[-60.96805599999999,45.883331000000055],[-60.960281000000009,45.880272000000048],[-60.919448999999986,45.857498000000078],[-60.915833000000021,45.852776000000006],[-60.917777999999942,45.847487999999998],[-60.935271999999941,45.825271999999984],[-60.940551999999911,45.821663000000001],[-60.947495000000004,45.820549000000028],[-61.019446999999957,45.809989999999971],[-61.067504999999983,45.791663999999969],[-61.079169999999976,45.786110000000008],[-61.118057000000022,45.763611000000026],[-61.12777699999998,45.755271999999991],[-61.147223999999994,45.704993999999999],[-61.149170000000026,45.699715000000026],[-61.142501999999922,45.696381000000031],[-61.077498999999932,45.688880999999981],[-61.070838999999978,45.689987000000031],[-61.041945999999996,45.704162999999994],[-61.012778999999966,45.718880000000013],[-60.996391000000017,45.727767999999969],[-60.972771000000023,45.738045],[-60.954719999999952,45.745543999999938],[-60.935829000000012,45.751389000000074],[-60.92222599999991,45.75360900000004],[-60.914443999999946,45.75360900000004],[-60.890556000000004,45.751663000000008],[-60.881942999999922,45.750000000000057],[-60.864165999999898,45.744438000000116],[-60.844161999999983,45.735268000000076],[-60.816665999999998,45.722488000000112],[-60.809998000000007,45.719154000000117],[-60.800835000000006,45.71166199999999],[-60.729438999999957,45.778603000000032],[-60.719718999999998,45.788329999999974],[-60.516944999999964,45.920830000000137],[-60.491942999999878,45.929436000000067],[-60.466942000000017,45.938041999999996],[-60.409163999999976,45.979987999999935],[-60.404166999999973,45.984436000000073],[-60.395835999999974,45.99610100000001],[-60.40166499999998,45.994713000000104],[-60.555000000000007,45.946938000000102],[-60.611671000000001,45.924995000000138],[-60.629722999999899,45.917496000000142],[-60.639998999999989,45.91027100000008],[-60.644721999999945,45.905548000000124],[-60.655272999999966,45.898330999999985],[-60.661110000000008,45.895270999999923],[-60.673331999999903,45.890549000000021],[-60.686110999999926,45.886940000000038],[-60.69388600000002,45.886107999999922],[-60.708892999999875,45.887215000000026],[-60.723327999999981,45.893326000000116],[-60.788337999999953,45.929436000000067],[-60.789725999999973,45.934433000000126],[-60.788895000000025,45.939986999999974],[-60.785278000000005,45.946381000000031],[-60.78055599999999,45.950828999999999],[-60.691382999999973,46.001937999999939],[-60.679168999999945,46.006660000000011],[-60.601395000000025,46.039719000000105],[-60.541114999999991,46.065544000000102],[-60.523612999999955,46.075554000000011],[-60.490836999999942,46.094437000000084],[-60.30999799999995,46.206939999999975],[-60.30499999999995,46.210548000000074],[-60.299994999999967,46.214996000000042],[-60.295279999999934,46.226936000000137],[-60.295279999999934,46.232208000000071],[-60.304169000000002,46.233878999999945],[-60.365554999999972,46.224990999999989],[-60.372771999999998,46.223320000000115],[-60.396111000000019,46.213051000000064],[-60.401938999999913,46.21027399999997],[-60.418335000000013,46.199996999999996],[-60.428054999999915,46.192490000000078],[-60.442497000000003,46.17943600000001],[-60.463332999999921,46.163879000000122],[-60.479163999999912,46.152771000000143],[-60.528053,46.121658000000139],[-60.605835000000013,46.074715000000083],[-60.629997000000003,46.065269000000114],[-60.644164999999987,46.063049000000092],[-60.65193899999997,46.063880999999981],[-60.656104999999968,46.067772000000048],[-60.656386999999938,46.073051000000021],[-60.652495999999985,46.079436999999984],[-60.638335999999867,46.093048000000124],[-60.456107999999972,46.241379000000052],[-60.404998999999975,46.279991000000052],[-60.399726999999984,46.283882000000119],[-60.388892999999996,46.291106999999954],[-60.359725999999966,46.304993000000138],[-60.347778000000005,46.310546999999985],[-60.285278000000005,46.321381000000031],[-60.205558999999994,46.240273000000002],[-60.138054000000011,46.246658000000025],[-60.131942999999922,46.248604000000114],[-60.124167999999997,46.248604000000114],[-60.099997999999971,46.246384000000091],[-60.091666999999916,46.244713000000047],[-59.950553999999897,46.201385000000073],[-59.873054999999965,46.17582699999997],[-59.808608999999876,46.111938000000066],[-59.80972300000002,46.106384000000048],[-59.819449999999961,46.097214000000008],[-59.834166999999979,46.084717000000012],[-59.853888999999924,46.00249500000001],[-59.840553,45.938324000000023],[-59.958610999999962,45.901657000000057],[-60.130279999999971,45.867767000000129],[-60.136115999999959,45.864997999999957],[-60.155272999999966,45.846656999999993],[-60.159438999999963,45.841102999999976],[-60.160552999999936,45.835548000000074],[-60.174445999999989,45.76388500000013],[-60.229163999999969,45.705551000000128],[-60.233886999999925,45.701102999999932],[-60.245834000000002,45.69499200000007],[-60.379723000000013,45.644997000000046],[-60.392226999999991,45.641105999999979],[-60.411666999999966,45.636940000000095],[-60.49888599999997,45.620269999999948],[-60.513061999999934,45.618880999999988],[-60.55750299999994,45.618049999999982],[-60.765556000000004,45.594994000000099],[-60.960830999999928,45.599433999999917],[-61.101669000000015,45.564437999999996],[-61.14833799999991,45.555267000000072],[-61.168334999999956,45.551384000000098],[-61.196917999999982,45.583740000000091],[-61.218696999999963,45.580788000000098],[-61.237521999999956,45.581528000000048],[-61.273055999999997,45.561935000000005],[-61.336945000000014,45.573326000000009],[-61.37557599999991,45.622131000000138],[-61.430556999999965,45.665543000000071],[-61.454719999999952,45.705551000000128],[-61.457503999999972,45.71527100000003],[-61.478049999999996,45.803879000000109],[-61.494720000000029,45.846381999999949],[-61.527495999999985,45.98943300000002],[-61.455558999999994,46.137497000000053],[-61.447776999999974,46.149436999999978],[-61.438888999999961,46.159430999999984],[-61.412772999999959,46.178329000000076],[-61.390839000000028,46.191376000000105],[-61.37388599999997,46.200829000000113],[-61.343329999999924,46.212493999999992],[-61.305557000000022,46.224990999999989],[-61.293892000000028,46.230819999999994],[-61.283332999999971,46.238884000000041],[-61.09722099999999,46.44609800000012],[-61.089438999999913,46.458046000000138],[-61.035278000000005,46.555549999999982],[-61.033057999999926,46.561661000000072],[-61.031113000000005,46.572769000000051],[-61.032501000000025,46.577492000000063],[-60.996947999999918,46.634720000000073],[-60.892226999999991,46.77388000000002],[-60.873610999999869,46.793052999999929],[-60.86361699999992,46.801384000000041],[-60.84027900000001,46.813605999999993],[-60.833884999999896,46.815543999999932],[-60.805557000000022,46.820273999999984],[-60.793892000000028,46.825271999999984],[-60.724716000000001,46.874992000000134],[-60.714721999999995,46.88249200000007],[-60.704444999999907,46.891380000000026],[-60.695273999999927,46.901657],[-60.686660999999958,46.912491000000045],[-60.678336999999942,46.930824000000143],[-60.670554999999979,46.953606000000036],[-60.664444000000003,46.966103000000032],[-60.65694400000001,46.978600000000029],[-60.640282000000013,47],[-60.609169000000009,47.024437000000091],[-60.597777999999892,47.031105000000025],[-60.591942000000017,47.033333000000027],[-60.583327999999938,47.031661999999926],[-60.460830999999871,46.999161000000015],[-60.427498000000014,46.965827999999988],[-60.493889000000024,46.902214000000072],[-60.498055000000022,46.896660000000111],[-60.452224999999942,46.864441000000056],[-60.445273999999984,46.861664000000133]],[[-64.039718999999991,46.743324000000086],[-64.031677000000002,46.742767000000015],[-64.016402999999912,46.743607000000054],[-64.009170999999981,46.744156000000032],[-64.005004999999983,46.749718000000144],[-63.999999999999943,46.75360900000004],[-63.991668999999945,46.753052000000139],[-63.979163999999912,46.746383999999978],[-63.974715999999944,46.742493000000081],[-63.832503999999972,46.617210000000057],[-63.831673000000023,46.611938000000123],[-63.865004999999883,46.537498000000085],[-63.868888999999967,46.531937000000084],[-63.840836000000024,46.464438999999913],[-63.828339000000028,46.458046000000138],[-63.780281000000002,46.44499200000007],[-63.742226000000016,46.439430000000129],[-63.733054999999979,46.438881000000038],[-63.709442000000024,46.43749200000002],[-63.703888000000006,46.440544000000102],[-63.698050999999964,46.456383000000073],[-63.698607999999979,46.461662000000047],[-63.700279000000023,46.466385000000002],[-63.722771000000023,46.48054500000012],[-63.738051999999982,46.491378999999995],[-63.739998000000014,46.496101000000067],[-63.723327999999924,46.543610000000058],[-63.716110000000015,46.553879000000109],[-63.709723999999994,46.556099000000131],[-63.676391999999964,46.564156000000082],[-63.662216000000001,46.566382999999973],[-63.647223999999881,46.56721500000009],[-63.618889000000024,46.561104],[-63.497779999999977,46.527771000000143],[-63.315001999999936,46.488602000000071],[-63.271979999999928,46.426926000000094],[-63.240661999999986,46.420456000000001],[-63.216392999999982,46.412209000000132],[-62.942771999999877,46.426941000000113],[-62.862777999999935,46.434715000000097],[-62.698607999999979,46.452492000000007],[-62.692497000000003,46.456100000000106],[-62.686385999999914,46.457497000000046],[-62.665833000000021,46.461104999999975],[-62.595001000000025,46.470825000000048],[-62.477218999999991,46.477768000000026],[-62.455558999999994,46.478600000000142],[-62.182502999999997,46.485824999999977],[-62.166388999999981,46.486107000000061],[-62.133330999999941,46.482764999999915],[-62.058051999999975,46.472762999999986],[-62.014724999999942,46.46527100000003],[-61.979720999999984,46.45915999999994],[-61.970551,46.456940000000145],[-61.965003999999965,46.453323000000012],[-61.968886999999995,46.447768999999994],[-61.973609999999951,46.443047000000092],[-62.013061999999991,46.421104000000128],[-62.101112000000001,46.379715000000033],[-62.173331999999959,46.349433999999974],[-62.215552999999943,46.343605000000139],[-62.279723999999931,46.338043000000027],[-62.309166000000005,46.349998000000085],[-62.326392999999996,46.354996000000085],[-62.342773000000022,46.356102000000135],[-62.357779999999934,46.35582700000009],[-62.355834999999956,46.35083000000003],[-62.348052999999993,46.332214000000022],[-62.334723999999994,46.311935000000062],[-62.361945999999932,46.276657000000057],[-62.419448999999986,46.219986000000119],[-62.424720999999977,46.215546000000074],[-62.453888000000006,46.21443899999997],[-62.507506999999919,46.214157000000114],[-62.603888999999924,46.182495000000131],[-62.603888999999924,46.177215999999987],[-62.54222900000002,46.122490000000028],[-62.507506999999919,46.118881000000044],[-62.5,46.119156000000089],[-62.478333000000021,46.120827000000133],[-62.477218999999991,46.126380999999924],[-62.478881999999999,46.131935000000112],[-62.481667000000016,46.13638300000008],[-62.489998000000014,46.138328999999999],[-62.497222999999963,46.138046000000031],[-62.506110999999976,46.139717000000076],[-62.513892999999996,46.142220000000066],[-62.509726999999998,46.148605000000032],[-62.504448000000025,46.150825999999995],[-62.489166000000012,46.151382000000126],[-62.473052999999993,46.150269000000094],[-62.468886999999995,46.146102999999982],[-62.449164999999937,46.100548000000003],[-62.447494999999947,46.095543000000134],[-62.446945000000028,46.090546000000018],[-62.454720000000009,46.018883000000073],[-62.459166999999979,46.006386000000077],[-62.473609999999951,45.994713000000104],[-62.496947999999975,45.983879000000002],[-62.510001999999929,45.979156000000046],[-62.541671999999949,45.970543000000077],[-62.548614999999927,45.969437000000028],[-62.591667000000029,45.964996000000099],[-62.613891999999964,45.962769000000037],[-62.650276000000019,45.960274000000027],[-62.761115999999959,45.954162999999937],[-62.837776000000019,45.967490999999939],[-62.856667000000016,45.977486000000056],[-62.882773999999984,45.995544000000109],[-62.930283000000031,46.037215999999944],[-62.970832999999971,46.07416500000005],[-62.922500999999954,46.092491000000052],[-62.917220999999984,46.096382000000119],[-62.875274999999931,46.134995000000004],[-62.871940999999936,46.143607999999972],[-62.885276999999974,46.155823000000055],[-62.890839000000028,46.159430999999984],[-63.025276000000019,46.189156000000082],[-63.103614999999991,46.201934999999935],[-63.112777999999992,46.204163000000108],[-63.119445999999868,46.207214000000135],[-63.12222300000002,46.211662000000103],[-63.120276999999987,46.217766000000097],[-63.115836999999942,46.222487999999998],[-63.038895000000025,46.280273000000079],[-63.02416999999997,46.290275999999949],[-63.017776000000026,46.292496000000142],[-63.010284000000013,46.292770000000075],[-63.002228000000002,46.289992999999981],[-62.99610899999999,46.292220999999984],[-62.979438999999957,46.301658999999972],[-62.969161999999983,46.309432999999956],[-62.964721999999881,46.314156000000139],[-62.962775999999963,46.319992000000013],[-62.969443999999953,46.31888600000002],[-63.035277999999892,46.301658999999972],[-63.041388999999981,46.299721000000034],[-63.052779999999927,46.293884000000048],[-63.058608999999933,46.290833000000021],[-63.090836000000024,46.26915699999995],[-63.165001000000018,46.210548000000074],[-63.143332999999984,46.201660000000118],[-63.139167999999984,46.197769000000051],[-63.138610999999912,46.192490000000078],[-63.140556000000004,46.186378000000104],[-63.22444200000001,46.139717000000076],[-63.23860899999994,46.138046000000031],[-63.253615999999965,46.137497000000053],[-63.26167299999986,46.138046000000031],[-63.289169000000015,46.14388299999996],[-63.409163999999919,46.176940999999999],[-63.519722000000002,46.206099999999935],[-63.591942000000017,46.211937000000091],[-63.642775999999913,46.224990999999989],[-63.649726999999928,46.228043000000071],[-63.699722000000008,46.259437999999989],[-63.700553999999954,46.269989000000066],[-63.702224999999999,46.27526899999998],[-63.70666499999993,46.278602999999919],[-63.741942999999935,46.304436000000067],[-63.754447999999968,46.310822000000144],[-63.811110999999926,46.32749200000012],[-63.772223999999937,46.360825000000091],[-63.736945999999932,46.353882000000112],[-63.729163999999969,46.352776000000063],[-63.714721999999995,46.354164000000026],[-63.739166000000012,46.391106000000036],[-63.745002999999997,46.394714000000135],[-63.754447999999968,46.396385000000009],[-63.761672999999917,46.396659999999997],[-63.841109999999958,46.39888000000002],[-63.963615000000004,46.401100000000042],[-63.981941000000006,46.39388300000013],[-63.989165999999898,46.393608000000086],[-64.121933000000013,46.404709000000025],[-64.129989999999964,46.407211000000132],[-64.133057000000008,46.4116590000001],[-64.135009999999909,46.416382000000056],[-64.133057000000008,46.43332700000002],[-64.115828999999962,46.523048000000017],[-64.11332699999997,46.53472099999999],[-64.110000999999954,46.541107000000125],[-64.105559999999969,46.54583000000008],[-64.100280999999882,46.549720999999977],[-64.094161999999926,46.551659000000086],[-64.105559999999969,46.618050000000096],[-64.273894999999982,46.62332200000003],[-64.387511999999958,46.62082700000002],[-64.391952999999944,46.624709999999936],[-64.413895000000025,46.665825000000098],[-64.415558000000033,46.670546999999999],[-64.416655999999932,46.68110699999994],[-64.414718999999991,46.697769000000108],[-64.410277999999948,46.711105000000089],[-64.400283999999942,46.727486000000113],[-64.382492000000013,46.746658000000082],[-64.346953999999982,46.773605000000032],[-64.323897999999929,46.786384999999996],[-64.296386999999982,46.801659000000029],[-64.286117999999931,46.80943300000007],[-64.27305599999994,46.823607999999979],[-64.249724999999955,46.868050000000039],[-64.247771999999941,46.874161000000129],[-64.247222999999906,46.879714999999976],[-64.243880999999988,46.886108000000092],[-64.236389000000031,46.897491000000116],[-64.226943999999946,46.906097000000045],[-64.182770000000005,46.945541000000105],[-64.168610000000001,46.956657000000064],[-64.020844000000011,47.038605000000132],[-63.99500299999994,46.984161000000086],[-63.969993999999986,46.901657],[-63.967498999999862,46.891662999999994],[-64.041381999999999,46.82249500000006],[-64.066100999999946,46.804436000000123],[-64.076401000000033,46.798881999999992],[-64.091674999999952,46.778603000000032],[-64.077498999999932,46.756386000000134],[-64.074448000000018,46.752220000000023],[-64.067504999999926,46.749161000000072],[-64.039718999999991,46.743324000000086]],[[-55.876105999999993,47.260551000000021],[-55.968329999999867,47.257773999999927],[-55.946388000000013,47.273323000000062],[-55.934440999999936,47.279434000000094],[-55.895003999999972,47.290833000000021],[-55.888053999999954,47.292496000000142],[-55.881110999999976,47.293326999999977],[-55.872771999999998,47.292221000000097],[-55.865836999999885,47.287773000000129],[-55.855003000000011,47.269714000000022],[-55.876105999999993,47.260551000000021]],[[-61.380554000000018,47.620270000000119],[-61.493057000000022,47.552490000000091],[-61.498610999999926,47.550270000000069],[-61.535560999999973,47.54583000000008],[-61.54222900000002,47.545547000000113],[-61.547782999999868,47.549164000000076],[-61.549445999999989,47.553879000000109],[-61.545279999999991,47.55943300000007],[-61.520279000000016,47.569160000000011],[-61.513892999999939,47.572495000000117],[-61.477492999999924,47.60054800000006],[-61.473610000000008,47.6055530000001],[-61.471382000000006,47.611382000000106],[-61.470551,47.616936000000123],[-61.479163999999969,47.618599000000017],[-61.534447,47.618881000000101],[-61.541945999999996,47.617210000000057],[-61.559440999999993,47.609161000000029],[-61.653610000000015,47.549995000000081],[-61.855559999999969,47.417213000000061],[-61.849723999999981,47.413605000000132],[-61.841667000000029,47.410820000000115],[-61.833611000000019,47.409987999999998],[-61.789169000000015,47.425827000000083],[-61.777221999999995,47.431664000000069],[-61.766662999999937,47.439156000000025],[-61.714447000000007,47.489989999999977],[-61.691382999999973,47.515548999999965],[-61.701392999999939,47.491936000000067],[-61.740836999999942,47.44499200000007],[-61.843329999999924,47.388603000000046],[-61.90589099999994,47.354935000000012],[-61.925277999999992,47.343605000000139],[-61.93332700000002,47.333327999999938],[-61.962776000000019,47.281662000000097],[-61.965003999999965,47.275551000000007],[-61.964721999999995,47.270271000000093],[-61.961945000000014,47.266106000000093],[-61.957503999999972,47.261940000000038],[-61.938605999999993,47.257217000000026],[-61.827782000000013,47.234161000000029],[-61.819450000000018,47.233330000000024],[-61.807776999999987,47.239159000000029],[-61.799445999999989,47.250274999999931],[-61.794723999999917,47.254714999999976],[-61.783057999999869,47.260551000000021],[-61.782775999999956,47.255272000000048],[-61.789725999999916,47.242493000000024],[-61.793892000000028,47.236938000000123],[-61.799445999999989,47.232764999999972],[-61.810279999999977,47.226654000000053],[-61.816948000000025,47.224709000000075],[-61.84444400000001,47.219436999999971],[-61.859443999999883,47.218047999999953],[-61.955276000000026,47.211662000000047],[-61.979995999999971,47.213608000000136],[-61.996390999999903,47.214996000000042],[-62.004722999999956,47.217766000000097],[-62.010001999999872,47.22137500000008],[-62.013061999999991,47.225821999999994],[-62.014724999999942,47.23054500000012],[-62.015006999999912,47.235825000000034],[-62.013061999999991,47.241661000000079],[-61.948607999999979,47.379432999999949],[-61.941665999999941,47.392219999999952],[-61.937499999999943,47.39777400000014],[-61.928054999999972,47.407211000000075],[-61.922225999999966,47.409987999999998],[-61.908889999999928,47.413879000000065],[-61.736114999999984,47.507216999999969],[-61.705832999999984,47.532494000000099],[-61.684440999999936,47.547492999999974],[-61.662216000000001,47.561661000000072],[-61.616942999999992,47.588042999999914],[-61.571114000000023,47.613608999999997],[-61.553611999999987,47.623046999999985],[-61.53583500000002,47.631659999999954],[-61.529167000000029,47.633606000000043],[-61.521110999999962,47.634437999999989],[-61.425277999999992,47.642769000000044],[-61.407775999999956,47.641105999999922],[-61.388892999999996,47.637771999999984],[-61.381942999999922,47.634437999999989],[-61.377776999999924,47.631103999999993],[-61.376105999999993,47.626380999999981],[-61.380554000000018,47.620270000000119]],[[-54.261391000000003,47.39027400000009],[-54.268889999999999,47.389717000000019],[-54.293059999999969,47.391663000000051],[-54.341385000000002,47.398048000000074],[-54.358054999999979,47.403046000000074],[-54.364448999999979,47.406654000000003],[-54.365554999999915,47.411659000000043],[-54.359726000000023,47.416664000000083],[-54.326392999999996,47.436653000000035],[-54.295279999999991,47.44999700000011],[-54.278053,47.460823000000062],[-54.267220000000009,47.469437000000084],[-54.262222000000008,47.474709000000018],[-54.257781999999963,47.480820000000108],[-54.230552999999986,47.523605000000032],[-54.229996000000028,47.550270000000069],[-54.204719999999952,47.593605000000082],[-54.13527699999986,47.668053000000043],[-54.128882999999973,47.670546999999999],[-54.122771999999998,47.66693900000007],[-54.121940999999993,47.661934000000031],[-54.122222999999963,47.656937000000084],[-54.124999999999943,47.640831000000105],[-54.160827999999981,47.534996000000035],[-54.238892000000021,47.40387700000008],[-54.243331999999953,47.399437000000091],[-54.255004999999983,47.392769000000101],[-54.261391000000003,47.39027400000009]],[[-54.077498999999989,47.479431000000091],[-54.08306099999993,47.474991000000102],[-54.093055999999933,47.483046999999999],[-54.096663999999976,47.487213000000054],[-54.101112000000001,47.496384000000035],[-54.101944000000003,47.501389000000074],[-54.099723999999924,47.558883999999978],[-54.09833500000002,47.589714000000015],[-54.097220999999934,47.605270000000132],[-54.09332999999998,47.631659999999954],[-54.083610999999962,47.679717999999923],[-54.078612999999962,47.684990000000028],[-54.071388000000013,47.685546999999929],[-54.067504999999983,47.681107000000111],[-54.060555000000022,47.651099999999985],[-54.078056000000004,47.563881000000038],[-54.05972300000002,47.532211000000132],[-54.058891000000017,47.527214000000072],[-54.077498999999989,47.479431000000091]],[[-55.901938999999857,47.602493000000038],[-55.923057999999912,47.599434000000088],[-55.947220000000016,47.601936000000137],[-56.013335999999981,47.611664000000019],[-56.097778000000005,47.627487000000031],[-56.105559999999855,47.630821000000026],[-56.109169000000009,47.63499500000006],[-56.113616999999977,47.644714000000022],[-56.112220999999977,47.649719000000118],[-56.106666999999959,47.654709000000139],[-56.100280999999939,47.657211000000018],[-56.005835999999988,47.680274999999995],[-55.941108999999983,47.689156000000139],[-55.933883999999978,47.688324000000023],[-55.92861199999993,47.684432999999956],[-55.927498000000014,47.676658999999972],[-55.934440999999936,47.658882000000119],[-55.934440999999936,47.653877000000023],[-55.932502999999997,47.643883000000017],[-55.930000000000007,47.639435000000049],[-55.926392000000021,47.635268999999994],[-55.914161999999976,47.628326000000015],[-55.889442000000031,47.618881000000101],[-55.876388999999961,47.611664000000019],[-55.882499999999936,47.607773000000122],[-55.901938999999857,47.602493000000038]],[[-64.482773000000009,47.917770000000019],[-64.50167799999997,47.856384000000048],[-64.503615999999909,47.850273000000016],[-64.514724999999999,47.832497000000046],[-64.523055999999997,47.822220000000016],[-64.541106999999954,47.80332199999998],[-64.604995999999971,47.748329000000126],[-64.610549999999989,47.745270000000005],[-64.635833999999988,47.735825000000091],[-64.647507000000019,47.733879000000002],[-64.690551999999968,47.753052000000139],[-64.693328999999949,47.758049000000028],[-64.702788999999939,47.823607999999979],[-64.697768999999994,47.836104999999918],[-64.685546999999985,47.852219000000048],[-64.667496000000028,47.866936000000067],[-64.662215999999944,47.870827000000133],[-64.624160999999958,47.884719999999959],[-64.617767000000015,47.886658000000125],[-64.609160999999972,47.886939999999981],[-64.584166999999923,47.884995000000004],[-64.508057000000008,47.903877000000023],[-64.482773000000009,47.917770000000019]],[[-64.567504999999926,47.899436999999978],[-64.574448000000018,47.89804799999996],[-64.583617999999888,47.899436999999978],[-64.589447000000007,47.902771000000143],[-64.593886999999995,47.90665400000006],[-64.594451999999933,47.911933999999974],[-64.593612999999891,47.918052999999986],[-64.531677000000002,48.016105999999979],[-64.52694699999995,48.02165999999994],[-64.522780999999952,48.025551000000007],[-64.516952999999944,48.028602999999976],[-64.509734999999921,48.029991000000052],[-64.50111400000003,48.027488999999946],[-64.495543999999938,48.023880000000133],[-64.490828999999906,48.019989000000066],[-64.48582499999992,48.013054000000011],[-64.482773000000009,48.008606000000043],[-64.469726999999978,47.969711000000132],[-64.469161999999869,47.96443899999997],[-64.470550999999944,47.953323000000069],[-64.47444200000001,47.947769000000051],[-64.496383999999978,47.933875999999998],[-64.513901000000033,47.924712999999997],[-64.567504999999926,47.899436999999978]],[[-53.712775999999963,48.14888000000002],[-53.689720000000023,48.147217000000126],[-53.682502999999997,48.147774000000027],[-53.667503000000011,48.150542999999971],[-53.647781000000009,48.155265999999926],[-53.615554999999915,48.167496000000028],[-53.583327999999995,48.18082400000003],[-53.571113999999909,48.186104000000114],[-53.564162999999951,48.190543999999932],[-53.553054999999972,48.199158000000011],[-53.539444000000003,48.202217000000132],[-53.53167000000002,48.202774000000034],[-53.516395999999986,48.201935000000105],[-53.509726999999941,48.198326000000066],[-53.509170999999867,48.193321000000026],[-53.510833999999988,48.150826000000109],[-53.512504999999919,48.145271000000037],[-53.530829999999924,48.097771000000023],[-53.536391999999978,48.093323000000055],[-53.549445999999989,48.088600000000099],[-53.56361400000003,48.084991000000116],[-53.598884999999996,48.079437000000098],[-53.634170999999924,48.075272000000098],[-53.823333999999932,48.092765999999983],[-53.83943899999997,48.094437000000084],[-53.856110000000001,48.098044999999956],[-53.871940999999936,48.104713000000118],[-53.876663000000008,48.108604000000014],[-53.93250299999994,48.172767999999962],[-53.935829000000012,48.182495000000131],[-53.932776999999987,48.198326000000066],[-53.929168999999945,48.209434999999985],[-53.922225999999966,48.212493999999936],[-53.906386999999938,48.21027400000014],[-53.898887999999943,48.206657000000007],[-53.860000999999954,48.174438000000123],[-53.855559999999969,48.169991000000095],[-53.712775999999963,48.14888000000002]],[[-123.47444200000001,48.709160000000054],[-123.48277300000001,48.708328000000108],[-123.48999000000003,48.709435000000042],[-123.51306199999993,48.716385000000116],[-123.52471899999989,48.722488000000055],[-123.54943800000001,48.746658000000082],[-123.551941,48.752220000000023],[-123.59277299999991,48.898331000000098],[-123.595551,48.909714000000122],[-123.59612299999998,48.928329000000076],[-123.59665699999994,48.946938000000046],[-123.59361299999995,48.947211999999979],[-123.58056599999992,48.935547000000042],[-123.57721699999996,48.929161000000136],[-123.53611799999999,48.914993000000095],[-123.53028899999998,48.911933999999974],[-123.45749699999993,48.863052000000039],[-123.43388400000003,48.844437000000084],[-123.37027,48.768326000000002],[-123.36888099999993,48.762771999999984],[-123.37165800000002,48.75750000000005],[-123.37638900000002,48.753608999999983],[-123.43195300000002,48.721099999999979],[-123.47444200000001,48.709160000000054]],[[-58.342223999999987,49.066101000000117],[-58.349166999999966,49.064437999999996],[-58.356109999999944,49.065826000000129],[-58.351943999999889,49.071938000000102],[-58.341385000000002,49.07638500000013],[-58.333611000000019,49.077773999999977],[-58.330558999999994,49.073326000000009],[-58.335830999999928,49.068885999999964],[-58.342223999999987,49.066101000000117]],[[-123.32277699999997,48.861107000000004],[-123.3705369999999,48.856384000000048],[-123.37888299999997,48.85694100000012],[-123.38474299999996,48.859993000000031],[-123.54055799999998,48.944992000000127],[-123.66251399999999,49.03527100000008],[-123.70388800000001,49.095268000000033],[-123.70527599999997,49.100273000000072],[-123.70249899999999,49.105552999999986],[-123.695831,49.108047000000113],[-123.68639400000001,49.106659000000036],[-123.68055700000002,49.103607000000068],[-123.674713,49.093048000000067],[-123.65943900000002,49.073608000000036],[-123.60444599999994,49.014717000000132],[-123.58640300000002,49.000549000000092],[-123.52166699999998,48.96027400000014],[-123.49916099999996,48.947211999999979],[-123.487503,48.94110100000006],[-123.45973200000003,48.930549999999982],[-123.43639399999995,48.924438000000009],[-123.42027299999995,48.920547000000113],[-123.38194299999992,48.910819999999944],[-123.32833900000003,48.895827999999938],[-123.32250999999991,48.892768999999987],[-123.31777999999997,48.88888500000013],[-123.31276700000001,48.872765000000072],[-123.3125,48.868050000000039],[-123.31639100000001,48.863327000000027],[-123.32277699999997,48.861107000000004]],[[-125.816101,49.125824000000136],[-125.82028200000002,49.124709999999993],[-125.86028299999998,49.134438000000046],[-125.906387,49.160820000000115],[-125.91027800000001,49.165543000000071],[-125.92582699999991,49.190826000000015],[-125.93360899999993,49.211104999999918],[-125.93306000000001,49.218048000000124],[-125.93055700000002,49.219986000000063],[-125.92610200000001,49.223320000000058],[-125.87888299999992,49.235824999999977],[-125.86749299999997,49.233330000000137],[-125.82917800000001,49.226379000000009],[-125.81806899999987,49.220543000000134],[-125.79915599999998,49.208328000000051],[-125.78888699999993,49.172768000000133],[-125.79583699999995,49.151932000000102],[-125.79833999999994,49.146385000000009],[-125.81249999999994,49.129158000000132],[-125.816101,49.125824000000136]],[[-126.13194299999992,49.393325999999945],[-126.126938,49.390274000000034],[-126.12470999999999,49.390274000000034],[-126.12053699999996,49.388602999999989],[-126.11054999999999,49.382210000000043],[-126.10665899999992,49.378601000000003],[-126.09612300000003,49.368599000000074],[-126.08640300000002,49.358604000000128],[-126.07277699999997,49.34304800000001],[-126.0497279999999,49.265548999999965],[-126.0511019999999,49.260550999999964],[-126.05583200000001,49.256104000000107],[-126.06471299999987,49.250832000000003],[-126.07112100000001,49.248329000000012],[-126.07972699999999,49.246658000000139],[-126.08917199999991,49.246101000000067],[-126.09638999999999,49.24721500000004],[-126.18666100000002,49.263328999999999],[-126.19167299999992,49.265548999999965],[-126.22332799999992,49.279716000000121],[-126.22944599999994,49.282493999999929],[-126.23916600000001,49.289718999999991],[-126.23473399999995,49.374161000000015],[-126.22917200000001,49.378601000000003],[-126.22138999999999,49.380547000000092],[-126.14138800000001,49.39415699999995],[-126.13194299999992,49.393325999999945]],[[-123.37943999999999,49.326941999999974],[-123.39222699999999,49.326103000000046],[-123.41027799999995,49.334159999999997],[-123.42194399999994,49.339714000000015],[-123.42666600000001,49.344154000000003],[-123.42804699999999,49.348877000000016],[-123.42027299999995,49.381660000000011],[-123.41332999999997,49.386107999999979],[-123.3600009999999,49.411658999999986],[-123.35472099999998,49.413322000000107],[-123.327789,49.416664000000083],[-123.31696299999999,49.417496000000142],[-123.31220999999999,49.414992999999981],[-123.30943300000001,49.41137700000013],[-123.31027199999994,49.40526600000004],[-123.31194299999993,49.401932000000045],[-123.327789,49.363052000000096],[-123.33112299999999,49.354996000000028],[-123.34472699999998,49.341934000000037],[-123.36833199999995,49.330275999999969],[-123.37943999999999,49.326941999999974]],[[-54.705276000000026,49.400543000000084],[-54.712776000000019,49.398330999999985],[-54.730277999999998,49.403046000000018],[-54.735557999999969,49.407211000000018],[-54.759726999999941,49.432495000000017],[-54.759170999999981,49.437766999999951],[-54.754723000000013,49.443878000000041],[-54.749442999999928,49.449158000000125],[-54.73833499999995,49.457771000000093],[-54.680556999999908,49.49193600000001],[-54.673057999999912,49.492493000000081],[-54.665001000000018,49.489159000000086],[-54.644164999999987,49.473320000000001],[-54.640281999999956,49.46915400000006],[-54.640838999999971,49.463881999999955],[-54.654716000000008,49.460823000000005],[-54.684440999999993,49.420546999999999],[-54.699164999999994,49.40387700000008],[-54.705276000000026,49.400543000000084]],[[-124.179169,49.441101000000117],[-124.18554699999999,49.439986999999974],[-124.31360599999999,49.456099999999992],[-124.32668299999995,49.460823000000005],[-124.36000099999995,49.474433999999974],[-124.36609599999997,49.477486000000056],[-124.37082699999996,49.481102000000135],[-124.37165799999997,49.483047000000113],[-124.38054699999998,49.506943000000035],[-124.38110399999994,49.511940000000095],[-124.37832599999996,49.515830999999991],[-124.37165799999997,49.518326000000002],[-124.361107,49.519157000000064],[-124.35500299999995,49.517494000000113],[-124.34889199999998,49.514442000000031],[-124.30471799999992,49.512214999999969],[-124.24471999999997,49.501389000000017],[-124.23750299999995,49.498329000000126],[-124.22138999999993,49.491379000000109],[-124.1875,49.474433999999974],[-124.18167099999999,49.471375000000023],[-124.17388900000003,49.45638299999996],[-124.17194399999994,49.446655000000135],[-124.17223399999989,49.444153000000085],[-124.179169,49.441101000000117]],[[-123.33277899999996,49.441101000000117],[-123.36028299999987,49.433051999999918],[-123.37499999999994,49.433327000000133],[-123.442207,49.438599000000067],[-123.448036,49.441658000000018],[-123.45944199999997,49.467209000000082],[-123.45973200000003,49.470543000000077],[-123.45305599999995,49.495544000000109],[-123.44526699999994,49.51527400000009],[-123.43666100000002,49.522217000000069],[-123.38082899999995,49.536110000000122],[-123.37000299999994,49.536110000000122],[-123.360817,49.534995999999978],[-123.3550029999999,49.531936999999971],[-123.33833300000003,49.50610400000005],[-123.33167999999995,49.500832000000116],[-123.32805599999995,49.496383999999978],[-123.32389799999993,49.488602000000014],[-123.319458,49.474708999999962],[-123.31777999999997,49.464157],[-123.319458,49.451934999999992],[-123.32224300000001,49.448043999999925],[-123.32695000000001,49.444153000000085],[-123.33277899999996,49.441101000000117]],[[-55.695548999999971,49.506943000000035],[-55.725829999999974,49.505554000000018],[-55.732497999999964,49.509163000000001],[-55.735001000000011,49.513610999999969],[-55.736114999999984,49.518599999999935],[-55.735832000000016,49.52388000000002],[-55.730277999999942,49.545547000000056],[-55.722771000000023,49.557770000000119],[-55.716110000000015,49.560271999999998],[-55.684998000000007,49.561104000000114],[-55.676948999999979,49.561104000000114],[-55.658332999999971,49.559158000000025],[-55.653052999999886,49.555267000000129],[-55.652221999999938,49.550270000000069],[-55.653885000000002,49.544716000000051],[-55.661384999999939,49.529716000000064],[-55.664444000000003,49.52388000000002],[-55.68111399999998,49.510826000000122],[-55.687499999999943,49.508049000000028],[-55.695548999999971,49.506943000000035]],[[-124.68943799999994,49.480270000000019],[-124.69611399999997,49.477767999999969],[-124.70221700000002,49.478042999999957],[-124.74137899999994,49.488045000000113],[-124.75361599999991,49.491379000000109],[-124.82362399999994,49.539435999999966],[-124.83666999999997,49.554993000000024],[-124.84111000000001,49.562767000000008],[-124.84249899999992,49.578605999999979],[-124.84194899999989,49.58415999999994],[-124.83416699999992,49.607773000000066],[-124.83168000000001,49.610549999999989],[-124.82749899999993,49.608887000000038],[-124.81054699999993,49.589714000000129],[-124.80888400000003,49.586655000000007],[-124.80583200000001,49.585823000000062],[-124.77887699999997,49.568886000000077],[-124.68804899999986,49.483604000000014],[-124.68943799999994,49.480270000000019]],[[-55.693053999999961,49.56749700000006],[-55.709166999999979,49.566383000000087],[-55.716659999999933,49.567214999999976],[-55.720832999999971,49.571381000000088],[-55.723052999999993,49.576102999999989],[-55.722771000000023,49.581383000000073],[-55.705832999999927,49.613883999999985],[-55.684998000000007,49.624992000000134],[-55.673888999999974,49.630547000000035],[-55.659720999999934,49.635551000000021],[-55.653052999999886,49.63638300000008],[-55.572776999999974,49.603881999999999],[-55.567504999999926,49.599998000000141],[-55.573058999999944,49.595543000000134],[-55.586387999999943,49.59137700000008],[-55.608054999999979,49.586104999999975],[-55.671669000000009,49.571381000000088],[-55.693053999999961,49.56749700000006]],[[-54.576667999999984,49.558601000000124],[-54.77305599999994,49.493880999999988],[-54.809440999999993,49.488045000000113],[-54.83916499999998,49.48443600000013],[-54.855835000000013,49.48443600000013],[-54.863060000000019,49.485268000000019],[-54.871940999999936,49.487495000000081],[-54.873055000000022,49.492218000000094],[-54.893616000000009,49.580551000000128],[-54.894447000000014,49.58526599999999],[-54.891945000000021,49.590546000000074],[-54.885276999999974,49.593048000000124],[-54.805556999999965,49.595825000000048],[-54.792228999999963,49.572768999999994],[-54.793335000000013,49.566939999999988],[-54.791671999999892,49.56249200000002],[-54.78833800000001,49.557770000000119],[-54.784172000000012,49.554161000000136],[-54.768607999999972,49.546661000000029],[-54.760001999999986,49.545547000000056],[-54.743889000000024,49.544998000000135],[-54.729720999999984,49.548050000000046],[-54.708611000000019,49.554436000000123],[-54.614722999999969,49.606102000000021],[-54.574722000000008,49.635269000000108],[-54.561942999999928,49.653603000000089],[-54.548889000000031,49.659988000000055],[-54.536117999999931,49.664153999999996],[-54.529723999999987,49.633881000000031],[-54.531669999999963,49.62221500000004],[-54.538054999999986,49.587494000000106],[-54.543334999999956,49.582497000000046],[-54.570557000000008,49.562209999999936],[-54.576667999999984,49.558601000000124]],[[-54.004448000000025,49.647491000000116],[-54.257781999999963,49.566666000000055],[-54.265839000000028,49.566939999999988],[-54.274719000000005,49.569160000000011],[-54.289444000000003,49.576102999999989],[-54.293335000000013,49.580551000000128],[-54.298888999999917,49.609993000000088],[-54.297782999999981,49.651100000000099],[-54.288054999999929,49.71138000000002],[-54.282775999999956,49.716660000000104],[-54.269996999999989,49.722487999999998],[-54.141945000000021,49.75],[-54.102225999999973,49.750274999999988],[-54.093886999999938,49.748878000000047],[-54.085830999999985,49.745544000000052],[-54.081115999999952,49.736381999999935],[-54.040000999999961,49.689987000000087],[-54.003058999999951,49.659988000000055],[-54.004448000000025,49.647491000000116]],[[-124.129707,49.650825999999995],[-124.139183,49.650543000000027],[-124.15361000000001,49.655548000000067],[-124.18694299999993,49.668883999999991],[-124.196663,49.676940999999999],[-124.20195000000001,49.701934999999992],[-124.19943199999989,49.706099999999992],[-124.14750699999996,49.746658000000025],[-124.14277600000003,49.75],[-124.13722199999995,49.752219999999966],[-124.09166699999997,49.767769000000101],[-124.03611799999999,49.777214000000129],[-124.029449,49.778328000000101],[-124.021118,49.77777100000003],[-124.01611299999996,49.775551000000007],[-124.01862299999999,49.77165999999994],[-124.02555799999993,49.767769000000101],[-124.04611199999999,49.756386000000077],[-124.06054699999999,49.744995000000131],[-124.07472200000001,49.733330000000024],[-124.09084300000001,49.715546000000131],[-124.10109699999992,49.700272000000041],[-124.10555999999991,49.689430000000016],[-124.10722399999992,49.677215999999987],[-124.11081699999994,49.664992999999924],[-124.11361699999998,49.659713999999951],[-124.12304699999993,49.651931999999988],[-124.129707,49.650825999999995]],[[-56.80361199999993,49.763329000000056],[-56.827498999999989,49.761107999999979],[-56.83555599999994,49.762771999999984],[-56.83805099999995,49.767494000000056],[-56.832779000000016,49.771934999999985],[-56.826667999999984,49.77526899999998],[-56.792503000000011,49.785552999999993],[-56.782218999999998,49.78694200000001],[-56.78194400000001,49.780822999999941],[-56.790840000000003,49.768326000000002],[-56.796669000000009,49.764999000000046],[-56.80361199999993,49.763329000000056]],[[-124.44611399999991,49.723320000000115],[-124.43749999999994,49.723045000000127],[-124.42887899999994,49.723877000000016],[-124.41000400000001,49.723045000000127],[-124.38137799999998,49.713326000000109],[-124.35138699999999,49.698044000000095],[-124.33277900000002,49.683327000000077],[-124.13474300000001,49.525269000000037],[-124.13221699999991,49.520271000000037],[-124.12416100000002,49.499161000000072],[-124.122772,49.493607000000054],[-124.12748699999997,49.489715999999987],[-124.13417099999992,49.487495000000081],[-124.14167799999996,49.485825000000091],[-124.14916999999997,49.486107000000004],[-124.15527299999985,49.488602000000014],[-124.281387,49.546661000000029],[-124.40583800000002,49.605826999999977],[-124.43804899999998,49.628875999999991],[-124.44220699999994,49.638046000000031],[-124.47666900000002,49.67193600000013],[-124.5396649999999,49.692768000000001],[-124.55249799999996,49.697105000000022],[-124.56167599999998,49.699935999999923],[-124.61416600000001,49.713607999999965],[-124.62721299999993,49.71915400000006],[-124.65416699999997,49.736107000000118],[-124.66082799999992,49.742767000000129],[-124.65666199999993,49.796943999999939],[-124.65110800000002,49.799995000000138],[-124.61945300000002,49.797218000000044],[-124.604446,49.789436000000137],[-124.59944199999995,49.78443900000002],[-124.59028599999999,49.77165999999994],[-124.56234000000001,49.753326000000015],[-124.55933399999998,49.751495000000034],[-124.49472000000003,49.733330000000024],[-124.44611399999991,49.723320000000115]],[[-126.67610199999996,49.583603000000039],[-126.68138099999993,49.583054000000118],[-126.68888899999996,49.583878000000084],[-126.69722000000002,49.585548000000074],[-126.78971899999999,49.612213000000111],[-126.80803699999996,49.61971299999999],[-126.81416299999995,49.622765000000072],[-126.90556300000003,49.685547000000099],[-126.96528599999999,49.726935999999966],[-126.96945199999999,49.731102000000078],[-126.97416699999991,49.740273000000002],[-126.97556299999997,49.75],[-126.94055200000003,49.831383000000017],[-126.890556,49.84777100000008],[-126.79915599999993,49.876099000000011],[-126.77749599999993,49.87971500000009],[-126.76872299999997,49.878616000000079],[-126.74944299999999,49.85694100000012],[-126.73416099999997,49.848045000000013],[-126.67804699999994,49.825272000000098],[-126.64472999999992,49.774162000000047],[-126.636124,49.759437999999989],[-126.63445300000001,49.753883000000087],[-126.61332699999997,49.648330999999985],[-126.61609599999997,49.624435000000062],[-126.62053699999996,49.606102000000021],[-126.62416099999996,49.601386999999988],[-126.63305700000001,49.596100000000035],[-126.66861,49.585548000000074],[-126.67610199999996,49.583603000000039]],[[-62.089721999999881,49.386383000000137],[-62.081389999999999,49.385551000000078],[-62.051665999999955,49.390274000000034],[-62.043616999999927,49.390549000000078],[-62.025276000000019,49.38749700000011],[-61.892226999999934,49.351387000000045],[-61.875557000000015,49.344994000000042],[-61.825835999999924,49.312209999999993],[-61.821114000000023,49.308883999999978],[-61.663329999999917,49.149162000000047],[-61.661666999999966,49.144439999999975],[-61.670837000000006,49.134163000000001],[-61.702224999999942,49.111107000000004],[-61.735557999999969,49.096099999999979],[-61.796111999999937,49.078048999999965],[-62.019996999999989,49.069443000000035],[-62.029167000000029,49.069443000000035],[-62.195549000000028,49.074997000000053],[-62.368057000000022,49.0991590000001],[-62.726105000000018,49.154709000000025],[-62.782218999999884,49.165824999999984],[-62.946662999999944,49.198874999999987],[-63.089995999999985,49.228043000000014],[-63.097778000000005,49.23054500000012],[-63.209442000000024,49.270827999999995],[-63.23082699999992,49.280273000000022],[-63.242774999999938,49.287498000000085],[-63.253059000000007,49.294997999999964],[-63.269996999999989,49.311104],[-63.275832999999977,49.314712999999983],[-63.283332999999914,49.317771999999934],[-63.387221999999952,49.34388000000007],[-63.416945999999882,49.350829999999974],[-63.501296999999965,49.370384000000115],[-63.537223999999867,49.379714999999976],[-63.573058999999944,49.396660000000111],[-63.61611199999993,49.446938000000102],[-63.621940999999879,49.455551000000071],[-63.620833999999945,49.461105000000089],[-63.616660999999908,49.46665999999999],[-63.61333499999995,49.473044999999956],[-63.612502999999947,49.478873999999962],[-63.61611199999993,49.488327000000027],[-63.619720000000029,49.492767000000015],[-63.662772999999959,49.533051],[-63.67888599999992,49.544716000000051],[-63.714446999999893,49.566383000000087],[-63.84194199999996,49.639160000000004],[-63.881942999999978,49.65915700000005],[-63.918334999999956,49.674438000000009],[-64.01556399999987,49.702492000000063],[-64.306945999999925,49.777489000000003],[-64.382216999999969,49.789436000000137],[-64.389998999999932,49.789719000000105],[-64.418335000000013,49.801658999999972],[-64.511123999999995,49.858604000000014],[-64.513901000000033,49.863609000000054],[-64.510283999999956,49.868599000000131],[-64.50111400000003,49.878043999999989],[-64.496108999999876,49.883049000000085],[-64.490828999999906,49.886939999999925],[-64.472778000000005,49.895828000000108],[-64.458618000000001,49.900826000000109],[-64.445540999999992,49.904434000000037],[-64.226943999999946,49.948326000000066],[-64.203613000000018,49.950271999999984],[-64.142775999999969,49.948044000000039],[-64.133057000000008,49.947212000000093],[-64.12388599999997,49.945267000000115],[-64.029175000000009,49.924438000000123],[-63.958892999999932,49.898048000000131],[-63.615836999999942,49.849158999999986],[-63.545006000000001,49.843323000000112],[-63.49222599999996,49.840828000000045],[-63.475272999999959,49.840546000000018],[-63.346946999999943,49.820274000000097],[-63.309722999999963,49.813880999999981],[-63.136115999999959,49.780822999999941],[-63.074447999999961,49.764160000000061],[-62.99610899999999,49.736656000000096],[-62.786667000000023,49.676384000000098],[-62.71055599999994,49.660820000000001],[-62.545554999999979,49.599998000000141],[-62.443610999999919,49.5472180000001],[-62.340553,49.486938000000009],[-62.212218999999948,49.41443600000008],[-62.205832999999984,49.41137700000013],[-62.188889000000017,49.405823000000112],[-62.169166999999959,49.401099999999985],[-62.099167000000023,49.387771999999984],[-62.089721999999881,49.386383000000137]],[[-124.92415599999998,50.05860100000001],[-124.96861299999995,50.035827999999981],[-125.00055699999996,50.056656000000032],[-125.06304899999998,50.103324999999984],[-125.06696299999999,50.107498000000135],[-125.066101,50.113884000000041],[-125.0625,50.118324000000086],[-125.03971899999999,50.130546999999922],[-124.991669,50.168327000000033],[-124.98222399999992,50.176102000000128],[-124.98055999999991,50.18221299999999],[-124.98332199999999,50.225548000000003],[-124.93138099999993,50.171104000000128],[-124.92859599999997,50.166100000000142],[-124.91528299999999,50.141380000000083],[-124.89778100000001,50.077492000000063],[-124.92415599999998,50.05860100000001]],[[-63.859443999999996,50.197768999999937],[-63.873610999999983,50.194434999999999],[-63.890282000000013,50.194709999999986],[-63.899993999999936,50.196098000000063],[-63.908607000000018,50.198601000000053],[-63.916107000000011,50.201660000000004],[-63.920837000000006,50.205551000000071],[-63.930557000000022,50.218597000000045],[-63.931389000000024,50.223877000000073],[-63.930557000000022,50.229431000000091],[-63.926948999999922,50.236107000000004],[-63.922774999999888,50.241661000000022],[-63.916663999999969,50.244713000000104],[-63.909995999999921,50.246658000000139],[-63.90193899999997,50.24721500000004],[-63.889724999999999,50.242218000000094],[-63.865554999999915,50.228325000000041],[-63.859443999999996,50.224709000000018],[-63.854720999999927,50.220824999999991],[-63.852782999999988,50.216103000000089],[-63.853614999999991,50.210548000000017],[-63.855835000000013,50.204437000000098],[-63.859443999999996,50.197768999999937]],[[-125.16777000000002,49.980819999999937],[-125.16999800000002,49.980819999999937],[-125.17111199999994,49.981659000000093],[-125.18582199999997,50.004165999999998],[-125.20722999999998,50.044998000000021],[-125.21417199999996,50.069992000000013],[-125.28167699999989,50.11332700000014],[-125.31777999999986,50.136107999999979],[-125.32362399999994,50.143326000000002],[-125.33999599999993,50.203049000000021],[-125.34916699999997,50.242493000000138],[-125.34973100000002,50.25777400000004],[-125.348343,50.261665000000107],[-125.34554299999996,50.263901000000033],[-125.33999599999993,50.26888300000013],[-125.31082200000003,50.281380000000127],[-125.26334400000002,50.293883999999991],[-125.25472999999988,50.293610000000058],[-125.24638399999998,50.290549999999996],[-125.24333199999995,50.288329999999974],[-125.16722099999987,50.213608000000079],[-125.16111799999999,50.200272000000098],[-125.16000400000001,50.190544000000102],[-125.18666100000002,50.141663000000051],[-125.1536099999999,50.006103999999937],[-125.15416699999997,50.000832000000003],[-125.16416900000002,49.985268000000133],[-125.16777000000002,49.980819999999937]],[[-124.8125,50.111381999999992],[-124.82112100000001,50.111107000000118],[-124.82749899999993,50.111937999999952],[-124.83361799999989,50.114441000000113],[-124.86110699999989,50.136383000000023],[-124.93916299999995,50.207771000000093],[-124.96305799999999,50.236382000000049],[-124.96610999999996,50.246941000000106],[-124.96556099999992,50.251663000000008],[-124.92304999999993,50.296386999999982],[-124.91832699999986,50.29972099999992],[-124.91082799999998,50.299995000000081],[-124.90249599999999,50.29833200000013],[-124.89862099999999,50.293883999999991],[-124.87581599999993,50.28472099999999],[-124.82167099999992,50.239716000000044],[-124.75666799999999,50.178328999999962],[-124.75250199999999,50.167770000000132],[-124.752228,50.161376999999959],[-124.75499699999995,50.156097000000102],[-124.80695300000002,50.113884000000041],[-124.8125,50.111381999999992]],[[-124.73082699999992,50.302215999999987],[-124.72693599999997,50.299164000000019],[-124.72471599999994,50.299164000000019],[-124.69554099999999,50.289436000000023],[-124.68331899999993,50.283333000000084],[-124.67250100000001,50.276100000000042],[-124.66860999999994,50.272491000000059],[-124.66111799999993,50.263054000000125],[-124.65943900000002,50.258330999999941],[-124.65750099999997,50.247772000000111],[-124.65611299999989,50.231377000000009],[-124.65834000000001,50.212212000000022],[-124.66000399999996,50.207496999999989],[-124.66251399999999,50.203323000000125],[-124.695831,50.157494000000042],[-124.70195000000001,50.158600000000092],[-124.70805399999995,50.161376999999959],[-124.79222099999993,50.22526600000009],[-124.79499800000002,50.228874000000019],[-124.78083800000002,50.269440000000031],[-124.77778599999999,50.27748900000006],[-124.74500299999994,50.299437999999952],[-124.74054699999994,50.30193300000002],[-124.73082699999992,50.302215999999987]],[[-125.54387700000001,50.393883000000017],[-125.63583399999999,50.379714999999976],[-125.69360399999999,50.383330999999998],[-125.70333899999991,50.384163000000115],[-125.75527999999997,50.391662999999994],[-125.762787,50.394157000000121],[-125.76363400000002,50.397491000000116],[-125.75527999999997,50.405548000000067],[-125.74416399999996,50.40776800000009],[-125.59528399999999,50.433052000000089],[-125.58640300000002,50.434158000000139],[-125.52390300000002,50.434433000000126],[-125.51889,50.431381000000044],[-125.51806599999998,50.428604000000121],[-125.51777600000003,50.409431000000041],[-125.520554,50.403320000000122],[-125.52500899999995,50.400825999999995],[-125.53639199999998,50.395827999999995],[-125.54387700000001,50.393883000000017]],[[-125.16555800000003,50.374435000000062],[-125.06139400000001,50.240547000000049],[-125.05194099999989,50.226653999999996],[-125.05027799999993,50.221657000000107],[-125.048607,50.207771000000093],[-125.04915599999993,50.193320999999969],[-125.05166599999995,50.190826000000129],[-125.11638599999998,50.136658000000011],[-125.12917299999998,50.126098999999954],[-125.13390400000003,50.122764999999958],[-125.14028899999994,50.121658000000025],[-125.14472999999987,50.12193300000007],[-125.15083299999998,50.12499200000002],[-125.15416699999997,50.133331000000055],[-125.13971699999996,50.159431000000097],[-125.15611299999995,50.239158999999972],[-125.21083099999993,50.313048999999921],[-125.21362299999993,50.316666000000055],[-125.22000099999991,50.318329000000006],[-125.26363400000002,50.323607999999979],[-125.27194199999997,50.323883000000023],[-125.31555199999997,50.318054000000018],[-125.32112099999989,50.316939999999988],[-125.32695000000001,50.313881000000038],[-125.33306900000002,50.304435999999953],[-125.33473200000003,50.29972099999992],[-125.33944699999989,50.29583000000008],[-125.35610999999994,50.290276000000063],[-125.37222300000002,50.289436000000023],[-125.38527699999997,50.289993000000095],[-125.390289,50.29222100000004],[-125.39306599999998,50.29583000000008],[-125.39917000000003,50.311104000000114],[-125.400284,50.320831000000055],[-125.39943699999998,50.331108000000086],[-125.39806399999998,50.333878000000084],[-125.391953,50.340546000000074],[-125.291946,50.433876000000055],[-125.28443899999996,50.435822000000144],[-125.27500900000001,50.433327000000133],[-125.27306399999992,50.431107000000111],[-125.23665599999993,50.415825000000098],[-125.21640000000002,50.404709000000139],[-125.16555800000003,50.374435000000062]],[[-125.42610200000001,50.3555530000001],[-125.45777899999996,50.349434000000088],[-125.46749899999998,50.350273000000016],[-125.52610800000002,50.378875999999991],[-125.52806099999998,50.381660000000124],[-125.51862299999993,50.390274000000034],[-125.47749299999998,50.424164000000133],[-125.47165699999999,50.427489999999977],[-125.465012,50.429993000000138],[-125.37998999999996,50.460823000000005],[-125.37165799999997,50.457771000000037],[-125.37082699999996,50.455826000000059],[-125.36665299999993,50.454162999999937],[-125.34306300000003,50.441658000000018],[-125.33194700000001,50.435547000000099],[-125.33000199999998,50.430824000000143],[-125.33056599999986,50.425270000000125],[-125.33693700000003,50.416664000000026],[-125.38583399999999,50.36971299999999],[-125.39835399999998,50.364159000000029],[-125.42610200000001,50.3555530000001]],[[-125.80721999999997,50.413605000000075],[-125.90695199999993,50.409714000000008],[-125.92194399999988,50.41027100000008],[-125.92804699999999,50.411658999999986],[-125.93110699999988,50.413879000000009],[-125.95111099999997,50.433876000000055],[-125.93943799999988,50.443047000000035],[-125.90583799999996,50.45638300000013],[-125.81416299999995,50.46804800000001],[-125.80777,50.467765999999983],[-125.80359599999997,50.465546000000131],[-125.79055799999998,50.456940000000031],[-125.74109599999997,50.431664000000012],[-125.73805199999998,50.428047000000049],[-125.73805199999998,50.426658999999972],[-125.74276700000001,50.424164000000133],[-125.75834700000001,50.419990999999982],[-125.79110700000001,50.414992999999981],[-125.80721999999997,50.413605000000075]],[[-126.22582999999997,50.555267000000129],[-126.30888399999998,50.528327999999988],[-126.33640299999996,50.521659999999997],[-126.35056299999997,50.52027099999998],[-126.486107,50.515549000000078],[-126.58805799999999,50.521378000000084],[-126.60417199999995,50.52526899999998],[-126.62389400000001,50.533881999999949],[-126.60417199999995,50.539719000000105],[-126.57444800000002,50.546387000000095],[-126.55695300000002,50.548607000000118],[-126.54194599999994,50.549438000000123],[-126.52667200000002,50.548882000000106],[-126.48860200000001,50.553321999999923],[-126.38110399999999,50.574715000000026],[-126.28611799999999,50.598327999999981],[-126.28278399999999,50.597488000000112],[-126.22609699999998,50.564156000000025],[-126.22305299999999,50.560546999999985],[-126.224716,50.556655999999919],[-126.22582999999997,50.555267000000129]],[[-126.46639999999996,50.575829000000056],[-126.47501399999993,50.575554000000011],[-126.47917199999995,50.576385000000016],[-126.53555299999999,50.590546000000018],[-126.54915599999998,50.596382000000062],[-126.55222300000003,50.598602000000085],[-126.554169,50.602776000000119],[-126.55248999999998,50.607498000000021],[-126.55027799999999,50.608604000000071],[-126.54360999999994,50.611382000000049],[-126.52916699999997,50.614998000000128],[-126.45361299999996,50.626937999999996],[-126.40499899999992,50.626099000000067],[-126.385559,50.625549000000035],[-126.37721299999993,50.623877999999934],[-126.364441,50.619438000000116],[-126.36138900000003,50.615829000000133],[-126.36165599999998,50.613052000000039],[-126.36971999999992,50.605826999999977],[-126.38027999999997,50.598602000000085],[-126.38474300000001,50.596100000000035],[-126.39138799999995,50.59276600000004],[-126.39806399999998,50.591103000000089],[-126.46639999999996,50.575829000000056]],[[-59.345832999999971,50.533881999999949],[-59.353888999999924,50.533881999999949],[-59.358337000000006,50.537773000000016],[-59.384170999999924,50.633049000000085],[-59.384170999999924,50.638328999999999],[-59.382773999999984,50.64388300000013],[-59.378051999999911,50.649161999999933],[-59.371940999999993,50.652771000000143],[-59.364448999999979,50.653876999999966],[-59.355003000000011,50.652214000000072],[-59.337775999999906,50.640831000000048],[-59.333610999999905,50.636108000000036],[-59.321670999999981,50.618881000000044],[-59.305556999999965,50.59165999999999],[-59.300277999999992,50.581940000000088],[-59.298339999999939,50.57249500000006],[-59.298339999999939,50.561935000000119],[-59.308891000000017,50.553047000000106],[-59.320557000000008,50.545830000000024],[-59.333060999999873,50.539436000000137],[-59.345832999999971,50.533881999999949]],[[-126.87332200000003,50.663322000000051],[-126.83416699999998,50.634163000000058],[-126.83112299999999,50.629158000000018],[-126.83583099999998,50.625267000000122],[-126.90249599999993,50.613883999999928],[-126.91251399999999,50.61360900000011],[-127.01666299999999,50.638328999999999],[-127.025284,50.639992000000063],[-127.04276999999996,50.637497000000053],[-127.05832700000002,50.632492000000013],[-127.10193600000002,50.627486999999974],[-127.12249800000001,50.62721300000004],[-127.13221699999991,50.628326000000129],[-127.14055599999995,50.62971500000009],[-127.14472999999998,50.633881000000031],[-127.14334100000002,50.63888500000013],[-127.13166799999999,50.652214000000072],[-127.12721299999998,50.656096999999988],[-127.10916099999997,50.665267999999969],[-127.093887,50.669159000000036],[-127.08640300000002,50.669716000000108],[-126.89028899999994,50.667213000000118],[-126.87970699999994,50.666100000000029],[-126.87332200000003,50.663322000000051]],[[-126.64388999999994,50.691933000000006],[-126.65249599999999,50.691376000000105],[-126.65888999999993,50.694435000000055],[-126.662781,50.69860099999994],[-126.66583300000002,50.703323000000012],[-126.69027699999998,50.75499700000006],[-126.68554699999993,50.758888000000127],[-126.66832699999998,50.759163000000115],[-126.60221899999999,50.770828000000051],[-126.58277900000002,50.769714000000022],[-126.54387700000001,50.765831000000105],[-126.53639199999992,50.763611000000083],[-126.53582799999998,50.758606000000043],[-126.63806199999993,50.694992000000127],[-126.64388999999994,50.691933000000006]],[[-55.564720000000023,50.699714999999912],[-55.580001999999922,50.698326000000122],[-55.588889999999992,50.699431999999945],[-55.64527899999996,50.71888000000007],[-55.65166499999998,50.72304500000007],[-55.653052999999886,50.727211000000011],[-55.629439999999931,50.780823000000112],[-55.62471800000003,50.787216000000058],[-55.619163999999955,50.791381999999999],[-55.462775999999963,50.805824000000143],[-55.454444999999964,50.802489999999977],[-55.450554000000011,50.798332000000016],[-55.449722000000008,50.792770000000075],[-55.454720000000009,50.788048000000003],[-55.46694199999996,50.784163999999976],[-55.512504999999976,50.722763000000043],[-55.525001999999972,50.715827999999988],[-55.551392000000021,50.703323000000012],[-55.557502999999997,50.701385000000073],[-55.564720000000023,50.699714999999912]],[[-126.27306399999998,50.652771000000143],[-126.46333300000003,50.641662999999937],[-126.56806899999998,50.648331000000098],[-126.58416699999992,50.650269000000037],[-126.59889199999998,50.654159999999933],[-126.60637699999995,50.657211000000132],[-126.612503,50.659988000000055],[-126.61749299999997,50.664993000000095],[-126.61749299999997,50.667770000000019],[-126.54583700000001,50.726096999999982],[-126.43720999999999,50.783882000000119],[-126.38971699999996,50.806381000000044],[-126.38221699999997,50.808043999999995],[-126.28056299999997,50.828331000000048],[-126.26640299999997,50.827773999999977],[-126.25805699999995,50.824715000000026],[-126.2538909999999,50.821938000000102],[-126.25171699999987,50.818932000000075],[-126.23832699999997,50.811104000000057],[-126.22944599999994,50.803322000000094],[-126.17832900000002,50.750832000000059],[-126.17722299999997,50.748604000000114],[-126.17666600000001,50.743881000000101],[-126.25305200000003,50.699646000000087],[-126.25611900000001,50.661377000000073],[-126.26083399999999,50.657211000000132],[-126.26640299999997,50.654709000000082],[-126.27306399999998,50.652771000000143]],[[-126.73137700000001,50.771934999999985],[-126.79778299999992,50.768883000000017],[-126.807503,50.769989000000066],[-126.85333300000002,50.782767999999919],[-126.86472299999997,50.78943600000008],[-126.90583799999996,50.822769000000108],[-126.90139799999992,50.825272000000098],[-126.88806199999999,50.829162999999994],[-126.88137799999993,50.830276000000026],[-126.64862099999999,50.847214000000122],[-126.64334100000002,50.846939000000134],[-126.63583399999999,50.845268000000033],[-126.62943999999993,50.842490999999995],[-126.58860800000002,50.821381000000031],[-126.56806899999998,50.807770000000062],[-126.56304899999992,50.799995000000138],[-126.56861900000001,50.797493000000088],[-126.73137700000001,50.771934999999985]],[[-127.22693599999991,50.636108000000036],[-126.975281,50.576942000000088],[-126.85472099999993,50.554436000000123],[-126.77639799999997,50.546104000000128],[-126.76806599999998,50.544441000000006],[-126.72138999999999,50.531936999999971],[-126.70527600000003,50.527489000000003],[-126.63999899999999,50.507773999999984],[-126.62332199999992,50.498329000000126],[-126.56388899999996,50.483604000000014],[-126.49388099999993,50.481934000000024],[-126.39472999999998,50.481658999999979],[-126.38694800000002,50.482765000000029],[-126.35582699999998,50.48333000000008],[-126.327789,50.480820000000051],[-126.22112299999998,50.468596999999988],[-126.20500199999992,50.466660000000104],[-126.15471600000001,50.459435000000042],[-126.06916799999999,50.438599000000067],[-126.04611199999994,50.432495000000017],[-126.031387,50.427773000000116],[-126.01889,50.42193600000013],[-125.97609699999992,50.394996999999989],[-125.96250900000001,50.388885000000016],[-125.94776899999994,50.38499500000006],[-125.92859599999997,50.382209999999986],[-125.81696299999999,50.378044000000102],[-125.58000199999987,50.365828999999962],[-125.56416300000001,50.363883999999985],[-125.54860699999989,50.359161000000029],[-125.46305799999993,50.329719999999952],[-125.44972200000001,50.323607999999979],[-125.44055200000003,50.318329000000006],[-125.43554699999999,50.314712999999983],[-125.43167099999999,50.310547000000042],[-125.42887899999994,50.305549999999982],[-125.42722300000003,50.299995000000081],[-125.42666599999995,50.293883999999991],[-125.42722300000003,50.287498000000085],[-125.41500899999994,50.261665000000107],[-125.39362299999999,50.215546000000018],[-125.37777699999998,50.17971799999998],[-125.36277799999993,50.138046000000088],[-125.33084099999996,50.113884000000041],[-125.28694199999995,50.08138300000013],[-125.229446,50.026657],[-125.22165699999999,50.018051000000071],[-125.21611000000001,50.001389000000074],[-125.21417199999996,49.976379000000065],[-125.212784,49.970825000000048],[-125.20722999999998,49.961662000000047],[-125.16860999999994,49.912766000000033],[-125.11221299999994,49.868324000000086],[-124.99305699999991,49.788330000000087],[-124.89806399999998,49.731658999999979],[-124.89138799999989,49.664711000000068],[-124.91639700000002,49.631660000000124],[-124.86028299999992,49.541663999999969],[-124.85305800000003,49.532494000000099],[-124.83306900000002,49.510826000000122],[-124.78943599999991,49.464157],[-124.579453,49.38749700000011],[-124.55110200000001,49.378044000000102],[-124.53555299999999,49.373878000000047],[-124.51917300000002,49.370270000000119],[-124.26083399999993,49.315269000000001],[-124.12193299999996,49.270271000000093],[-123.94304699999992,49.211104999999918],[-123.85637699999995,49.149162000000047],[-123.86028299999992,49.153046000000074],[-123.86638599999998,49.160820000000115],[-123.86805700000002,49.164436000000137],[-123.87110899999988,49.173607000000118],[-123.87138399999998,49.181106999999997],[-123.86638599999998,49.186378000000047],[-123.86165599999993,49.188880999999981],[-123.84999099999999,49.191658000000075],[-123.82444800000002,49.192764000000125],[-123.82055699999995,49.190544000000102],[-123.80722000000003,49.180275000000051],[-123.79444899999993,49.173325000000034],[-123.78859699999998,49.170273000000122],[-123.76944700000001,49.16304800000006],[-123.73805199999993,49.154433999999981],[-123.71112099999999,49.149993999999992],[-123.70417800000001,49.147491000000002],[-123.699432,49.143883000000073],[-123.696663,49.14027400000009],[-123.69638099999997,49.135551000000078],[-123.69915799999995,49.130272000000105],[-123.70388800000001,49.126381000000038],[-123.73137700000001,49.117493000000081],[-123.74166899999989,49.118049999999982],[-123.83750899999995,49.14138000000014],[-123.85056299999997,49.145546000000024],[-123.81027199999994,49.115829000000076],[-123.75195300000001,49.040833000000021],[-123.74944299999999,49.03527100000008],[-123.75028999999989,49.02915999999999],[-123.75695799999994,48.986938000000123],[-123.75862099999989,48.980819999999994],[-123.76334399999996,48.976936000000137],[-123.69193999999993,48.908325000000104],[-123.68222000000003,48.902214000000072],[-123.5911099999999,48.839989000000116],[-123.58277900000002,48.831940000000088],[-123.56555199999997,48.789719000000105],[-123.56304899999998,48.778327999999988],[-123.56471299999993,48.749718000000087],[-123.50945300000001,48.587493999999992],[-123.47666899999996,48.631660000000124],[-123.47083999999995,48.673324999999977],[-123.46916199999993,48.67943600000001],[-123.46444700000001,48.683327000000077],[-123.45973200000003,48.685822000000144],[-123.45140100000003,48.686652999999978],[-123.44193999999999,48.686652999999978],[-123.41639699999996,48.684433000000126],[-123.40110800000002,48.681381000000044],[-123.39639299999999,48.677773000000116],[-123.34973099999996,48.547775000000058],[-123.34834299999994,48.535828000000095],[-123.29527300000001,48.484718000000044],[-123.29167200000001,48.480820000000108],[-123.27861000000001,48.456100000000049],[-123.27610800000002,48.451103000000103],[-123.27694700000001,48.445540999999992],[-123.28694200000001,48.418602000000021],[-123.28971899999999,48.413321999999937],[-123.29444899999993,48.409714000000065],[-123.30082699999997,48.406654000000003],[-123.32055699999989,48.399437000000034],[-123.33640299999996,48.396942000000024],[-123.36028299999987,48.397217000000069],[-123.41665599999999,48.423882000000106],[-123.42138699999992,48.427490000000034],[-123.425003,48.431938000000002],[-123.45973200000003,48.411934000000031],[-123.51334400000002,48.374709999999993],[-123.53694200000001,48.338326000000109],[-123.54250300000001,48.312492000000077],[-123.54611199999999,48.307770000000005],[-123.55166600000001,48.304710000000114],[-123.55915800000002,48.303047000000049],[-123.58332799999994,48.301102000000014],[-123.598343,48.311661000000072],[-123.71444699999995,48.348045000000127],[-123.76251199999996,48.361664000000019],[-123.77166699999998,48.361664000000019],[-123.77999899999998,48.360550000000046],[-123.79499799999996,48.357498000000135],[-123.80888400000003,48.353324999999984],[-123.817497,48.352493000000095],[-123.823624,48.352776000000063],[-123.91610699999995,48.364159000000029],[-123.92415599999998,48.366104000000064],[-123.97609699999998,48.381934999999999],[-124.26363399999997,48.468880000000013],[-124.423607,48.516937000000041],[-124.609444,48.560547000000042],[-124.6885989999999,48.578330999999991],[-124.72083999999995,48.586655000000007],[-124.75917099999998,48.6055530000001],[-124.77111799999994,48.611663999999962],[-124.79499800000002,48.629989999999964],[-124.81777999999997,48.648880000000133],[-124.82277699999997,48.652489000000116],[-124.9225009999999,48.679993000000138],[-125.02887699999997,48.708885000000009],[-125.0625,48.714996000000099],[-125.09500100000002,48.721930999999984],[-125.10221899999993,48.724433999999917],[-125.11389199999996,48.731102000000078],[-125.18443299999996,48.796104000000128],[-125.18499800000001,48.800827000000083],[-125.01722699999999,48.920547000000113],[-124.90862300000003,48.969154000000003],[-124.90306099999998,48.97137500000008],[-124.84750399999996,49.011664999999994],[-124.84277299999985,49.015549000000021],[-124.83556399999998,49.02416199999999],[-124.78083800000002,49.131377999999984],[-124.77944899999994,49.144439999999975],[-124.78083800000002,49.150542999999914],[-124.79695099999998,49.215828000000101],[-124.79972799999996,49.22693600000008],[-124.80499299999997,49.236938000000066],[-124.80776999999995,49.240547000000049],[-124.81555199999997,49.238045],[-124.818893,49.234718000000044],[-124.82444800000002,49.224158999999986],[-124.82501199999996,49.217209000000139],[-124.82333399999993,49.205551000000128],[-124.81723,49.18332700000002],[-124.81610099999995,49.164711000000011],[-124.81806899999998,49.146103000000096],[-124.82611099999997,49.122489999999971],[-124.83139,49.112495000000081],[-124.87832599999996,49.025268999999923],[-124.88194299999998,49.020546000000138],[-124.89472999999998,49.008888000000127],[-124.90055799999993,49.00499700000006],[-124.906113,49.001938000000052],[-124.93694299999999,48.988045000000056],[-124.94999699999994,48.983330000000024],[-124.96278399999994,48.981102000000021],[-125.06916799999999,48.984436000000017],[-125.126938,48.991104000000007],[-125.19888300000002,48.96276899999998],[-125.21000699999996,48.955826000000002],[-125.21665999999988,48.953323000000012],[-125.22416699999991,48.951660000000118],[-125.23137699999995,48.951103000000046],[-125.24194299999988,48.951660000000118],[-125.318893,48.96443899999997],[-125.32721699999996,48.966102999999976],[-125.45722999999992,48.918052999999986],[-125.46472199999988,48.916382000000112],[-125.48361199999999,48.915825000000041],[-125.502228,48.917770000000019],[-125.50723299999999,48.920273000000009],[-125.75110599999994,49.055267000000072],[-125.76806599999998,49.098602000000028],[-125.73805199999998,49.105552999999986],[-125.69304699999992,49.12860100000006],[-125.64167800000001,49.16304800000006],[-125.63722200000001,49.166939000000127],[-125.60888699999998,49.198043999999982],[-125.60582699999992,49.210274000000084],[-125.60749800000002,49.215828000000101],[-125.611107,49.220267999999919],[-125.61638599999998,49.219711000000018],[-125.66443599999991,49.189987000000031],[-125.72083999999995,49.157767999999976],[-125.74694799999997,49.148604999999975],[-125.75334199999998,49.147491000000002],[-125.75611899999996,49.151657000000114],[-125.779449,49.241661000000022],[-125.79666099999992,49.310272000000055],[-125.86609599999991,49.274436999999978],[-125.952789,49.230270000000075],[-125.96501199999989,49.22526599999992],[-125.97028399999999,49.224709000000018],[-125.97444199999995,49.224991000000102],[-125.98137700000001,49.227211000000125],[-125.98750299999989,49.230270000000075],[-126.020554,49.263054000000125],[-126.02333099999993,49.268051000000071],[-126.02223200000003,49.280823000000055],[-126.01862299999993,49.285553000000107],[-126.01306199999999,49.288887000000102],[-126.00666799999993,49.290549999999996],[-125.98029300000002,49.292496000000085],[-125.97361799999999,49.294997999999964],[-125.96916199999998,49.297493000000031],[-125.950287,49.311935000000005],[-125.94554099999999,49.316666000000112],[-125.89750699999996,49.41027100000008],[-125.89584399999995,49.416381999999999],[-125.89695699999993,49.428047000000049],[-125.89972699999998,49.433601000000067],[-125.90471599999995,49.435822000000144],[-125.90915699999988,49.431938000000116],[-125.94722000000002,49.395546000000138],[-125.96250900000001,49.377487000000031],[-125.96501199999989,49.373604000000114],[-125.96528599999999,49.367493000000024],[-125.962219,49.3555530000001],[-125.962784,49.350273000000072],[-125.96610999999996,49.345543000000021],[-125.99527,49.324440000000095],[-126.00195300000001,49.321938000000046],[-126.00945299999989,49.321663000000001],[-126.03916900000002,49.330275999999969],[-126.04638699999987,49.333328000000108],[-126.06111099999998,49.344154000000003],[-126.06500199999999,49.348328000000038],[-126.07556199999999,49.386383000000137],[-126.07389799999999,49.392494000000056],[-126.120003,49.423049999999989],[-126.22556299999991,49.41027100000008],[-126.26390099999998,49.389435000000049],[-126.36527999999998,49.401657000000057],[-126.45916699999998,49.401932000000045],[-126.46167000000003,49.382767000000115],[-126.46611000000001,49.380272000000048],[-126.52667200000002,49.371933000000013],[-126.54222099999993,49.374435000000119],[-126.54723399999995,49.378044000000102],[-126.57778899999988,49.407767999999919],[-126.579453,49.413322000000107],[-126.57917799999996,49.419440999999949],[-126.56973299999999,49.576385000000073],[-126.56610099999995,49.584434999999985],[-126.47028399999999,49.635551000000021],[-126.46167000000003,49.636658000000125],[-126.40416699999997,49.637772000000098],[-126.38417099999992,49.63638300000008],[-126.36749299999997,49.633049000000085],[-126.36028299999998,49.630820999999969],[-126.34137699999997,49.628875999999991],[-126.28472899999997,49.634438000000102],[-126.22389199999998,49.640549000000021],[-126.13417099999998,49.649994000000049],[-126.09445199999988,49.655548000000067],[-126.08693699999998,49.657211000000018],[-126.08750899999995,49.662209000000018],[-126.09028599999999,49.666382000000112],[-126.09416199999993,49.671104000000014],[-126.10305799999998,49.679161000000022],[-126.11028299999992,49.681380999999988],[-126.11972000000003,49.681107000000054],[-126.20944199999991,49.673881999999992],[-126.23444399999994,49.669159000000036],[-126.24638400000003,49.664711000000068],[-126.283073,49.654990999999995],[-126.29833999999994,49.652214000000072],[-126.34084300000001,49.648605000000089],[-126.43110699999994,49.662491000000045],[-126.43831599999993,49.664153999999996],[-126.58500699999996,49.701103000000046],[-126.59028599999994,49.704437000000041],[-126.63027999999997,49.794998000000078],[-126.67971799999998,49.878876000000105],[-126.80444299999988,49.909156999999993],[-126.83917200000002,49.884720000000129],[-126.84555099999989,49.8822100000001],[-126.85221899999993,49.87971500000009],[-126.87609899999995,49.873322000000087],[-126.93943799999994,49.862770000000125],[-126.99416399999996,49.855270000000019],[-127.12111699999997,49.85228699999999],[-127.13249200000001,49.85694100000012],[-127.17749000000003,49.88888500000013],[-127.18554699999999,49.897491000000059],[-127.22444199999995,49.940269000000114],[-127.24137899999999,49.961937000000034],[-127.23889199999996,49.967208999999968],[-127.234444,49.97137500000008],[-127.17999299999991,50.021378000000027],[-127.18277,50.03166200000004],[-127.18360899999999,50.051102000000014],[-127.17666599999995,50.061104],[-127.172234,50.064995000000067],[-127.13027999999997,50.084717000000126],[-127.15833999999995,50.096382000000006],[-127.27055399999995,50.0991590000001],[-127.27500899999995,50.059990000000028],[-127.27749599999993,50.055267000000015],[-127.28388999999999,50.052216000000044],[-127.33000199999998,50.033882000000062],[-127.34500100000002,50.030273000000079],[-127.38054699999998,50.026100000000099],[-127.38999899999993,50.028603000000089],[-127.42331699999994,50.042221000000097],[-127.45195000000001,50.069716999999969],[-127.46916199999993,50.088042999999971],[-127.47193900000002,50.092765999999983],[-127.54804999999993,50.130272000000105],[-127.63276699999994,50.129990000000021],[-127.78028899999993,50.084160000000054],[-127.781387,50.084160000000054],[-127.78362299999998,50.084160000000054],[-127.890556,50.106941000000063],[-127.89584400000001,50.108886999999925],[-127.90083299999998,50.112495000000024],[-127.90695199999999,50.12082700000002],[-127.90666199999998,50.127769000000114],[-127.90334300000001,50.132492000000127],[-127.89222699999988,50.139160000000061],[-127.87917299999998,50.144440000000145],[-127.86805700000002,50.151099999999985],[-127.83721899999995,50.172493000000088],[-127.82833900000003,50.180550000000096],[-127.78888699999999,50.222214000000008],[-127.79915599999993,50.317772000000105],[-127.80444299999994,50.321380999999917],[-127.86389200000002,50.336937000000091],[-127.87138399999998,50.33776899999998],[-127.88110399999999,50.337212000000079],[-127.895554,50.326385000000073],[-127.90778399999999,50.319717000000082],[-127.92166099999997,50.316666000000055],[-127.93138099999993,50.31610100000006],[-127.94833399999993,50.321937999999989],[-127.95249899999993,50.324715000000083],[-127.97860700000001,50.342491000000052],[-127.97944599999994,50.347214000000065],[-127.92610199999996,50.459991000000059],[-127.92388900000003,50.462769000000037],[-127.91722099999993,50.464156999999943],[-127.75666799999993,50.486381999999992],[-127.708054,50.491661000000136],[-127.70028699999995,50.492218000000037],[-127.58416699999998,50.486938000000009],[-127.576683,50.484717999999987],[-127.57140400000003,50.481934000000024],[-127.56331599999999,50.4741590000001],[-127.53278399999999,50.439986999999974],[-127.50750700000003,50.409157000000107],[-127.49527,50.395827999999995],[-127.47444200000001,50.381660000000124],[-127.46193699999998,50.37582400000008],[-127.454453,50.373604000000057],[-127.44695300000001,50.372765000000129],[-127.446663,50.379714999999976],[-127.45249899999988,50.388885000000016],[-127.48665599999993,50.437492000000134],[-127.50583599999999,50.458602999999982],[-127.52027899999996,50.469711000000132],[-127.53083800000002,50.476936000000023],[-127.54750100000001,50.486938000000009],[-127.56388899999996,50.502220000000023],[-127.57000699999998,50.512214999999912],[-127.56749699999995,50.516105999999979],[-127.55027799999999,50.538329999999917],[-127.54472399999997,50.541664000000083],[-127.50361599999997,50.562210000000107],[-127.49694799999992,50.565269000000058],[-127.49027999999993,50.568054000000132],[-127.47501399999999,50.571663000000115],[-127.44360399999999,50.571663000000115],[-127.41972399999992,50.573883000000137],[-127.41416900000002,50.575829000000056],[-127.41166699999997,50.581383000000017],[-127.41139199999992,50.587494000000106],[-127.41944899999999,50.596657000000107],[-127.58168000000001,50.593880000000013],[-127.69138299999997,50.606659000000093],[-127.87332200000003,50.623877999999934],[-127.87666299999995,50.621658000000139],[-127.87361099999993,50.616936000000067],[-127.854446,50.608330000000137],[-127.80055199999998,50.587494000000106],[-127.78666699999997,50.582214000000022],[-127.76834099999996,50.579994000000056],[-127.75110599999999,50.581108000000029],[-127.72501399999993,50.584434999999928],[-127.708618,50.584991000000116],[-127.66251399999999,50.581383000000017],[-127.63445300000001,50.578049000000021],[-127.61028299999998,50.565825999999959],[-127.595551,50.55582400000003],[-127.59166699999997,50.551659000000029],[-127.58972199999999,50.546104000000128],[-127.595551,50.536659000000043],[-127.60109699999998,50.533333000000027],[-127.60888699999987,50.53138000000007],[-128.05142199999995,50.446693000000039],[-128.13363599999997,50.474709000000132],[-128.224152,50.531105000000082],[-128.319458,50.608604000000071],[-128.37527499999993,50.678604000000064],[-128.40695199999999,50.738883999999985],[-128.41473399999995,50.762771999999984],[-128.41665599999999,50.76915699999995],[-128.41305499999993,50.773880000000133],[-128.40863000000002,50.77777100000003],[-128.35583499999996,50.799721000000034],[-128.349152,50.801658999999972],[-128.10693400000002,50.860550000000103],[-128.05306999999999,50.87193300000007],[-127.91832699999998,50.872214999999983],[-127.90972899999991,50.871375999999998],[-127.882767,50.865546999999992],[-127.83332799999999,50.854163999999969],[-127.67749000000003,50.817497000000003],[-127.51471700000002,50.774437000000034],[-127.50723299999993,50.772217000000012],[-127.49582699999996,50.765831000000105],[-127.48750299999995,50.757217000000082],[-127.45916699999992,50.718322999999998],[-127.354446,50.676102000000014],[-127.22693599999991,50.636108000000036]],[[-127.65471599999995,50.837769000000094],[-127.66139199999998,50.834991000000059],[-127.67027300000001,50.835266000000104],[-127.75306699999999,50.852776000000063],[-127.83332799999999,50.879715000000033],[-127.83860799999997,50.881660000000068],[-127.83306899999997,50.884995000000117],[-127.73500100000001,50.909987999999998],[-127.72638699999993,50.908600000000092],[-127.71665999999999,50.90554800000001],[-127.71028099999995,50.901932000000102],[-127.69138299999997,50.887214999999969],[-127.67083699999995,50.86693600000001],[-127.65833999999995,50.854163999999969],[-127.65527299999997,50.849433999999974],[-127.65334299999995,50.843880000000127],[-127.65471599999995,50.837769000000094]],[[-55.555557000000022,50.886383000000023],[-55.563888999999961,50.884995000000117],[-55.571670999999924,50.885826000000122],[-55.581116000000009,50.888046000000145],[-55.604720999999984,50.898048000000074],[-55.615554999999972,50.906097000000102],[-55.619720000000029,50.910271000000137],[-55.636115999999959,50.950829000000056],[-55.635276999999917,50.961380000000133],[-55.629439999999931,50.965546000000018],[-55.565552000000025,50.983046999999999],[-55.558334000000002,50.984436000000017],[-55.550551999999925,50.985268000000076],[-55.54222900000002,50.984993000000088],[-55.535277999999948,50.981377000000009],[-55.531386999999995,50.977211000000125],[-55.529723999999987,50.968323000000112],[-55.549995000000024,50.890830999999991],[-55.555557000000022,50.886383000000023]],[[-55.993889000000024,51.200272000000098],[-55.999999999999943,51.196655000000135],[-56.00111400000003,51.201660000000004],[-55.998055000000022,51.207496999999989],[-55.992774999999995,51.212769000000094],[-55.981383999999935,51.22165700000005],[-55.975554999999986,51.225822000000051],[-55.967772999999966,51.226653999999996],[-55.968329999999867,51.221375000000023],[-55.970550999999944,51.218323000000055],[-55.982498000000021,51.208885000000066],[-55.993889000000024,51.200272000000098]],[[-58.413329999999917,51.238884000000098],[-58.462219000000005,51.216103000000089],[-58.563613999999973,51.228325000000041],[-58.565001999999993,51.23333000000008],[-58.561942999999928,51.239159000000086],[-58.555831999999953,51.242767000000015],[-58.513335999999924,51.264999000000103],[-58.506392999999946,51.268326000000059],[-58.419448999999986,51.274712000000136],[-58.412773000000016,51.267212000000029],[-58.409163999999919,51.256943000000035],[-58.413329999999917,51.238884000000098]],[[-53.756366999999955,48.50326200000012],[-53.997498000000007,48.425552000000039],[-54.011116000000015,48.421660999999972],[-54.025001999999915,48.418602000000021],[-54.048889000000031,48.420546999999999],[-54.057220000000029,48.421936000000017],[-54.072776999999917,48.428604000000007],[-54.081115999999952,48.429992999999968],[-54.094443999999953,48.425827000000083],[-54.100554999999929,48.422493000000088],[-54.147223999999994,48.391380000000083],[-54.138054000000011,48.359161000000029],[-54.134726999999998,48.354438999999957],[-54.12749500000001,48.353324999999984],[-54.118606999999997,48.364998000000014],[-54.088607999999965,48.395545999999968],[-54.075561999999934,48.401932000000102],[-54.069449999999961,48.40387700000008],[-54.054442999999935,48.404160000000047],[-54.045554999999979,48.401932000000102],[-54.029167000000029,48.399437000000034],[-54.021111000000019,48.399162000000047],[-53.998885999999914,48.400826000000052],[-53.99222599999996,48.402489000000003],[-53.97972099999987,48.408042999999964],[-53.913054999999929,48.444153000000085],[-53.756366999999955,48.50326200000012],[-53.674445999999932,48.534164000000089],[-53.647223999999994,48.541107000000068],[-53.631942999999978,48.541382000000056],[-53.623054999999965,48.53916200000009],[-53.586387999999999,48.525269000000037],[-53.574722000000008,48.507216999999969],[-53.558051999999975,48.474709000000018],[-53.588051000000007,48.428047000000106],[-53.562217999999973,48.439155999999969],[-53.533889999999985,48.451935000000049],[-53.48860899999994,48.507216999999969],[-53.461945000000014,48.555266999999958],[-53.46527900000001,48.568603999999993],[-53.465835999999967,48.57416500000005],[-53.465003999999965,48.579436999999984],[-53.437217999999973,48.619987000000094],[-53.424445999999989,48.625549000000035],[-53.345832999999914,48.615828999999962],[-53.33805099999995,48.612494999999967],[-53.313056999999958,48.595267999999976],[-53.305832000000009,48.586655000000007],[-53.303329000000019,48.581940000000145],[-53.226386999999932,48.555549999999926],[-53.216392999999925,48.566939999999988],[-53.153884999999946,48.628601000000003],[-53.079726999999991,48.6988750000001],[-53.072776999999917,48.700272000000041],[-53.067779999999914,48.696380999999974],[-53.02305599999994,48.660820000000001],[-53.018889999999942,48.656380000000013],[-52.978049999999996,48.604439000000127],[-52.976386999999988,48.599159000000043],[-52.976944000000003,48.59388000000007],[-52.987220999999977,48.548050000000046],[-53.053885999999977,48.442764000000068],[-53.075561999999991,48.422493000000088],[-53.097495999999978,48.405266000000097],[-53.1875,48.350829999999974],[-53.194159999999954,48.348602000000028],[-53.201941999999974,48.347488000000055],[-53.209723999999937,48.347771000000023],[-53.218055999999933,48.3491590000001],[-53.24888599999997,48.362770000000069],[-53.261391000000003,48.37082700000002],[-53.266395999999986,48.37499200000002],[-53.345001000000025,48.360275000000058],[-53.388892999999882,48.303879000000109],[-53.615279999999984,48.178046999999935],[-53.621383999999921,48.174712999999997],[-53.634170999999924,48.169991000000095],[-53.662216000000001,48.163321999999994],[-53.668609999999944,48.162490999999989],[-53.676948999999979,48.163879000000065],[-53.694716999999912,48.169158999999979],[-53.71055599999994,48.17582700000014],[-53.892501999999979,48.226936000000137],[-53.901389999999935,48.229156000000103],[-53.934165999999948,48.233330000000137],[-53.940551999999968,48.230819999999937],[-53.945273999999984,48.178879000000052],[-53.944159999999897,48.163879000000065],[-53.917777999999998,48.088043000000027],[-53.912498000000028,48.084160000000054],[-53.904167000000029,48.081940000000088],[-53.823616000000015,48.074439999999981],[-53.793335000000013,48.073608000000092],[-53.77027899999996,48.073326000000009],[-53.733611999999994,48.076103000000103],[-53.718604999999968,48.078049000000021],[-53.696944999999971,48.079162999999994],[-53.689163000000008,48.078880000000026],[-53.692885999999874,48.067993000000001],[-53.688389000000029,48.065989999999999],[-53.685219000000018,48.063660000000141],[-53.683887000000027,48.060822000000144],[-53.684222999999918,48.057822999999985],[-53.687888999999927,48.054825000000108],[-53.691055000000006,48.052658000000065],[-53.698883000000023,48.049328000000003],[-53.736945999999989,48.032767999999976],[-53.763335999999981,48.026382000000012],[-53.799445999999989,48.02165999999994],[-53.836661999999933,48.022217000000012],[-53.852225999999973,48.023048000000074],[-53.876389000000017,48.025826000000052],[-53.893889999999942,48.029991000000052],[-53.90166499999998,48.033607000000075],[-53.909438999999963,48.033882000000119],[-53.916663999999912,48.033332999999971],[-53.923614999999984,48.031662000000097],[-53.924170999999944,48.026657000000057],[-53.919167000000016,48.022490999999945],[-53.911384999999939,48.019157000000007],[-53.893058999999937,48.014442000000145],[-53.794448999999986,47.996384000000091],[-53.779166999999973,47.996658000000025],[-53.695388999999921,48.018218999999988],[-53.69138700000002,48.019215000000145],[-53.668723999999997,48.029880999999989],[-53.650218999999993,48.037884000000133],[-53.607779999999991,48.051102000000071],[-53.605835000000013,48.046387000000038],[-53.619164000000012,47.998878000000047],[-53.622498000000007,47.993050000000096],[-53.723610000000008,47.843880000000013],[-53.737777999999992,47.826660000000061],[-53.787506000000008,47.773048000000074],[-53.793335000000013,47.768599999999935],[-53.801391999999964,47.769989000000123],[-53.807502999999997,47.773604999999975],[-53.825561999999991,47.794998000000078],[-53.852500999999961,47.785271000000137],[-53.850554999999986,47.760551000000135],[-53.837501999999915,47.699432000000058],[-53.760283999999956,47.609993000000145],[-53.631110999999976,47.54332700000009],[-53.550551999999982,47.529159999999933],[-53.545279999999991,47.534439000000134],[-53.542502999999954,47.550270000000069],[-53.541114999999991,47.585266000000047],[-53.497779999999977,47.734717999999987],[-53.495834000000002,47.740273000000059],[-53.461113000000012,47.806655999999975],[-53.434998000000007,47.83776899999998],[-53.30610699999994,47.984161000000029],[-53.290840000000003,47.999435000000119],[-53.274445000000014,48.013329000000056],[-53.170554999999979,48.05360399999995],[-53.110001000000011,48.03943600000008],[-53.101943999999946,48.038048000000003],[-53.095001000000025,48.03943600000008],[-53.053329000000019,48.049721000000034],[-53.041945999999996,48.055824000000143],[-52.996947999999975,48.086380000000077],[-52.974716000000001,48.116385999999977],[-52.959723999999994,48.143051000000014],[-52.956389999999999,48.148605000000032],[-52.926948999999979,48.169991000000095],[-52.919998000000021,48.171379000000002],[-52.902221999999995,48.16304800000006],[-52.886115999999959,48.151100000000042],[-52.881942999999922,48.147491000000059],[-52.83555599999994,48.106383999999991],[-52.831389999999942,48.101661999999919],[-52.832779000000016,48.096939000000134],[-52.838889999999935,48.093605000000139],[-52.871940999999993,48.082214000000022],[-52.880279999999914,48.083327999999995],[-52.898055999999997,48.090546000000018],[-52.904167000000029,48.089714000000072],[-52.911384999999996,48.088043000000027],[-52.917503000000011,48.084716999999955],[-52.928336999999999,48.075553999999954],[-53.058051999999975,47.922493000000031],[-53.05999799999995,47.916939000000013],[-53.059440999999993,47.886658000000125],[-53.075835999999981,47.850830000000087],[-53.158607000000018,47.683052000000089],[-53.178336999999999,47.651382000000012],[-53.183608999999933,47.646385000000123],[-53.201667999999984,47.636383000000137],[-53.221106999999961,47.628601000000003],[-53.240836999999942,47.622489999999914],[-53.259726999999998,47.615829000000019],[-53.265006999999969,47.611664000000019],[-53.267220000000009,47.606102000000078],[-53.261672999999973,47.546386999999982],[-53.175560000000019,47.431381000000101],[-53.128333999999995,47.411102000000142],[-53.121940999999993,47.413321999999994],[-53.111945999999989,47.423607000000118],[-53.083060999999987,47.458327999999995],[-53.065833999999938,47.469986000000063],[-53.013061999999934,47.501389000000074],[-52.995002999999997,47.51138300000008],[-52.951667999999927,47.530823000000055],[-52.919167000000016,47.541663999999969],[-52.907218999999998,47.54833200000013],[-52.896949999999947,47.55860100000001],[-52.849167000000023,47.621101000000124],[-52.842498999999918,47.632767000000115],[-52.840552999999943,47.638329000000056],[-52.837501999999915,47.65415999999999],[-52.838889999999935,47.663879000000009],[-52.841110000000015,47.668602000000021],[-52.841667000000029,47.673324999999977],[-52.840552999999943,47.683876000000055],[-52.798889000000031,47.784164000000033],[-52.791388999999981,47.795547000000056],[-52.78556100000003,47.79972100000009],[-52.779442000000017,47.803047000000106],[-52.770554000000004,47.79972100000009],[-52.704169999999976,47.753882999999973],[-52.700554000000011,47.749435000000005],[-52.657776000000013,47.657493999999986],[-52.614448999999979,47.516662999999937],[-52.620276999999987,47.500275000000101],[-52.625832000000003,47.489158999999972],[-52.653327999999988,47.437767000000008],[-52.718055999999933,47.364998000000014],[-52.787506000000008,47.308043999999938],[-52.818610999999976,47.224159000000043],[-52.849723999999981,47.1616590000001],[-52.845276000000013,47.142493999999942],[-52.843613000000005,47.063880999999981],[-52.844161999999983,47.058601000000067],[-52.852782999999988,47.022491000000002],[-52.884170999999981,46.9741590000001],[-52.909995999999978,46.911658999999986],[-52.92972599999996,46.851662000000033],[-52.932776999999987,46.825554000000068],[-52.934998000000007,46.804993000000024],[-52.938332000000003,46.78916200000009],[-53.090836000000024,46.643326000000002],[-53.102501000000018,46.636658000000011],[-53.161110000000008,46.619986999999981],[-53.169166999999959,46.619713000000047],[-53.192497000000003,46.62332200000003],[-53.207221999999888,46.630272000000105],[-53.213332999999977,46.633881000000088],[-53.315552000000025,46.694709999999986],[-53.354171999999949,46.736938000000009],[-53.361945999999932,46.737495000000081],[-53.384170999999981,46.721375000000023],[-53.410552999999936,46.700828999999999],[-53.426391999999964,46.687210000000107],[-53.451392999999996,46.66137700000013],[-53.463614999999947,46.654160000000047],[-53.521111000000019,46.62082700000002],[-53.532776000000013,46.614159000000029],[-53.561667999999941,46.612770000000069],[-53.569449999999961,46.614159000000029],[-53.577224999999999,46.617493000000024],[-53.607779999999991,46.636107999999979],[-53.613891999999964,46.640274000000034],[-53.617774999999995,46.644157000000007],[-53.635001999999929,46.680823999999973],[-53.643058999999994,46.704437000000098],[-53.64416499999993,46.709160000000111],[-53.648055999999997,46.796661000000029],[-53.647781000000009,46.801932999999963],[-53.645279000000016,46.81249200000002],[-53.639724999999999,46.829163000000051],[-53.636391000000003,46.834717000000069],[-53.594718999999998,46.9447100000001],[-53.64166999999992,46.983879000000002],[-53.633614000000023,47.001105999999993],[-53.577781999999956,47.085265999999933],[-53.55083499999995,47.106659000000036],[-53.539444000000003,47.114158999999972],[-53.591385000000002,47.156096999999988],[-53.646392999999989,47.105270000000075],[-53.703612999999962,47.053047000000106],[-53.823059000000001,46.956657000000064],[-53.894164999999987,46.899994000000106],[-53.945830999999941,46.858887000000038],[-54.053328999999962,46.794998000000135],[-54.097220999999934,46.799438000000123],[-54.17888599999992,46.81610100000006],[-54.187774999999988,46.819160000000011],[-54.18999500000001,46.823607999999979],[-54.190833999999995,46.828605999999979],[-54.196387999999956,46.862494999999967],[-54.196663000000001,46.883330999999998],[-54.193329000000006,46.893607999999972],[-54.160827999999981,46.981934000000024],[-54.131942999999978,47.012496999999996],[-54.11500499999994,47.039719000000105],[-54.092498999999975,47.079437000000098],[-54.066665999999998,47.131104000000107],[-53.993889000000024,47.265274000000034],[-53.964721999999995,47.299721000000034],[-53.928611999999987,47.302773000000116],[-53.921943999999996,47.304161000000022],[-53.879997000000003,47.348045000000127],[-53.875557000000015,47.354163999999969],[-53.867500000000007,47.402771000000087],[-53.879439999999931,47.43082400000003],[-53.900275999999963,47.486107000000061],[-53.891669999999976,47.524711999999965],[-53.885558999999944,47.576941999999974],[-53.894721999999945,47.6055530000001],[-53.896950000000004,47.609993000000145],[-53.983886999999925,47.75777400000004],[-54.003333999999995,47.778877000000136],[-54.033332999999914,47.796661000000029],[-54.195273999999984,47.857498000000021],[-54.194999999999993,47.843048000000124],[-54.197219999999902,47.832214000000079],[-54.212776000000019,47.777771000000087],[-54.219161999999926,47.766106000000036],[-54.223884999999939,47.759995000000117],[-54.259170999999981,47.715271000000143],[-54.337776000000019,47.621658000000025],[-54.435271999999998,47.505554000000075],[-54.468605000000025,47.441658000000075],[-54.477492999999981,47.404991000000052],[-54.472495999999978,47.401099999999985],[-54.477492999999981,47.395828000000051],[-54.482772999999952,47.391663000000051],[-54.511116000000015,47.372765000000015],[-54.517219999999952,47.369438000000059],[-54.601394999999968,47.345268000000033],[-54.611388999999974,47.353049999999996],[-54.613060000000019,47.35833000000008],[-54.61333499999995,47.362770000000069],[-54.606948999999986,47.374434999999949],[-54.601944000000003,47.379715000000033],[-54.596663999999862,47.383880999999917],[-54.559998000000007,47.413879000000065],[-54.529166999999973,47.442214999999976],[-54.489998000000014,47.486382000000049],[-54.417220999999984,47.583603000000096],[-54.410827999999867,47.594994000000042],[-54.413329999999917,47.599715999999944],[-54.418334999999956,47.603607000000011],[-54.430557000000022,47.597771000000137],[-54.440833999999938,47.586937000000091],[-54.508614000000023,47.513328999999999],[-54.53194400000001,47.479987999999992],[-54.539444000000003,47.468048000000124],[-54.563613999999973,47.439987000000031],[-54.578887999999893,47.423882000000106],[-54.604720999999984,47.401932000000102],[-54.621383999999978,47.389992000000007],[-54.700279000000023,47.357773000000009],[-54.719993999999929,47.352218999999991],[-54.727218999999991,47.351387000000045],[-54.818610999999862,47.363609000000054],[-54.819450000000018,47.368599000000074],[-54.803054999999972,47.380546999999979],[-54.793616999999983,47.391936999999984],[-54.786667000000023,47.413879000000065],[-54.787506000000008,47.418884000000105],[-54.796111999999994,47.420830000000024],[-54.856392000000028,47.390549000000078],[-54.980552999999929,47.285552999999936],[-55.039169000000015,47.225821999999994],[-55.043892000000028,47.220825000000048],[-55.045554999999979,47.215271000000087],[-55.043335000000013,47.210548000000074],[-55.05361199999993,47.150826000000109],[-55.065833999999995,47.093323000000112],[-55.069450000000018,47.082214000000022],[-55.100280999999995,47.05471],[-55.149444999999957,47.012215000000083],[-55.154716000000008,47.008049000000028],[-55.193329000000006,46.984993000000145],[-55.225829999999974,46.934433000000126],[-55.230277999999942,46.928329000000076],[-55.236945999999932,46.923607000000004],[-55.246947999999975,46.916939000000013],[-55.258613999999966,46.91027100000008],[-55.358337000000006,46.874161000000129],[-55.384170999999924,46.865829000000133],[-55.399993999999936,46.865829000000133],[-55.456664999999987,46.874710000000107],[-55.463615000000004,46.877486999999974],[-55.468604999999968,46.881660000000124],[-55.471938999999963,46.886383000000137],[-55.626944999999921,46.868881000000101],[-55.634170999999981,46.866661000000079],[-55.689719999999966,46.858329999999967],[-55.803328999999962,46.860549999999989],[-55.845832999999971,46.86971299999999],[-55.915000999999961,46.88749700000011],[-55.923614999999927,46.889717000000076],[-55.931389000000024,46.892769000000044],[-55.946663000000001,46.899436999999978],[-55.966110000000015,46.909988000000112],[-55.98082699999992,46.932213000000104],[-55.982773000000009,46.936652999999978],[-55.984168999999952,46.941658000000018],[-55.983054999999979,46.952492000000063],[-55.980552999999986,46.957771000000037],[-55.96665999999999,46.981377000000123],[-55.952498999999989,46.996383999999921],[-55.886948000000018,47.056099000000017],[-55.87110899999999,47.069160000000124],[-55.865554999999972,47.072768999999937],[-55.775276000000019,47.10193600000008],[-55.768607999999972,47.103325000000041],[-55.745551999999918,47.10443900000007],[-55.738892000000021,47.10443900000007],[-55.723609999999951,47.104164000000026],[-55.715553,47.103050000000053],[-55.698050999999964,47.098045000000013],[-55.68250299999994,47.091377000000023],[-55.674445999999989,47.090270999999973],[-55.586945000000014,47.110275000000115],[-55.573616000000015,47.11360900000011],[-55.493331999999896,47.133880999999974],[-55.487777999999992,47.137214999999969],[-55.329445000000021,47.242493000000024],[-55.298339999999939,47.267211999999972],[-55.290557999999976,47.278328000000101],[-55.285278000000005,47.294998000000021],[-55.28583500000002,47.310272000000111],[-55.286948999999993,47.314995000000067],[-55.286117999999988,47.325554000000125],[-55.269721999999945,47.390830999999991],[-55.266662999999994,47.396659999999997],[-55.262221999999895,47.402771000000087],[-55.256949999999961,47.407211000000075],[-55.202224999999999,47.44609800000012],[-55.179169000000002,47.460548000000017],[-55.172501000000011,47.463882000000012],[-55.107779999999991,47.483604000000071],[-55.100554999999986,47.484160999999972],[-55.083611000000019,47.481101999999964],[-55.075835999999867,47.480820000000108],[-55.040282999999931,47.484993000000031],[-54.951392999999882,47.504997000000003],[-54.868057000000022,47.543883999999991],[-54.845832999999971,47.556938000000059],[-54.841666999999973,47.563324000000136],[-54.841385000000002,47.583603000000096],[-54.845551,47.633881000000088],[-54.949439999999925,47.599715999999944],[-54.956389999999999,47.59804500000007],[-54.970832999999971,47.596656999999993],[-55.019278999999926,47.621101000000124],[-55.028277999999887,47.620766000000117],[-55.033278999999936,47.621601000000112],[-55.036109999999894,47.623936000000015],[-55.037612999999908,47.626601999999991],[-55.037440999999887,47.62977200000006],[-55.03561000000002,47.633269999999982],[-55.029612999999927,47.639598999999976],[-55.013779,47.65310299999993],[-55.00777800000003,47.65943500000003],[-54.956389999999999,47.741379000000109],[-54.947494999999947,47.75360900000004],[-54.938048999999978,47.771103000000096],[-54.936110999999926,47.781661999999983],[-54.943054000000018,47.781105000000082],[-54.948607999999922,47.776657000000114],[-55.011391000000003,47.721374999999966],[-55.021942000000024,47.711661999999933],[-55.025276000000019,47.705268999999987],[-55.027221999999995,47.695267000000058],[-55.03055599999999,47.684158000000139],[-55.033614999999941,47.678329000000133],[-55.119114000000025,47.616936000000123],[-55.122443999999916,47.614269000000093],[-55.126281999999946,47.612774000000002],[-55.130774999999915,47.611938000000123],[-55.135777000000019,47.613605000000007],[-55.262778999999966,47.650543000000084],[-55.349167000000023,47.704437000000098],[-55.34833500000002,47.710274000000027],[-55.357506000000001,47.726097000000095],[-55.365004999999996,47.726379000000122],[-55.379722999999956,47.724991000000045],[-55.427497999999957,47.711661999999933],[-55.432502999999997,47.70638299999996],[-55.461944999999957,47.646103000000039],[-55.464721999999938,47.640274000000034],[-55.467498999999975,47.619155999999919],[-55.46665999999999,47.614159000000029],[-55.461387999999943,47.610275000000001],[-55.454444999999964,47.611107000000118],[-55.446663000000001,47.623046999999985],[-55.436110999999926,47.631659999999954],[-55.430000000000007,47.634163000000115],[-55.423057999999969,47.635826000000066],[-55.415276000000006,47.63249200000007],[-55.407776000000013,47.624161000000015],[-55.400276000000019,47.615547000000106],[-55.398337999999967,47.610275000000001],[-55.389724999999999,47.58638000000002],[-55.400276000000019,47.514717000000076],[-55.406661999999926,47.493050000000039],[-55.40972099999999,47.487213000000054],[-55.414161999999919,47.481101999999964],[-55.429726000000016,47.467209000000139],[-55.43638599999997,47.465546000000018],[-55.498610999999983,47.453880000000026],[-55.505835999999931,47.453322999999955],[-55.526108000000022,47.454436999999928],[-55.555274999999938,47.440269000000058],[-55.560555000000022,47.436104000000057],[-55.565001999999993,47.429993000000024],[-55.587776000000019,47.398604999999975],[-55.625,47.463608000000079],[-55.654167000000029,47.495270000000062],[-55.795279999999991,47.492767000000072],[-55.914443999999946,47.437767000000008],[-55.920279999999934,47.435265000000129],[-55.925560000000019,47.439156000000025],[-55.923889000000031,47.444709999999986],[-55.91972399999986,47.450829000000056],[-55.831673000000023,47.517212000000086],[-55.788895000000025,47.551102000000014],[-55.745834000000002,47.585266000000047],[-55.77305599999994,47.579720000000009],[-55.824172999999973,47.566382999999973],[-55.892226999999991,47.5366590000001],[-55.987777999999992,47.500549000000035],[-56.104172000000005,47.463608000000079],[-56.110557999999855,47.462494000000106],[-56.11860699999994,47.463608000000079],[-56.158889999999928,47.484718000000044],[-56.169167000000016,47.492493000000138],[-56.172500999999897,47.49721500000004],[-56.172500999999897,47.501663000000008],[-56.168059999999969,47.507216999999969],[-56.162498000000028,47.51138300000008],[-56.12027699999993,47.519157000000064],[-56.044448999999986,47.535271000000023],[-55.941939999999931,47.561661000000072],[-55.889998999999932,47.578330999999991],[-55.639998999999989,47.668053000000043],[-55.633330999999998,47.671104000000071],[-55.628333999999995,47.674713000000054],[-55.635001999999986,47.678329000000133],[-55.642501999999979,47.678604000000121],[-55.649993999999992,47.677773000000116],[-55.663886999999932,47.675552000000039],[-55.704169999999976,47.664992999999981],[-55.75,47.649437000000034],[-55.756110999999976,47.646942000000024],[-55.774718999999948,47.638329000000056],[-55.80471799999998,47.624435000000119],[-55.824447999999961,47.618599000000017],[-55.838889999999935,47.617210000000057],[-55.855835000000013,47.620270000000119],[-55.903327999999931,47.645270999999923],[-55.913611999999944,47.653046000000018],[-55.917503000000011,47.657493999999986],[-55.919448999999929,47.667213000000004],[-55.918609999999944,47.673049999999989],[-55.916388999999981,47.678329000000133],[-55.91194200000001,47.684432999999956],[-55.901389999999992,47.693047000000035],[-55.895554000000004,47.696655000000135],[-55.866393999999957,47.713882000000126],[-55.83277899999996,47.742493000000081],[-55.815001999999993,47.772491000000002],[-55.799445999999875,47.799164000000019],[-55.742226000000016,47.923325000000091],[-55.746947999999975,47.93249499999996],[-55.754447999999968,47.94110100000006],[-55.767219999999952,47.953323000000069],[-55.773613000000012,47.956940000000031],[-55.78055599999999,47.95526899999993],[-55.817504999999983,47.886939999999981],[-55.835273999999913,47.850830000000087],[-55.835555999999997,47.845543000000134],[-55.847220999999934,47.806938000000002],[-55.849998000000028,47.801102000000128],[-55.854445999999996,47.794716000000051],[-55.865279999999984,47.786110000000122],[-55.877219999999966,47.778602999999976],[-55.888892999999996,47.773048000000074],[-56.049727999999959,47.699432000000058],[-56.087501999999972,47.736938000000009],[-56.081116000000009,47.739715999999987],[-56.053611999999987,47.77388000000002],[-56.057502999999997,47.778327999999988],[-56.064163000000008,47.776657000000114],[-56.111671000000001,47.763610999999969],[-56.125,47.757216999999969],[-56.185271999999998,47.680274999999995],[-56.160278000000005,47.642220000000123],[-56.154998999999862,47.638329000000056],[-56.161384999999939,47.634163000000115],[-56.173332000000016,47.629714999999976],[-56.187499999999943,47.627213000000097],[-56.358336999999892,47.603324999999984],[-56.394722000000002,47.601105000000132],[-56.410277999999948,47.601387000000045],[-56.418892000000028,47.601936000000137],[-56.443053999999904,47.605827000000033],[-56.546950999999979,47.613883999999985],[-56.615554999999915,47.613327000000083],[-56.644164999999987,47.596100000000092],[-56.641113000000018,47.592216000000064],[-56.639998999999989,47.587212000000079],[-56.644164999999987,47.581108000000086],[-56.65055099999995,47.578330999999991],[-56.774719000000005,47.531937000000028],[-56.840836000000024,47.52137799999997],[-56.902221999999995,47.552490000000091],[-56.924445999999989,47.562209999999993],[-56.956107999999972,47.574996999999996],[-56.96527900000001,47.57777400000009],[-56.992500000000007,47.583878000000141],[-56.999725000000012,47.584717000000069],[-57.014724999999942,47.583878000000141],[-57.096663999999976,47.56610100000006],[-57.118332000000009,47.563881000000038],[-57.126105999999993,47.563881000000038],[-57.134445000000028,47.566382999999973],[-57.150276000000019,47.572769000000051],[-57.163329999999917,47.579720000000009],[-57.204720000000009,47.59304800000001],[-57.530829999999867,47.630821000000026],[-57.657776000000013,47.60305000000011],[-57.779441999999904,47.627487000000031],[-57.882499999999993,47.651382000000012],[-58.027495999999928,47.694153000000028],[-58.036391999999978,47.696098000000063],[-58.359443999999939,47.647217000000012],[-58.690552000000025,47.598877000000016],[-58.771110999999962,47.59137700000008],[-58.861945999999932,47.589157000000114],[-58.885001999999872,47.592766000000097],[-58.894164999999873,47.59388000000007],[-58.937499999999943,47.589989000000003],[-59.076667999999984,47.571663000000001],[-59.102130999999929,47.564251000000127],[-59.11361699999992,47.558327000000077],[-59.118889000000024,47.554710000000114],[-59.135559000000001,47.556380999999988],[-59.161941999999954,47.561661000000072],[-59.297782999999868,47.606658999999979],[-59.304442999999992,47.609993000000145],[-59.305831999999953,47.614998000000014],[-59.309440999999993,47.661102000000085],[-59.309440999999993,47.671379000000059],[-59.30499999999995,47.724991000000045],[-59.3024979999999,47.736107000000004],[-59.325561999999991,47.807213000000047],[-59.329726999999991,47.816383000000087],[-59.369164000000012,47.852775999999949],[-59.40193899999997,47.880271999999991],[-59.40694400000001,47.889717000000076],[-59.404715999999951,47.900269000000094],[-59.400832999999921,47.90665400000006],[-59.39166999999992,47.916664000000026],[-59.378051999999911,47.922493000000031],[-59.365554999999915,47.924995000000081],[-59.328612999999905,47.928879000000109],[-59.321945000000028,47.930549999999982],[-59.31639100000001,47.934158000000082],[-59.31138599999997,47.938881000000094],[-59.267775999999969,47.982208000000071],[-59.265006999999912,47.988045000000056],[-59.262778999999966,47.999435000000119],[-59.246947999999975,48.011940000000038],[-59.230277999999942,48.02276599999999],[-59.218605000000025,48.029160000000047],[-59.091384999999946,48.090271000000143],[-59.053885999999864,48.105552999999986],[-59.041114999999934,48.110275000000058],[-59.020554000000004,48.116385999999977],[-58.958054000000004,48.149993999999992],[-58.75,48.287498000000085],[-58.701392999999996,48.319716999999969],[-58.691108999999983,48.32888000000014],[-58.686385999999914,48.334160000000054],[-58.682502999999997,48.340546000000131],[-58.678336999999999,48.351936000000023],[-58.675835000000006,48.363051999999925],[-58.670279999999991,48.37499200000002],[-58.598884999999939,48.423325000000034],[-58.587775999999963,48.430550000000039],[-58.568892999999889,48.438599000000067],[-58.555831999999953,48.443047000000035],[-58.514724999999999,48.452773999999977],[-58.500556999999958,48.455551000000071],[-58.492774999999995,48.455551000000071],[-58.492774999999995,48.450272000000098],[-58.497779999999977,48.44582400000013],[-58.518889999999999,48.441375999999991],[-58.526108000000022,48.440544000000102],[-58.546394000000021,48.434990000000084],[-58.558891000000017,48.42971799999998],[-58.588889999999935,48.412765999999976],[-58.599998000000028,48.405822999999998],[-58.601112000000001,48.400826000000052],[-58.59194199999996,48.398879999999963],[-58.483611999999994,48.427773000000002],[-58.470832999999971,48.43221299999999],[-58.464721999999995,48.436377999999991],[-58.449439999999925,48.449158000000125],[-58.4183349999999,48.486655999999982],[-58.420279999999991,48.508049000000085],[-58.569449999999961,48.538605000000018],[-58.673614999999984,48.554710000000057],[-58.682502999999997,48.554993000000024],[-58.697219999999959,48.553046999999992],[-58.732215999999994,48.545830000000024],[-58.765556000000004,48.535828000000095],[-58.778052999999886,48.531937000000028],[-58.812499999999943,48.52388000000002],[-58.857506000000001,48.518599999999992],[-58.931389000000024,48.511939999999981],[-58.954720000000009,48.510825999999952],[-58.979163999999969,48.512497000000053],[-58.988335000000006,48.514442000000031],[-59.004722999999956,48.520271000000037],[-59.013335999999924,48.522217000000126],[-59.091667000000029,48.508331000000112],[-59.105559999999969,48.50471500000009],[-59.118889000000024,48.50110600000005],[-59.146392999999875,48.493049999999982],[-59.192771999999991,48.477767999999969],[-59.232497999999964,48.468597000000045],[-59.246947999999975,48.46665999999999],[-59.255279999999971,48.467490999999995],[-59.260558999999944,48.471931000000041],[-59.261115999999959,48.476653999999996],[-59.232773000000009,48.523048000000131],[-59.228881999999999,48.529160000000104],[-59.215003999999965,48.545547000000056],[-59.209998999999925,48.549995000000024],[-59.137504999999976,48.598876999999959],[-59.084166999999866,48.626380999999981],[-59.077782000000013,48.629158000000075],[-59.050277999999935,48.635551000000021],[-59.03055599999999,48.641937000000098],[-59.02416999999997,48.644714000000022],[-58.908889999999985,48.701934999999992],[-58.828888000000006,48.750832000000116],[-58.811667999999941,48.76166500000005],[-58.799727999999959,48.768050999999957],[-58.774719000000005,48.77887700000008],[-58.767775999999969,48.775551000000064],[-58.772498999999982,48.769989000000123],[-58.815001999999936,48.735825000000091],[-58.849723999999867,48.714996000000099],[-58.873885999999914,48.701659999999947],[-58.891113000000018,48.690826000000072],[-58.912773000000016,48.674713000000054],[-58.938605999999879,48.653603000000089],[-58.947776999999917,48.642769000000044],[-58.955832999999984,48.630272000000048],[-58.958610999999962,48.624161000000129],[-58.958610999999962,48.613883999999985],[-58.955832999999984,48.609436000000017],[-58.947494999999947,48.601105000000132],[-58.896950000000004,48.55193300000002],[-58.888335999999924,48.551101999999958],[-58.743057000000022,48.560822000000087],[-58.728332999999964,48.56249200000002],[-58.721381999999949,48.564438000000109],[-58.715003999999965,48.567215000000033],[-58.709442000000024,48.570831000000055],[-58.704445000000021,48.575271999999984],[-58.695549000000028,48.586937000000091],[-58.68332700000002,48.605827000000033],[-58.676666000000012,48.618050000000096],[-58.672501000000011,48.629433000000063],[-58.669998000000021,48.640831000000105],[-58.671386999999925,48.650825999999995],[-58.674171000000001,48.65526600000004],[-58.679442999999992,48.66944100000012],[-58.680832000000009,48.68471500000004],[-58.658051,48.743049999999982],[-58.618331999999896,48.779716000000064],[-58.543892000000028,48.860824999999977],[-58.535834999999963,48.878601000000117],[-58.506667999999934,48.949431999999945],[-58.506667999999934,48.98054499999995],[-58.503333999999995,48.997490000000084],[-58.500838999999928,49.003608999999926],[-58.400832999999864,49.127487000000087],[-58.396110999999962,49.131377999999984],[-58.351943999999889,49.15026899999998],[-58.348884999999996,49.145828000000108],[-58.342967999999985,49.100201000000027],[-58.365634999999997,49.079922000000067],[-58.368019000000004,49.061428000000035],[-58.353702999999939,49.056656000000032],[-58.31075299999992,49.068584000000044],[-58.292857999999967,49.072762000000068],[-58.240554999999972,49.070274000000097],[-58.17832199999998,49.063217000000066],[-58.143726000000015,49.041740000000118],[-58.09833500000002,48.99221799999998],[-58.084723999999937,48.985268000000133],[-58.077781999999956,48.981934000000138],[-58.060279999999921,48.976096999999982],[-58.050551999999982,48.973320000000115],[-57.99610899999999,48.96138000000002],[-57.961387999999999,48.956657000000007],[-57.938605999999993,48.958328000000051],[-57.90166499999998,48.96276899999998],[-57.888054000000011,48.966102999999976],[-57.881667999999991,48.96888000000007],[-57.892226999999934,48.981658999999922],[-57.900551000000007,48.9847180000001],[-57.929442999999992,48.978874000000076],[-57.958611000000019,48.976096999999982],[-57.974716000000001,48.976096999999982],[-58.009223999999961,48.98041500000005],[-58.02777900000001,48.985549999999989],[-58.035834999999963,48.988602000000128],[-58.050551999999982,48.99582700000002],[-58.09332999999998,49.025825999999995],[-58.103888999999924,49.033607000000075],[-58.108054999999922,49.037772999999959],[-58.135276999999974,49.082771000000037],[-58.144447000000014,49.12193300000007],[-58.122612000000004,49.124931000000004],[-58.119281999999998,49.127102000000036],[-58.115608000000009,49.129105000000038],[-58.111110999999994,49.129771999999946],[-58.094775999999968,49.124603000000036],[-58.078776999999945,49.121769000000029],[-58.049445999999932,49.120270000000005],[-57.925559999999962,49.123047000000042],[-57.918610000000001,49.124709999999993],[-57.913329999999974,49.129158000000132],[-57.882773999999927,49.157767999999976],[-57.878882999999973,49.170273000000122],[-57.89805599999994,49.158600000000092],[-57.912215999999944,49.152771000000087],[-57.925834999999893,49.148331000000042],[-57.939437999999996,49.144997000000046],[-57.947494999999947,49.144997000000046],[-58.057220000000029,49.144997000000046],[-58.075558000000001,49.153271000000075],[-58.081054999999992,49.154438000000141],[-58.086055999999928,49.156269000000123],[-58.092555999999945,49.160934000000111],[-58.09589399999993,49.166271000000108],[-58.064055999999994,49.183350000000132],[-58.063057000000015,49.185451999999941],[-58.065455999999983,49.190414000000033],[-58.060622999999964,49.188583000000051],[-58.05495499999995,49.187583999999958],[-58.034957999999904,49.185749000000044],[-58.025459000000012,49.185749000000044],[-58.011292000000026,49.186252999999965],[-58.002456999999993,49.188251000000093],[-57.995621000000028,49.192078000000038],[-57.988785000000007,49.197247000000118],[-57.932219999999973,49.234160999999972],[-57.928054999999972,49.240273000000116],[-57.93638599999997,49.239716000000044],[-57.995162999999991,49.236885000000086],[-58.003330000000005,49.234215000000006],[-58.011662000000001,49.23071299999998],[-58.031001999999944,49.224548000000027],[-58.03566399999994,49.223713000000032],[-58.049331999999936,49.222717000000046],[-58.058829999999944,49.223049000000003],[-58.191939999999931,49.236382000000049],[-58.200835999999867,49.239716000000044],[-58.211945000000014,49.24721500000004],[-58.233886999999982,49.27304799999996],[-58.236663999999905,49.27748900000006],[-58.240836999999942,49.286942000000067],[-58.241942999999992,49.291663999999969],[-58.241942999999992,49.302215999999987],[-58.223327999999924,49.390274000000034],[-58.216392999999982,49.402488999999946],[-58.192497000000003,49.429436000000067],[-58.157776000000013,49.464439000000027],[-58.152221999999995,49.468879999999956],[-58.043892000000028,49.541382000000056],[-58.032218999999941,49.548332000000073],[-58.019164999999873,49.553879000000052],[-57.998336999999992,49.559158000000025],[-57.971107000000018,49.554993000000024],[-57.915112000000022,49.532047000000034],[-57.910609999999963,49.530216000000053],[-57.903445999999974,49.525551000000064],[-57.861445999999944,49.505885999999975],[-57.746947999999918,49.453606000000093],[-57.715004000000022,49.454712000000086],[-57.707503999999915,49.455551000000071],[-57.701110999999969,49.458327999999995],[-57.696388000000013,49.463608000000022],[-57.698883000000023,49.468323000000055],[-57.705832999999984,49.47165700000005],[-57.788895000000025,49.500832000000116],[-57.864222999999981,49.534939000000065],[-57.869389000000012,49.535439000000054],[-57.872719000000018,49.537773000000072],[-57.942223000000013,49.60305000000011],[-57.944716999999969,49.607498000000078],[-57.951110999999912,49.652771000000143],[-57.951110999999912,49.65776800000009],[-57.948333999999932,49.674164000000076],[-57.935271999999998,49.708602999999925],[-57.926391999999964,49.726379000000065],[-57.899993999999992,49.762215000000083],[-57.82916999999992,49.845543000000077],[-57.671111999999937,50.084160000000054],[-57.631667999999934,50.144714000000079],[-57.543334999999956,50.29833200000013],[-57.524445000000014,50.334159999999997],[-57.521384999999952,50.345267999999976],[-57.521111000000019,50.35054800000006],[-57.515555999999947,50.373604000000057],[-57.507224999999949,50.390831000000105],[-57.498336999999992,50.408600000000035],[-57.490836999999999,50.420830000000137],[-57.448607999999979,50.486106999999947],[-57.377220000000023,50.584434999999928],[-57.37249799999995,50.590828000000101],[-57.361114999999927,50.598602000000085],[-57.341667000000029,50.607498000000021],[-57.310059000000024,50.608940000000132],[-57.300220000000024,50.609776000000068],[-57.295559000000026,50.60927200000009],[-57.291224999999997,50.607105000000047],[-57.276222000000018,50.601440000000082],[-57.245276999999987,50.596382000000062],[-57.228049999999939,50.594437000000084],[-57.204444999999964,50.596100000000035],[-57.173614999999927,50.60083000000003],[-57.166945999999996,50.603325000000098],[-57.161384999999996,50.606384000000048],[-57.150832999999921,50.616104000000121],[-57.148055999999997,50.621933000000126],[-57.154715999999951,50.625549000000035],[-57.171943999999996,50.624992000000134],[-57.276442999999915,50.640717000000052],[-57.378608999999926,50.687767000000065],[-57.334166999999923,50.711937000000091],[-57.325004999999919,50.711662000000047],[-57.236945999999989,50.727211000000011],[-57.162498000000028,50.751105999999993],[-57.14833799999991,50.756103999999993],[-57.089438999999913,50.780548000000124],[-57.072501999999986,50.793884000000048],[-56.983054999999979,50.868324000000086],[-56.927498000000014,50.915824999999984],[-56.898055999999997,51.019440000000088],[-56.899170000000026,51.024436999999978],[-56.903327999999988,51.028603000000089],[-56.909995999999978,51.03276800000009],[-56.927223000000026,51.038605000000018],[-56.964721999999995,51.04332700000009],[-56.921669000000009,51.051384000000098],[-56.892226999999991,51.060272000000055],[-56.879996999999946,51.065543999999989],[-56.784446999999943,51.137771999999984],[-56.781386999999995,51.143608000000029],[-56.78194400000001,51.149162000000047],[-56.785278000000005,51.153046000000074],[-56.793334999999956,51.16137700000013],[-56.80972300000002,51.183601000000067],[-56.793892000000028,51.239989999999921],[-56.744164000000012,51.293052999999929],[-56.738608999999997,51.298881999999935],[-56.733330000000024,51.302773000000002],[-56.68250299999994,51.339432000000102],[-56.623885999999914,51.366386000000034],[-56.616942999999935,51.368881000000044],[-56.512504999999976,51.402214000000072],[-56.476661999999919,51.411658999999986],[-56.461945000000014,51.414992999999981],[-56.45416999999992,51.415543000000014],[-56.271384999999952,51.471656999999993],[-56.110557999999855,51.523879999999963],[-56.011391000000003,51.56638300000003],[-55.998336999999992,51.572220000000016],[-55.960281000000009,51.593880000000013],[-55.943329000000006,51.606384000000048],[-55.918609999999944,51.62110100000001],[-55.90555599999999,51.626937999999996],[-55.898055999999997,51.628601000000117],[-55.890282000000013,51.629433000000006],[-55.837775999999963,51.621376000000055],[-55.846389999999928,51.60193600000008],[-55.857779999999991,51.593323000000112],[-55.885001999999929,51.562492000000134],[-55.886664999999937,51.556938000000002],[-55.886948000000018,51.551933000000133],[-55.887222000000008,51.500274999999988],[-55.886116000000015,51.495270000000119],[-55.87777699999998,51.492218000000037],[-55.694442999999978,51.481102000000078],[-55.639998999999989,51.481934000000024],[-55.648612999999955,51.485267999999962],[-55.68360899999999,51.5],[-55.729720999999984,51.543327000000033],[-55.737503000000004,51.552490000000034],[-55.739166000000012,51.556656000000089],[-55.73860899999994,51.567214999999976],[-55.735274999999945,51.573051000000021],[-55.724716000000001,51.583603000000039],[-55.718605000000025,51.587212000000022],[-55.653327999999988,51.590546000000018],[-55.631667999999991,51.569717000000026],[-55.625,51.565544000000102],[-55.598610000000008,51.561377999999991],[-55.589721999999995,51.560271999999941],[-55.581389999999942,51.560271999999941],[-55.574448000000018,51.562767000000008],[-55.547501000000011,51.584991000000116],[-55.515838999999971,51.602219000000048],[-55.458610999999962,51.592216000000008],[-55.411110000000008,51.580826000000116],[-55.40555599999999,51.576942000000088],[-55.404442000000017,51.571938000000102],[-55.405273000000022,51.561661000000129],[-55.40694400000001,51.556099000000017],[-55.454444999999964,51.455268999999987],[-55.492226000000016,51.377769000000058],[-55.508057000000008,51.363327000000083],[-55.597778000000005,51.303604000000064],[-55.612777999999935,51.301102000000128],[-55.62222300000002,51.30332199999998],[-55.702782000000013,51.328049000000078],[-55.820557000000008,51.350830000000087],[-56.030555999999876,51.378600999999946],[-56.078338999999971,51.36971299999999],[-56.085555999999997,51.368323999999973],[-56.096389999999985,51.318329000000006],[-56.025557999999876,51.238327000000027],[-56.012252999999987,51.212337000000048],[-55.992561000000023,51.176575000000128],[-55.959441999999967,51.197487000000081],[-55.851394999999968,51.226936000000023],[-55.837775999999963,51.230545000000063],[-55.769164999999987,51.216934000000094],[-55.760833999999988,51.213881999999955],[-55.726105000000018,51.190544000000045],[-55.712776000000019,51.178047000000049],[-55.709998999999982,51.173607000000061],[-55.719161999999983,51.123047000000042],[-55.732497999999964,51.079994000000113],[-55.735557999999912,51.074165000000107],[-55.751113999999973,51.058327000000077],[-55.756950000000018,51.053879000000109],[-55.796111999999994,51.03916200000009],[-55.805557000000022,51.009163000000058],[-55.859169000000009,50.942490000000021],[-55.999442999999872,50.788605000000075],[-56.068893000000003,50.724434000000088],[-56.092278000000022,50.725716000000091],[-56.097279000000015,50.725880000000018],[-56.101279999999917,50.728045999999949],[-56.125832000000003,50.754166000000055],[-56.130829000000006,50.763329000000056],[-56.133330999999998,50.773048000000017],[-56.128052000000025,50.846382000000062],[-56.12222300000002,50.863884000000098],[-56.119720000000029,50.869156000000032],[-56.116394000000014,50.874992000000077],[-56.107223999999974,50.887214999999969],[-56.103888999999981,50.893326000000002],[-56.103888999999981,50.898331000000042],[-56.107779999999934,50.902771000000087],[-56.12222300000002,50.899437000000091],[-56.143058999999937,50.892494000000113],[-56.155272999999966,50.885551000000135],[-56.172500999999897,50.85582700000009],[-56.157218999999941,50.690826000000072],[-56.141272999999956,50.671047000000101],[-56.135776999999962,50.669884000000138],[-56.163329999999917,50.617767000000072],[-56.258614000000023,50.502777000000094],[-56.323615999999959,50.446380999999974],[-56.423057999999912,50.352776000000006],[-56.421943999999939,50.347771000000137],[-56.422226000000023,50.342491000000052],[-56.423614999999984,50.336937000000091],[-56.426666000000012,50.331108000000086],[-56.462501999999915,50.272217000000126],[-56.501944999999921,50.214439000000084],[-56.511947999999961,50.203606000000093],[-56.555832000000009,50.167496000000028],[-56.635276999999974,50.106383999999991],[-56.743056999999965,50.022766000000104],[-56.767501999999922,49.962212000000079],[-56.778610000000015,49.933875999999998],[-56.78194400000001,49.917496000000028],[-56.775001999999972,49.919158999999979],[-56.726661999999976,49.916100000000029],[-56.759845999999982,49.837275999999974],[-56.82790399999999,49.785000000000082],[-56.866863000000023,49.777602999999999],[-56.90533099999999,49.747520000000122],[-56.820999000000029,49.74209600000006],[-56.784007999999972,49.731243000000006],[-56.782776000000013,49.690826000000072],[-56.815552000000025,49.594994000000042],[-56.818610999999976,49.588882000000012],[-56.848884999999939,49.544441000000006],[-56.843055999999933,49.548050000000046],[-56.826667999999984,49.562767000000008],[-56.782776000000013,49.609993000000088],[-56.763061999999991,49.631378000000041],[-56.749167999999884,49.64916199999999],[-56.735557999999969,49.666939000000013],[-56.712501999999972,49.696380999999974],[-56.677779999999927,49.733604000000128],[-56.598609999999894,49.811935000000062],[-56.56138599999997,49.842215999999951],[-56.477776000000006,49.892220000000009],[-56.464164999999923,49.896385000000009],[-56.431945999999982,49.890549000000135],[-56.412216000000001,49.909714000000122],[-56.388054000000011,49.943047000000092],[-56.385001999999929,49.949158000000011],[-56.330284000000006,50.024994000000106],[-56.324172999999973,50.029990999999995],[-56.237777999999992,50.100273000000072],[-56.220832999999971,50.112495000000024],[-56.208892999999989,50.120270000000119],[-56.160278000000005,50.148048000000074],[-56.153884999999946,50.150543000000084],[-56.132499999999993,50.155548000000124],[-56.12471800000003,50.15638000000007],[-56.116660999999965,50.153046000000074],[-56.067222999999956,50.096382000000006],[-56.065001999999936,50.091377000000136],[-56.005004999999983,50.031380000000013],[-55.938605999999936,50.036385000000053],[-55.905273000000022,50.033882000000062],[-55.896111000000019,50.031937000000084],[-55.881110999999976,50.024994000000106],[-55.853888999999924,50.005554000000075],[-55.846106999999961,49.996940999999936],[-55.845275999999956,49.99221799999998],[-55.845551,49.986938000000066],[-55.844161999999983,49.981934000000138],[-55.840836000000024,49.977211000000125],[-55.830001999999979,49.969154000000003],[-55.755004999999869,49.924164000000019],[-55.746108999999933,49.923050000000046],[-55.587218999999948,49.964157000000057],[-55.55610699999994,49.980270000000132],[-55.543892000000028,49.987213000000111],[-55.527221999999995,50.000275000000101],[-55.491698999999983,50.007309000000021],[-55.463332999999977,49.966933999999981],[-55.460830999999985,49.962212000000079],[-55.459723999999937,49.957497000000046],[-55.460281000000009,49.952216999999962],[-55.465004000000022,49.940826000000015],[-55.475272999999959,49.930275000000108],[-55.492226000000016,49.917213000000061],[-55.511391000000003,49.908882000000006],[-55.659163999999976,49.84777100000008],[-55.843055999999933,49.788330000000087],[-55.98611499999987,49.746940999999993],[-56.115279999999927,49.63999200000012],[-56.124167999999997,49.613327000000083],[-56.050551999999925,49.666382000000112],[-56.044448999999986,49.669990999999925],[-55.963889999999935,49.698600999999996],[-55.957779000000016,49.700272000000041],[-55.893889999999999,49.714157000000114],[-55.833327999999995,49.686652999999922],[-55.880279999999971,49.584990999999945],[-55.935443999999961,49.543991000000119],[-55.945441999999957,49.536159999999995],[-55.953444999999988,49.533660999999995],[-55.971607000000006,49.531826000000024],[-55.980277999999998,49.53049500000003],[-56.035277999999948,49.506660000000068],[-56.080001999999922,49.486938000000009],[-56.12749500000001,49.431107000000111],[-56.129165999999998,49.425552000000039],[-56.122771999999941,49.421379000000115],[-56.073891000000003,49.434432999999956],[-56.06221800000003,49.440544000000045],[-56.025275999999963,49.461105000000089],[-56.02027899999996,49.464995999999928],[-56.005279999999914,49.480820000000051],[-55.999725000000012,49.485268000000019],[-55.96305499999994,49.496155000000044],[-55.91705300000001,49.507496000000117],[-55.874717999999973,49.517212000000029],[-55.827781999999956,49.524162000000103],[-55.783332999999914,49.511940000000095],[-55.775001999999915,49.508605999999929],[-55.724997999999971,49.479431000000091],[-55.720832999999971,49.475822000000051],[-55.725554999999986,49.470543000000077],[-55.722771000000023,49.453880000000026],[-55.678336999999942,49.386940000000038],[-55.673057999999969,49.383049000000142],[-55.664444000000003,49.381934999999999],[-55.656386999999938,49.382210000000043],[-55.650275999999963,49.384162999999944],[-55.639167999999984,49.392769000000044],[-55.636115999999959,49.398604999999918],[-55.637778999999966,49.409157000000107],[-55.637778999999966,49.413605000000075],[-55.636115999999959,49.419159000000093],[-55.589164999999923,49.462494000000049],[-55.560279999999977,49.482490999999925],[-55.55388599999992,49.484993000000031],[-55.546950999999979,49.486381999999992],[-55.53167000000002,49.487770000000125],[-55.523055999999997,49.486655999999925],[-55.522223999999994,49.481934000000024],[-55.566390999999953,49.409157000000107],[-55.572776999999974,49.376656000000025],[-55.573058999999944,49.371658000000025],[-55.570556999999951,49.366936000000123],[-55.566665999999998,49.362770000000012],[-55.559998000000007,49.365273000000002],[-55.554717999999923,49.369713000000047],[-55.539443999999946,49.385551000000078],[-55.529723999999987,49.396942000000024],[-55.528053,49.402488999999946],[-55.528885000000002,49.408043000000134],[-55.529166999999973,49.423324999999977],[-55.526389999999992,49.42860399999995],[-55.49610899999999,49.453880000000026],[-55.441665999999998,49.491104000000064],[-55.430282999999974,49.498878000000104],[-55.37749500000001,49.50360900000004],[-55.369445999999982,49.503326000000072],[-55.349276999999972,49.468159000000014],[-55.332946999999933,49.416489000000126],[-55.33577699999995,49.388161000000025],[-55.333610999999905,49.359161000000029],[-55.338608000000022,49.355270000000132],[-55.336112999999955,49.350829999999974],[-55.315276999999924,49.314437999999939],[-55.310996999999929,49.355937999999981],[-55.306830999999931,49.356772999999976],[-55.274833999999998,49.385605000000055],[-55.267501999999979,49.396603000000027],[-55.264499999999998,49.403435000000059],[-55.264336000000014,49.406441000000086],[-55.266669999999863,49.409103000000073],[-55.269833000000006,49.411438000000032],[-55.280838000000017,49.41443600000008],[-55.28317299999992,49.41693500000008],[-55.310000999999943,49.484772000000021],[-55.310832999999946,49.487770000000125],[-55.305557000000022,49.534439000000077],[-55.261390999999946,49.541107000000068],[-55.149726999999928,49.546387000000095],[-55.141112999999962,49.545273000000122],[-55.137222000000008,49.540833000000134],[-55.123328999999956,49.496941000000049],[-55.124717999999973,49.465271000000143],[-55.221107000000018,49.261939999999981],[-55.231109999999944,49.251389000000074],[-55.237220999999977,49.248046999999929],[-55.296394000000021,49.226379000000009],[-55.315001999999936,49.216933999999924],[-55.365836999999999,49.165268000000083],[-55.369164000000012,49.159431000000097],[-55.369445999999982,49.154160000000047],[-55.360001000000011,49.151382000000069],[-55.347495999999978,49.157211000000075],[-55.339721999999995,49.158600000000092],[-55.331673000000023,49.156654000000003],[-55.323615999999959,49.153602999999976],[-55.319449999999904,49.149162000000047],[-55.307219999999973,49.104996000000085],[-55.307776999999987,49.0991590000001],[-55.317504999999983,49.087769000000037],[-55.323059000000001,49.083327999999938],[-55.383330999999998,49.040833000000021],[-55.345551,49.057770000000062],[-55.272223999999937,49.099998000000085],[-55.277495999999985,49.103882000000112],[-55.282501000000025,49.113051999999982],[-55.283332999999914,49.118049999999982],[-55.288054999999986,49.182495000000074],[-55.288054999999986,49.187210000000107],[-55.285004000000015,49.193047000000092],[-55.280555999999933,49.199157999999954],[-55.275275999999963,49.204436999999984],[-55.148055999999997,49.259995000000004],[-55.081116000000009,49.283882000000062],[-55.081673000000023,49.345825000000104],[-55.081389999999942,49.351105000000132],[-55.078055999999947,49.356941000000006],[-55.069450000000018,49.3555530000001],[-55.010284000000013,49.323883000000023],[-54.989998000000014,49.286942000000067],[-54.990554999999972,49.28166200000004],[-54.824448000000018,49.269157000000064],[-54.817779999999914,49.271660000000054],[-54.787506000000008,49.288605000000018],[-54.78194400000001,49.292770000000019],[-54.67972599999996,49.379990000000021],[-54.658332999999971,49.399162000000047],[-54.648055999999997,49.409431000000041],[-54.641388000000006,49.421104000000071],[-54.643889999999999,49.425827000000083],[-54.579726999999934,49.494713000000104],[-54.541114999999934,49.526657000000114],[-54.528885000000002,49.533333000000027],[-54.521111000000019,49.533882000000006],[-54.474716000000001,49.534995999999978],[-54.431945999999925,49.470824999999991],[-54.430831999999953,49.465828000000045],[-54.450554000000011,49.427773000000116],[-54.483330000000024,49.361938000000123],[-54.49361399999998,49.268051000000071],[-54.492500000000007,49.263611000000026],[-54.486945999999989,49.259719999999959],[-54.480552999999929,49.262215000000026],[-54.474716000000001,49.266662999999994],[-54.406386999999938,49.320831000000112],[-54.400832999999921,49.325272000000041],[-54.399170000000026,49.330551000000014],[-54.410278000000005,49.343605000000082],[-54.412773000000016,49.34804500000007],[-54.413612000000001,49.353049999999939],[-54.407501000000025,49.374710000000107],[-54.404167000000029,49.380547000000092],[-54.395003999999915,49.392769000000044],[-54.380279999999971,49.408882000000119],[-54.36999499999996,49.419159000000093],[-54.364166000000012,49.423607000000061],[-54.358054999999979,49.426941000000056],[-54.325279000000023,49.423882000000049],[-54.24888599999997,49.397490999999945],[-54.186661000000015,49.371101000000124],[-54.17888599999992,49.37082700000002],[-54.166106999999897,49.378044000000102],[-54.161941999999897,49.383606000000043],[-54.15582999999998,49.40526600000004],[-54.153327999999931,49.416100000000085],[-54.151938999999913,49.427216000000044],[-54.148337999999967,49.437492000000134],[-54.145279000000016,49.443320999999969],[-54.139998999999932,49.448601000000053],[-54.133888000000013,49.451934999999992],[-54.048889000000031,49.479431000000091],[-54.041671999999949,49.480820000000051],[-53.919998000000021,49.447769000000108],[-53.775001999999972,49.396103000000039],[-53.673331999999959,49.34304800000001],[-53.511116000000015,49.277214000000072],[-53.48860899999994,49.220543000000134],[-53.588332999999977,49.040833000000021],[-53.593886999999995,49.035552999999993],[-53.66194200000001,49.032211000000018],[-53.714721999999938,49.02915999999999],[-53.804442999999992,49.022217000000012],[-53.785277999999948,49.011107999999922],[-53.731667000000016,49.013329000000056],[-53.725273000000016,49.009720000000016],[-53.736664000000019,49.001105999999993],[-53.742774999999995,48.997771999999998],[-53.749167999999941,48.995270000000119],[-53.77027899999996,48.989433000000133],[-53.803611999999987,48.978043000000071],[-53.813056999999958,48.938881000000038],[-53.974441999999954,48.84777100000008],[-54.021384999999952,48.833327999999995],[-54.096106999999961,48.812210000000107],[-53.920279999999991,48.834991000000116],[-53.899170000000026,48.838043000000027],[-53.875557000000015,48.836937000000034],[-53.829445000000021,48.831383000000017],[-53.820556999999951,48.829436999999928],[-53.800835000000006,48.812767000000008],[-53.802223000000026,48.807770000000062],[-53.845276000000013,48.766936999999984],[-53.867774999999938,48.75],[-53.89055599999989,48.733604000000014],[-53.897223999999937,48.731377000000123],[-53.932219999999973,48.71393599999999],[-53.950554000000011,48.670830000000137],[-53.93250299999994,48.624710000000107],[-53.924445999999989,48.624435000000062],[-53.917220999999927,48.624991999999963],[-53.888610999999969,48.631660000000124],[-53.882773999999927,48.633606000000043],[-53.869163999999955,48.638885000000016],[-53.857223999999974,48.644157000000121],[-53.795554999999922,48.675827000000027],[-53.790001000000018,48.679993000000138],[-53.798889000000031,48.682213000000104],[-53.817779999999971,48.673882000000049],[-53.831389999999999,48.669990999999982],[-53.852782999999931,48.666381999999942],[-53.896950000000004,48.662209000000018],[-53.913054999999929,48.663605000000075],[-53.920836999999949,48.667213000000004],[-53.924445999999989,48.671379000000059],[-53.892058999999904,48.682938000000092],[-53.887225999999941,48.690102000000024],[-53.884051999999997,48.693100000000129],[-53.880554000000018,48.695099000000141],[-53.857558999999981,48.704937000000029],[-53.759170999999981,48.714156999999943],[-53.618056999999965,48.694435000000112],[-53.610001000000011,48.693046999999979],[-53.601943999999946,48.68971300000004],[-53.599723999999924,48.684990000000028],[-53.603888999999924,48.674164000000076],[-53.610001000000011,48.668602000000135],[-53.645835999999974,48.648330999999985],[-53.658607000000018,48.641937000000098],[-53.671943999999939,48.638602999999932],[-53.728881999999942,48.629433000000063],[-53.779998999999975,48.623604000000057],[-53.787780999999995,48.622490000000084],[-53.928336999999942,48.575829000000056],[-53.93332700000002,48.572220000000073],[-53.951392999999996,48.549995000000024],[-53.956107999999915,48.543883999999991],[-53.952498999999932,48.539436000000023],[-53.944159999999897,48.539718999999991],[-53.932219999999973,48.544998000000135],[-53.919998000000021,48.551659000000086],[-53.914444000000003,48.555824000000086],[-53.908332999999914,48.559158000000025],[-53.901389999999935,48.562209999999993],[-53.895003999999858,48.563048999999921],[-53.804169000000002,48.568053999999961],[-53.788054999999929,48.566383000000087],[-53.746391000000017,48.558600999999953],[-53.746947999999918,48.523322999999948],[-53.74888599999997,48.513329000000113],[-53.750838999999985,48.50777400000004],[-53.756366999999955,48.50326200000012]],[[-127.91443599999991,51.410820000000001],[-127.92443799999995,51.41027100000008],[-128.06527700000004,51.464157000000114],[-128.07583599999998,51.470543000000021],[-128.08111599999995,51.474709000000132],[-128.15307599999988,51.601661999999976],[-128.15417499999995,51.605826999999977],[-128.15280199999995,51.638046000000145],[-128.15249600000004,51.641937000000041],[-128.15029899999996,51.647491000000059],[-128.14556900000002,51.653603000000032],[-128.136414,51.6616590000001],[-128.01306199999993,51.72137500000008],[-128.00527999999997,51.723320000000058],[-128,51.720542999999964],[-127.99694799999997,51.714157000000057],[-127.99804699999999,51.711662000000047],[-127.995003,51.705269000000101],[-127.98388699999998,51.682495000000131],[-127.96749899999992,51.651931999999988],[-127.951683,51.633880999999974],[-127.93776699999995,51.621933000000126],[-127.92639199999996,51.608886999999982],[-127.91999800000002,51.600547999999947],[-127.90556300000003,51.55971500000004],[-127.87361099999993,51.464439000000027],[-127.87193300000001,51.451934999999992],[-127.87332200000003,51.447769000000051],[-127.87666299999995,51.443046999999979],[-127.90444899999994,51.414711000000068],[-127.91443599999991,51.410820000000001]],[[-55.367500000000007,51.874161000000015],[-55.37471800000003,51.873878000000047],[-55.382216999999912,51.875267000000065],[-55.428885999999977,51.884163000000001],[-55.430000000000007,51.885826000000122],[-55.431113999999923,51.887771999999984],[-55.430557000000022,51.896659999999997],[-55.42610899999994,51.905822999999998],[-55.423331999999959,51.909431000000097],[-55.387779000000023,51.942764000000125],[-55.353614999999991,51.963608000000079],[-55.301392000000021,51.993050000000039],[-55.283889999999985,52.001389000000074],[-55.277221999999938,52.002495000000067],[-55.269996999999989,52.000549000000035],[-55.268889999999942,51.998604],[-55.267501999999979,51.993881000000044],[-55.274170000000026,51.97693600000008],[-55.274170000000026,51.975548000000003],[-55.28194400000001,51.961937000000034],[-55.295005999999944,51.943321000000026],[-55.302222999999969,51.933326999999963],[-55.332503999999972,51.896384999999952],[-55.342223999999874,51.886383000000023],[-55.354720999999927,51.878043999999989],[-55.360001000000011,51.875824000000136],[-55.367500000000007,51.874161000000015]],[[-128.05389400000001,51.753609000000097],[-128.11972000000003,51.741661000000079],[-128.13192699999996,51.743881000000101],[-128.13613899999996,51.746657999999968],[-128.25445599999995,51.865829000000019],[-128.25308199999995,51.872214999999983],[-128.22222899999997,51.953323000000125],[-128.21749899999998,51.962769000000094],[-128.177795,52.008330999999941],[-128.150848,52.035271000000023],[-128.14529400000004,52.038605000000018],[-128.10775799999999,52.051659000000086],[-128.06082200000003,52.056380999999988],[-127.99582699999996,52.062767000000065],[-127.98332199999993,52.061934999999949],[-127.96028100000001,52.055549999999982],[-127.95472699999999,52.05332199999998],[-127.95121799999998,52.046913000000131],[-127.95140100000003,52.03054800000001],[-127.95472699999999,51.981101999999964],[-128.00723299999993,51.782493999999986],[-128.00945999999999,51.778328000000101],[-128.01306199999993,51.773605000000089],[-128.01861600000001,51.770271000000093],[-128.03582800000004,51.760826000000066],[-128.05389400000001,51.753609000000097]],[[-79.252791999999999,52.071380999999917],[-79.319732999999985,51.969986000000063],[-79.364440999999943,51.942214999999976],[-79.370543999999995,51.938599000000124],[-79.376663000000008,51.936104000000057],[-79.385833999999988,51.935546999999985],[-79.42361499999987,51.936935000000062],[-79.433318999999869,51.93832400000008],[-79.450561999999877,51.942214999999976],[-79.50111400000003,51.942489999999964],[-79.568344000000025,51.935546999999985],[-79.576675000000023,51.934158000000025],[-79.591949,51.922768000000133],[-79.604445999999996,51.916664000000083],[-79.611664000000019,51.914436000000137],[-79.617767000000015,51.917770000000132],[-79.621383999999978,51.9222180000001],[-79.652785999999992,51.981101999999964],[-79.654175000000009,51.986655999999982],[-79.650832999999977,51.991936000000067],[-79.633895999999993,52.017493999999942],[-79.629439999999988,52.022217000000126],[-79.62332200000003,52.025269000000037],[-79.61471599999993,52.023048000000131],[-79.608611999999994,52.01998900000001],[-79.603881999999942,52.016106000000036],[-79.596114999999998,52.013611000000026],[-79.585281000000009,52.012772000000041],[-79.567779999999971,52.014999000000103],[-79.538329999999974,52.023323000000005],[-79.408889999999985,52.071938000000046],[-79.396666999999866,52.077217000000019],[-79.383895999999936,52.090827999999988],[-79.345551,52.108604000000128],[-79.338332999999977,52.110275000000001],[-79.297225999999966,52.091933999999981],[-79.277221999999881,52.090546000000074],[-79.269729999999925,52.08776899999998],[-79.263625999999988,52.083878000000084],[-79.252791999999999,52.071380999999917]],[[-131.01889,51.946098000000063],[-131.02166699999998,51.940825999999959],[-131.02917500000001,51.941375999999991],[-131.03695700000003,51.944434999999999],[-131.04861499999998,51.951385000000016],[-131.07415800000001,51.970543000000134],[-131.09500099999997,51.989989999999977],[-131.10165399999994,52.00277699999998],[-131.120544,52.055549999999982],[-131.12719699999997,52.095543000000021],[-131.126373,52.106941000000006],[-131.12249800000001,52.124710000000107],[-131.11639400000001,52.148048000000017],[-131.11026000000004,52.151099999999929],[-131.10192899999998,52.151932000000045],[-131.08361799999989,52.151382000000012],[-131.07720900000004,52.150268999999923],[-131.00945999999999,52.102776000000006],[-130.99249299999991,52.060822000000087],[-131.00473,52.005829000000062],[-131.01889,51.946098000000063]],[[-127.96278399999989,52.074714999999912],[-128.05111699999992,52.07416500000005],[-128.06222500000001,52.074996999999996],[-128.07638499999996,52.079994000000113],[-128.09387199999998,52.090546000000074],[-128.10583500000001,52.100273000000016],[-128.10888699999992,52.105270000000132],[-128.12081899999998,52.141936999999928],[-128.11471599999987,52.14916199999999],[-128.10693400000002,52.152489000000116],[-128.03167699999995,52.163292000000126],[-128.01583900000003,52.164711000000125],[-127.89111299999996,52.171660999999972],[-127.88110399999999,52.172218000000044],[-127.87917299999998,52.166664000000026],[-127.88971700000002,52.131103999999993],[-127.89334100000002,52.126938000000052],[-127.94360399999999,52.079163000000051],[-127.94721999999996,52.075829000000113],[-127.96278399999989,52.074714999999912]],[[-128.21194499999996,52.015549000000135],[-128.22082499999999,52.014442000000031],[-128.23858599999994,52.014717000000076],[-128.2463679999999,52.016662999999937],[-128.25308199999995,52.019714000000135],[-128.29110699999995,52.101936000000137],[-128.29415899999998,52.113608999999997],[-128.29168700000002,52.118881000000101],[-128.25280799999996,52.171379000000059],[-128.24444600000004,52.179993000000138],[-128.23971599999993,52.184158000000139],[-128.23193399999997,52.187492000000134],[-128.18804899999998,52.193604000000107],[-128.16223100000002,52.196655000000135],[-128.15307599999988,52.195267000000001],[-128.14779699999997,52.191658000000018],[-128.14584399999995,52.186104],[-128.1480709999999,52.183327000000133],[-128.15472399999999,52.159431000000041],[-128.15612799999997,52.153320000000122],[-128.15862999999996,52.11971299999999],[-128.154449,52.108604000000128],[-128.15139799999997,52.103882000000056],[-128.14752199999998,52.092766000000097],[-128.15112299999993,52.081108000000086],[-128.20611600000001,52.01888300000013],[-128.21194499999996,52.015549000000135]],[[-128.42834499999992,52.13749700000011],[-128.44415300000003,52.134163000000115],[-128.44638099999997,52.13499500000006],[-128.50472999999994,52.16027100000008],[-128.50918599999994,52.16443600000008],[-128.51113899999996,52.169990999999982],[-128.50863600000002,52.175552000000039],[-128.50527999999997,52.180274999999995],[-128.50058000000001,52.184158000000139],[-128.45138499999996,52.217209000000082],[-128.448059,52.21915400000006],[-128.43331899999998,52.223320000000001],[-128.41641200000004,52.226379000000122],[-128.40972899999997,52.224991000000045],[-128.40640299999995,52.2227630000001],[-128.40527299999997,52.218596999999988],[-128.4100039999999,52.214714000000072],[-128.40777599999996,52.15277100000003],[-128.408905,52.149437000000034],[-128.41363499999994,52.145270999999923],[-128.42834499999992,52.13749700000011]],[[-128.29998799999998,52.133606000000043],[-128.308044,52.128875999999991],[-128.31362899999999,52.129714999999976],[-128.36499000000003,52.162491000000102],[-128.37304699999999,52.185265000000072],[-128.378601,52.213608000000022],[-128.37832599999996,52.220268000000033],[-128.37719699999991,52.223877000000073],[-128.37027,52.228600000000029],[-128.35665900000004,52.235825000000091],[-128.34527600000001,52.238602000000014],[-128.29724099999999,52.237212999999997],[-128.23721299999994,52.222488000000055],[-128.22943099999998,52.220268000000033],[-128.22720300000003,52.218880000000127],[-128.22610499999996,52.216934000000037],[-128.22747799999996,52.212769000000037],[-128.22997999999995,52.209435000000099],[-128.29998799999998,52.133606000000043]],[[-81.476944000000003,52.249161000000072],[-81.48582499999992,52.248329000000126],[-81.646118000000001,52.251389000000017],[-81.687499999999943,52.254997000000117],[-81.706115999999952,52.258049000000028],[-81.710007000000019,52.262496999999996],[-81.695830999999941,52.267212000000029],[-81.578063999999983,52.294716000000051],[-81.551666000000012,52.298050000000046],[-81.541672000000005,52.296661000000029],[-81.493057000000022,52.283881999999949],[-81.480559999999969,52.277489000000003],[-81.475280999999995,52.27388000000002],[-81.471664000000033,52.268051000000014],[-81.468063000000029,52.263054000000068],[-81.467772999999966,52.256942999999978],[-81.470839999999953,52.252220000000023],[-81.476944000000003,52.249161000000072]],[[-127.924713,52.174164000000133],[-127.93360899999999,52.173049999999932],[-128.036407,52.177489999999977],[-128.05416899999994,52.180550000000039],[-128.07971199999997,52.186377999999934],[-128.08639500000004,52.188599000000067],[-128.09277299999991,52.19221500000009],[-128.16696199999996,52.244713000000104],[-128.17001299999998,52.249718000000144],[-128.15862999999996,52.256386000000077],[-128.06945799999994,52.294716000000051],[-128.0477909999999,52.300545000000056],[-128.04000899999994,52.301659000000029],[-127.97944599999994,52.296661000000029],[-127.97277800000001,52.295273000000122],[-127.96193700000003,52.289436000000137],[-127.95861799999989,52.287498000000028],[-127.95111099999997,52.279716000000064],[-127.90943899999996,52.210274000000027],[-127.90750100000002,52.204712000000086],[-127.90666199999998,52.198600999999996],[-127.91055299999988,52.186377999999934],[-127.91776999999996,52.176940999999999],[-127.924713,52.174164000000133]],[[-128.18444799999992,52.278602999999976],[-128.20361299999996,52.277489000000003],[-128.21026599999993,52.278327999999988],[-128.21362299999998,52.279716000000064],[-128.18917799999986,52.330826000000116],[-128.18307499999997,52.339714000000129],[-128.11471599999987,52.41832700000009],[-128.11111499999998,52.421661000000086],[-128.10443099999992,52.421379000000002],[-128.09997599999991,52.418602000000135],[-128.09359699999999,52.411658999999929],[-128.09249899999998,52.408324999999934],[-128.08526599999999,52.396385000000066],[-128.05917399999998,52.352219000000048],[-128.05694600000004,52.346100000000035],[-128.05526699999996,52.334991000000116],[-128.05667099999994,52.328880000000083],[-128.06140099999999,52.324715000000083],[-128.15194700000001,52.282211000000075],[-128.18444799999992,52.278602999999976]],[[-127.72444199999995,51.97693600000008],[-127.87082699999991,51.944709999999986],[-127.87970699999994,51.94499200000007],[-127.886124,51.947768999999994],[-127.89167800000001,51.951385000000016],[-127.89472999999992,51.956100000000049],[-127.89943700000003,51.973320000000001],[-127.90110799999991,51.985824999999977],[-127.90055799999988,51.999435000000005],[-127.88110399999999,52.078880000000083],[-127.87361099999993,52.094994000000042],[-127.85138699999999,52.141380000000026],[-127.82833900000003,52.175827000000027],[-127.817497,52.191375999999934],[-127.79750100000001,52.213882000000126],[-127.78916899999996,52.221930999999984],[-127.75334199999998,52.245827000000077],[-127.74527,52.247772000000055],[-127.699997,52.257216999999912],[-127.68083199999995,52.258888000000013],[-127.65943900000002,52.259163000000001],[-127.65055799999999,52.260276999999974],[-127.58640300000002,52.281105000000082],[-127.51666299999999,52.304436000000123],[-127.51000999999985,52.306938000000002],[-127.46056399999998,52.345824999999991],[-127.45694700000001,52.350548000000003],[-127.45612299999988,52.362213000000054],[-127.45694700000001,52.368324000000143],[-127.45333900000003,52.373046999999929],[-127.4177699999999,52.385269000000108],[-127.36277799999999,52.403876999999966],[-127.26390100000003,52.436653000000092],[-127.25945300000001,52.435265000000015],[-127.23473399999995,52.416939000000013],[-127.20777899999996,52.344711000000018],[-127.21056399999992,52.33526599999999],[-127.218887,52.325829000000056],[-127.23222399999992,52.313049000000092],[-127.24749800000001,52.301933000000133],[-127.27084399999995,52.288605000000132],[-127.28916899999996,52.279433999999981],[-127.30304699999999,52.274162000000047],[-127.30999800000001,52.271659999999997],[-127.32584400000002,52.268051000000014],[-127.36193800000001,52.264717000000019],[-127.42582699999997,52.24610100000001],[-127.43971299999993,52.240829000000076],[-127.44526699999994,52.23832699999997],[-127.57972699999999,52.177216000000044],[-127.58444199999991,52.173324999999977],[-127.58805799999999,52.167770000000075],[-127.59631300000001,52.151793999999995],[-127.65416700000003,52.123877999999991],[-127.68694299999993,52.074440000000095],[-127.69193999999993,52.06360600000005],[-127.70111099999991,52.041107000000068],[-127.70388800000001,52.028877000000136],[-127.699997,52.017768999999987],[-127.69915799999995,52.01138300000008],[-127.699432,52.00471500000009],[-127.70194999999995,51.998604],[-127.708054,51.988327000000027],[-127.71749899999998,51.980270000000075],[-127.72444199999995,51.97693600000008]],[[-128.66860999999994,52.266388000000063],[-128.67556799999994,52.266388000000063],[-128.72055099999994,52.306938000000002],[-128.724152,52.311378000000047],[-128.72637899999995,52.316101000000003],[-128.74832200000003,52.369156000000089],[-128.76196299999998,52.41832700000009],[-128.76251200000002,52.423325000000091],[-128.76196299999998,52.429160999999965],[-128.759186,52.449432000000002],[-128.75280799999996,52.467766000000097],[-128.74722299999996,52.471656999999993],[-128.68139599999989,52.482208000000071],[-128.67443800000001,52.482208000000071],[-128.65029899999996,52.474434000000088],[-128.63696299999992,52.468597000000102],[-128.624146,52.461662000000103],[-128.61914099999996,52.457771000000037],[-128.615814,52.453606000000036],[-128.61608899999993,52.44860099999994],[-128.61331199999995,52.364441000000056],[-128.61471599999993,52.353325000000098],[-128.61776699999996,52.329994000000056],[-128.61999500000002,52.323883000000137],[-128.62554899999992,52.311378000000047],[-128.62997399999995,52.305550000000096],[-128.66860999999994,52.266388000000063]],[[-128.471924,52.492767000000129],[-128.46777299999991,52.483047000000056],[-128.46499599999993,52.47304500000007],[-128.46417199999996,52.46804800000001],[-128.46499599999993,52.462212000000136],[-128.46722399999999,52.456099999999935],[-128.47082499999993,52.449714999999969],[-128.48055999999991,52.440269000000001],[-128.4869379999999,52.437209999999993],[-128.49414100000001,52.434989999999971],[-128.50945999999999,52.432213000000104],[-128.51806599999998,52.431938000000059],[-128.59553499999998,52.460140000000081],[-128.66314699999987,52.491927999999973],[-128.75500499999998,52.487770000000012],[-128.77557399999995,52.49332400000003],[-128.78472899999991,52.496101000000124],[-128.80944799999997,52.515549000000078],[-128.81304899999992,52.519989000000066],[-128.81390399999998,52.524994000000106],[-128.811127,52.536941999999954],[-128.808899,52.543053000000043],[-128.73889199999996,52.587494000000049],[-128.732483,52.590545999999961],[-128.72470099999998,52.59165999999999],[-128.5781859999999,52.5936430000001],[-128.56750499999998,52.622490000000028],[-128.53527800000001,52.647217000000069],[-128.53167699999995,52.62110100000001],[-128.52890000000002,52.611107000000004],[-128.52194199999997,52.591377000000023],[-128.50085399999995,52.543610000000115],[-128.48889199999991,52.52027099999998],[-128.48526000000004,52.515831000000105],[-128.47970599999996,52.506660000000011],[-128.471924,52.492767000000129]],[[-131.46444700000001,52.627487000000087],[-131.58554099999998,52.585266000000104],[-131.59359699999999,52.585823000000005],[-131.60137900000001,52.588600000000099],[-131.6119379999999,52.596099999999979],[-131.62359600000002,52.608886999999982],[-131.70971700000001,52.705269000000044],[-131.691101,52.724991000000102],[-131.68499799999995,52.728043000000014],[-131.65945399999993,52.730270000000075],[-131.48471099999995,52.736938000000066],[-131.475281,52.736655999999982],[-131.46859699999999,52.733330000000137],[-131.46887200000003,52.73054500000012],[-131.44943199999994,52.714996000000042],[-131.44027699999998,52.706940000000145],[-131.43917799999991,52.701660000000061],[-131.44137599999999,52.684158000000025],[-131.45443699999998,52.636383000000023],[-131.45834399999995,52.630821000000083],[-131.46444700000001,52.627487000000087]],[[-128.43029799999994,52.368050000000039],[-128.44168099999996,52.368050000000039],[-128.45611599999989,52.373046999999929],[-128.46026599999999,52.37721300000004],[-128.46664399999986,52.386939999999981],[-128.46777299999991,52.393051000000071],[-128.43777499999999,52.543610000000115],[-128.44973800000002,52.620827000000077],[-128.45056199999999,52.626937999999996],[-128.44168099999996,52.746941000000106],[-128.43917799999997,52.752220000000079],[-128.43582200000003,52.756943000000092],[-128.39001500000001,52.797493000000031],[-128.383331,52.797493000000031],[-128.37332200000003,52.791107000000125],[-128.36276199999998,52.740272999999945],[-128.35861199999988,52.729156000000103],[-128.32138099999992,52.634720000000129],[-128.275848,52.496101000000124],[-128.27502400000003,52.489990000000034],[-128.28640699999994,52.457771000000037],[-128.31140099999999,52.423881999999992],[-128.365814,52.38220999999993],[-128.37164300000001,52.378875999999991],[-128.386414,52.374992000000134],[-128.40335099999993,52.371658000000139],[-128.43029799999994,52.368050000000039]],[[-128.97442599999999,52.453323000000069],[-128.98275799999999,52.453049000000135],[-129.11471599999993,52.556656000000089],[-129.21081499999997,52.64888000000002],[-129.26333599999998,52.710548000000074],[-129.27056899999997,52.719153999999946],[-129.29196200000001,52.761664999999994],[-129.29278599999998,52.766937000000098],[-129.28140299999995,52.81721500000009],[-129.27722199999988,52.823051000000135],[-129.27084400000001,52.826103000000046],[-129.26223799999997,52.826660000000118],[-129.252228,52.825272000000041],[-129.23111,52.81610100000006],[-129.218323,52.809158000000082],[-129.10415599999999,52.74110399999995],[-129.066101,52.714714000000129],[-128.94695999999993,52.626381000000094],[-128.926941,52.610825000000091],[-128.92333999999994,52.606659000000036],[-128.91973899999999,52.602218999999991],[-128.91861,52.527488999999946],[-128.92251599999997,52.515274000000034],[-128.93640099999999,52.480545000000006],[-128.94360399999999,52.469711000000075],[-128.9491579999999,52.465546000000074],[-128.96166999999997,52.459435000000042],[-128.97442599999999,52.453323000000069]],[[-128.26974499999994,52.596939000000134],[-128.27416999999997,52.595543000000077],[-128.27890000000002,52.595824999999991],[-128.28445399999998,52.598602000000028],[-128.28750600000001,52.602776000000063],[-128.28973399999995,52.60833000000008],[-128.29269399999993,52.661549000000036],[-128.32305899999994,52.74110399999995],[-128.32638499999996,52.771378000000027],[-128.32501199999996,52.776100000000099],[-128.26322900000002,52.784645000000125],[-128.21063200000003,52.798515000000009],[-128.18582199999992,52.826942000000031],[-128.177795,52.826103000000046],[-128.17334,52.823326000000122],[-128.17028799999997,52.817771999999991],[-128.17584199999999,52.787773000000129],[-128.17861899999997,52.776100000000099],[-128.20776399999994,52.704436999999984],[-128.21026599999993,52.698875000000044],[-128.24722299999996,52.620544000000109],[-128.24972500000001,52.616660999999965],[-128.26141399999995,52.604439000000013],[-128.26974499999994,52.596939000000134]],[[-131.63973999999996,52.828049000000135],[-131.64666699999992,52.825829000000113],[-131.64889499999998,52.826103000000046],[-131.66973899999999,52.819160000000068],[-131.70834400000001,52.811378000000104],[-131.72387700000002,52.808327000000077],[-131.73306299999996,52.80860100000001],[-131.81332399999997,52.82027400000004],[-131.82388300000002,52.82777400000009],[-131.83138999999994,52.841934000000037],[-131.83029199999999,52.846656999999993],[-131.82250999999991,52.848045000000127],[-131.74859599999996,52.853324999999984],[-131.72860699999995,52.851387000000045],[-131.644745,52.835548000000131],[-131.636414,52.832497000000103],[-131.63973999999996,52.828049000000135]],[[-128.50527999999997,52.641106000000036],[-128.5125119999999,52.641106000000036],[-128.51611300000002,52.645271000000037],[-128.52029400000004,52.654991000000109],[-128.54000899999994,52.703323000000012],[-128.53500399999996,52.758049000000085],[-128.53362999999996,52.769157000000121],[-128.51391599999999,52.860825000000034],[-128.51028400000001,52.867493000000024],[-128.50613399999992,52.873047000000042],[-128.49887100000001,52.87082700000002],[-128.49194299999994,52.868599000000074],[-128.48553499999997,52.865273000000002],[-128.471924,52.853049999999996],[-128.46832299999994,52.848602000000028],[-128.45083599999992,52.805267000000015],[-128.45361300000002,52.782493999999986],[-128.45443699999998,52.776939000000084],[-128.50167799999991,52.647491000000002],[-128.50527999999997,52.641106000000036]],[[-129.61053500000003,52.954993999999999],[-129.61831699999999,52.953606000000093],[-129.62222299999996,52.958046000000081],[-129.65139799999992,53.013329000000113],[-129.650848,53.01888300000013],[-129.62441999999993,53.02388000000002],[-129.615814,53.024436999999921],[-129.60720800000001,53.022766000000047],[-129.57055699999989,53.013611000000026],[-129.5625,53.010551000000135],[-129.55749499999996,53.006660000000068],[-129.55667099999999,53.001389000000017],[-129.55862400000001,52.997490000000028],[-129.55334500000004,52.984993000000031],[-129.561127,52.970543000000077],[-129.59637499999991,52.959435000000099],[-129.61053500000003,52.954993999999999]],[[-129.531677,53.010551000000135],[-129.53890999999993,53.008049000000085],[-129.546967,53.008888000000013],[-129.58859299999995,53.024162000000103],[-129.64001500000001,53.044158999999979],[-129.63391099999996,53.056099000000074],[-129.56277499999993,53.053046999999992],[-129.52444500000001,53.033606999999961],[-129.51779199999993,53.029991000000109],[-129.51724200000001,53.024993999999992],[-129.52056900000002,53.018326000000059],[-129.531677,53.010551000000135]],[[-55.763061999999991,53.029434000000037],[-55.853333000000021,53.01527399999992],[-55.861945999999989,53.015549000000135],[-55.870834000000002,53.018599999999992],[-55.876388999999961,53.02748900000006],[-55.876105999999993,53.032768000000033],[-55.872771999999998,53.043883999999991],[-55.869719999999973,53.04972100000009],[-55.857779999999991,53.06749700000006],[-55.854445999999996,53.071663000000001],[-55.848609999999951,53.076102999999989],[-55.808333999999945,53.09137700000008],[-55.800551999999982,53.093605000000025],[-55.79222900000002,53.093048000000124],[-55.788612000000001,53.089714000000129],[-55.788337999999953,53.086655000000007],[-55.749167999999997,53.069160000000011],[-55.748885999999914,53.064712999999927],[-55.755004999999869,53.038604999999961],[-55.756667999999991,53.033051],[-55.763061999999991,53.029434000000037]],[[-129.60247799999996,53.057213000000047],[-129.61080899999996,53.056655999999975],[-129.69250499999993,53.075829000000056],[-129.70193499999999,53.078330999999935],[-129.70834399999995,53.08166499999993],[-129.72305299999999,53.099159000000043],[-129.73611500000004,53.12221500000004],[-129.73831200000001,53.12721300000004],[-129.73275799999999,53.131103999999937],[-129.716949,53.133881000000031],[-129.69973800000002,53.134995000000004],[-129.66805999999991,53.136108000000092],[-129.66250600000001,53.135551000000021],[-129.65444899999994,53.132767000000058],[-129.650848,53.130547000000035],[-129.64416499999999,53.12721300000004],[-129.62081899999998,53.112494999999967],[-129.615814,53.108604000000071],[-129.58804299999991,53.084717000000069],[-129.58416699999998,53.08027600000014],[-129.58193999999997,53.075554000000068],[-129.58612099999999,53.069992000000127],[-129.59664900000001,53.061104000000114],[-129.60247799999996,53.057213000000047]],[[-79.909164000000033,53.081940000000145],[-79.919723999999974,53.081940000000145],[-79.926102000000014,53.084991000000002],[-79.92971799999998,53.089432000000102],[-79.932220000000029,53.094436999999971],[-79.938599000000011,53.122490000000084],[-79.938599000000011,53.134995000000004],[-79.93499799999995,53.147774000000084],[-79.930557000000022,53.152489000000116],[-79.906386999999995,53.172768000000076],[-79.897781000000009,53.174438000000009],[-79.887511999999958,53.174438000000009],[-79.877486999999974,53.173050000000103],[-79.866393999999957,53.16944100000012],[-79.858886999999868,53.166939000000013],[-79.846114999999941,53.160545000000013],[-79.795836999999892,53.116386000000034],[-79.789444000000003,53.106941000000006],[-79.787215999999944,53.101936000000137],[-79.789444000000003,53.095825000000048],[-79.796951000000035,53.093605000000025],[-79.835555999999997,53.083878000000084],[-79.843886999999995,53.082214000000079],[-79.909164000000033,53.081940000000145]],[[-129.4324949999999,53.151382000000012],[-129.35278299999993,53.072220000000073],[-129.29000899999988,52.993607000000054],[-129.28750600000001,52.978043000000014],[-129.28945899999985,52.971930999999984],[-129.29583700000001,52.968880000000013],[-129.31222499999996,52.966934000000094],[-129.341095,52.973320000000001],[-129.41418499999997,53.010551000000135],[-129.41915900000004,53.014442000000031],[-129.42138699999998,53.019157000000064],[-129.42471299999994,53.040276000000063],[-129.42916899999994,53.04972100000009],[-129.475281,53.101936000000137],[-129.50527999999997,53.126380999999981],[-129.51196300000004,53.129714999999976],[-129.52194199999985,53.131103999999937],[-129.53750600000001,53.128326000000129],[-129.54473899999994,53.128326000000129],[-129.54724099999993,53.133049000000142],[-129.54806500000001,53.14916199999999],[-129.546967,53.16027100000008],[-129.5386049999999,53.171660999999915],[-129.52166699999992,53.18360100000001],[-129.51446499999997,53.185822000000144],[-129.49859599999996,53.188599000000011],[-129.49026499999997,53.188881000000094],[-129.47997999999995,53.187767000000122],[-129.470551,53.185265000000015],[-129.46276899999992,53.179993000000081],[-129.4324949999999,53.151382000000012]],[[-81.106109999999887,53.199714999999969],[-81.087783999999886,53.17943600000001],[-81.045272999999952,53.148605000000089],[-80.978881999999942,53.113052000000039],[-80.973617999999988,53.109436000000017],[-80.809433000000013,52.97693600000008],[-80.775008999999955,52.944434999999942],[-80.763335999999924,52.931381000000044],[-80.669158999999979,52.776939000000084],[-80.667769999999962,52.771935000000099],[-80.667496000000028,52.759438000000102],[-80.670836999999892,52.745827000000133],[-80.673049999999932,52.740547000000049],[-80.699722000000008,52.69609800000012],[-80.705001999999979,52.692214999999976],[-80.712509000000011,52.689156000000025],[-80.720551,52.688324000000136],[-80.731673999999998,52.688881000000038],[-80.739166000000012,52.691376000000048],[-80.749161000000015,52.698875000000044],[-80.753066999999987,52.703323000000012],[-80.765839000000028,52.709717000000012],[-80.797500999999954,52.719153999999946],[-80.815001999999993,52.723045000000013],[-80.861388999999917,52.731102000000021],[-80.898894999999982,52.737495000000138],[-80.918883999999991,52.740272999999945],[-80.995543999999938,52.746101000000067],[-81.015563999999927,52.748604000000057],[-81.024444999999957,52.750549000000035],[-81.138061999999934,52.788048000000117],[-81.15306099999998,52.793052999999986],[-81.198882999999967,52.814156000000082],[-81.212783999999942,52.819991999999957],[-81.251953000000015,52.832497000000103],[-81.287216000000001,52.83998900000006],[-81.369155999999862,52.856102000000078],[-81.41722099999987,52.863052000000096],[-81.58444199999991,52.889160000000061],[-81.649170000000026,52.907211000000075],[-81.763625999999931,52.937767000000008],[-81.781386999999995,52.941658000000075],[-81.811660999999958,52.945267000000058],[-81.834166999999866,52.946381000000031],[-81.881377999999984,52.954162999999994],[-81.916655999999989,52.96166199999999],[-81.933318999999983,52.965828000000045],[-81.949721999999952,52.971375000000023],[-81.962783999999886,52.97693600000008],[-82.049987999999985,53.014442000000031],[-82.056655999999862,53.017494000000113],[-82.061661000000015,53.021102999999925],[-82.063323999999909,53.026657000000114],[-82.060271999999998,53.031937000000028],[-82.053329000000019,53.041938999999957],[-82.049164000000019,53.046661000000029],[-81.974716000000001,53.113883999999985],[-81.965285999999935,53.12221500000004],[-81.954177999999956,53.129990000000134],[-81.910827999999981,53.158882000000062],[-81.892226999999991,53.168326999999977],[-81.864440999999999,53.178604000000121],[-81.848052999999936,53.181664000000012],[-81.826110999999969,53.181381000000044],[-81.714721999999881,53.188599000000011],[-81.543059999999969,53.209160000000054],[-81.385283999999899,53.224990999999989],[-81.374999999999943,53.224990999999989],[-81.295546999999999,53.217765999999983],[-81.116394000000014,53.200829000000113],[-81.106109999999887,53.199714999999969]],[[-131.76223800000002,53.196655000000078],[-131.6305539999999,53.084159999999997],[-131.595551,53.046103999999957],[-131.59304800000001,53.041382000000056],[-131.59472700000003,53.035271000000023],[-131.60165399999994,53.033051],[-131.61026000000004,53.032211000000132],[-131.62887599999999,53.032494000000099],[-131.63973999999996,53.034439000000077],[-131.73666400000002,53.053879000000052],[-131.75558499999994,53.058601000000124],[-131.77444500000001,53.068886000000077],[-131.78390499999989,53.071381000000088],[-131.79473899999994,53.073051000000078],[-131.81362899999999,53.073607999999979],[-131.82971199999992,53.071381000000088],[-131.94332900000001,53.054993000000024],[-131.96472199999999,53.046386999999925],[-131.91195700000003,53.005271999999991],[-131.90835599999991,53.011108000000036],[-131.89944499999996,53.019714000000135],[-131.88806199999999,53.026939000000027],[-131.87027,53.037498000000028],[-131.85611,53.04222100000004],[-131.84777800000001,53.043052999999929],[-131.83111600000001,53.043052999999929],[-131.81167600000003,53.039718999999991],[-131.662781,53.00777400000004],[-131.644745,53.003882999999973],[-131.62860099999995,52.998328999999956],[-131.61498999999998,52.991661000000022],[-131.609711,52.988045000000113],[-131.59805299999999,52.97526600000009],[-131.59582499999993,52.964714000000072],[-131.59750399999996,52.958602999999982],[-131.61554000000001,52.920273000000066],[-131.662781,52.882210000000043],[-131.66805999999997,52.878043999999932],[-131.68057299999992,52.871658000000025],[-131.68749999999994,52.869155999999975],[-131.70443699999993,52.867767000000129],[-131.80221599999999,52.86471599999993],[-131.80862400000001,52.865829000000019],[-131.833618,52.88499500000006],[-131.849152,52.901932000000102],[-131.87027,52.922768000000076],[-131.88473499999992,52.934433000000013],[-131.89001500000001,52.93832400000008],[-131.898346,52.941100999999946],[-131.906677,52.940269000000058],[-131.93859899999995,52.934990000000084],[-131.94473299999999,52.931664000000012],[-131.982483,52.879715000000033],[-131.97860700000001,52.875549000000092],[-131.96859699999999,52.874435000000119],[-131.95278899999988,52.875267000000065],[-131.94528200000002,52.876938000000109],[-131.93139599999995,52.881660000000011],[-131.85638399999993,52.856102000000078],[-131.77557399999989,52.716660000000047],[-131.767517,52.713882000000012],[-131.73361199999999,52.69860100000011],[-131.72692900000004,52.695541000000048],[-131.72305299999988,52.691101000000003],[-131.683899,52.642220000000009],[-131.68139600000001,52.637496999999996],[-131.65945399999993,52.581665000000044],[-131.57278400000001,52.529991000000052],[-131.56527700000004,52.531662000000097],[-131.55667099999994,52.532211000000018],[-131.54583700000001,52.530273000000079],[-131.48193400000002,52.507773999999984],[-131.46749899999992,52.501389000000131],[-131.42361499999998,52.460823000000119],[-131.42748999999998,52.414993000000095],[-131.39849899999996,52.377827000000025],[-131.39533999999998,52.375492000000122],[-131.39016699999996,52.374660000000006],[-131.36749299999991,52.381827999999985],[-131.36549400000001,52.384491000000025],[-131.36599699999988,52.390986999999996],[-131.36715700000002,52.397160000000042],[-131.357483,52.403320000000065],[-131.35833699999989,52.414153999999996],[-131.35305799999998,52.41832700000009],[-131.32833900000003,52.431107000000054],[-131.31304899999998,52.434158000000082],[-131.27252199999998,52.438881000000038],[-131.25558499999988,52.440269000000001],[-131.23638900000003,52.439156000000082],[-131.23248299999995,52.434714999999983],[-131.24749800000001,52.365829000000133],[-131.25085399999995,52.359160999999972],[-131.25836200000003,52.34777100000008],[-131.26306199999999,52.34276600000004],[-131.30311599999993,52.332100000000025],[-131.31977799999993,52.335106000000053],[-131.33059700000001,52.332770999999923],[-131.33248899999995,52.293610000000001],[-131.32833900000003,52.284995999999978],[-131.32443199999989,52.280822999999998],[-131.27139299999999,52.277771000000087],[-131.259186,52.284164000000033],[-131.25613399999992,52.290833000000077],[-131.24832199999997,52.302216000000101],[-131.17971799999998,52.317772000000048],[-131.17193599999996,52.319442999999922],[-131.136414,52.311378000000047],[-131.09500099999997,52.286110000000122],[-131.01501500000001,52.225548000000117],[-131.00750699999998,52.217209000000082],[-131.00527999999991,52.206657000000064],[-131.01168799999988,52.193604000000107],[-131.01556400000004,52.187767000000122],[-131.024719,52.178047000000049],[-131.030304,52.173882000000049],[-131.036407,52.170830000000137],[-131.04305999999991,52.168326999999977],[-131.11512799999997,52.168289000000016],[-131.16610700000001,52.125549000000092],[-131.18057299999987,52.121658000000025],[-131.26473999999985,52.11971299999999],[-131.29888900000003,52.150268999999923],[-131.36025999999993,52.189156000000139],[-131.36694299999999,52.192490000000134],[-131.38946499999997,52.205826000000059],[-131.41168200000004,52.220543000000077],[-131.55111699999998,52.333878000000084],[-131.57333399999993,52.360824999999977],[-131.58194000000003,52.379990000000134],[-131.582764,52.385269000000108],[-131.58056599999986,52.390548999999965],[-131.57778899999994,52.393607999999972],[-131.57083099999994,52.396102999999982],[-131.54806500000001,52.400543000000027],[-131.53973399999995,52.401100000000099],[-131.52972399999993,52.400269000000094],[-131.52029400000004,52.397774000000027],[-131.56140099999999,52.431664000000126],[-131.66168199999998,52.478324999999984],[-131.67916899999994,52.483604000000128],[-131.70944199999991,52.491104000000007],[-131.76223800000002,52.50499700000006],[-131.77529899999996,52.51166500000005],[-131.89279199999999,52.582771000000093],[-132.01751699999994,52.677490000000034],[-132.08194000000003,52.727485999999942],[-132.08471700000001,52.732208000000014],[-132.060272,52.755272000000048],[-132.01028399999996,52.775269000000094],[-132.00250199999999,52.776939000000084],[-131.993042,52.774436999999978],[-131.97305299999999,52.764717000000076],[-131.96389799999997,52.756660000000124],[-131.94445799999988,52.735549999999989],[-131.93362400000001,52.728043000000014],[-131.92694099999994,52.724709000000075],[-131.91751099999988,52.722487999999942],[-131.91723599999995,52.725822000000107],[-131.93722499999996,52.763611000000083],[-131.93972799999995,52.768326000000116],[-131.95166,52.781105000000139],[-131.96221899999995,52.788605000000018],[-131.96887200000003,52.791939000000013],[-132.03417999999994,52.812767000000122],[-132.06167599999998,52.813881000000094],[-132.05804399999994,52.804161000000022],[-132.05557299999987,52.793610000000058],[-132.10247800000002,52.749435000000062],[-132.11026000000004,52.748046999999985],[-132.12026999999995,52.748877999999991],[-132.12747199999995,52.750832000000003],[-132.21417199999991,52.804710000000114],[-132.21945199999999,52.808327000000077],[-132.22888199999994,52.816382999999973],[-132.31640599999997,52.902214000000129],[-132.34414700000002,52.931664000000012],[-132.34695399999993,52.936377999999991],[-132.34304799999995,52.942214999999976],[-132.32971199999992,52.94582400000013],[-132.31362899999999,52.948043999999982],[-132.25558499999994,52.954711999999915],[-132.24527,52.953880000000026],[-132.23803699999991,52.951935000000049],[-132.16778599999992,52.928047000000106],[-132.15640300000001,52.958885000000066],[-132.11248799999998,52.987770000000125],[-132.11026000000004,52.993049999999982],[-132.11276199999992,52.997772000000055],[-132.11944599999998,53.00110600000005],[-132.25613399999997,53.028877000000136],[-132.26696799999996,53.030823000000055],[-132.29501300000004,53.031105000000082],[-132.41195700000003,53.031937000000028],[-132.47970599999996,53.027214000000015],[-132.49609399999991,53.032768000000033],[-132.50778199999996,53.040549999999996],[-132.51196300000004,53.044716000000051],[-132.55279499999995,53.089714000000129],[-132.55557299999992,53.094436999999971],[-132.56362899999999,53.139160000000004],[-132.56222500000001,53.145271000000093],[-132.55667099999994,53.149436999999978],[-132.54916399999991,53.151100000000099],[-132.53945899999991,53.148880000000077],[-132.52584799999994,53.142220000000066],[-132.50140399999998,53.133881000000031],[-132.48165899999998,53.130820999999969],[-132.45111099999986,53.128044000000102],[-132.41363499999989,53.127486999999974],[-132.378601,53.129433000000063],[-132.21081499999997,53.141662999999994],[-132.07083099999994,53.153877000000023],[-132.06390399999987,53.156380000000013],[-132.05777,53.159714000000008],[-132.03057899999999,53.179993000000081],[-132.00750700000003,53.1947100000001],[-131.92834500000004,53.230545000000006],[-131.92138699999992,53.233047000000056],[-131.811127,53.253608999999983],[-131.80194099999994,53.253326000000015],[-131.794464,53.251388999999961],[-131.79055800000003,53.247214999999926],[-131.76223800000002,53.196655000000078]],[[-55.778052999999943,53.289719000000105],[-55.786667000000023,53.288330000000087],[-55.794448999999929,53.291107000000011],[-55.797226000000023,53.295546999999999],[-55.793334999999956,53.300545],[-55.785003999999958,53.303604000000007],[-55.776108000000022,53.300270000000012],[-55.776389999999992,53.295273000000066],[-55.778052999999943,53.289719000000105]],[[-128.68945299999996,53.16443600000008],[-128.67944299999994,53.163047999999947],[-128.67083700000001,53.163605000000075],[-128.65222199999999,53.16276600000009],[-128.64196799999996,53.161377000000073],[-128.62469499999997,53.155548000000067],[-128.60555999999997,53.145271000000093],[-128.57611099999991,53.105270000000132],[-128.53167699999995,53.021102999999925],[-128.52890000000002,53.011108000000036],[-128.52056900000002,52.959435000000099],[-128.51834099999991,52.943604000000107],[-128.51779199999987,52.927489999999977],[-128.51834099999991,52.911102000000142],[-128.52001999999999,52.899719000000118],[-128.52279699999991,52.888046000000088],[-128.57028199999996,52.691376000000048],[-128.57223499999992,52.685265000000129],[-128.57528699999995,52.679993000000024],[-128.59359699999993,52.659156999999993],[-128.58526599999988,52.659431000000097],[-128.57748400000003,52.65638000000007],[-128.58581499999991,52.6322100000001],[-128.59222399999993,52.613884000000098],[-128.59722899999991,52.609161000000086],[-128.60497999999995,52.607773000000009],[-128.74887099999995,52.597214000000122],[-128.75167799999997,52.60083000000003],[-128.74859600000002,52.748604000000057],[-128.74804699999999,52.754165999999998],[-128.74444600000004,52.760826000000009],[-128.69250499999998,52.856102000000078],[-128.65335099999999,52.892769000000101],[-128.648346,52.89777400000014],[-128.64474499999994,52.904160000000047],[-128.64334099999996,52.915543000000071],[-128.64196799999996,52.948601000000053],[-128.64334099999996,52.958885000000066],[-128.646973,52.963325999999995],[-128.65335099999999,52.96665999999999],[-128.663635,52.968048000000067],[-128.67138699999998,52.96665999999999],[-128.67694099999994,52.962769000000094],[-128.67999299999997,52.957771000000093],[-128.75112899999999,52.835823000000119],[-128.75390600000003,52.830826000000059],[-128.76223800000002,52.810822000000087],[-128.76446499999997,52.804710000000114],[-128.78057899999999,52.739989999999977],[-128.78140299999995,52.734160999999972],[-128.77999899999998,52.72387700000013],[-128.77780200000001,52.718880000000013],[-128.77111799999994,52.704711999999972],[-128.76556400000004,52.695541000000048],[-128.77889999999991,52.66415400000011],[-128.84637499999997,52.653320000000065],[-128.88445999999999,52.648048000000131],[-128.89251699999994,52.64888000000002],[-129,52.697212000000093],[-129.03277600000001,52.719711000000075],[-129.04779099999996,52.731377000000009],[-129.08029199999999,52.772491000000116],[-129.10861199999999,52.812767000000122],[-129.11080899999996,52.817497000000117],[-129.114441,52.821938000000046],[-129.11886600000003,52.83138300000013],[-129.12191799999994,52.852218999999934],[-129.12191799999994,52.863052000000096],[-129.11999500000002,52.869155999999975],[-129.11080899999996,52.877487000000031],[-129.10360699999995,52.879715000000033],[-129.09500100000002,52.880272000000105],[-129.08444199999997,52.878043999999932],[-129.0763849999999,52.87499200000002],[-129.02224699999988,52.905548000000124],[-128.95178199999992,52.973660000000052],[-128.86999499999996,53.021935000000042],[-128.85498000000001,53.025269000000037],[-128.84082000000001,53.029716000000121],[-128.83639499999998,53.03555300000005],[-128.84359699999999,53.044158999999979],[-128.89556899999997,53.08277099999998],[-128.96389799999992,53.121657999999968],[-128.970551,53.124992000000134],[-129.00222799999995,53.136940000000038],[-129.01168799999999,53.139717000000076],[-129.01583900000003,53.133881000000031],[-129.01501499999995,53.128875999999991],[-129.00473,53.109993000000088],[-128.99386599999997,53.097214000000065],[-128.98748799999998,53.095825000000048],[-128.98110999999994,53.09887700000013],[-128.97387700000002,53.101105000000132],[-128.96444699999995,53.100548000000003],[-128.95666499999999,53.097771000000137],[-128.912781,53.073051000000078],[-128.86444099999989,53.038887000000045],[-128.862213,53.034164000000089],[-129.05584699999997,52.909156999999936],[-129.06915299999991,52.90387700000008],[-129.09500100000002,52.902489000000003],[-129.10583500000001,52.904708999999968],[-129.15945399999998,52.919715999999994],[-129.16583299999996,52.923049999999989],[-129.169464,52.927489999999977],[-129.17529300000001,52.936377999999991],[-129.18554700000004,52.955269000000044],[-129.18722499999996,52.965546000000018],[-129.191956,53.00777400000004],[-129.19137599999999,53.013329000000113],[-129.18804899999992,53.024162000000103],[-129.16665599999993,53.06610100000006],[-129.16168200000004,53.0711060000001],[-129.15472399999999,53.073326000000066],[-129.13165300000003,53.078049000000078],[-129.11804199999989,53.079163000000051],[-129.11749299999991,53.073882999999967],[-129.11804199999989,53.068329000000006],[-129.11499000000003,53.064712999999927],[-129.10861199999999,53.067772000000105],[-129.08248899999995,53.089989000000003],[-129.075287,53.10305000000011],[-129.07333399999999,53.109160999999972],[-129.07055700000001,53.131660000000124],[-129.05889899999988,53.231377000000123],[-129.06027199999988,53.241661000000136],[-129.064728,53.251105999999993],[-129.07193000000001,53.25999500000006],[-129.08221400000002,53.267769000000101],[-129.08972199999994,53.287216000000114],[-129.08612099999999,53.293610000000001],[-129.07971199999997,53.296661000000029],[-129.06664999999992,53.300827000000083],[-129.04305999999997,53.30471],[-129.025848,53.305550000000096],[-129.01861600000001,53.305550000000096],[-128.90084799999994,53.290276000000006],[-128.89138799999989,53.287773000000016],[-128.88137800000004,53.279991000000052],[-128.87777699999992,53.275826000000052],[-128.86389199999991,53.263610999999969],[-128.84359699999999,53.248047000000042],[-128.83221399999996,53.240546999999992],[-128.77529900000002,53.208885000000009],[-128.71167000000003,53.173882000000049],[-128.70526099999989,53.170546999999942],[-128.68945299999996,53.16443600000008]],[[-129.15307599999994,53.098328000000038],[-129.16168200000004,53.097771000000137],[-129.25945999999999,53.09804500000007],[-129.28945899999985,53.101936000000137],[-129.31140099999999,53.116936000000067],[-129.32665999999989,53.128601000000003],[-129.33248900000001,53.13749700000011],[-129.33471699999996,53.142493999999999],[-129.33639500000004,53.152770999999973],[-129.33889799999986,53.179161000000022],[-129.3383179999999,53.184990000000028],[-129.33639500000004,53.191101000000117],[-129.32528699999989,53.216103000000032],[-129.27389500000004,53.328049000000021],[-129.26806599999992,53.331940000000088],[-129.26028399999996,53.333327999999995],[-129.250854,53.333054000000061],[-129.22915599999988,53.328880000000026],[-129.22692899999998,53.326102999999932],[-129.20889299999999,53.321937999999932],[-129.19415299999997,53.315544000000102],[-129.18112199999996,53.308601000000067],[-129.17611699999998,53.30471],[-129.16860999999994,53.296104000000128],[-129.14529399999998,53.22165700000005],[-129.13247699999999,53.118599000000017],[-129.13192699999996,53.11360899999994],[-129.1339109999999,53.107498000000078],[-129.13891599999994,53.102493000000038],[-129.15307599999994,53.098328000000038]],[[-79.942764000000011,53.266936999999984],[-80.009170999999924,53.263885000000073],[-80.018065999999862,53.265830999999991],[-80.024445000000014,53.268883000000073],[-80.081679999999949,53.316101000000003],[-80.083892999999989,53.321106000000043],[-80.085281000000009,53.326942000000088],[-80.073333999999988,53.348877000000073],[-80.068892999999946,53.353325000000041],[-80.061385999999914,53.355553000000043],[-79.999724999999955,53.364716000000044],[-79.944716999999969,53.368050000000039],[-79.950561999999934,53.349716000000058],[-79.951949999999954,53.348327999999981],[-79.913054999999986,53.296104000000128],[-79.91194200000001,53.29055000000011],[-79.913329999999917,53.283051000000114],[-79.920836999999949,53.273048000000074],[-79.927215999999987,53.27027099999998],[-79.942764000000011,53.266936999999984]],[[-129.35833700000001,53.304161000000079],[-129.37441999999999,53.301383999999985],[-129.38363600000002,53.301933000000133],[-129.3875119999999,53.306099000000017],[-129.43499799999995,53.378876000000105],[-129.43307500000003,53.384720000000129],[-129.39501999999999,53.410819999999944],[-129.386414,53.40915700000005],[-129.37970000000001,53.40554800000001],[-129.37387100000001,53.400826000000109],[-129.36663799999991,53.398880000000077],[-129.32861300000002,53.377769000000001],[-129.30557299999998,53.335823000000005],[-129.30334499999992,53.331107999999972],[-129.30749500000002,53.31888600000002],[-129.31249999999989,53.313880999999981],[-129.32693499999999,53.309715000000097],[-129.35833700000001,53.304161000000079]],[[-55.787505999999951,53.394157000000064],[-55.793059999999969,53.391663000000108],[-55.801392000000021,53.392493999999942],[-55.949439999999981,53.430275000000108],[-55.958053999999947,53.434158000000082],[-55.971663999999919,53.445824000000016],[-55.978881999999942,53.454712000000029],[-55.979163999999912,53.459159999999997],[-55.976386999999988,53.463051000000064],[-55.958892999999932,53.472487999999998],[-55.945549000000028,53.478600000000142],[-55.931670999999994,53.483879000000115],[-55.923889000000031,53.485549999999989],[-55.916388999999981,53.485825000000034],[-55.883057000000008,53.486382000000106],[-55.878051999999968,53.486656000000039],[-55.811942999999928,53.483879000000115],[-55.757224999999949,53.468322999999998],[-55.740554999999915,53.462212000000079],[-55.729163999999969,53.455269000000101],[-55.729439000000013,53.450271999999984],[-55.787505999999951,53.394157000000064]],[[-128.94250499999998,53.317497000000003],[-129.11138899999997,53.315826000000129],[-129.12222299999996,53.318054000000132],[-129.12582399999991,53.322495000000004],[-129.13891599999994,53.339989000000116],[-129.14334099999996,53.349716000000058],[-129.14416499999993,53.354996000000142],[-129.14306599999986,53.366104000000121],[-129.14083899999997,53.37221500000004],[-129.13445999999993,53.383880999999974],[-129.08270299999998,53.429259999999999],[-129.05406199999999,53.453601999999989],[-129.05883799999998,53.487965000000145],[-129.051941,53.50499700000006],[-129.04779099999996,53.510551000000021],[-129.03778099999988,53.520271000000093],[-129.02194199999997,53.533882000000062],[-129.015289,53.536658999999986],[-128.99941999999987,53.53943600000008],[-128.988586,53.537216000000058],[-128.984711,53.533051000000057],[-128.98416099999997,53.52777100000003],[-128.98553499999997,53.523048000000017],[-128.98611499999998,53.513054000000011],[-128.98611499999998,53.502220000000136],[-128.9844359999999,53.491661000000079],[-128.97555499999987,53.472762999999986],[-128.95361300000002,53.446655000000021],[-128.94137599999993,53.434158000000082],[-128.93612699999994,53.430275000000108],[-128.90335099999993,53.39138000000014],[-128.90112299999998,53.386658000000068],[-128.90029900000002,53.381378000000041],[-128.91805999999997,53.331383000000017],[-128.92251599999997,53.325828999999999],[-128.92806999999999,53.321663000000115],[-128.94250499999998,53.317497000000003]],[[-79.709732000000031,53.508049000000142],[-79.720276000000013,53.507499999999993],[-79.730559999999969,53.508888000000127],[-79.746947999999918,53.513328999999999],[-79.764724999999942,53.523605000000089],[-79.769729999999925,53.527214000000129],[-79.773620999999991,53.531662000000097],[-79.77027899999996,53.536942000000124],[-79.761397999999929,53.546104000000071],[-79.755004999999983,53.543053000000043],[-79.70695499999988,53.515549000000021],[-79.703338999999914,53.511108000000092],[-79.709732000000031,53.508049000000142]],[[-129.93472299999985,53.484161000000029],[-129.94277999999991,53.482764999999972],[-129.95220899999998,53.483047000000056],[-130.01446499999997,53.501938000000052],[-130.02111799999994,53.505272000000048],[-129.98858599999988,53.528603000000089],[-129.94195599999995,53.551102000000071],[-129.93417399999998,53.552489999999977],[-129.92611699999992,53.551658999999972],[-129.89334099999991,53.545546999999999],[-129.88668799999999,53.542221000000097],[-129.88418599999994,53.537216000000058],[-129.88696300000004,53.534163999999976],[-129.894745,53.521934999999928],[-129.89889499999998,53.516388000000006],[-129.913635,53.501938000000052],[-129.92916899999994,53.488327000000083],[-129.93472299999985,53.484161000000029]],[[-129.87942499999991,53.392768999999987],[-129.72915599999993,53.215271000000087],[-129.73028599999992,53.204163000000108],[-129.73220799999996,53.198044000000095],[-129.74249299999997,53.178329000000076],[-129.75085399999989,53.166939000000013],[-129.75585899999993,53.162209000000018],[-129.76223799999997,53.158882000000062],[-129.86416600000001,53.153046000000018],[-129.91223100000002,53.156380000000013],[-129.93167099999999,53.158043000000077],[-129.93695099999997,53.161933999999974],[-130.08804299999991,53.289436000000137],[-130.11111500000004,53.328049000000021],[-130.16500899999988,53.358330000000137],[-130.20333899999997,53.378876000000105],[-130.24249299999997,53.384163000000058],[-130.261414,53.384720000000129],[-130.28695700000003,53.381378000000041],[-130.29638699999998,53.381660000000068],[-130.30584699999997,53.384163000000058],[-130.31640600000003,53.391937000000041],[-130.40194700000001,53.479988000000048],[-130.52722199999999,53.552216000000044],[-130.52999899999998,53.567771999999991],[-130.52944899999994,53.573326000000009],[-130.52224699999994,53.618599000000074],[-130.52029399999998,53.624709999999993],[-130.50836200000003,53.631935000000055],[-130.459991,53.637496999999996],[-130.450287,53.634995000000117],[-130.39584399999995,53.619438000000059],[-130.39111300000002,53.61693600000001],[-130.37554899999992,53.612212999999997],[-130.27529900000002,53.580276000000026],[-130.20220900000004,53.553878999999938],[-130.14083900000003,53.528877000000023],[-129.97720300000003,53.455550999999957],[-129.94415299999991,53.438598999999954],[-129.93222000000003,53.431380999999988],[-129.92056300000002,53.424164000000019],[-129.88418599999994,53.397217000000126],[-129.87942499999991,53.392768999999987]],[[-129.08639500000004,53.446097999999949],[-129.15750099999997,53.392768999999987],[-129.16778599999998,53.593880000000127],[-129.16583299999996,53.610825000000091],[-129.16305499999999,53.622489999999971],[-129.16082799999998,53.62860100000006],[-129.15307599999994,53.638603000000046],[-129.14724699999994,53.642494000000113],[-129.14083899999997,53.645546000000024],[-129.05249000000003,53.681106999999997],[-129.03860499999985,53.686377999999991],[-129.00805699999995,53.693321000000026],[-128.98330699999991,53.696655000000021],[-128.87554899999998,53.709434999999928],[-128.832764,53.712494000000106],[-128.82388299999997,53.713051000000007],[-128.81887800000004,53.709160000000111],[-128.82110599999999,53.703049000000021],[-128.82360799999998,53.700546000000088],[-128.87222299999991,53.661102000000142],[-128.97970599999996,53.58387799999997],[-128.98638900000003,53.580826000000059],[-128.99221799999992,53.576942000000031],[-129.07556199999993,53.514717000000132],[-129.08554100000003,53.50499700000006],[-129.08999599999999,53.499435000000062],[-129.09359699999993,53.492767000000129],[-129.09414699999996,53.487213000000111],[-129.093323,53.481934000000138],[-129.08889799999997,53.472487999999998],[-129.08526599999993,53.468047999999953],[-129.08306899999997,53.463326000000052],[-129.08221400000002,53.458328000000051],[-129.08276399999988,53.452492000000007],[-129.08639500000004,53.446097999999949]],[[-130.09109499999994,53.569443000000035],[-130.09832800000004,53.566940000000102],[-130.10775799999999,53.567497000000003],[-130.14862099999999,53.571938000000102],[-130.21887199999992,53.587212000000136],[-130.22833299999996,53.589431999999988],[-130.32916299999994,53.618049999999982],[-130.34249899999998,53.624709999999993],[-130.39028899999988,53.669991000000039],[-130.40335099999999,53.682495000000074],[-130.39111300000002,53.699432000000058],[-130.29888899999997,53.796944000000053],[-130.2836299999999,53.79833200000013],[-130.27194199999997,53.797775000000058],[-130.26168799999994,53.796386999999982],[-130.24664299999989,53.790276000000063],[-130.23330699999985,53.783607000000018],[-130.11944600000004,53.686653000000035],[-130.11721799999998,53.681938000000002],[-130.09109499999994,53.569443000000035]],[[-56.86721799999998,53.764998999999932],[-56.948607999999979,53.750000000000057],[-56.982773000000009,53.755271999999991],[-57.01139099999989,53.781105000000139],[-57.014450000000011,53.785553000000107],[-57.012222000000008,53.790276000000063],[-57.006667999999991,53.794716000000108],[-57,53.79833200000013],[-56.984726000000023,53.803879000000109],[-56.966942000000017,53.803879000000109],[-56.863060000000019,53.798050000000103],[-56.84444400000001,53.792496000000085],[-56.847518999999977,53.786644000000138],[-56.86721799999998,53.764998999999932]],[[-129.82611099999991,53.724158999999986],[-129.59722899999997,53.550270000000125],[-129.51611300000002,53.488045000000056],[-129.42471299999994,53.411377000000016],[-129.43472299999996,53.401656999999943],[-129.45165999999995,53.379158000000018],[-129.45498699999996,53.372490000000028],[-129.47415199999995,53.289162000000033],[-129.47387700000002,53.239990000000091],[-129.50668299999995,53.216660000000104],[-129.56390399999998,53.207497000000103],[-129.72582999999992,53.340546000000018],[-129.800568,53.380546999999979],[-129.80721999999997,53.384163000000058],[-129.82223499999986,53.401382000000126],[-129.85833700000001,53.456383000000073],[-129.87719699999997,53.50499700000006],[-129.87026999999995,53.518051000000128],[-129.86999500000002,53.534721000000047],[-129.87026999999995,53.545546999999999],[-129.88391100000001,53.579720000000009],[-129.91607699999992,53.601715000000013],[-129.9192349999999,53.604050000000143],[-129.92489599999999,53.605545000000006],[-129.93022199999996,53.605213000000106],[-129.939728,53.603549999999984],[-129.94305399999985,53.601215000000025],[-129.94605999999987,53.598216999999977],[-129.94555700000001,53.59521500000011],[-129.96139500000004,53.594711000000132],[-129.96554600000002,53.589156999999943],[-129.99941999999993,53.574714999999969],[-130.00750699999998,53.573326000000009],[-130.01611300000002,53.572769000000108],[-130.02694699999989,53.574714999999969],[-130.04028299999993,53.58138300000013],[-130.05166600000001,53.594437000000028],[-130.05639599999995,53.603882000000112],[-130.05584699999991,53.609436000000073],[-130.05166600000001,53.615273000000059],[-130.03085299999987,53.622765000000015],[-129.98288000000002,53.641605000000084],[-129.97805799999992,53.642436999999973],[-129.96240199999994,53.643436000000065],[-129.95622300000002,53.642769000000101],[-129.94955400000003,53.641434000000118],[-129.93505900000002,53.636272000000076],[-129.92938199999998,53.634765999999956],[-129.926895,53.636772000000065],[-129.92820699999993,53.639602999999966],[-129.93440199999992,53.644268000000125],[-129.94956999999994,53.646805000000086],[-129.95996100000002,53.649501999999927],[-129.96726999999993,53.650299000000018],[-129.98693799999995,53.658600000000092],[-130.01889,53.653046000000074],[-130.091949,53.677216000000101],[-130.15695199999999,53.721375000000023],[-130.283905,53.83277099999998],[-130.286407,53.837493999999992],[-130.27917499999995,53.856384000000105],[-130.27029400000004,53.875549000000092],[-130.26641799999999,53.881378000000097],[-130.25472999999994,53.889160000000061],[-130.20166,53.912491000000102],[-130.19445799999994,53.914711000000125],[-130.18640099999999,53.916100000000085],[-130.10916099999992,53.885551000000021],[-129.96444699999995,53.805824000000086],[-129.83139,53.728043000000014],[-129.82611099999991,53.724158999999986]],[[-79.864166000000012,53.906380000000013],[-79.873885999999914,53.90415999999999],[-79.906113000000005,53.913879000000009],[-79.918883999999991,53.920273000000066],[-79.922775000000001,53.924713000000054],[-79.925277999999878,53.929717999999923],[-79.926392000000021,53.935265000000072],[-79.915008999999998,53.933876000000055],[-79.867492999999968,53.919715999999994],[-79.862212999999997,53.915825000000098],[-79.860001000000011,53.910820000000058],[-79.864166000000012,53.906380000000013]],[[-130.14974999999998,53.989159000000086],[-130.16805999999997,53.988884000000098],[-130.179169,53.990829000000076],[-130.19415300000003,53.997214999999983],[-130.20306400000004,54.005271999999934],[-130.21499600000004,54.029160000000104],[-130.21694899999994,54.039436000000137],[-130.21640000000002,54.044998000000078],[-130.21304299999997,54.051659000000029],[-130.20278899999994,54.069160000000011],[-130.19360399999999,54.079720000000123],[-130.18640099999999,54.081940000000145],[-130.17834500000004,54.083328000000051],[-130.16861,54.083054000000118],[-130.15917999999994,54.080551000000128],[-130.15557899999999,54.075554000000011],[-130.14889500000004,54.072220000000016],[-130.14361599999995,54.068328999999949],[-130.13973999999996,54.064156000000025],[-130.13247699999999,54.049995000000024],[-130.12249799999995,54.024993999999992],[-130.1213679999999,54.019989000000123],[-130.12249799999995,54.0086060000001],[-130.12441999999999,54.002495000000067],[-130.13528399999996,53.993607000000054],[-130.14974999999998,53.989159000000086]],[[-130.25918599999994,54.004715000000033],[-130.237213,53.984161000000086],[-130.23330699999985,53.979987999999935],[-130.23083499999996,53.975266000000033],[-130.228882,53.964714000000072],[-130.22998000000001,53.953606000000093],[-130.23330699999985,53.946938000000102],[-130.24249299999997,53.936377999999991],[-130.338593,53.839157000000114],[-130.34445199999999,53.835266000000047],[-130.35220299999997,53.833878000000141],[-130.37860099999995,53.831939999999975],[-130.38723800000002,53.831383000000073],[-130.45016499999997,53.864326000000005],[-130.45433000000003,53.866325000000018],[-130.45849599999997,53.882159999999942],[-130.41278099999994,53.958602999999982],[-130.40777600000001,53.963325999999995],[-130.400848,53.965828000000045],[-130.38165300000003,53.965271000000143],[-130.35055499999993,53.961661999999933],[-130.341095,53.961380000000077],[-130.33306899999991,53.962769000000094],[-130.32748400000003,53.966934000000094],[-130.34359699999987,53.984993000000031],[-130.35497999999995,53.993324000000086],[-130.42944299999994,53.983047000000113],[-130.4375,53.981659000000036],[-130.44387800000004,53.978600000000029],[-130.452789,53.968048000000067],[-130.47517400000004,53.944213999999931],[-130.47550999999993,53.940712000000076],[-130.47917199999995,53.926379999999995],[-130.48266599999988,53.915379000000144],[-130.48516799999993,53.912048000000027],[-130.4895019999999,53.910549000000003],[-130.49465900000001,53.910217000000046],[-130.500854,53.910881000000131],[-130.524338,53.914711000000125],[-130.54724099999999,53.903877000000023],[-130.55248999999998,53.907767999999919],[-130.55639599999995,53.911934000000031],[-130.56527699999998,53.925827000000027],[-130.57748400000003,53.93721000000005],[-130.591949,53.949158000000125],[-130.59722899999997,53.953048999999965],[-130.60278299999993,53.956657000000064],[-130.61080900000002,53.959717000000126],[-130.62191799999999,53.961661999999933],[-130.65805099999989,53.964439000000027],[-130.66696200000001,53.963882000000126],[-130.67251599999997,53.959991000000059],[-130.67666600000001,53.954162999999994],[-130.69528200000002,53.91944100000012],[-130.698059,53.914154000000053],[-130.69555700000001,53.909431000000041],[-130.68499799999989,53.901932000000045],[-130.66305499999993,53.892220000000123],[-130.64666699999998,53.886657999999954],[-130.633331,53.879990000000021],[-130.62777700000004,53.876099000000124],[-130.62249799999995,53.872215000000097],[-130.6177669999999,53.862770000000012],[-130.61804199999995,53.857216000000051],[-130.62136799999996,53.85054800000006],[-130.62554899999998,53.844711000000075],[-130.6305539999999,53.839989000000003],[-130.64251699999994,53.83277099999998],[-130.65139799999997,53.834435000000042],[-130.69583099999994,53.844436999999971],[-130.70639,53.851936000000137],[-130.71026599999999,53.856384000000105],[-130.71276899999998,53.861107000000118],[-130.72305299999999,53.917213000000004],[-130.72277799999995,53.922768000000076],[-130.7202759999999,53.93471500000004],[-130.71777299999991,53.939986999999974],[-130.667236,53.986938000000009],[-130.66168200000004,53.990829000000076],[-130.59527600000001,54.026382000000069],[-130.523346,54.059989999999914],[-130.41113300000001,54.100830000000087],[-130.40249600000004,54.101386999999988],[-130.37081899999998,54.087212000000079],[-130.33612099999999,54.06749700000006],[-130.30499299999991,54.045273000000122],[-130.25918599999994,54.004715000000033]],[[-58.518332999999927,54.051659000000029],[-58.526664999999923,54.050545000000056],[-58.536666999999966,54.05082700000014],[-58.545554999999979,54.052216000000101],[-58.556389000000024,54.054710000000057],[-58.56138599999997,54.058044000000052],[-58.56138599999997,54.063880999999981],[-58.55777699999993,54.069160000000011],[-58.552779999999927,54.074440000000038],[-58.53556100000003,54.086654999999951],[-58.503058999999951,54.103050000000053],[-58.468605000000025,54.114716000000044],[-58.450554000000011,54.11721],[-58.437774999999988,54.115547000000049],[-58.378608999999926,54.106659000000093],[-58.373885999999914,54.104164000000083],[-58.378052000000025,54.099998000000141],[-58.407172999999943,54.090561000000037],[-58.426108999999997,54.070831000000055],[-58.43250299999994,54.067214999999976],[-58.440551999999968,54.064713000000097],[-58.456389999999999,54.061661000000015],[-58.518332999999927,54.051659000000029]],[[-132.808044,54.120270000000062],[-132.78890999999999,54.119987000000094],[-132.77999899999998,54.120827000000133],[-132.75723300000004,54.126380999999924],[-132.73580899999996,54.133881000000031],[-132.70306399999993,54.139160000000004],[-132.65835600000003,54.142220000000066],[-132.6480709999999,54.141380000000026],[-132.63946499999997,54.138603000000103],[-132.57528699999995,54.115547000000049],[-132.56973300000004,54.111938000000066],[-132.55777,54.088043000000084],[-132.558899,54.048332000000073],[-132.56054699999999,54.04222100000004],[-132.56664999999992,54.029160000000104],[-132.57583599999998,54.019157000000007],[-132.58139,54.014999000000103],[-132.59387199999998,54.0086060000001],[-132.62554899999992,54.002220000000023],[-132.63275099999993,53.999718000000144],[-132.66418499999997,53.98333000000008],[-132.67999299999997,53.958885000000066],[-132.68167099999999,53.952773999999977],[-132.68029799999999,53.947769000000108],[-132.65890499999989,53.939430000000073],[-132.57223499999992,53.976653999999996],[-132.55584699999997,53.989159000000086],[-132.55029299999995,53.993880999999988],[-132.5477909999999,53.999161000000072],[-132.54888899999997,54.004166000000112],[-132.55306999999999,54.008331000000112],[-132.54833999999994,54.02693899999997],[-132.54528800000003,54.033607000000131],[-132.54055799999998,54.038329999999974],[-132.41665599999999,54.096100000000035],[-132.40972899999997,54.098602000000085],[-132.40167199999985,54.099998000000141],[-132.30111699999998,54.111664000000133],[-132.29055800000003,54.110549999999989],[-132.28582799999998,54.107773000000066],[-132.25280799999996,54.08526599999999],[-132.22833300000002,54.065826000000015],[-132.15029899999996,53.992767000000015],[-132.142517,53.978600000000029],[-132.11111499999998,53.878326000000015],[-132.11721799999992,53.864998000000014],[-132.125,53.853324999999984],[-132.13445999999988,53.843605000000082],[-132.22500600000001,53.780273000000022],[-132.23111,53.776939000000027],[-132.24527,53.772217000000126],[-132.47442599999999,53.707496999999989],[-132.50500499999998,53.700271999999927],[-132.52084399999995,53.697212000000093],[-132.53805499999999,53.695823999999959],[-132.55721999999997,53.695823999999959],[-132.56832899999995,53.697768999999994],[-132.58889799999992,53.699715000000026],[-132.60693399999991,53.698874999999987],[-132.62441999999993,53.697487000000081],[-132.64724699999994,53.69193300000012],[-132.65890499999989,53.684433000000013],[-132.66332999999997,53.679436000000123],[-132.665009,53.673325000000034],[-132.46362299999993,53.612770000000069],[-132.41805999999997,53.606102000000078],[-132.32138099999992,53.663605000000132],[-132.31527699999998,53.666939000000127],[-132.308044,53.669158999999922],[-132.29943799999995,53.669991000000039],[-132.290009,53.669716000000051],[-132.27890000000002,53.6680530000001],[-132.24554399999994,53.662490999999989],[-132.15640300000001,53.716385000000002],[-132.15249600000004,53.812492000000077],[-132.08450299999998,53.872738000000027],[-132.106201,53.917881000000023],[-132.126373,53.979431000000034],[-132.07250999999997,54.022766000000047],[-132.01501499999989,54.021935000000042],[-131.98803699999996,54.023048000000074],[-131.97109999999998,54.025269000000037],[-131.87499999999994,54.052773000000002],[-131.86053500000003,54.057495000000074],[-131.81777999999997,54.071937999999989],[-131.75473,54.094993999999986],[-131.72778299999999,54.106102000000021],[-131.71499599999999,54.112495000000138],[-131.70361299999996,54.120543999999995],[-131.67193599999996,54.146660000000054],[-131.66305499999999,54.152214000000072],[-131.66000399999996,54.131104000000107],[-131.66665599999999,54.079436999999984],[-131.67279099999996,54.044158999999979],[-131.67971799999998,54.019714000000135],[-131.70498699999996,53.966934000000094],[-131.72082499999999,53.943878000000041],[-131.73889199999996,53.923324999999977],[-131.78640699999994,53.874435000000119],[-131.79666099999997,53.865273000000002],[-131.82971199999992,53.841102999999976],[-131.85333300000002,53.816382999999973],[-131.86886600000003,53.79332700000009],[-131.87222299999996,53.786942000000067],[-131.93331899999998,53.615273000000059],[-131.93499800000001,53.609161000000086],[-131.94000199999988,53.519714000000022],[-131.93917799999991,53.508888000000127],[-131.91778599999998,53.399162000000103],[-131.90863000000002,53.357498000000021],[-131.95916699999992,53.276382000000069],[-131.96832299999988,53.266388000000063],[-131.98220799999996,53.251663000000121],[-131.988586,53.248604000000114],[-132.00585899999993,53.247214999999926],[-132.036407,53.25],[-132.0561219999999,53.253326000000015],[-132.08331299999992,53.253052000000082],[-132.17138699999998,53.23832700000014],[-132.19500700000003,53.233879000000002],[-132.21054100000003,53.230545000000006],[-132.21749899999998,53.228324999999984],[-132.27279699999997,53.210274000000027],[-132.27029399999998,53.205551000000014],[-132.26611300000002,53.20138500000013],[-132.25558499999994,53.193877999999984],[-132.23776199999998,53.188881000000094],[-132.22997999999995,53.190544000000045],[-132.21581999999995,53.195267000000001],[-132.20361299999996,53.201659999999947],[-132.19415299999991,53.201659999999947],[-132.14501999999999,53.198325999999952],[-132.13391100000001,53.196655000000078],[-132.12441999999987,53.194153000000028],[-132.12191799999999,53.189430000000016],[-132.158905,53.169990999999982],[-132.18695099999997,53.160545000000013],[-132.19473300000004,53.158882000000062],[-132.390289,53.142769000000044],[-132.40835599999997,53.142220000000066],[-132.44665499999991,53.143607999999972],[-132.45748900000001,53.145271000000093],[-132.506958,53.161102000000085],[-132.53668199999998,53.178879000000109],[-132.56527700000004,53.212769000000037],[-132.57638499999996,53.232208000000128],[-132.58581500000003,53.240273000000059],[-132.59664899999996,53.247489999999971],[-132.61471599999993,53.252777000000094],[-132.64529399999992,53.255553999999961],[-132.66473400000001,53.256386000000077],[-132.68362400000001,53.256660000000011],[-132.67584199999999,53.281661999999926],[-132.61944599999998,53.300270000000012],[-132.55221599999999,53.308043999999995],[-132.54446399999995,53.309433000000013],[-132.53973400000001,53.314438000000052],[-132.53695700000003,53.321106000000043],[-132.53918499999997,53.326385000000016],[-132.54333499999996,53.330551000000071],[-132.54998799999987,53.333878000000027],[-132.55835000000002,53.336655000000121],[-132.56860399999999,53.337494000000106],[-132.67001300000004,53.326942000000088],[-132.72000100000002,53.320830999999998],[-132.73388699999998,53.337212000000022],[-132.709991,53.370270000000005],[-132.70443699999993,53.374435000000005],[-132.69750999999991,53.376937999999996],[-132.52076699999998,53.340160000000026],[-132.51744099999996,53.337990000000104],[-132.41641200000004,53.2972180000001],[-132.41055299999994,53.294715999999994],[-132.406677,53.300545],[-132.40362500000003,53.30721299999999],[-132.40057399999995,53.319443000000092],[-132.40029900000002,53.330826000000116],[-132.40280200000001,53.335548000000017],[-132.406677,53.339714000000072],[-132.41223099999996,53.343604999999968],[-132.52084399999995,53.412209000000132],[-132.54138199999994,53.416382000000112],[-132.73580899999996,53.453323000000012],[-132.85775799999999,53.461104999999975],[-132.86749299999997,53.463608000000136],[-132.87277199999988,53.467209000000025],[-132.97250399999996,53.555824000000143],[-132.991669,53.583054000000004],[-132.9941409999999,53.587769000000037],[-132.98889199999991,53.591934000000037],[-132.96139500000004,53.600273000000072],[-132.95361300000002,53.601936000000023],[-132.94415300000003,53.601936000000023],[-132.93444799999986,53.599716000000001],[-132.91805999999997,53.588600000000042],[-132.90972899999997,53.585823000000005],[-132.89862099999999,53.584160000000054],[-132.89083900000003,53.585548000000131],[-132.88445999999999,53.588882000000126],[-132.88082900000001,53.594711000000132],[-132.8805539999999,53.600273000000072],[-132.88192700000002,53.605552999999986],[-132.8861389999999,53.609717999999987],[-132.92028800000003,53.637214999999912],[-132.935272,53.648604999999975],[-132.95056199999999,53.654709000000025],[-133.00778200000002,53.676383999999985],[-132.95361300000002,53.682770000000119],[-132.95443699999998,53.702774000000034],[-132.9844359999999,53.742767000000072],[-133.02471899999995,53.751389000000074],[-133.03362999999996,53.75277699999998],[-133.09387200000003,53.775551000000121],[-133.10082999999997,53.778603000000032],[-133.10638399999993,53.782494000000099],[-133.10916099999997,53.786942000000067],[-133.13751199999996,53.87499200000002],[-133.13891599999994,53.880272000000048],[-133.14001500000001,53.908043000000134],[-133.13833599999992,53.914154000000053],[-133.13391100000001,53.919159000000093],[-133.11639399999996,53.934158000000139],[-133.09527599999996,53.949432000000058],[-133.09081999999995,53.954162999999994],[-133.04110700000001,54.031661999999983],[-133.03973400000001,54.037773000000072],[-133.04083299999996,54.0430530000001],[-133.05862399999995,54.076102999999989],[-133.07916299999999,54.09777100000008],[-133.08193999999992,54.102492999999981],[-133.07165499999996,54.168883999999991],[-133.06722999999988,54.173881999999992],[-133.04083299999996,54.176102000000014],[-133.03112799999991,54.176102000000014],[-132.94027700000004,54.161377000000073],[-132.93029799999994,54.15915700000005],[-132.92001299999993,54.15248900000006],[-132.90335099999993,54.135826000000009],[-132.82748400000003,54.122490000000084],[-132.808044,54.120270000000062]],[[-130.19555699999995,54.118050000000039],[-130.21166999999997,54.115273000000116],[-130.22109999999998,54.115547000000049],[-130.23220799999996,54.117493000000138],[-130.24581899999993,54.124161000000129],[-130.25112899999999,54.128044000000045],[-130.25500499999998,54.132209999999986],[-130.261414,54.141380000000026],[-130.26364099999995,54.146102999999982],[-130.26473999999996,54.151381999999955],[-130.26306199999993,54.16832700000009],[-130.2611389999999,54.174164000000076],[-130.25778199999996,54.180824000000086],[-130.2528079999999,54.185547000000099],[-130.23971599999999,54.189712999999983],[-130.23083499999996,54.190269000000001],[-130.20944199999985,54.187209999999993],[-130.20999099999989,54.18360100000001],[-130.20166,54.183052000000032],[-130.19223,54.180549999999982],[-130.17861900000003,54.173607000000004],[-130.16113300000001,54.16276600000009],[-130.15585299999992,54.158882000000062],[-130.15194699999995,54.154434000000094],[-130.15112299999998,54.149436999999978],[-130.153076,54.143326000000059],[-130.158051,54.138328999999999],[-130.169464,54.130547000000035],[-130.19555699999995,54.118050000000039]],[[-79.469727000000034,54.167496000000085],[-79.477218999999877,54.165825000000041],[-79.483611999999994,54.169159000000036],[-79.485001000000011,54.174712999999997],[-79.481109999999944,54.187492000000077],[-79.475554999999929,54.191376000000105],[-79.43472300000002,54.200272000000041],[-79.413054999999986,54.191657999999961],[-79.418610000000001,54.187209999999993],[-79.426392000000021,54.183052000000032],[-79.469727000000034,54.167496000000085]],[[-130.64862099999999,54.114441000000056],[-130.67138699999992,54.107773000000066],[-130.69055199999997,54.108330000000137],[-130.69888299999997,54.111107000000061],[-130.77417000000003,54.142220000000066],[-130.78500399999996,54.149994000000049],[-130.79806500000001,54.162208999999962],[-130.800568,54.166939000000013],[-130.79861500000004,54.173050000000103],[-130.78167699999995,54.211662000000103],[-130.77444500000001,54.213882000000069],[-130.76391599999999,54.212769000000037],[-130.75613399999992,54.209159999999997],[-130.74636799999996,54.206657000000064],[-130.72582999999997,54.196655000000078],[-130.64889500000004,54.149719000000061],[-130.64501999999993,54.145271000000093],[-130.64001500000001,54.135826000000009],[-130.63919099999993,54.130820999999969],[-130.63946499999997,54.124992000000134],[-130.64279199999999,54.118599000000017],[-130.64862099999999,54.114441000000056]],[[-130.35555999999991,54.257773999999984],[-130.36663799999991,54.241104000000007],[-130.375,54.244155999999975],[-130.38861099999997,54.250832000000059],[-130.40057400000001,54.258048999999971],[-130.45556599999998,54.295830000000137],[-130.46639999999996,54.303322000000094],[-130.46722399999993,54.308601000000067],[-130.44750999999991,54.325828999999999],[-130.44000199999999,54.328049000000021],[-130.43112199999996,54.328606000000093],[-130.41778599999992,54.326385000000016],[-130.39196799999996,54.312492000000134],[-130.38528400000001,54.308884000000035],[-130.37997399999995,54.305267000000072],[-130.37582399999997,54.300827000000083],[-130.35470599999996,54.269157000000007],[-130.35220299999997,54.264442000000145],[-130.35555999999991,54.257773999999984]],[[-130.26641799999999,54.260551000000078],[-130.32528699999995,54.243050000000096],[-130.33416699999998,54.244713000000047],[-130.33804299999997,54.248878000000047],[-130.355255,54.282211000000075],[-130.35415599999999,54.293326999999977],[-130.350281,54.305550000000039],[-130.34445199999999,54.30971500000004],[-130.29000899999994,54.332214000000022],[-130.27279699999991,54.329720000000066],[-130.26751699999994,54.325828999999999],[-130.25973499999998,54.317497000000003],[-130.25250199999999,54.303047000000049],[-130.25058000000001,54.292770000000075],[-130.25167799999991,54.281380000000013],[-130.255585,54.269440000000145],[-130.25973499999998,54.263610999999912],[-130.26641799999999,54.260551000000078]],[[-130.70416299999994,54.356659000000036],[-130.745544,54.354713000000118],[-130.754456,54.356102000000135],[-130.76391599999999,54.364159000000086],[-130.76724200000001,54.374161000000072],[-130.76834099999991,54.379433000000006],[-130.76779199999987,54.384995000000117],[-130.76446499999992,54.389434999999992],[-130.75805699999995,54.392494000000113],[-130.72943099999986,54.402771000000087],[-130.72222899999991,54.404991000000109],[-130.71417199999996,54.406380000000127],[-130.699432,54.40665400000006],[-130.68890399999998,54.393326000000059],[-130.68331899999998,54.373047000000099],[-130.685272,54.36693600000001],[-130.6894529999999,54.361381999999992],[-130.69610599999999,54.358047000000113],[-130.70416299999994,54.356659000000036]],[[-57.324721999999952,54.498877999999991],[-57.342498999999918,54.498604000000057],[-57.351668999999958,54.500275000000101],[-57.356666999999959,54.502220000000079],[-57.362777999999992,54.506104000000107],[-57.365004999999996,54.511664999999994],[-57.365554999999972,54.516387999999949],[-57.362502999999947,54.527489000000116],[-57.359443999999996,54.533332999999914],[-57.333327999999995,54.565543999999989],[-57.327782000000013,54.570831000000112],[-57.321114000000023,54.574997000000053],[-57.267220000000009,54.585548000000131],[-57.265556000000004,54.580551000000014],[-57.269722000000002,54.574997000000053],[-57.272728000000029,54.572495000000117],[-57.239440999999999,54.522217000000012],[-57.240279999999984,54.517769000000044],[-57.255004999999926,54.513328999999999],[-57.293059999999912,54.503609000000097],[-57.307776999999987,54.500549000000035],[-57.324721999999952,54.498877999999991]],[[-130.95166,54.454711999999972],[-130.95944199999997,54.453323000000012],[-130.96499600000004,54.456940000000145],[-130.96749899999992,54.461662000000047],[-130.96609499999994,54.510826000000009],[-130.96472199999994,54.527771000000143],[-130.96112099999999,54.539992999999981],[-130.93057299999998,54.61471599999993],[-130.92556799999994,54.619438000000059],[-130.88891599999994,54.628876000000048],[-130.88137800000004,54.629158000000132],[-130.754456,54.62943300000012],[-130.74777199999994,54.626099000000124],[-130.74664299999995,54.62082700000002],[-130.74694799999997,54.615273000000059],[-130.7441409999999,54.60166200000009],[-130.745544,54.584717000000126],[-130.74914599999994,54.572769000000051],[-130.75250199999999,54.566101000000117],[-130.75613399999992,54.559433000000126],[-130.76083399999999,54.554710000000114],[-130.76666299999999,54.550545000000113],[-130.84915199999995,54.496941000000106],[-130.85583500000001,54.493881000000044],[-130.93695099999997,54.459434999999985],[-130.95166,54.454711999999972]],[[-79.667220999999927,54.76388500000013],[-79.726944000000003,54.752495000000067],[-79.710281000000009,54.76388500000013],[-79.703613000000018,54.766937000000041],[-79.611114999999984,54.79332700000009],[-79.587218999999948,54.799164000000019],[-79.624435000000005,54.779716000000121],[-79.631103999999993,54.776657000000114],[-79.637786999999946,54.773605000000032],[-79.659728999999913,54.766106000000036],[-79.667220999999927,54.76388500000013]],[[-130.26834099999991,54.714995999999985],[-130.370544,54.692214999999976],[-130.37887599999988,54.695267000000058],[-130.37609899999995,54.700546000000031],[-130.37109399999991,54.705269000000044],[-130.32693499999999,54.739716000000044],[-130.32110599999987,54.743881000000044],[-130.22415199999989,54.803046999999992],[-130.21749899999998,54.806380999999988],[-130.20944199999985,54.807770000000119],[-130.20694000000003,54.803046999999992],[-130.19860800000004,54.783607000000018],[-130.20056199999999,54.77748900000006],[-130.20971699999996,54.760551000000135],[-130.21362299999993,54.748329000000012],[-130.21722399999999,54.741661000000022],[-130.22222899999986,54.736938000000009],[-130.23388699999998,54.728874000000019],[-130.2611389999999,54.717209000000139],[-130.26834099999991,54.714995999999985]],[[-130.51834099999996,54.70249200000012],[-130.52722199999999,54.701935000000049],[-130.5386049999999,54.703880000000026],[-130.56750499999993,54.716934000000094],[-130.57443199999994,54.72026800000009],[-130.58526599999999,54.727767999999969],[-130.60803199999992,54.748329000000012],[-130.61053499999991,54.753052000000139],[-130.61166399999996,54.758049000000085],[-130.60665900000004,54.763054000000125],[-130.48803699999991,54.807495000000131],[-130.47998000000001,54.808883999999921],[-130.46945199999999,54.807770000000119],[-130.458618,54.800270000000069],[-130.44665499999996,54.787216000000001],[-130.44027699999992,54.778327999999988],[-130.43777499999993,54.773605000000032],[-130.43582199999997,54.763329000000113],[-130.43972799999989,54.75110600000005],[-130.45388799999989,54.719154000000117],[-130.45748900000001,54.712769000000094],[-130.46331799999996,54.708603000000039],[-130.51834099999996,54.70249200000012]],[[-57.940833999999938,54.911933999999974],[-57.985832000000016,54.870826999999963],[-57.98860899999994,54.86721],[-57.991942999999935,54.833878000000084],[-57.983886999999868,54.802215999999987],[-57.980277999999942,54.798607000000118],[-57.971663999999976,54.798050000000046],[-57.965553,54.799437999999952],[-57.958892999999989,54.803046999999992],[-57.955558999999994,54.805824000000086],[-57.923888999999974,54.823326000000122],[-57.871666000000005,54.83166499999993],[-57.864723000000026,54.832214000000079],[-57.859726000000023,54.83027600000014],[-57.843613000000005,54.820549000000028],[-57.841110000000015,54.816939999999988],[-57.841667000000029,54.81249200000002],[-57.848334999999963,54.806938000000059],[-57.875,54.79332700000009],[-57.881942999999922,54.790549999999996],[-58.022774000000027,54.755554000000018],[-58.031386999999995,54.753882999999973],[-58.040000999999961,54.75277699999998],[-58.04999499999991,54.753052000000139],[-58.119995000000017,54.755554000000018],[-58.139167999999927,54.757216999999969],[-58.15943900000002,54.76138300000008],[-58.174171000000001,54.767768999999987],[-58.176948999999979,54.770828000000108],[-58.172378999999978,54.797314000000085],[-58.184173999999985,54.808471999999938],[-58.219718999999941,54.825829000000056],[-58.222771000000023,54.83027600000014],[-58.224715999999944,54.83526599999999],[-58.225554999999986,54.850273000000016],[-58.225554999999986,54.862770000000012],[-58.224998000000028,54.866936000000067],[-58.218886999999938,54.875267000000008],[-58.215836000000024,54.878044000000102],[-58.209723999999937,54.877487000000031],[-58.049445999999932,54.893326000000116],[-57.967773000000022,54.919159000000036],[-57.942771999999991,54.924995000000138],[-57.94027699999998,54.923607000000004],[-57.938605999999993,54.918602000000135],[-57.940833999999938,54.911933999999974]],[[-79.125823999999909,54.897217000000012],[-79.134445000000028,54.895827999999995],[-79.235000999999954,54.896660000000111],[-79.515288999999939,54.840546000000074],[-79.660277999999948,54.805549999999926],[-79.763625999999988,54.771660000000054],[-79.774170000000026,54.773048000000131],[-79.776947000000007,54.778046000000131],[-79.773330999999985,54.783333000000084],[-79.768889999999942,54.787773000000072],[-79.725554999999986,54.818886000000077],[-79.714721999999995,54.826385000000073],[-79.686934999999949,54.838326000000052],[-79.656661999999983,54.846656999999993],[-79.467223999999931,54.888328999999999],[-79.458617999999944,54.88999200000012],[-79.430557000000022,54.892769000000044],[-79.419448999999872,54.892769000000044],[-79.339446999999893,54.896941999999967],[-79.164169000000015,54.925552000000039],[-79.053878999999995,54.946655000000078],[-79.041945999999882,54.945824000000073],[-79.015014999999948,54.938324000000023],[-79.015014999999948,54.932213000000104],[-79.027221999999995,54.925270000000125],[-79.05749499999996,54.917770000000075],[-79.102782999999988,54.903877000000023],[-79.125823999999909,54.897217000000012]],[[-58.675277999999992,54.914153999999996],[-58.68360899999999,54.913048000000003],[-58.752501999999993,54.915825000000041],[-58.757225000000005,54.916100000000085],[-58.760558999999887,54.920546999999942],[-58.759170999999981,54.926102000000071],[-58.754723000000013,54.932495000000017],[-58.701667999999927,54.999161000000015],[-58.697495000000004,55.003326000000015],[-58.691108999999983,55.006942999999978],[-58.684722999999906,55.008331000000055],[-58.676391999999908,55.009437999999989],[-58.660277999999948,55.0086060000001],[-58.653609999999901,55.005554000000018],[-58.652778999999953,55.00110600000005],[-58.657500999999968,54.996100999999953],[-58.662772999999902,54.992218000000037],[-58.658332999999971,54.962494000000049],[-58.656661999999983,54.94221500000009],[-58.658607000000018,54.932495000000017],[-58.663054999999986,54.922493000000031],[-58.668892000000028,54.917770000000075],[-58.675277999999992,54.914153999999996]],[[-130.38528400000001,54.769988999999953],[-130.39916999999997,54.764717000000019],[-130.40917999999999,54.767212000000086],[-130.41445899999997,54.770828000000108],[-130.45556599999998,54.813324000000136],[-130.45944199999997,54.81749700000006],[-130.46194499999996,54.822220000000073],[-130.459991,54.828330999999991],[-130.41833499999996,54.853324999999927],[-130.38528400000001,54.868881000000101],[-130.34304800000001,54.894996999999989],[-130.27029400000004,54.950272000000041],[-130.25,54.969711000000132],[-130.22778299999993,54.997214999999983],[-130.2133179999999,55.012496999999996],[-130.20083599999992,55.019714000000079],[-130.18499800000001,55.023323000000119],[-130.17529300000001,55.023048000000074],[-130.16833500000001,55.019714000000079],[-130.16500899999988,55.014160000000118],[-130.16027799999995,55.004439999999988],[-130.146973,54.975822000000051],[-130.14529399999998,54.965271000000143],[-130.14556899999997,54.959717000000126],[-130.14611799999994,54.954163000000108],[-130.14974999999998,54.947487000000024],[-130.16332999999997,54.931381000000044],[-130.27029400000004,54.830826000000002],[-130.38528400000001,54.769988999999953]],[[-82.964721999999995,55.263611000000083],[-82.970000999999968,55.259720000000016],[-83.014450000000011,55.269714000000022],[-83.031951999999876,55.273880000000133],[-83.035278000000005,55.278877000000023],[-83.027495999999928,55.281380000000013],[-83.016953000000001,55.281662000000097],[-82.990279999999984,55.280548000000124],[-82.980835000000013,55.278877000000023],[-82.963332999999977,55.273880000000133],[-82.96166999999997,55.269157000000121],[-82.964721999999995,55.263611000000083]],[[-77.592772999999909,55.435265000000129],[-77.633330999999998,55.424438000000123],[-77.644164999999873,55.425827000000083],[-77.449431999999945,55.533882000000062],[-77.336120999999991,55.604439000000127],[-77.323058999999944,55.610550000000046],[-77.221389999999928,55.653602999999919],[-77.213897999999915,55.65526600000004],[-77.205276000000026,55.65387700000008],[-77.199996999999939,55.65026899999998],[-77.201110999999912,55.64415699999995],[-77.210555999999997,55.639717000000132],[-77.252227999999945,55.618050000000096],[-77.389174999999966,55.546386999999982],[-77.452224999999942,55.512772000000098],[-77.474166999999966,55.498046999999929],[-77.484160999999915,55.489158999999972],[-77.49499499999996,55.481377000000009],[-77.500564999999938,55.478325000000098],[-77.55221599999993,55.453049000000021],[-77.592772999999909,55.435265000000129]],[[-60.970832999999914,55.869437999999946],[-60.98833499999995,55.86721],[-60.998336999999992,55.867767000000072],[-61.008895999999936,55.869156000000089],[-61.016944999999964,55.873046999999985],[-61.051666000000012,55.901100000000099],[-61.056664000000012,55.905823000000055],[-61.059165999999948,55.909988000000055],[-61.070557000000008,55.938599000000011],[-61.065551999999968,55.944153000000028],[-61.047782999999981,55.945541000000105],[-61.036948999999993,55.9447100000001],[-60.96805599999999,55.936652999999922],[-60.948607999999979,55.930549999999982],[-60.908332999999971,55.898330999999985],[-60.906386999999995,55.893326000000116],[-60.911109999999951,55.887772000000098],[-60.917503000000011,55.884163000000115],[-60.970832999999914,55.869437999999946]],[[-60.858611999999994,55.864716000000044],[-60.876105999999993,55.863883999999985],[-60.892501999999979,55.864441000000056],[-60.898612999999955,55.86721],[-60.902221999999995,55.871376000000112],[-60.900551000000007,55.876380999999981],[-60.873610999999869,55.94360400000005],[-60.869995000000017,55.949432000000002],[-60.86500499999994,55.95277400000009],[-60.851944000000003,55.95526899999993],[-60.748336999999935,55.944153000000028],[-60.74138599999992,55.942764000000011],[-60.742500000000007,55.939156000000082],[-60.747498000000007,55.931663999999955],[-60.691939999999875,55.925270000000125],[-60.68638599999997,55.92193600000013],[-60.688048999999978,55.917213000000118],[-60.692771999999991,55.911658999999986],[-60.705001999999979,55.903046000000018],[-60.718604999999911,55.896385000000066],[-60.756393000000003,55.880272000000048],[-60.778610000000015,55.876099000000067],[-60.840836000000024,55.86610399999995],[-60.858611999999994,55.864716000000044]],[[-79.123046999999929,55.789993000000038],[-79.130553999999961,55.788887000000045],[-79.135559000000001,55.789162000000033],[-79.137786999999946,55.790549999999939],[-79.136123999999938,55.794158999999979],[-79.131667999999934,55.799995000000024],[-79.126099000000011,55.803879000000052],[-79.121932999999956,55.808601000000124],[-79.108886999999925,55.823883000000137],[-79.102782999999988,55.833054000000118],[-79.039168999999958,55.952492000000063],[-79.03083799999996,55.968596999999932],[-79.027221999999995,55.976935999999966],[-79.022232000000031,55.996384000000091],[-79.009353999999973,56.063614000000086],[-78.960007000000019,56.083054000000061],[-78.957503999999972,56.083602999999982],[-78.952788999999939,56.080826000000116],[-78.949157999999898,56.071663000000115],[-78.939712999999983,56.02526899999998],[-79.054442999999935,55.865547000000049],[-79.089995999999985,55.816939999999988],[-79.104445999999996,55.80082700000014],[-79.116652999999985,55.792496000000028],[-79.123046999999929,55.789993000000038]],[[-60.943329000000006,56.006660000000011],[-61.040557999999976,56.005272000000105],[-61.0819469999999,56.011382999999967],[-61.141387999999949,56.020545999999968],[-61.17111199999988,56.028602999999976],[-61.18721800000003,56.033882000000119],[-61.215836000000024,56.046387000000038],[-61.220832999999971,56.050827000000083],[-61.228333000000021,56.06332400000008],[-61.232772999999952,56.072769000000108],[-61.233611999999994,56.085548000000017],[-61.232772999999952,56.091103000000089],[-61.226944000000003,56.098045000000013],[-61.217498999999975,56.100547999999947],[-61.211670000000026,56.101387000000102],[-61.08916499999998,56.169991000000095],[-61.059165999999948,56.159714000000122],[-61.045836999999892,56.153877000000136],[-60.944442999999978,56.094993999999986],[-60.943610999999976,56.090271000000143],[-60.934440999999993,56.015830999999935],[-60.934722999999963,56.011382999999967],[-60.943329000000006,56.006660000000011]],[[-61.623610999999983,56.399993999999992],[-61.546668999999952,56.390830999999991],[-61.493057000000022,56.404991000000052],[-61.482773000000009,56.406654000000003],[-61.474716000000001,56.406654000000003],[-61.468329999999924,56.404433999999981],[-61.415275999999949,56.376656000000025],[-61.411667000000023,56.372214999999926],[-61.411109999999951,56.367210000000057],[-61.412216000000001,56.326659999999947],[-61.416106999999954,56.322220000000129],[-61.424171000000001,56.32027400000004],[-61.482773000000009,56.309990000000028],[-61.569449999999904,56.320549000000085],[-61.579726999999991,56.322494999999947],[-61.599723999999924,56.32777399999992],[-61.686385999999857,56.352776000000063],[-61.719993999999986,56.365829000000019],[-61.788895000000025,56.405822999999998],[-61.793335000000013,56.408882000000119],[-61.796111999999937,56.41304800000006],[-61.790557999999919,56.415824999999927],[-61.783889999999872,56.415824999999927],[-61.677779999999927,56.405548000000124],[-61.623610999999983,56.399993999999992]],[[-78.839995999999928,56.129990000000078],[-78.927490000000034,56.113884000000098],[-78.933318999999983,56.115547000000049],[-78.930556999999965,56.128601000000117],[-78.916945999999996,56.172493000000145],[-78.908339999999896,56.182495000000131],[-78.903884999999946,56.187209999999993],[-78.883330999999998,56.201935000000105],[-78.846389999999985,56.2347180000001],[-78.830291999999929,56.253326000000129],[-78.825287000000003,56.262772000000098],[-78.813323999999966,56.304709999999943],[-78.809432999999956,56.338882000000126],[-78.813888999999961,56.343323000000055],[-78.834732000000031,56.345543000000021],[-78.832503999999915,56.350829999999974],[-78.762512000000015,56.424713000000111],[-78.751403999999923,56.432495000000074],[-78.731673999999941,56.440544000000102],[-78.694992000000013,56.443878000000097],[-78.686385999999914,56.443320999999969],[-78.667220999999984,56.439713000000097],[-78.661666999999966,56.436104000000057],[-78.660003999999958,56.430550000000096],[-78.650832999999921,56.289161999999976],[-78.652785999999935,56.241936000000067],[-78.655563000000029,56.223602000000142],[-78.676392000000021,56.181106999999997],[-78.688599000000011,56.172767999999962],[-78.839995999999928,56.129990000000078]],[[-79.626937999999996,56.265273999999977],[-79.635833999999988,56.264998999999989],[-79.636672999999973,56.266388000000006],[-79.636397999999872,56.269157000000121],[-79.609436000000017,56.319716999999969],[-79.538605000000018,56.433051999999975],[-79.53443900000002,56.437491999999963],[-79.523894999999982,56.442764000000068],[-79.511123999999938,56.446381000000031],[-79.496947999999975,56.448601000000053],[-79.492217999999923,56.446937999999932],[-79.490554999999915,56.440826000000129],[-79.510833999999932,56.397491000000002],[-79.557769999999891,56.305267000000015],[-79.561110999999926,56.299164000000076],[-79.565552000000025,56.293884000000048],[-79.569457999999997,56.289992999999981],[-79.619445999999868,56.267211999999972],[-79.626937999999996,56.265273999999977]],[[-79.619995000000017,56.385268999999994],[-79.638061999999991,56.360550000000046],[-79.649444999999957,56.346382000000006],[-79.663329999999974,56.333878000000141],[-79.682495000000017,56.317496999999946],[-79.701110999999969,56.306381000000044],[-79.714447000000007,56.299995000000081],[-79.906661999999926,56.227211000000125],[-79.928328999999962,56.219711000000075],[-79.986114999999984,56.199715000000083],[-80.01916499999993,56.191376000000048],[-80.060546999999985,56.18443300000007],[-80.082503999999915,56.186653000000092],[-80.092223999999987,56.188324000000136],[-80.100554999999986,56.191376000000048],[-80.107497999999907,56.194992000000127],[-80.109726000000023,56.197768999999994],[-80.110275000000001,56.203323000000012],[-80.100280999999995,56.239158999999972],[-80.098617999999874,56.244156000000089],[-80.055267000000015,56.303604000000121],[-80.044448999999929,56.310822000000144],[-80.040558000000033,56.312767000000122],[-80.022506999999962,56.319716999999969],[-79.867492999999968,56.357498000000135],[-79.795546999999942,56.366661000000136],[-79.756667999999991,56.361937999999952],[-79.72444200000001,56.362770000000069],[-79.69888299999991,56.368880999999988],[-79.679169000000002,56.378326000000015],[-79.656386999999995,56.392769000000101],[-79.642501999999979,56.404433999999981],[-79.618880999999931,56.426941000000056],[-79.614440999999999,56.431664000000069],[-79.604171999999949,56.444153000000085],[-79.598052999999936,56.454437000000098],[-79.591384999999946,56.469154000000117],[-79.588333000000034,56.493881000000044],[-79.585281000000009,56.499161000000072],[-79.582503999999915,56.501663000000008],[-79.549728000000016,56.525269000000037],[-79.543334999999956,56.527771000000143],[-79.542770000000019,56.522217000000126],[-79.549438000000009,56.508049000000085],[-79.613891999999964,56.39527099999998],[-79.619995000000017,56.385268999999994]],[[-61.435829000000012,56.541382000000112],[-61.168059999999969,56.474709000000018],[-61.149993999999992,56.445540999999992],[-61.148887999999943,56.441101000000003],[-61.154442000000017,56.438599000000067],[-61.163612000000001,56.436653000000035],[-61.181945999999925,56.435265000000129],[-61.200278999999966,56.435265000000129],[-61.220832999999971,56.435546999999985],[-61.517501999999865,56.446937999999932],[-61.609169000000009,56.46166199999999],[-61.630553999999961,56.465270999999973],[-61.642226999999991,56.486382000000049],[-61.637221999999952,56.489716000000044],[-61.629997000000003,56.490547000000049],[-61.546394000000021,56.488044999999943],[-61.538612000000001,56.485824999999977],[-61.525832999999864,56.478874000000019],[-61.512778999999966,56.474991000000102],[-61.438048999999921,56.476379000000009],[-61.423057999999969,56.479156000000103],[-61.417777999999998,56.483330000000137],[-61.418335000000013,56.488327000000027],[-61.422501000000011,56.490547000000049],[-61.455276000000026,56.496383999999978],[-61.496666000000005,56.500000000000057],[-61.527221999999938,56.501663000000008],[-61.624167999999997,56.503882999999973],[-61.633330999999998,56.506386000000134],[-61.634445000000028,56.512497000000053],[-61.631942999999978,56.51638800000012],[-61.602225999999916,56.552773000000059],[-61.595832999999971,56.556380999999988],[-61.588332999999977,56.558044000000052],[-61.576667999999984,56.557769999999948],[-61.561667999999941,56.554161000000136],[-61.558051999999975,56.55193300000002],[-61.525947999999971,56.550212999999985],[-61.459166999999923,56.54583000000008],[-61.435829000000012,56.541382000000112]],[[-79.021666999999923,56.426941000000056],[-79.009445000000028,56.426383999999985],[-78.98832699999997,56.426941000000056],[-78.949157999999898,56.43082400000003],[-78.943054000000018,56.430550000000096],[-78.93582200000003,56.428878999999995],[-78.928878999999938,56.425827000000083],[-78.92471299999994,56.419441000000006],[-78.922775000000001,56.415268000000026],[-78.921111999999994,56.409714000000065],[-78.920546999999942,56.403320000000008],[-78.923049999999932,56.386940000000095],[-78.93638599999997,56.317496999999946],[-78.943328999999949,56.284996000000035],[-78.949996999999939,56.282493999999986],[-78.955276000000026,56.27915999999999],[-78.961394999999868,56.271378000000027],[-79.029174999999952,56.172493000000145],[-79.06138599999997,56.124435000000005],[-79.071670999999981,56.104996000000085],[-79.085007000000019,56.07749200000012],[-79.094161999999983,56.054993000000138],[-79.129990000000021,55.989432999999963],[-79.175277999999935,55.92332499999992],[-79.195266999999944,55.891937000000098],[-79.203613000000018,55.894157000000121],[-79.166267000000005,55.973881000000006],[-79.122116000000005,56.046715000000006],[-79.061935000000005,56.148605000000032],[-79.022781000000009,56.202492000000007],[-79.008895999999993,56.221656999999936],[-78.990829000000019,56.261664999999994],[-78.985824999999977,56.273605000000089],[-78.972777999999948,56.306656000000032],[-78.970275999999956,56.314156000000082],[-78.967772999999909,56.323608000000036],[-78.966109999999901,56.336105000000032],[-78.970275999999956,56.378043999999989],[-78.97084000000001,56.3836060000001],[-78.977218999999991,56.388602999999989],[-78.983321999999987,56.389716999999962],[-78.998885999999914,56.384163000000001],[-79.043334999999956,56.360550000000046],[-79.055267000000015,56.344437000000028],[-79.062209999999993,56.329720000000009],[-79.089172000000019,56.267769000000044],[-79.091109999999958,56.263054000000011],[-79.093062999999972,56.256943000000092],[-79.092948999999976,56.231716000000006],[-79.095443999999986,56.2190480000001],[-79.093948000000012,56.213717999999972],[-79.092781000000002,56.211551999999983],[-79.089110999999946,56.211884000000111],[-79.083327999999995,56.174164000000019],[-79.212783999999999,55.954163000000108],[-79.236114999999927,55.917496000000085],[-79.259444999999914,55.886108000000092],[-79.275283999999999,55.870270000000062],[-79.283324999999991,55.864441000000056],[-79.286666999999852,55.866661000000079],[-79.286117999999988,55.869987000000094],[-79.278060999999923,55.885551000000021],[-79.267226999999934,55.903046000000018],[-79.226668999999958,55.962493999999992],[-79.183608999999933,56.037497999999971],[-79.139998999999932,56.115273000000116],[-79.133895999999993,56.126656000000082],[-79.132721000000004,56.175770000000057],[-79.138564999999858,56.205269000000101],[-79.139724999999999,56.20776699999999],[-79.143561999999974,56.211266000000137],[-79.15055799999999,56.233046999999999],[-79.160552999999993,56.231377000000066],[-79.170272999999952,56.225548000000003],[-79.205565999999976,56.190826000000015],[-79.243880999999988,56.151100000000042],[-79.256393000000003,56.13110400000005],[-79.270844000000011,56.104712999999947],[-79.277495999999985,56.090828000000045],[-79.284164000000033,56.078049000000021],[-79.299727999999959,56.051658999999972],[-79.309158000000025,56.036385000000109],[-79.323623999999938,56.016936999999984],[-79.358611999999937,55.974434000000088],[-79.452498999999989,55.879990000000134],[-79.479996000000028,55.863883999999985],[-79.493056999999965,55.858887000000038],[-79.500564999999995,55.856659000000093],[-79.510559000000001,55.855553000000043],[-79.520279000000016,55.854713000000004],[-79.532500999999968,55.854996000000142],[-79.567779999999971,55.864716000000044],[-79.593886999999938,55.874435000000062],[-79.604996000000028,55.881660000000124],[-79.78195199999999,55.78804800000006],[-79.763061999999934,55.814156000000025],[-79.598052999999936,55.981658999999979],[-79.486937999999952,56.087212000000022],[-79.474716000000001,56.098327999999981],[-79.470275999999956,56.104439000000013],[-79.470551,56.112770000000125],[-79.472504000000015,56.11693600000001],[-79.478881999999999,56.123322000000087],[-79.497222999999963,56.133605999999986],[-79.513061999999991,56.134995000000117],[-79.523055999999997,56.133880999999974],[-79.537216000000001,56.12971500000009],[-79.550277999999935,56.123322000000087],[-79.567504999999983,56.112770000000125],[-79.59722899999997,56.091377000000023],[-79.645003999999972,56.050545],[-79.819457999999941,55.901100000000099],[-79.831680000000006,55.88999200000012],[-79.846663999999976,55.874161000000129],[-79.858046999999999,55.859993000000088],[-79.863892000000021,55.850830000000087],[-79.865829000000019,55.847214000000008],[-79.909164000000033,55.840546000000074],[-79.985824999999977,55.898048000000017],[-79.961944999999957,55.960274000000027],[-79.774444999999957,56.112213000000054],[-79.668059999999912,56.189987000000031],[-79.648620999999991,56.198326000000066],[-79.642226999999991,56.201385000000073],[-79.587783999999999,56.230270000000132],[-79.536330999999961,56.295052000000055],[-79.526839999999993,56.304214000000115],[-79.516173999999978,56.319881000000066],[-79.494666999999993,56.367214000000047],[-79.48733500000003,56.402714000000117],[-79.458892999999875,56.464157],[-79.458617999999944,56.468323000000112],[-79.458617999999944,56.478600000000085],[-79.466109999999958,56.498878000000104],[-79.474441999999954,56.521102999999982],[-79.471389999999928,56.544441000000063],[-79.466109999999958,56.54833200000013],[-79.456664999999987,56.55332199999998],[-79.448883000000023,56.554435999999953],[-79.445267000000001,56.553604000000064],[-79.441939999999875,56.551384000000041],[-79.438599000000011,56.547775000000058],[-79.418334999999956,56.490829000000076],[-79.419448999999872,56.443603999999937],[-79.443000999999981,56.393436000000008],[-79.474998000000028,56.320438000000138],[-79.531386999999995,56.206940000000145],[-79.514450000000011,56.186378000000047],[-79.461670000000026,56.193321000000026],[-79.438889000000017,56.197212000000093],[-79.427215999999987,56.203049000000078],[-79.416397000000018,56.212212000000079],[-79.413054999999986,56.216660000000047],[-79.309998000000007,56.424163999999962],[-79.301101999999958,56.447212000000036],[-79.298049999999932,56.459435000000099],[-79.293335000000013,56.488044999999943],[-79.291672000000005,56.498878000000104],[-79.286391999999921,56.570273999999984],[-79.139998999999932,56.546386999999982],[-79.133057000000008,56.542770000000019],[-79.129990000000021,56.537773000000072],[-79.125548999999978,56.514159999999947],[-79.121932999999956,56.495543999999938],[-79.119995000000017,56.489989999999977],[-79.111938000000009,56.47526600000009],[-79.099990999999989,56.463051000000007],[-79.091384999999889,56.454437000000098],[-79.075561999999934,56.444153000000085],[-79.055557000000022,56.433876000000112],[-79.038895000000025,56.428878999999995],[-79.021666999999923,56.426941000000056]],[[-79.141952999999944,56.616661000000079],[-79.15194699999995,56.616386000000091],[-79.260009999999966,56.628044000000102],[-79.268889999999999,56.629158000000075],[-79.274719000000005,56.632209999999986],[-79.277495999999985,56.637215000000026],[-79.279998999999975,56.648880000000133],[-79.280288999999982,56.654990999999995],[-79.275009000000011,56.667213000000004],[-79.271941999999967,56.67193600000013],[-79.254729999999881,56.679993000000138],[-79.244155999999919,56.682495000000017],[-79.218886999999938,56.684990000000028],[-79.208892999999989,56.683876000000055],[-79.193603999999937,56.678329000000133],[-79.160004000000015,56.65776800000009],[-79.151108000000022,56.649994000000106],[-79.141678000000013,56.635826000000066],[-79.138061999999991,56.626099000000124],[-79.138901000000033,56.619986999999924],[-79.141952999999944,56.616661000000079]],[[-61.1875,56.586104999999975],[-61.211670000000026,56.581664999999987],[-61.217498999999975,56.58277099999998],[-61.222770999999966,56.588882000000069],[-61.231667000000016,56.611663999999962],[-61.231941000000006,56.61971299999999],[-61.226104999999961,56.626656000000025],[-61.165832999999964,56.684433000000126],[-61.159163999999919,56.688324000000023],[-61.150276000000019,56.689430000000073],[-61.131942999999978,56.68721000000005],[-61.0819469999999,56.678878999999938],[-61.0777819999999,56.674995000000138],[-61.057776999999987,56.628875999999991],[-61.059440999999993,56.626380999999981],[-61.06361400000003,56.624160999999958],[-61.103888999999867,56.606658999999922],[-61.1875,56.586104999999975]],[[-79.560821999999973,56.617767000000129],[-79.567504999999983,56.615273000000002],[-79.573333999999988,56.618881000000101],[-79.583618000000001,56.648048000000017],[-79.583892999999932,56.65277100000003],[-79.589995999999985,56.768326000000002],[-79.587508999999898,56.788886999999988],[-79.581679999999949,56.80721299999999],[-79.578339000000028,56.81249200000002],[-79.57417299999986,56.815825999999959],[-79.567504999999983,56.817772000000048],[-79.516662999999937,56.78555300000005],[-79.496384000000035,56.766936999999984],[-79.476943999999946,56.72165700000005],[-79.474716000000001,56.689156000000139],[-79.486114999999984,56.658043000000134],[-79.488891999999964,56.655548000000067],[-79.560821999999973,56.617767000000129]],[[-79.881942999999978,56.743607000000054],[-79.888610999999969,56.741104000000064],[-79.904723999999987,56.741661000000136],[-79.923889000000031,56.751389000000017],[-79.930831999999953,56.754997000000117],[-79.941101000000003,56.763610999999969],[-79.944442999999922,56.767769000000101],[-79.947494999999947,56.773323000000119],[-79.957229999999925,56.799164000000019],[-79.958892999999932,56.805267000000129],[-79.958618000000001,56.811377999999991],[-79.954726999999934,56.823607999999922],[-79.945830999999998,56.833603000000039],[-79.919158999999922,56.858330000000137],[-79.915008999999998,56.861382000000049],[-79.865829000000019,56.866104000000121],[-79.858046999999999,56.865829000000133],[-79.843886999999995,56.858330000000137],[-79.83444199999991,56.852492999999981],[-79.819457999999941,56.84027100000003],[-79.81639100000001,56.835548000000017],[-79.814712999999927,56.829162999999994],[-79.81361400000003,56.816939999999988],[-79.833892999999989,56.793610000000001],[-79.83805799999999,56.788886999999988],[-79.872222999999906,56.752220000000023],[-79.876663000000008,56.747772000000055],[-79.881942999999978,56.743607000000054]],[[-79.750564999999938,56.905823000000055],[-79.717498999999918,56.813605999999993],[-79.71833799999996,56.80721299999999],[-79.721114999999884,56.802773000000002],[-79.725554999999986,56.798049999999989],[-79.730834999999956,56.794158999999922],[-79.749725000000012,56.783607000000131],[-79.757507000000032,56.781936999999971],[-79.781113000000005,56.784721000000104],[-79.78832999999986,56.785828000000038],[-79.793555999999967,56.795792000000063],[-79.794373000000007,56.832947000000104],[-79.793143999999984,56.859890000000064],[-79.82376899999997,56.895003999999972],[-79.852753000000007,56.885204000000044],[-79.894164999999873,56.881935000000112],[-79.897506999999962,56.884995000000004],[-79.89805599999994,56.891106000000036],[-79.896118000000001,56.897217000000126],[-79.892776000000026,56.90248900000006],[-79.858611999999937,56.938599000000011],[-79.851943999999946,56.940268999999944],[-79.808333999999945,56.948326000000122],[-79.799438000000009,56.949431999999945],[-79.790833000000021,56.947769000000051],[-79.784164000000033,56.940826000000072],[-79.753615999999965,56.910820000000001],[-79.750564999999938,56.905823000000055]],[[-61.429211000000009,56.929707000000008],[-61.397204999999985,56.927715000000035],[-61.37261199999989,56.930972999999994],[-61.354888999999957,56.93639799999994],[-61.343319000000008,56.934227000000078],[-61.340785999999866,56.930248000000006],[-61.355277999999998,56.910820000000001],[-61.400275999999963,56.884720000000129],[-61.404716000000008,56.87971500000009],[-61.399444999999957,56.875824000000023],[-61.378052000000025,56.871658000000139],[-61.360282999999924,56.866104000000121],[-61.352225999999973,56.857773000000066],[-61.355834999999956,56.852776000000119],[-61.361670999999944,56.848045000000013],[-61.375831999999946,56.840546000000018],[-61.443168999999898,56.817719000000125],[-61.48966999999999,56.807549000000108],[-61.563331999999946,56.784721000000104],[-61.570281999999906,56.781661999999983],[-61.576949999999954,56.778046000000074],[-61.585555999999997,56.766388000000063],[-61.584998999999982,56.761383000000023],[-61.58277899999996,56.756660000000011],[-61.575561999999991,56.753052000000082],[-61.564720000000023,56.751663000000121],[-61.555831999999953,56.752777000000094],[-61.540839999999946,56.757773999999984],[-61.526664999999866,56.76527400000009],[-61.515282000000013,56.774712000000079],[-61.497653999999955,56.78694200000001],[-61.488975999999923,56.789295000000038],[-61.476315,56.79019900000003],[-61.434002000000021,56.783688000000097],[-61.393313999999918,56.778988000000027],[-61.386626999999976,56.775913000000003],[-61.382107000000019,56.771393000000103],[-61.373965999999996,56.74390800000009],[-61.368724999999984,56.695988],[-61.368632999999988,56.6857720000001],[-61.370804000000021,56.675282000000038],[-61.378399000000002,56.632607000000007],[-61.379119999999944,56.626820000000066],[-61.39358900000002,56.617779000000041],[-61.409137999999928,56.615608000000009],[-61.444217999999978,56.619587000000081],[-61.484000999999978,56.641647000000091],[-61.521975999999938,56.669857000000093],[-61.561034999999947,56.682513999999969],[-61.588157999999964,56.703853999999978],[-61.605334999999968,56.713798999999995],[-61.635353000000009,56.731518000000051],[-61.644393999999977,56.734775999999954],[-61.644031999999868,56.73802900000004],[-61.634991000000014,56.770938999999998],[-61.624865999999997,56.82591200000013],[-61.632098999999982,56.859547000000077],[-61.588698999999963,56.893539000000089],[-61.534812999999986,56.901859000000002],[-61.522517999999934,56.914879000000099],[-61.5261339999999,56.933323000000087],[-61.523963999999921,56.940193000000079],[-61.499370999999996,56.952849999999955],[-61.473694000000023,56.95900000000006],[-61.460673999999983,56.955021000000045],[-61.446571000000006,56.935131000000126],[-61.429211000000009,56.929707000000008]],[[-76.621108999999933,57.075554000000125],[-76.646956999999986,57.073050999999964],[-76.660278000000005,57.075828999999999],[-76.671386999999925,57.083327999999995],[-76.675551999999925,57.087769000000094],[-76.681106999999997,57.097771000000023],[-76.709732000000031,57.182213000000047],[-76.708617999999944,57.18832400000008],[-76.678329000000019,57.205269000000044],[-76.669998000000021,57.20249199999995],[-76.667496000000028,57.195541000000048],[-76.626099000000011,57.142769000000101],[-76.618880999999988,57.080276000000026],[-76.621108999999933,57.075554000000125]],[[-61.621666000000005,57.335548000000131],[-61.611114999999984,57.334991000000002],[-61.605559999999912,57.335548000000131],[-61.594443999999953,57.334159999999997],[-61.589995999999985,57.330275999999969],[-61.589438999999913,57.325272000000041],[-61.59194199999996,57.321380999999974],[-61.608337000000006,57.308327000000077],[-61.652221999999995,57.290549999999996],[-61.658051,57.290276000000063],[-61.734725999999966,57.290276000000063],[-61.739998000000014,57.291939000000013],[-61.753333999999938,57.302490000000091],[-61.763617999999951,57.311661000000072],[-61.766662999999937,57.315269000000001],[-61.767776000000026,57.319716999999969],[-61.768607999999915,57.324996999999996],[-61.767501999999979,57.328330999999991],[-61.752228000000002,57.360275000000001],[-61.74888599999997,57.365546999999935],[-61.74500299999994,57.369155999999975],[-61.726944000000003,57.374435000000119],[-61.702498999999989,57.372765000000129],[-61.693329000000006,57.368050000000096],[-61.677497999999957,57.357216000000051],[-61.632216999999912,57.337769000000037],[-61.621666000000005,57.335548000000131]],[[-76.715012000000002,57.292770000000019],[-76.72972099999987,57.289718999999991],[-76.734726000000023,57.291382000000112],[-76.740279999999984,57.294441000000063],[-76.744445999999982,57.299438000000009],[-76.793059999999969,57.374709999999936],[-76.821944999999914,57.419715999999994],[-76.823623999999995,57.424713000000111],[-76.821670999999981,57.429436000000067],[-76.812774999999931,57.428329000000133],[-76.78443900000002,57.41693900000007],[-76.761397999999986,57.40387700000008],[-76.735549999999989,57.386383000000137],[-76.731109999999944,57.381934999999999],[-76.725554999999986,57.372765000000129],[-76.721114999999941,57.356658999999979],[-76.708054000000004,57.29583000000008],[-76.715012000000002,57.292770000000019]],[[-61.655273000000022,57.391380000000083],[-61.675003000000004,57.389992000000007],[-61.839721999999995,57.408043000000134],[-61.860000999999954,57.412491000000102],[-61.877494999999954,57.418602000000021],[-61.889998999999989,57.426102000000071],[-61.894446999999957,57.42971799999998],[-61.897780999999952,57.433327000000133],[-61.900275999999963,57.437492000000134],[-61.897498999999982,57.444153000000085],[-61.813003999999921,57.473709000000042],[-61.772738999999945,57.495097999999984],[-61.742774999999995,57.534995999999978],[-61.737220999999977,57.536942000000067],[-61.719993999999986,57.536384999999996],[-61.648055999999997,57.530272999999966],[-61.643889999999999,57.522766000000047],[-61.634726999999998,57.509438000000046],[-61.613616999999977,57.416100000000142],[-61.615279999999984,57.409157000000107],[-61.634170999999924,57.398880000000133],[-61.648337999999967,57.393608000000029],[-61.655273000000022,57.391380000000083]],[[-61.878333999999995,57.46305099999995],[-61.926948999999979,57.45249200000012],[-61.937499999999943,57.453049000000021],[-61.946945000000028,57.454993999999999],[-61.955832999999927,57.458046000000081],[-61.962776000000019,57.462212000000022],[-62.012504999999919,57.508331000000112],[-62.021942000000024,57.521102999999925],[-62.02305599999994,57.534164000000033],[-62.020279000000016,57.540276000000063],[-62.014450000000011,57.549438000000123],[-61.992500000000007,57.569160000000011],[-61.974997999999971,57.581383000000073],[-61.968886999999995,57.584434999999985],[-61.953056000000004,57.59027100000003],[-61.944442999999978,57.590828000000101],[-61.878052000000025,57.584991000000002],[-61.855002999999954,57.580551000000128],[-61.833327999999995,57.574440000000038],[-61.817504999999926,57.567215000000033],[-61.783614999999941,57.550545000000056],[-61.781386999999995,57.548050000000046],[-61.778885000000002,57.543883999999935],[-61.77694699999995,57.52388000000002],[-61.777778999999953,57.518326000000059],[-61.779441999999904,57.513611000000026],[-61.783057999999869,57.508331000000112],[-61.864165999999955,57.466385000000116],[-61.878333999999995,57.46305099999995]],[[-79.797501000000011,57.418884000000048],[-79.801666000000012,57.415825000000098],[-79.805556999999965,57.418053000000043],[-79.835830999999985,57.460274000000084],[-79.826949999999897,57.53804800000006],[-79.808883999999978,57.561661000000015],[-79.792769999999962,57.578880000000083],[-79.749160999999958,57.609718000000044],[-79.740828999999962,57.615547000000106],[-79.734160999999915,57.618881000000044],[-79.727782999999931,57.61721],[-79.723052999999993,57.612770000000012],[-79.706116000000009,57.585548000000074],[-79.70666499999993,57.580826000000002],[-79.704726999999991,57.576660000000061],[-79.698607999999979,57.563324000000136],[-79.695830999999998,57.531661999999983],[-79.698607999999979,57.519989000000123],[-79.705001999999922,57.508605999999929],[-79.712508999999955,57.500548999999978],[-79.797501000000011,57.418884000000048]],[[-61.688605999999936,57.713051000000121],[-61.696105999999929,57.712212000000136],[-61.757506999999976,57.715546000000131],[-61.768889999999999,57.716934000000037],[-61.894164999999987,57.754166000000055],[-61.896950000000004,57.758331000000055],[-61.896110999999962,57.769714000000079],[-61.891669999999976,57.779160000000047],[-61.865836999999999,57.799721000000034],[-61.853614999999934,57.808327000000133],[-61.80889099999996,57.836936999999978],[-61.800551999999925,57.841377000000023],[-61.778885000000002,57.84526800000009],[-61.773055999999997,57.845543000000077],[-61.711113000000012,57.834160000000111],[-61.698607999999922,57.830276000000083],[-61.653610000000015,57.784721000000104],[-61.652221999999995,57.782494000000042],[-61.651664999999923,57.779433999999981],[-61.652495999999928,57.775826000000052],[-61.654166999999916,57.771103000000096],[-61.668609999999887,57.738884000000041],[-61.674171000000001,57.726936000000023],[-61.684440999999936,57.714996000000099],[-61.688605999999936,57.713051000000121]],[[-61.947494999999947,57.787216000000114],[-61.957222000000002,57.78694200000001],[-62.08916499999998,57.808043999999995],[-62.100280999999995,57.816101000000003],[-62.108337000000006,57.824715000000026],[-62.109443999999996,57.829437000000098],[-62.108054999999922,57.837769000000094],[-62.099723999999924,57.846382000000062],[-62.094443999999953,57.850547999999947],[-62.065276999999924,57.870544000000109],[-62.028884999999946,57.892768999999987],[-62.009170999999924,57.904434000000037],[-61.995002999999997,57.90915700000005],[-61.986114999999984,57.910271000000023],[-61.971663999999976,57.911377000000016],[-61.941108999999983,57.909988000000055],[-61.928336999999942,57.908599999999922],[-61.923332000000016,57.906096999999988],[-61.918891999999971,57.90248900000006],[-61.884444999999971,57.86693600000001],[-61.867774999999881,57.84276600000004],[-61.867774999999881,57.838600000000099],[-61.879439999999931,57.816665999999998],[-61.881942999999922,57.812767000000008],[-61.885558999999887,57.809157999999968],[-61.889998999999989,57.806381000000101],[-61.940833999999938,57.788886999999988],[-61.947494999999947,57.787216000000114]],[[-77.678328999999962,58.235549999999932],[-77.687774999999931,58.235268000000076],[-77.702788999999996,58.238884000000098],[-77.761123999999938,58.257499999999936],[-77.946380999999917,58.3211060000001],[-77.950835999999924,58.32416500000005],[-77.947495000000004,58.328605999999979],[-77.940551999999968,58.330551000000014],[-77.932495000000017,58.331383000000073],[-77.917312999999922,58.329369000000042],[-77.829726999999934,58.311378000000047],[-77.80749499999996,58.305267000000015],[-77.801392000000021,58.303046999999992],[-77.702788999999996,58.260277000000031],[-77.689437999999996,58.253882999999973],[-77.670273000000009,58.244156000000032],[-77.668334999999956,58.241936000000067],[-77.668334999999956,58.240547000000049],[-77.678328999999962,58.235549999999932]],[[-67.596114999999998,58.284164000000089],[-67.616394000000014,58.284164000000089],[-67.637786999999946,58.28472099999999],[-67.666106999999954,58.292770000000019],[-67.673888999999917,58.296104000000014],[-67.676666000000012,58.301384000000041],[-67.675827000000027,58.306099000000074],[-67.672775000000001,58.312209999999993],[-67.624435000000005,58.368050000000096],[-67.61999499999996,58.372215000000097],[-67.61082499999992,58.373877999999991],[-67.599166999999909,58.373046999999985],[-67.580565999999976,58.369986999999924],[-67.527221999999995,58.343605000000082],[-67.520844000000011,58.339989000000003],[-67.517501999999979,58.335266000000047],[-67.51916499999993,58.329719999999952],[-67.524445000000014,58.32416500000005],[-67.551102000000014,58.302215999999987],[-67.557220000000029,58.298050000000046],[-67.571670999999867,58.290833000000134],[-67.596114999999998,58.284164000000089]],[[-78.453888000000006,58.539993000000038],[-78.455565999999862,58.537215999999944],[-78.463332999999977,58.537498000000028],[-78.474716000000001,58.541382000000056],[-78.649993999999936,58.601386999999988],[-78.672501000000011,58.610549999999989],[-78.683884000000035,58.620827000000133],[-78.697495000000004,58.678329000000076],[-78.698607999999979,58.688599000000011],[-78.696944999999971,58.690543999999989],[-78.692764000000011,58.691933000000006],[-78.665008999999998,58.674995000000081],[-78.659163999999976,58.669991000000095],[-78.635284000000013,58.618598999999961],[-78.631942999999978,58.616386000000034],[-78.628051999999968,58.614158999999972],[-78.56639100000001,58.586104999999918],[-78.513061999999934,58.563880999999981],[-78.457229999999981,58.542770000000132],[-78.453888000000006,58.539993000000038]],[[-69.194442999999922,59.064712999999983],[-69.18638599999997,59.064437999999996],[-69.180831999999953,59.06721500000009],[-69.178328999999906,59.029715999999951],[-69.227218999999934,58.971931000000041],[-69.320281999999963,58.946381000000088],[-69.327498999999989,58.94499200000007],[-69.338897999999972,58.944434999999999],[-69.350280999999995,58.946381000000088],[-69.355559999999969,58.949715000000083],[-69.360000999999954,58.958603000000039],[-69.357223999999974,58.964714000000129],[-69.318344000000025,59.02555099999995],[-69.319457999999997,59.098045000000127],[-69.353057999999976,59.127213000000097],[-69.357773000000009,59.13499500000006],[-69.357223999999974,59.139717000000132],[-69.345550999999944,59.144714000000079],[-69.339447000000007,59.146103000000039],[-69.282227000000034,59.154433999999981],[-69.275283999999942,59.154991000000052],[-69.198607999999922,59.14527099999998],[-69.18638599999997,59.138329000000056],[-69.18249499999996,59.128601000000003],[-69.194991999999957,59.09415400000006],[-69.199996999999996,59.077217000000019],[-69.200561999999877,59.072495000000117],[-69.198607999999922,59.06721500000009],[-69.194442999999922,59.064712999999983]],[[-80.53443900000002,59.369438000000002],[-80.544158999999979,59.365547000000106],[-80.552215999999873,59.365829000000133],[-80.555832000000009,59.369438000000002],[-80.549437999999952,59.446938000000046],[-80.537506000000008,59.455268999999987],[-80.488051999999982,59.477486000000056],[-80.475554999999929,59.481102000000078],[-80.465011999999945,59.463882000000126],[-80.471389999999928,59.454994000000113],[-80.477218999999934,59.451103000000046],[-80.520844000000011,59.382767000000058],[-80.525283999999942,59.377486999999974],[-80.53443900000002,59.369438000000002]],[[-80.277495999999985,59.618599000000131],[-80.319167999999991,59.612213000000054],[-80.329726999999991,59.612495000000138],[-80.340560999999923,59.614158999999972],[-80.343886999999995,59.619156000000032],[-80.340835999999967,59.625267000000122],[-80.295273000000009,59.678329000000019],[-80.232773000000009,59.725265999999976],[-80.222228999999857,59.723602000000142],[-80.171386999999925,59.715271000000087],[-80.154175000000009,59.709991000000002],[-80.14527899999996,59.705550999999957],[-80.154723999999931,59.682495000000131],[-80.156661999999983,59.678329000000019],[-80.170546999999999,59.673881999999992],[-80.205840999999964,59.665267999999912],[-80.222777999999892,59.660271000000023],[-80.229720999999984,59.656380000000127],[-80.233063000000016,59.651100000000042],[-80.237212999999997,59.639434999999992],[-80.240554999999858,59.634163000000058],[-80.246384000000035,59.629990000000078],[-80.260833999999988,59.623604],[-80.277495999999985,59.618599000000131]],[[-64.019729999999925,59.714713999999958],[-64.124160999999958,59.695267000000115],[-64.134170999999981,59.695541000000048],[-64.146118000000001,59.696655000000021],[-64.157226999999978,59.699715000000083],[-64.16332999999986,59.703605999999979],[-64.204452999999944,59.734436000000017],[-64.192490000000021,59.765549000000021],[-64.121933000000013,59.849433999999974],[-64.115828999999962,59.852776000000063],[-64.107223999999974,59.854996000000085],[-64.067504999999926,59.863884000000041],[-64.061385999999914,59.864440999999943],[-64.052779999999984,59.859992999999974],[-64.049727999999959,59.855270000000019],[-64.047774999999945,59.849433999999974],[-64.055266999999958,59.835266000000104],[-64.054442999999992,59.829437000000041],[-64.042769999999905,59.783882000000062],[-64.020278999999903,59.781104999999968],[-64.002791999999943,59.774712000000022],[-63.959723999999937,59.75638600000002],[-63.959441999999967,59.752220000000136],[-63.99722300000002,59.723602000000142],[-64.011397999999872,59.716385000000059],[-64.019729999999925,59.714713999999958]],[[-80.089721999999938,59.751938000000052],[-80.166945999999996,59.742493000000024],[-80.177779999999984,59.744156000000089],[-80.184158000000025,59.747771999999998],[-80.184722999999963,59.752777000000037],[-80.128875999999991,59.82388300000008],[-80.11500499999994,59.837769000000037],[-80.103057999999976,59.844994000000099],[-80.015015000000005,59.884995000000117],[-80.00778200000002,59.886107999999979],[-79.946944999999914,59.880272000000105],[-79.937774999999931,59.877768999999944],[-79.929992999999911,59.873603999999943],[-79.884170999999924,59.85833000000008],[-79.878875999999991,59.854713000000118],[-79.883621000000005,59.849998000000085],[-79.906661999999926,59.828049000000135],[-79.922226000000023,59.815544000000045],[-79.928054999999972,59.811661000000072],[-80.025283999999942,59.764442000000088],[-80.089721999999938,59.751938000000052]],[[-64.427673000000027,60.372932000000048],[-64.452788999999996,60.357215999999994],[-64.442763999999897,60.309715000000097],[-64.438323999999966,60.305550000000096],[-64.423614999999984,60.282494000000042],[-64.429442999999935,60.281936999999971],[-64.438048999999864,60.282494000000042],[-64.448607999999979,60.284164000000033],[-64.50111400000003,60.301933000000133],[-64.521712999999977,60.310730000000035],[-64.541106999999954,60.324440000000038],[-64.557219999999916,60.331383000000017],[-64.601943999999889,60.350273000000016],[-64.610001000000011,60.353606999999954],[-64.632216999999912,60.357498000000021],[-64.643889999999942,60.357773000000066],[-64.655562999999972,60.357498000000021],[-64.666107000000011,60.356940999999949],[-64.675551999999982,60.355270000000075],[-64.710007000000019,60.358330000000137],[-64.728881999999999,60.363327000000083],[-64.790282999999931,60.391106000000093],[-64.815552000000025,60.406096999999988],[-64.831116000000009,60.419159000000036],[-64.867492999999911,60.450272000000041],[-64.868606999999997,60.453323000000069],[-64.868056999999965,60.458885000000009],[-64.856110000000001,60.473877000000016],[-64.84722899999997,60.478874000000133],[-64.837783999999999,60.482491000000039],[-64.823058999999944,60.485268000000133],[-64.639998999999989,60.4847180000001],[-64.61860699999994,60.477211000000011],[-64.426940999999943,60.401381999999955],[-64.423889000000031,60.397216999999955],[-64.422501000000011,60.391937000000098],[-64.423889000000031,60.383049000000085],[-64.427673000000027,60.372932000000048]],[[-68.25140399999998,60.230820000000051],[-68.310546999999985,60.223045000000127],[-68.340285999999992,60.223320000000001],[-68.361937999999952,60.225822000000051],[-68.376937999999996,60.232491000000095],[-68.387222000000008,60.240829000000076],[-68.393065999999976,60.249161000000072],[-68.394729999999981,60.254440000000045],[-68.395003999999972,60.259995000000117],[-68.393065999999976,60.276100000000042],[-68.384170999999924,60.29972100000009],[-68.37777699999998,60.310271999999998],[-68.314437999999996,60.390273999999977],[-68.175277999999992,60.53443900000002],[-68.129439999999931,60.570549000000085],[-68.119155999999919,60.577217000000076],[-68.092223999999987,60.581665000000044],[-68.081679999999949,60.582496999999989],[-68.035277999999948,60.581107999999972],[-67.999435000000005,60.57749200000012],[-67.956664999999987,60.566100999999946],[-67.948607999999922,60.561377999999991],[-67.887221999999952,60.503883000000087],[-67.862212999999997,60.488045000000056],[-67.839721999999995,60.478043000000071],[-67.831389999999999,60.474990999999989],[-67.821395999999993,60.472487999999998],[-67.808043999999938,60.467209000000025],[-67.803054999999972,60.463051000000064],[-67.79861499999987,60.457497000000103],[-67.794998000000021,60.447769000000051],[-67.795546999999942,60.443877999999984],[-67.79861499999987,60.432213000000104],[-67.806106999999997,60.417496000000085],[-67.815276999999924,60.408043000000077],[-67.836394999999925,60.388603000000103],[-67.841385000000002,60.384438000000102],[-67.853333000000021,60.375266999999951],[-67.885559000000001,60.353606999999954],[-67.898055999999997,60.345267999999919],[-67.934433000000013,60.321662999999944],[-67.965285999999992,60.30832700000002],[-67.97222899999997,60.30582400000003],[-68.167496000000028,60.245544000000109],[-68.17721599999993,60.243049999999982],[-68.205276000000026,60.238045000000113],[-68.25140399999998,60.230820000000051]],[[-64.689986999999917,60.584435000000099],[-64.697220000000016,60.582214000000022],[-64.704452999999944,60.582496999999989],[-64.712783999999942,60.590271000000143],[-64.713897999999915,60.59526800000009],[-64.713057999999876,60.598877000000073],[-64.710830999999985,60.602776000000119],[-64.615554999999858,60.681664000000069],[-64.610274999999945,60.685265000000129],[-64.599166999999966,60.689430000000129],[-64.592772999999909,60.685547000000042],[-64.590835999999967,60.676659000000029],[-64.592498999999975,60.666939000000127],[-64.593886999999995,60.648331000000098],[-64.59584000000001,60.645271000000037],[-64.620543999999995,60.616661000000022],[-64.631667999999991,60.60833000000008],[-64.638061999999934,60.604996000000085],[-64.689986999999917,60.584435000000099]],[[-78.656386999999995,60.702774000000034],[-78.664718999999991,60.702217000000132],[-78.674163999999962,60.704711999999972],[-78.689986999999974,60.712212000000079],[-78.694716999999912,60.716660000000047],[-78.698333999999988,60.721656999999936],[-78.697768999999937,60.724159000000043],[-78.616393999999957,60.771935000000099],[-78.573623999999995,60.784163999999919],[-78.399993999999992,60.809990000000028],[-78.223891999999978,60.830826000000059],[-78.21945199999999,60.823883000000023],[-78.219161999999983,60.817497000000117],[-78.221114999999998,60.814156000000082],[-78.226669000000015,60.808883999999978],[-78.277221999999995,60.769157000000121],[-78.285004000000015,60.766106000000093],[-78.397231999999917,60.743881000000044],[-78.62332200000003,60.705551000000128],[-78.656386999999995,60.702774000000034]],[[-69.977218999999991,60.933051999999975],[-69.983886999999982,60.93110699999994],[-69.995269999999948,60.931381000000101],[-70.003615999999965,60.935265000000072],[-70.007781999999963,60.939155999999969],[-70.026107999999965,60.995827000000077],[-70.025008999999955,61.001937999999996],[-70.021666999999866,61.008605999999986],[-70.016662999999994,61.013611000000026],[-70.009170999999867,61.017768999999987],[-70.003341999999918,61.020828000000108],[-69.982772999999895,61.028327999999988],[-69.964721999999995,61.032768000000033],[-69.954177999999956,61.033882000000006],[-69.943603999999993,61.031380000000127],[-69.931380999999931,61.020271000000037],[-69.929992999999854,61.016663000000108],[-69.929717999999923,61.010825999999952],[-69.930832000000009,61.00471500000009],[-69.933883999999921,60.998047000000099],[-69.977218999999991,60.933051999999975]],[[-64.723891999999921,61.53833000000003],[-64.71665999999999,61.535827999999981],[-64.706954999999994,61.536658999999986],[-64.688323999999909,61.535552999999993],[-64.683318999999869,61.531105000000025],[-64.675277999999992,61.508606000000043],[-64.674164000000019,61.503325999999959],[-64.686935000000005,61.465827999999988],[-64.705276000000026,61.444153000000142],[-64.715012000000002,61.433327000000077],[-64.820557000000008,61.355270000000075],[-64.866942999999992,61.324164999999994],[-64.870833999999945,61.32249500000006],[-64.875274999999988,61.32249500000006],[-64.887222000000008,61.324715000000026],[-64.972503999999958,61.344154000000117],[-64.977492999999924,61.34777100000008],[-64.985000999999954,61.367493000000138],[-65.179168999999945,61.466933999999981],[-65.18582200000003,61.47554800000006],[-65.187499999999943,61.480270000000132],[-65.190552000000025,61.494995000000074],[-65.195267000000001,61.499160999999958],[-65.295272999999895,61.528877000000023],[-65.329453000000001,61.531937000000084],[-65.353333000000021,61.534721000000047],[-65.37249799999995,61.537216000000058],[-65.381103999999993,61.540550000000053],[-65.47444200000001,61.586936999999978],[-65.481109999999887,61.590828000000045],[-65.487777999999935,61.599433999999974],[-65.486938000000009,61.610825000000091],[-65.485000999999954,61.62193300000007],[-65.482223999999974,61.62860100000006],[-65.472228999999857,61.64027400000009],[-65.466400000000021,61.644997000000046],[-65.459441999999854,61.649162000000047],[-65.453063999999983,61.651932000000102],[-65.449158000000011,61.653602999999976],[-65.441375999999934,61.656654000000003],[-65.43582200000003,61.658043000000021],[-65.339721999999938,61.670547000000056],[-65.247498000000007,61.68082400000003],[-65.174438000000009,61.686935000000119],[-65.068343999999968,61.693047000000092],[-65.036391999999921,61.693603999999993],[-65.018889999999885,61.692490000000021],[-65.016112999999962,61.692214999999976],[-64.99499499999996,61.689987000000031],[-64.733062999999959,61.659987999999998],[-64.719161999999983,61.658043000000021],[-64.646392999999932,61.603882000000112],[-64.646118000000001,61.599716000000001],[-64.650833000000034,61.594437000000028],[-64.65972899999997,61.588042999999971],[-64.662780999999995,61.587769000000037],[-64.714172000000019,61.556381000000044],[-64.720275999999956,61.551383999999928],[-64.726104999999961,61.542220999999927],[-64.723891999999921,61.53833000000003]],[[-65.695266999999888,61.776657],[-65.71945199999999,61.754165999999998],[-65.803054999999915,61.755554000000075],[-65.827224999999942,61.758049000000085],[-65.891388000000006,61.76638800000012],[-65.903885000000002,61.768326000000059],[-65.931106999999997,61.778328000000045],[-65.939163000000008,61.782210999999961],[-65.944442999999978,61.785828000000095],[-65.948043999999925,61.790276000000063],[-65.94749499999989,61.796104000000014],[-65.943877999999927,61.799720999999977],[-65.818344000000025,61.860825000000034],[-65.809432999999956,61.86332700000014],[-65.789992999999981,61.865547000000106],[-65.778060999999866,61.865547000000106],[-65.767501999999979,61.862770000000012],[-65.718613000000005,61.841102999999976],[-65.714721999999938,61.836937000000091],[-65.713622999999984,61.824165000000107],[-65.695266999999888,61.776657]],[[-92.963897999999972,61.879158000000075],[-92.995270000000005,61.851105000000132],[-93.00167799999997,61.847214000000065],[-93.051940999999943,61.829437000000041],[-93.07028200000002,61.825272000000041],[-93.079726999999991,61.826941999999974],[-93.086669999999913,61.829437000000041],[-93.115828999999962,61.860275000000001],[-93.120270000000005,61.864441000000113],[-93.126937999999882,61.868599000000074],[-93.135833999999988,61.872489999999914],[-93.14805599999994,61.87582400000008],[-93.179717999999923,61.875549000000092],[-93.189437999999996,61.874161000000015],[-93.211120999999935,61.875267000000008],[-93.218886999999995,61.87943300000012],[-93.223327999999981,61.888329000000056],[-93.226105000000018,61.908325000000048],[-93.223617999999931,61.913048000000003],[-93.218886999999995,61.918884000000048],[-93.20944199999991,61.921104000000071],[-93.072509999999909,61.929993000000138],[-93.062209999999993,61.930550000000039],[-92.96945199999999,61.888329000000056],[-92.962783999999999,61.884162999999944],[-92.963897999999972,61.879158000000075]],[[-64.916106999999954,61.719437000000084],[-64.926940999999943,61.718880000000013],[-64.951950000000011,61.722488000000112],[-65.14805599999994,61.780548000000067],[-65.156661999999926,61.783882000000062],[-65.210555999999883,61.816940000000045],[-65.214721999999881,61.821938000000046],[-65.251953000000015,61.869713000000047],[-65.255843999999968,61.885551000000078],[-65.255004999999926,61.901657000000057],[-65.249435000000005,61.91027100000008],[-65.245270000000005,61.914711000000125],[-65.189712999999983,61.945540999999992],[-65.170273000000009,61.947769000000108],[-65.156951999999876,61.946938000000102],[-65.080291999999929,61.931107000000111],[-65.074448000000018,61.928329000000133],[-65.06806899999998,61.923882000000049],[-65.039169000000015,61.899719000000118],[-64.980834999999956,61.885826000000066],[-64.893341000000021,61.829994000000113],[-64.886948000000018,61.825554000000068],[-64.828887999999893,61.766662999999994],[-64.825835999999981,61.761939999999981],[-64.825287000000003,61.758330999999998],[-64.828887999999893,61.752220000000079],[-64.83555599999994,61.748877999999991],[-64.858046999999942,61.739158999999972],[-64.889449999999954,61.725822000000107],[-64.906112999999948,61.721100000000035],[-64.916106999999954,61.719437000000084]],[[-65.852492999999924,62.084717000000012],[-65.869155999999919,62.079720000000123],[-65.889998999999989,62.080551000000128],[-65.913329999999974,62.084990999999945],[-66.009734999999978,62.116661000000079],[-66.016662999999994,62.120543999999995],[-66.020279000000016,62.124435000000062],[-66.021118000000001,62.128326000000129],[-66.020843999999954,62.131660000000124],[-66.014724999999942,62.136658000000125],[-65.991942999999935,62.141380000000026],[-65.928054999999972,62.151657],[-65.904449,62.152771000000143],[-65.853607000000011,62.131104000000107],[-65.845000999999911,62.124992000000134],[-65.83555599999994,62.115272999999945],[-65.835830999999928,62.099716000000114],[-65.843886999999995,62.088599999999985],[-65.852492999999924,62.084717000000012]],[[-92.223617999999931,62.355552999999986],[-92.306106999999997,62.351661999999919],[-92.339721999999995,62.354712999999947],[-92.34973100000002,62.356659000000036],[-92.371932999999956,62.386939999999925],[-92.372498000000007,62.391937000000041],[-92.354445999999939,62.410820000000115],[-92.347777999999948,62.414436000000023],[-92.319457999999941,62.415268000000083],[-92.308333999999945,62.414436000000023],[-92.162216000000001,62.402214000000015],[-92.139724999999999,62.399719000000005],[-92.141112999999905,62.394714000000135],[-92.15834000000001,62.390549000000135],[-92.223617999999931,62.355552999999986]],[[-79.540558000000033,62.411102000000028],[-79.449996999999939,62.382767000000001],[-79.442764000000011,62.379990000000078],[-79.433883999999978,62.371376000000055],[-79.429168999999945,62.361664000000076],[-79.427215999999987,62.356102000000135],[-79.424438000000009,62.344154000000117],[-79.420546999999942,62.339989000000116],[-79.359160999999972,62.296104000000071],[-79.347228999999913,62.288886999999988],[-79.328613000000018,62.283332999999971],[-79.272780999999952,62.262215000000083],[-79.266112999999962,62.258048999999971],[-79.260833999999988,62.253608999999983],[-79.256393000000003,62.244438000000002],[-79.255568999999923,62.23971599999993],[-79.261397999999929,62.163605000000018],[-79.262222000000008,62.158882000000062],[-79.329726999999991,62.01527400000009],[-79.353881999999999,61.999718000000144],[-79.396392999999932,61.968879999999956],[-79.457229999999925,61.893883000000017],[-79.461944999999957,61.881660000000011],[-79.465560999999923,61.876099000000124],[-79.524445000000014,61.811378000000104],[-79.541320999999925,61.799789000000089],[-79.552779999999927,61.796386999999982],[-79.568344000000025,61.790276000000063],[-79.583618000000001,61.783051],[-79.596664000000033,61.774436999999978],[-79.605269999999962,61.765273999999977],[-79.611114999999984,61.754440000000102],[-79.612777999999992,61.742767000000072],[-79.611938000000009,61.738045],[-79.608336999999949,61.732208000000014],[-79.606110000000001,61.726654000000053],[-79.605559999999969,61.721100000000035],[-79.607498000000021,61.708885000000123],[-79.628875999999934,61.669158999999979],[-79.632216999999969,61.664993000000038],[-79.642226999999991,61.655822999999998],[-79.65695199999999,61.642494000000113],[-79.740828999999962,61.588600000000099],[-79.75389100000001,61.580276000000026],[-79.761397999999929,61.576942000000031],[-79.779449,61.571938000000102],[-79.805831999999896,61.568054000000075],[-79.827788999999939,61.566665999999998],[-79.846114999999941,61.569992000000013],[-79.87110899999999,61.609717999999987],[-79.954178000000013,61.683601000000124],[-80.06806899999998,61.745270000000062],[-80.079453000000001,61.747772000000111],[-80.092223999999987,61.748046999999929],[-80.138610999999912,61.748604000000057],[-80.161941999999954,61.748604000000057],[-80.173324999999977,61.750275000000101],[-80.191665999999884,61.755554000000075],[-80.205276000000026,61.762772000000098],[-80.275283999999999,61.806656000000032],[-80.27806099999998,61.810272000000055],[-80.278884999999946,61.816382999999973],[-80.291381999999942,61.929993000000138],[-80.295273000000009,61.983604000000014],[-80.268616000000009,62.107215999999994],[-80.266662999999994,62.111382000000049],[-80.198607999999979,62.1988750000001],[-80.180283000000031,62.217491000000109],[-80.017501999999979,62.358604000000014],[-80.009445000000028,62.362495000000081],[-79.981383999999935,62.374161000000072],[-79.947220000000016,62.386108000000036],[-79.938048999999978,62.388603000000046],[-79.919723999999974,62.393051000000014],[-79.900283999999999,62.395828000000108],[-79.842772999999909,62.403603000000032],[-79.833617999999944,62.404160000000104],[-79.730834999999956,62.399162000000103],[-79.605559999999969,62.41304800000006],[-79.584166999999979,62.417213000000061],[-79.561934999999892,62.417213000000061],[-79.540558000000033,62.411102000000028]],[[-92.411117999999931,62.39388300000013],[-92.420546999999942,62.391663000000108],[-92.431380999999988,62.391663000000108],[-92.440825999999959,62.393608000000086],[-92.529175000000009,62.378326000000072],[-92.539443999999946,62.377212999999983],[-92.561385999999914,62.377486999999917],[-92.583892999999989,62.379990000000078],[-92.595839999999953,62.382491999999957],[-92.600554999999986,62.386939999999925],[-92.600280999999995,62.392494000000113],[-92.596953999999926,62.397774000000027],[-92.592772999999966,62.40248900000006],[-92.539992999999981,62.428329000000019],[-92.531112999999948,62.431380999999931],[-92.410278000000005,62.408882000000006],[-92.403884999999946,62.404709000000025],[-92.405563000000029,62.399436999999921],[-92.411117999999931,62.39388300000013]],[[-64.653884999999946,62.540833000000021],[-64.580840999999964,62.538605000000075],[-64.559722999999963,62.554161000000022],[-64.559998000000007,62.55860100000001],[-64.555556999999965,62.560822000000144],[-64.549727999999959,62.56221000000005],[-64.397506999999962,62.536385000000053],[-64.389724999999999,62.533882000000062],[-64.385284000000013,62.531105000000139],[-64.382767000000001,62.525825999999995],[-64.382767000000001,62.511383000000137],[-64.39416499999993,62.461379999999963],[-64.477218999999991,62.408043000000021],[-64.528609999999958,62.386658000000068],[-64.59056099999998,62.367210000000114],[-64.598891999999978,62.366385999999977],[-64.653610000000015,62.372490000000028],[-64.772781000000009,62.386383000000023],[-64.87110899999999,62.406380000000127],[-64.926666000000012,62.41832700000009],[-64.937209999999993,62.421103999999957],[-64.945830999999998,62.424438000000123],[-64.952498999999875,62.428329000000019],[-64.953887999999949,62.431380999999931],[-64.965835999999911,62.465827999999931],[-64.846114999999998,62.555267000000015],[-64.815552000000025,62.559714999999983],[-64.797500999999954,62.561378000000104],[-64.766953000000001,62.562767000000122],[-64.753066999999987,62.562492000000077],[-64.741669000000002,62.560822000000144],[-64.653884999999946,62.540833000000021]],[[-78.008347000000015,62.593605000000082],[-77.86721799999998,62.589157000000114],[-77.850554999999986,62.582771000000037],[-77.841674999999952,62.568054000000018],[-77.837783999999999,62.556938000000116],[-77.840835999999911,62.549995000000081],[-77.844726999999978,62.544716000000108],[-77.852782999999988,62.541664000000026],[-77.86221299999994,62.53943600000008],[-77.873046999999985,62.537773000000129],[-77.885009999999966,62.537498000000141],[-77.913054999999929,62.53943600000008],[-78.103333000000021,62.559158000000082],[-78.113051999999925,62.56221000000005],[-78.114440999999943,62.570549000000085],[-78.111664000000019,62.578049000000135],[-78.107772999999952,62.582771000000037],[-78.105835000000013,62.583328000000108],[-78.047500999999897,62.591934000000037],[-78.030838000000017,62.593323000000055],[-78.019164999999987,62.591934000000037],[-78.008347000000015,62.593605000000082]],[[-77.805267000000015,62.592491000000109],[-77.727218999999934,62.585822999999948],[-77.665832999999907,62.586655000000064],[-77.628052000000025,62.588326000000109],[-77.621384000000035,62.584435000000042],[-77.637787000000003,62.570831000000112],[-77.651108000000022,62.563881000000094],[-77.659164000000033,62.560822000000144],[-77.734725999999966,62.535827999999981],[-77.745270000000005,62.534163999999976],[-77.758620999999891,62.535553000000107],[-77.780288999999925,62.539161999999976],[-77.808608999999933,62.546660999999915],[-77.813613999999973,62.551102000000014],[-77.831116000000009,62.590271000000087],[-77.831679999999949,62.595825000000104],[-77.821121000000005,62.596099999999922],[-77.809433000000013,62.59415400000006],[-77.805267000000015,62.592491000000109]],[[-64.983063000000016,62.528046000000018],[-65.007232999999928,62.526382000000012],[-65.096389999999985,62.534996000000035],[-65.119720000000029,62.537498000000141],[-65.131942999999978,62.539719000000048],[-65.138061999999991,62.542770000000075],[-65.141677999999956,62.54694400000011],[-65.137787000000003,62.550544999999943],[-65.022507000000019,62.594994000000099],[-65.00306699999993,62.598877000000016],[-64.972503999999958,62.602493000000095],[-64.909163999999976,62.604438999999957],[-64.892501999999979,62.598877000000016],[-64.884734999999921,62.59415400000006],[-64.843886999999938,62.582771000000037],[-64.839447000000007,62.57777399999992],[-64.860824999999863,62.561378000000104],[-64.866104000000007,62.558044000000109],[-64.874435000000005,62.554709999999943],[-64.965285999999878,62.531380000000013],[-64.972778000000005,62.529716000000008],[-64.983063000000016,62.528046000000018]],[[-91.572783999999956,62.627487000000087],[-91.578612999999962,62.62193300000007],[-91.668059999999912,62.649162000000047],[-91.683059999999955,62.662209000000075],[-91.685546999999985,62.666939000000127],[-91.67582699999997,62.669159000000093],[-91.663329999999974,62.665543000000071],[-91.655272999999909,62.662209000000075],[-91.581954999999994,62.641380000000083],[-91.575561999999934,62.637215000000083],[-91.571121000000005,62.632767000000115],[-91.572783999999956,62.627487000000087]],[[-90.979995999999971,62.657767999999976],[-90.990279999999984,62.656654000000003],[-91.003341999999918,62.657211000000075],[-91.098891999999921,62.654433999999981],[-91.244719999999973,62.669991000000039],[-91.256393000000003,62.671936000000017],[-91.266952999999944,62.675552000000096],[-91.271117999999944,62.679992999999968],[-91.267226999999991,62.685546999999985],[-91.226944000000003,62.691658000000075],[-91.173049999999989,62.691375999999991],[-91.080291999999986,62.686935000000062],[-91.056106999999997,62.681664000000069],[-90.981673999999998,62.661376999999959],[-90.979995999999971,62.657767999999976]],[[-74.347778000000005,62.679436000000067],[-74.309998000000007,62.679161000000079],[-74.285552999999993,62.679992999999968],[-74.25028999999995,62.682495000000074],[-74.216109999999958,62.684990000000084],[-74.181670999999994,62.688880999999981],[-74.158889999999985,62.688880999999981],[-74.145843999999954,62.687767000000008],[-74.015839000000028,62.664993000000038],[-74.009170999999981,62.662490999999932],[-73.959732000000031,62.62082700000002],[-73.958054000000004,62.616661000000136],[-73.958054000000004,62.612495000000024],[-73.962508999999955,62.607772999999952],[-73.969727000000034,62.604163999999969],[-73.988602000000014,62.602218999999991],[-74.128875999999877,62.600829999999974],[-74.154448999999886,62.601105000000018],[-74.169158999999922,62.602218999999991],[-74.183608999999933,62.603882000000056],[-74.333618000000001,62.62943300000012],[-74.541381999999942,62.668327000000033],[-74.551102000000014,62.670829999999967],[-74.586394999999925,62.683051999999975],[-74.617217999999923,62.696098000000063],[-74.639724999999999,62.706383000000017],[-74.64973399999991,62.712769000000094],[-74.651397999999858,62.716934000000094],[-74.645844000000011,62.720824999999991],[-74.537215999999944,62.748878000000104],[-74.526671999999905,62.748878000000104],[-74.519164999999873,62.747772000000111],[-74.482772999999952,62.739716000000044],[-74.392226999999934,62.687210000000107],[-74.379989999999964,62.682495000000074],[-74.374160999999958,62.681381000000101],[-74.347778000000005,62.679436000000067]],[[-70.711670000000026,62.81499500000001],[-70.659728999999913,62.79833200000013],[-70.587783999999999,62.774162000000103],[-70.547500999999954,62.765273999999977],[-70.415557999999976,62.729156000000103],[-70.396956999999986,62.723045000000013],[-70.226104999999961,62.603049999999996],[-70.217772999999966,62.594437000000028],[-70.212218999999948,62.584160000000054],[-70.211120999999991,62.579163000000108],[-70.211945000000014,62.57777399999992],[-70.264724999999999,62.559158000000082],[-70.283324999999991,62.55443600000001],[-70.373610999999926,62.533332999999914],[-70.393065999999976,62.530273000000079],[-70.414444000000003,62.529434000000094],[-70.466659999999933,62.53166200000004],[-70.501113999999973,62.533607000000075],[-70.686385999999914,62.546104000000014],[-70.723891999999978,62.550270000000125],[-70.746383999999978,62.554709999999943],[-70.765015000000005,62.560547000000099],[-70.770844000000011,62.564712999999983],[-70.819732999999985,62.604713000000118],[-70.825011999999958,62.614441000000113],[-70.854445999999939,62.713608000000079],[-70.846663999999976,62.766106000000036],[-70.945540999999935,62.798050000000046],[-71.01916499999993,62.811934999999949],[-71.032500999999968,62.81249200000002],[-71.043334999999956,62.811934999999949],[-71.051665999999955,62.810547000000042],[-71.106383999999935,62.80082700000014],[-71.141113000000018,62.794998000000135],[-71.148620999999935,62.794998000000135],[-71.15834000000001,62.797217999999987],[-71.176101999999958,62.809158000000082],[-71.240554999999972,62.876380999999981],[-71.241378999999995,62.881378000000097],[-71.236389000000031,62.886658000000125],[-71.229445999999882,62.888046000000031],[-71.191100999999946,62.884720000000016],[-71.073897999999929,62.871933000000013],[-70.788054999999929,62.836104999999975],[-70.760283999999956,62.829994000000056],[-70.711670000000026,62.81499500000001]],[[-66.368331999999953,62.83526599999999],[-66.373885999999857,62.833603000000096],[-66.386123999999995,62.834434999999985],[-66.490279999999984,62.855270000000132],[-66.505279999999971,62.861382000000106],[-66.601669000000015,62.906654000000117],[-66.593886999999938,62.911934000000031],[-66.574172999999973,62.913048000000003],[-66.547775000000001,62.910545000000013],[-66.540282999999931,62.907493999999986],[-66.441939999999988,62.871101000000124],[-66.377776999999924,62.843322999999998],[-66.370270000000005,62.839713999999958],[-66.368331999999953,62.83526599999999]],[[-81.87110899999999,62.928329000000133],[-81.865554999999972,62.923324999999977],[-81.864165999999955,62.919990999999982],[-81.90695199999999,62.866386000000091],[-81.926101999999958,62.744156000000032],[-81.924712999999997,62.739158999999972],[-81.923889000000031,62.733046999999942],[-81.924164000000019,62.728325000000041],[-81.926101999999958,62.723602000000085],[-81.929169000000002,62.719437000000084],[-81.938598999999954,62.709991000000116],[-81.958892999999989,62.697768999999937],[-81.973052999999993,62.689713000000097],[-82.102218999999991,62.629158000000132],[-82.1875,62.599433999999917],[-82.277785999999935,62.584160000000054],[-82.286941999999897,62.581664999999987],[-82.315552000000025,62.571663000000058],[-82.369155999999919,62.547493000000031],[-82.381667999999991,62.53943600000008],[-82.387786999999946,62.534721000000047],[-82.40194699999995,62.520546000000138],[-82.40834000000001,62.509720000000016],[-82.408889999999928,62.496657999999968],[-82.414444000000003,62.478043000000071],[-82.425811999999951,62.469986000000063],[-82.442214999999919,62.458603000000096],[-82.449722000000008,62.455269000000101],[-82.499434999999949,62.438599000000124],[-82.533889999999985,62.428604000000064],[-82.551940999999999,62.423881999999992],[-82.583617999999944,62.412766000000033],[-82.621384000000035,62.395271000000037],[-82.641113000000018,62.385269000000051],[-82.647232000000031,62.38110400000005],[-82.670273000000009,62.35943600000013],[-82.688599000000011,62.341103000000089],[-82.713057999999933,62.321381000000031],[-82.731383999999935,62.309990000000084],[-82.743606999999997,62.302489999999977],[-82.769164999999987,62.290276000000006],[-82.985549999999989,62.209717000000126],[-83.001953000000015,62.204437000000041],[-83.087783999999999,62.178879000000109],[-83.121932999999956,62.173050000000103],[-83.136397999999986,62.173050000000103],[-83.143889999999999,62.176659000000086],[-83.150832999999977,62.182770000000005],[-83.15943900000002,62.198600999999996],[-83.168059999999912,62.207497000000103],[-83.176392000000021,62.213051000000064],[-83.198607999999979,62.222214000000065],[-83.249435000000005,62.240829000000019],[-83.275832999999977,62.248604000000114],[-83.308043999999882,62.252777000000037],[-83.322784000000013,62.253052000000082],[-83.337783999999942,62.252219999999966],[-83.359726000000023,62.249718000000087],[-83.405562999999972,62.238884000000041],[-83.471938999999907,62.222763000000043],[-83.480835000000013,62.219986000000119],[-83.498885999999914,62.213326000000109],[-83.513335999999924,62.20638300000013],[-83.539992999999924,62.191933000000006],[-83.57417299999986,62.176384000000098],[-83.639174999999966,62.151100000000099],[-83.653885000000002,62.145827999999995],[-83.672774999999945,62.141106000000093],[-83.683318999999983,62.139717000000076],[-83.703887999999949,62.141662999999994],[-83.709441999999967,62.144440000000088],[-83.713897999999972,62.147216999999955],[-83.71833799999996,62.152214000000072],[-83.722778000000005,62.160271000000023],[-83.722778000000005,62.167213000000118],[-83.718063000000029,62.17943600000001],[-83.711945000000014,62.217209000000025],[-83.711669999999913,62.235825000000034],[-83.721389999999985,62.281662000000097],[-83.722778000000005,62.286385000000109],[-83.725829999999917,62.295273000000066],[-83.731673999999998,62.303604000000007],[-83.738892000000021,62.306937999999946],[-83.756667999999991,62.312492000000134],[-83.783324999999991,62.31888600000002],[-83.806655999999975,62.326385000000016],[-83.824448000000018,62.337212000000022],[-83.902495999999871,62.387497000000053],[-83.918610000000001,62.399162000000103],[-83.933608999999876,62.412209000000132],[-83.942489999999964,62.421661000000029],[-83.945267000000001,62.42721599999993],[-83.946654999999964,62.434158000000025],[-83.946654999999964,62.440269000000114],[-83.945267000000001,62.447212000000093],[-83.939162999999951,62.457497000000046],[-83.914168999999958,62.478600000000142],[-83.908339999999953,62.482764999999972],[-83.869445999999982,62.501105999999936],[-83.853058000000033,62.508049000000142],[-83.814437999999996,62.523880000000077],[-83.741378999999995,62.551658999999916],[-83.704177999999956,62.569443000000035],[-83.698043999999925,62.573051000000135],[-83.570007000000032,62.675270000000012],[-83.559433000000013,62.684157999999968],[-83.550277999999935,62.69999700000011],[-83.545546999999999,62.712212000000022],[-83.545546999999999,62.71776600000004],[-83.551392000000021,62.726653999999996],[-83.555831999999953,62.731659000000036],[-83.558884000000035,62.743881000000044],[-83.533614999999884,62.810272000000055],[-83.527495999999928,62.8211060000001],[-83.523055999999997,62.825271999999984],[-83.516953000000001,62.829994000000056],[-83.400283999999999,62.897491000000116],[-83.374160999999958,62.906937000000084],[-83.31082200000003,62.924438000000066],[-83.298614999999984,62.925827000000027],[-83.211670000000026,62.913605000000075],[-83.204177999999956,62.91027100000008],[-83.198333999999988,62.906654000000117],[-83.193877999999984,62.901932000000045],[-83.182495000000017,62.881378000000097],[-83.178054999999915,62.876380999999981],[-83.156112999999948,62.860549999999989],[-83.142501999999979,62.854439000000127],[-83.124709999999936,62.84804500000007],[-83.108337000000006,62.843322999999998],[-83.087509000000011,62.840271000000087],[-83.061935000000005,62.837493999999992],[-83.041107000000011,62.837212000000079],[-83.021392999999989,62.838599999999985],[-83.001677999999913,62.842491000000052],[-82.982223999999917,62.847771000000137],[-82.857497999999964,62.88999200000012],[-82.825561999999991,62.90277100000003],[-82.793335000000013,62.915543000000014],[-82.759734999999921,62.926940999999999],[-82.751952999999901,62.928878999999938],[-82.694442999999978,62.939430000000073],[-82.652221999999995,62.943878000000041],[-82.62470999999988,62.945540999999935],[-82.606658999999979,62.945540999999935],[-82.573623999999995,62.943878000000041],[-82.540833000000021,62.939430000000073],[-82.507781999999963,62.933601000000067],[-82.461394999999982,62.927489999999977],[-82.436110999999983,62.925270000000125],[-82.420837000000006,62.924995000000138],[-82.398055999999883,62.927489999999977],[-82.381377999999984,62.932770000000005],[-82.378052000000025,62.936377999999934],[-82.376389000000017,62.941101000000117],[-82.379165999999998,62.946655000000135],[-82.383620999999948,62.95138500000013],[-82.379989999999964,62.957497000000103],[-82.37222300000002,62.960274000000027],[-82.292770000000019,62.98333000000008],[-82.266662999999937,62.989159000000086],[-82.239440999999999,62.990273000000059],[-82.185821999999916,62.979988000000105],[-82.121932999999956,62.966660000000104],[-82.008057000000008,62.954993999999942],[-81.94027699999998,62.95387999999997],[-81.911666999999966,62.952217000000076],[-81.905838000000017,62.949997000000053],[-81.87110899999999,62.928329000000133]],[[-66.825561999999991,62.984161000000086],[-66.831389999999999,62.982765000000029],[-66.871384000000035,62.988884000000041],[-66.881942999999978,62.991661000000136],[-66.889450000000011,62.995269999999948],[-67.069457999999997,63.107498000000021],[-67.032776000000013,63.103881999999999],[-66.965285999999992,63.082496999999989],[-66.952224999999999,63.078049000000021],[-66.946105999999872,63.07499700000011],[-66.944442999999922,63.072768999999994],[-66.930557000000022,63.066939999999988],[-66.917496000000028,63.059715000000097],[-66.907501000000025,63.052773000000002],[-66.830001999999922,62.992493000000081],[-66.826950000000011,62.989990000000091],[-66.825011999999958,62.985550000000046],[-66.825561999999991,62.984161000000086]],[[-67.764450000000011,63.162491000000045],[-67.775833000000034,63.1616590000001],[-67.787505999999951,63.163048000000117],[-67.79861499999987,63.165543000000127],[-67.806380999999988,63.168602000000135],[-67.851943999999946,63.191376000000105],[-67.863327000000027,63.199158000000011],[-67.876388999999961,63.211937000000091],[-67.876937999999996,63.216933999999981],[-67.875,63.22304500000007],[-67.866393999999957,63.232491000000039],[-67.852218999999877,63.244438000000002],[-67.84445199999999,63.247215000000097],[-67.839721999999995,63.247215000000097],[-67.831954999999994,63.244155999999919],[-67.821945000000028,63.236656000000039],[-67.822234999999921,63.233330000000024],[-67.816101000000003,63.23054499999995],[-67.791671999999949,63.214996000000042],[-67.769454999999994,63.198326000000122],[-67.746108999999933,63.178879000000109],[-67.744720000000029,63.173050000000103],[-67.746384000000035,63.166939000000013],[-67.764450000000011,63.162491000000045]],[[-67.925003000000004,63.183327000000077],[-67.956116000000009,63.181107000000054],[-67.966949,63.183875999999998],[-68.000838999999985,63.208046000000024],[-68.017226999999991,63.220543000000021],[-68.061385999999914,63.257773999999984],[-68.105834999999956,63.299438000000066],[-68.111663999999962,63.309158000000139],[-68.112212999999997,63.313606000000107],[-68.106383999999991,63.318604000000107],[-68.096953999999926,63.318885999999964],[-68.085555999999997,63.316101000000117],[-68.069167999999877,63.309432999999956],[-68.048889000000031,63.297493000000088],[-68.032227000000034,63.284996000000092],[-68.00028999999995,63.260276999999917],[-67.92582699999997,63.196098000000006],[-67.920546999999999,63.191376000000105],[-67.916945999999939,63.186653000000092],[-67.925003000000004,63.183327000000077]],[[-78.079726999999991,63.469436999999914],[-77.946105999999986,63.468048000000124],[-77.937774999999988,63.471100000000035],[-77.930556999999965,63.474991000000102],[-77.924164000000019,63.47693600000008],[-77.911941999999954,63.476379000000009],[-77.845001000000025,63.472214000000008],[-77.680557000000022,63.434433000000013],[-77.636672999999917,63.402771000000087],[-77.495834000000002,63.274994000000106],[-77.493880999999988,63.269989000000066],[-77.49499499999996,63.265831000000105],[-77.50389100000001,63.252494999999954],[-77.573333999999932,63.200546000000145],[-77.641953000000001,63.171936000000073],[-77.785277999999892,63.121658000000139],[-77.898894999999925,63.09276600000004],[-77.906661999999983,63.09165999999999],[-77.931380999999931,63.090546000000018],[-77.946655000000021,63.091103000000089],[-77.958343999999954,63.093048000000124],[-78.025008999999898,63.11721],[-78.124709999999993,63.165825000000041],[-78.226944000000003,63.221656999999993],[-78.295546999999999,63.25999500000006],[-78.311385999999914,63.272217000000012],[-78.322234999999978,63.281105000000025],[-78.343613000000005,63.29694400000011],[-78.354445999999996,63.303604000000121],[-78.446655000000021,63.350273000000129],[-78.486937999999896,63.364998000000071],[-78.519729999999981,63.370270000000005],[-78.523894999999982,63.372489999999971],[-78.562499999999943,63.395828000000108],[-78.572234999999921,63.434715000000097],[-78.572783999999956,63.440269000000114],[-78.551665999999955,63.44499200000007],[-78.379989999999964,63.476379000000009],[-78.278885000000002,63.489716000000044],[-78.214111000000003,63.496535999999992],[-78.212783999999999,63.496101000000067],[-78.158614999999884,63.482208000000014],[-78.091675000000009,63.470543000000134],[-78.079726999999991,63.469436999999914]],[[-90.653884999999946,63.441101000000003],[-90.697495000000004,63.439713000000097],[-90.708892999999932,63.440544000000102],[-90.719161999999983,63.443603999999993],[-90.72582999999986,63.448043999999982],[-90.755004999999983,63.489716000000044],[-90.757232999999985,63.494438000000116],[-90.748046999999929,63.498329000000012],[-90.737502999999947,63.499161000000129],[-90.645553999999947,63.483330000000137],[-90.620269999999948,63.47693600000008],[-90.602782999999988,63.463882000000012],[-90.598052999999993,63.454436999999984],[-90.602218999999991,63.449158000000011],[-90.611937999999952,63.44609800000012],[-90.621932999999956,63.444153000000142],[-90.653884999999946,63.441101000000003]],[[-78.55749499999996,63.457497000000046],[-78.600554999999929,63.456383000000017],[-78.603333000000021,63.45777099999998],[-78.56138599999997,63.502495000000124],[-78.543334999999956,63.516106000000093],[-78.515839000000028,63.53166200000004],[-78.505004999999869,63.532493999999929],[-78.496108999999933,63.529434000000094],[-78.473327999999981,63.519157000000121],[-78.468063000000029,63.515549000000021],[-78.46166999999997,63.507499999999993],[-78.459166999999979,63.479988000000048],[-78.461945000000014,63.47387700000013],[-78.467223999999987,63.469436999999914],[-78.475554999999986,63.466933999999981],[-78.531113000000005,63.458603000000039],[-78.55749499999996,63.457497000000046]],[[-90.793609999999944,63.494156000000089],[-90.804442999999935,63.493324000000143],[-90.816956000000005,63.495827000000133],[-90.877212999999983,63.514717000000076],[-90.933318999999983,63.534164000000089],[-90.965835999999967,63.54583000000008],[-90.96833799999996,63.550270000000125],[-90.957503999999972,63.551384000000098],[-90.771117999999944,63.55193300000002],[-90.748046999999929,63.550270000000125],[-90.720001000000025,63.543052999999986],[-90.709731999999974,63.539992999999924],[-90.700835999999981,63.536110000000008],[-90.681380999999988,63.52304799999996],[-90.676940999999886,63.518599999999992],[-90.674712999999997,63.513884999999959],[-90.678604000000007,63.508330999999998],[-90.688889000000017,63.50638600000002],[-90.793609999999944,63.494156000000089]],[[-64.851944000000003,63.385826000000122],[-64.856948999999986,63.385826000000122],[-64.882216999999969,63.395546000000024],[-64.904175000000009,63.40638000000007],[-64.918335000000013,63.413879000000065],[-64.942215000000033,63.43082400000003],[-64.950835999999924,63.439156000000025],[-65.026672000000019,63.515549000000021],[-65.035278000000005,63.524436999999978],[-65.053054999999972,63.548331999999959],[-65.051940999999999,63.552215999999987],[-64.977218999999991,63.568329000000062],[-64.967498999999918,63.568329000000062],[-64.954726999999991,63.558883999999978],[-64.954726999999991,63.553879000000109],[-64.93360899999999,63.544716000000108],[-64.912216000000001,63.533333000000084],[-64.909163999999976,63.528603000000089],[-64.867492999999911,63.461662000000047],[-64.860824999999863,63.447212000000093],[-64.847504000000015,63.407494000000042],[-64.844726999999978,63.396942000000081],[-64.847778000000005,63.387496999999996],[-64.851944000000003,63.385826000000122]],[[-72.182495000000017,63.51998900000001],[-72.207503999999972,63.51998900000001],[-72.218886999999995,63.522491000000059],[-72.226943999999946,63.525825999999995],[-72.232772999999895,63.530273000000022],[-72.286666999999909,63.583328000000108],[-72.279174999999952,63.585548000000131],[-72.232223999999917,63.586655000000064],[-72.230285999999978,63.587212000000136],[-72.205276000000026,63.583054000000004],[-72.184432999999956,63.577217000000019],[-72.135559000000001,63.562767000000065],[-72.129165999999998,63.558883999999978],[-72.128052000000025,63.553879000000109],[-72.145003999999972,63.539436000000023],[-72.165833000000021,63.526381999999955],[-72.173614999999984,63.522766000000104],[-72.182495000000017,63.51998900000001]],[[-91.329177999999956,63.559714999999983],[-91.401947000000007,63.549438000000009],[-91.424438000000009,63.550270000000125],[-91.43638599999997,63.55193300000002],[-91.461944999999901,63.558327000000077],[-91.540282999999931,63.601662000000033],[-91.540558000000033,63.606658999999979],[-91.534164000000033,63.611381999999935],[-91.501113999999973,63.611938000000123],[-91.463897999999915,63.6097180000001],[-91.440826000000015,63.608047000000056],[-91.428604000000007,63.606383999999935],[-91.416396999999961,63.603607000000068],[-91.362503000000004,63.590271000000087],[-91.34944200000001,63.586655000000064],[-91.299727999999959,63.567771999999934],[-91.308884000000035,63.563881000000094],[-91.329177999999956,63.559714999999983]],[[-64.092498999999918,63.481659000000093],[-64.101944000000003,63.47943099999992],[-64.109160999999915,63.483046999999999],[-64.169448999999986,63.523605000000089],[-64.180556999999965,63.533051000000057],[-64.184158000000025,63.537216000000058],[-64.209166999999979,63.574996999999996],[-64.216109999999901,63.595268000000033],[-64.216948999999943,63.601105000000132],[-64.215285999999935,63.617493000000024],[-64.212783999999942,63.623604000000114],[-64.199722000000008,63.633331000000055],[-64.191939999999988,63.637215000000083],[-64.182495000000017,63.639435000000105],[-64.17193599999996,63.633606000000043],[-64.09333799999996,63.568329000000062],[-64.078338999999914,63.550545000000113],[-64.077224999999999,63.545273000000009],[-64.077788999999882,63.539718999999991],[-64.086120999999935,63.493050000000039],[-64.087508999999955,63.486655999999982],[-64.092498999999918,63.481659000000093]],[[-68.656386999999938,63.626381000000038],[-68.717772999999909,63.624161000000015],[-68.731109999999944,63.625549000000092],[-68.815552000000025,63.649162000000047],[-68.821670999999981,63.652488999999946],[-68.820007000000032,63.65526600000004],[-68.793059999999969,63.661659000000043],[-68.71444699999995,63.672493000000088],[-68.691665999999941,63.673607000000061],[-68.676940999999999,63.671379000000115],[-68.668883999999935,63.668326999999977],[-68.666397000000018,63.663879000000009],[-68.666259999999966,63.662581999999986],[-68.655272999999966,63.634437999999989],[-68.654449,63.630272000000105],[-68.656386999999938,63.626381000000038]],[[-64.061110999999983,63.270546000000138],[-64.070556999999951,63.268326000000116],[-64.078338999999914,63.268883000000017],[-64.181945999999982,63.29694400000011],[-64.25140399999998,63.320830999999998],[-64.266953000000001,63.326384999999959],[-64.349730999999963,63.392220000000009],[-64.353881999999885,63.395828000000108],[-64.421936000000017,63.471657000000107],[-64.496108999999876,63.6097180000001],[-64.490554999999972,63.620544000000052],[-64.479171999999949,63.636940000000038],[-64.473617999999874,63.640549000000078],[-64.386672999999973,63.675270000000012],[-64.377212999999927,63.677489999999977],[-64.367217999999923,63.675270000000012],[-64.363051999999925,63.671936000000017],[-64.328888000000006,63.644440000000145],[-64.325561999999934,63.637496999999939],[-64.325561999999934,63.59804500000007],[-64.324447999999961,63.588042999999971],[-64.321670999999981,63.577492000000063],[-64.316101000000003,63.562492000000077],[-64.262511999999958,63.421104000000128],[-64.232498000000021,63.388329000000113],[-64.225280999999939,63.384438000000046],[-64.20666499999993,63.384163000000001],[-64.166945999999996,63.369438000000059],[-64.144729999999925,63.355552999999986],[-64.099990999999932,63.322769000000108],[-64.057495000000017,63.278046000000018],[-64.057495000000017,63.273880000000133],[-64.061110999999983,63.270546000000138]],[[-71.799164000000019,63.615546999999935],[-71.806945999999868,63.611938000000123],[-71.845275999999956,63.613608999999997],[-71.855269999999905,63.615829000000019],[-71.863327000000027,63.619438000000002],[-71.865829000000019,63.624435000000119],[-71.865829000000019,63.636383000000137],[-71.864166000000012,63.669440999999949],[-71.830565999999919,63.693878000000041],[-71.821945000000028,63.695267000000058],[-71.789444000000003,63.691375999999991],[-71.779449,63.68832400000008],[-71.775283999999999,63.683051999999918],[-71.777221999999938,63.670830000000137],[-71.791107000000011,63.627213000000097],[-71.799164000000019,63.615546999999935]],[[-76.810546999999985,63.601105000000132],[-76.710555999999997,63.565826000000072],[-76.672225999999966,63.528877000000023],[-76.675551999999925,63.496658000000139],[-76.681609999999978,63.481354000000067],[-76.61332699999997,63.473602000000085],[-76.565551999999911,63.46776600000004],[-76.546111999999994,63.464714000000129],[-76.541945999999939,63.462494000000106],[-76.543883999999991,63.461104999999918],[-76.675002999999947,63.374709999999993],[-76.682219999999973,63.370827000000077],[-76.692214999999976,63.367767000000015],[-76.703338999999971,63.365829000000076],[-76.712783999999942,63.365546999999992],[-76.726105000000018,63.36693600000001],[-76.847778000000005,63.385269000000051],[-76.984160999999915,63.40638000000007],[-77.035277999999948,63.423882000000106],[-77.039443999999946,63.426102000000128],[-77.046111999999994,63.42971799999998],[-77.051391999999964,63.434158000000025],[-77.05360399999995,63.436935000000119],[-77.055556999999965,63.442764000000125],[-77.06138599999997,63.450546000000088],[-77.105834999999956,63.476654000000053],[-77.111663999999962,63.479713000000004],[-77.327788999999996,63.572220000000129],[-77.36721799999998,63.583054000000004],[-77.391388000000006,63.585548000000131],[-77.411666999999966,63.584991000000002],[-77.422226000000023,63.586655000000064],[-77.427779999999984,63.589157000000114],[-77.431945999999982,63.591934000000037],[-77.442215000000033,63.608330000000024],[-77.457229999999981,63.643325999999945],[-77.453887999999949,63.652214000000129],[-77.44027699999998,63.665268000000026],[-77.410277999999948,63.686652999999978],[-77.40055799999999,63.688880999999981],[-77.378051999999968,63.692214999999919],[-77.343338000000017,63.696098000000063],[-77.116942999999935,63.681107000000111],[-77.103332999999964,63.67971799999998],[-77.06138599999997,63.672768000000076],[-77.021392999999932,63.664154000000053],[-76.810546999999985,63.601105000000132]],[[-72.594727000000034,63.642494000000056],[-72.604445999999939,63.641663000000051],[-72.780563000000029,63.659987999999942],[-72.783324999999877,63.66443600000008],[-72.770553999999947,63.669715999999994],[-72.756667999999877,63.672768000000076],[-72.723052999999993,63.67860399999995],[-72.506667999999991,63.707214000000022],[-72.483886999999982,63.708885000000066],[-72.474166999999909,63.705826000000116],[-72.470839999999953,63.702217000000076],[-72.471389999999985,63.700828999999999],[-72.468886999999938,63.699158000000125],[-72.463333000000034,63.689156000000139],[-72.459731999999974,63.679161000000079],[-72.46055599999994,63.672768000000076],[-72.463897999999972,63.668326999999977],[-72.584441999999967,63.644440000000145],[-72.594727000000034,63.642494000000056]],[[-64.032501000000025,63.68971300000004],[-64.161117999999988,63.674438000000066],[-64.181106999999997,63.675827000000083],[-64.200286999999946,63.685546999999985],[-64.208344000000011,63.697487000000081],[-64.21166999999997,63.706383000000017],[-64.212509000000011,63.712212000000022],[-64.208892999999989,63.721930999999984],[-64.180283000000031,63.742218000000094],[-64.17471299999994,63.745270000000005],[-64.166655999999989,63.747772000000055],[-64.083069000000023,63.758331000000112],[-64.078063999999983,63.758331000000112],[-64.075287000000003,63.758049000000028],[-64.073333999999932,63.756386000000134],[-64.054840000000013,63.736595000000079],[-64.043335000000013,63.734161000000086],[-64.030288999999982,63.729713000000118],[-64.025283999999942,63.70249200000012],[-64.025283999999942,63.697487000000081],[-64.026397999999915,63.693878000000041],[-64.032501000000025,63.68971300000004]],[[-72.667769999999962,63.69582400000013],[-72.6949919999999,63.690269000000058],[-72.703613000000018,63.692490000000134],[-72.734160999999972,63.710823000000005],[-72.738891999999908,63.714439000000084],[-72.741669000000002,63.719711000000018],[-72.743880999999874,63.730270000000019],[-72.739989999999977,63.736107000000004],[-72.719727000000034,63.76388500000013],[-72.715560999999923,63.766106000000036],[-72.705841000000021,63.767494000000113],[-72.693877999999984,63.765830999999991],[-72.682495000000017,63.762214999999969],[-72.664718999999934,63.755554000000018],[-72.642226999999934,63.745270000000005],[-72.635833999999988,63.741379000000109],[-72.626663000000008,63.732207999999957],[-72.625823999999966,63.727486000000056],[-72.626389000000017,63.721099999999979],[-72.634170999999981,63.709160000000054],[-72.649993999999992,63.701385000000016],[-72.667769999999962,63.69582400000013]],[[-64.28443900000002,63.708602999999982],[-64.286391999999978,63.708046000000081],[-64.311110999999926,63.709991000000116],[-64.329178000000013,63.71665999999999],[-64.336394999999925,63.719986000000006],[-64.348617999999988,63.728042999999957],[-64.356948999999986,63.736938000000009],[-64.363616999999977,63.746383999999978],[-64.381103999999993,63.807495000000131],[-64.35943599999996,63.803879000000052],[-64.339721999999938,63.796943999999996],[-64.331954999999994,63.791663999999969],[-64.302779999999927,63.78054800000001],[-64.278610000000015,63.770828000000108],[-64.275008999999955,63.766663000000108],[-64.255279999999971,63.729713000000118],[-64.255004999999926,63.72526600000009],[-64.260833999999875,63.719711000000018],[-64.28443900000002,63.708602999999982]],[[-64.170273000000009,63.856384000000105],[-64.180831999999896,63.785270999999966],[-64.195267000000001,63.778603000000032],[-64.203338999999971,63.776382000000126],[-64.234435999999903,63.771378000000141],[-64.245834000000002,63.771378000000141],[-64.256957999999997,63.774162000000103],[-64.325561999999934,63.80582400000003],[-64.398346000000004,63.845543000000134],[-64.39916999999997,63.849434000000031],[-64.397780999999895,63.851386999999988],[-64.396117999999944,63.851936000000137],[-64.353881999999885,63.861107000000061],[-64.334091000000001,63.852081000000055],[-64.325561999999934,63.850273000000016],[-64.31082200000003,63.848328000000038],[-64.268340999999907,63.846100000000035],[-64.215012000000002,63.850273000000016],[-64.208344000000011,63.852776000000006],[-64.200286999999946,63.859718000000044],[-64.186661000000015,63.86721],[-64.179992999999911,63.865547000000106],[-64.175827000000027,63.861938000000066],[-64.170273000000009,63.856384000000105]],[[-92.954178000000013,63.871101000000067],[-92.96055599999994,63.866386000000034],[-92.972778000000005,63.867767000000072],[-92.998610999999983,63.873046999999985],[-93.068619000000012,63.888046000000031],[-93.093886999999995,63.899994000000049],[-93.094451999999933,63.904990999999995],[-93.087783999999999,63.908882000000062],[-93.070007000000032,63.909713999999951],[-93.002791999999943,63.911377000000073],[-92.990829000000019,63.910820000000001],[-92.978333000000021,63.908324999999991],[-92.97444200000001,63.901657],[-92.955275999999969,63.880820999999969],[-92.952498999999989,63.876099000000067],[-92.954178000000013,63.871101000000067]],[[-64.576110999999855,63.780822999999998],[-64.525832999999977,63.771378000000141],[-64.467772999999966,63.771378000000141],[-64.461945000000014,63.774712000000136],[-64.452498999999989,63.777214000000015],[-64.432769999999948,63.779434000000037],[-64.426102000000014,63.777771000000087],[-64.394729999999981,63.745827000000077],[-64.387511999999958,63.737495000000081],[-64.386123999999938,63.73443600000013],[-64.386123999999938,63.701660000000004],[-64.389998999999932,63.696381000000031],[-64.404175000000009,63.687492000000134],[-64.419158999999979,63.67971799999998],[-64.436385999999914,63.673324999999977],[-64.450561999999934,63.671660999999972],[-64.459441999999967,63.672768000000076],[-64.47444200000001,63.679161000000079],[-64.496947999999918,63.690826000000129],[-64.661666999999909,63.754997000000117],[-64.802215999999987,63.764442000000031],[-64.813323999999966,63.767212000000029],[-64.890288999999939,63.789435999999966],[-64.90055799999999,63.793883999999935],[-64.906386999999995,63.797493000000145],[-64.916396999999904,63.806380999999931],[-64.918335000000013,63.815269000000114],[-64.920272999999952,63.824715000000083],[-64.917769999999905,63.831108000000029],[-64.910277999999948,63.837212000000079],[-64.896392999999989,63.845267999999976],[-64.811660999999958,63.87721300000004],[-64.710555999999997,63.908882000000062],[-64.682494999999903,63.91443600000008],[-64.660278000000005,63.916382000000112],[-64.647231999999974,63.916100000000085],[-64.557219999999916,63.909988000000112],[-64.553054999999915,63.906380000000013],[-64.549437999999952,63.895271000000093],[-64.571121000000005,63.870827000000133],[-64.585555999999997,63.844994000000042],[-64.576110999999855,63.780822999999998]],[[-77.743880999999931,63.926658999999916],[-77.753341999999975,63.925551999999982],[-77.948607999999979,63.950829000000113],[-77.956954999999937,63.95388000000014],[-77.966948999999886,63.959160000000054],[-77.978881999999999,63.96915400000006],[-77.982497999999964,63.97554800000006],[-77.982497999999964,63.983047000000056],[-77.976105000000018,63.990273000000059],[-77.957503999999972,64.004715000000033],[-77.950287000000003,64.009155000000021],[-77.943603999999993,64.011107999999979],[-77.923889000000031,64.014999000000046],[-77.889998999999989,64.019989000000066],[-77.774445000000014,64.031662000000097],[-77.753890999999953,64.032761000000107],[-77.648620999999991,64.032486000000063],[-77.591110000000015,64.030272999999966],[-77.557219999999973,64.028046000000074],[-77.549727999999959,64.025543000000084],[-77.544448999999986,64.021927000000062],[-77.545273000000009,64.018600000000106],[-77.623610999999983,63.997214999999926],[-77.623885999999914,63.99582700000002],[-77.628052000000025,63.991104000000064],[-77.639450000000011,63.981934000000024],[-77.68638599999997,63.954437000000041],[-77.728606999999954,63.932213000000104],[-77.737212999999883,63.928329000000076],[-77.743880999999931,63.926658999999916]],[[-89.808884000000035,64.056366000000082],[-89.817229999999938,64.054703000000131],[-89.828887999999893,64.055816999999934],[-89.839447000000007,64.058868000000132],[-89.847778000000005,64.063034000000073],[-89.861114999999984,64.071655000000135],[-89.869995000000017,64.080826000000116],[-89.871933000000013,64.085541000000148],[-89.867767000000015,64.095824999999991],[-89.857498000000021,64.0977630000001],[-89.831679999999892,64.091094999999939],[-89.828063999999927,64.088318000000072],[-89.819732999999928,64.080276000000083],[-89.80471799999998,64.0619200000001],[-89.808884000000035,64.056366000000082]],[[-64.962783999999999,64.110809000000074],[-64.948607999999979,64.109710999999947],[-64.903609999999901,64.111099000000081],[-64.87110899999999,64.099152000000117],[-64.869445999999982,64.096649000000127],[-64.869995000000017,64.093323000000112],[-64.87332200000003,64.090820000000122],[-64.884445000000028,64.086655000000121],[-64.905563000000029,64.082214000000022],[-64.946655000000021,64.078872999999987],[-64.988892000000021,64.081375000000037],[-65.002228000000002,64.083878000000027],[-65.02305599999994,64.089432000000045],[-65.045546999999942,64.099426000000051],[-65.055556999999965,64.108596999999975],[-65.057495000000017,64.11303700000002],[-65.056380999999931,64.117203000000075],[-65.05221599999993,64.121093999999971],[-65.039718999999934,64.124985000000038],[-65.025009000000011,64.127472000000125],[-65.015563999999927,64.126922999999977],[-64.995270000000005,64.12303199999991],[-64.989990000000034,64.118590999999981],[-64.980834999999956,64.115265000000136],[-64.962783999999999,64.110809000000074]],[[-64.491104000000007,64.109146000000123],[-64.499999999999943,64.10803199999998],[-64.511397999999929,64.108321999999987],[-64.587508999999955,64.147491000000059],[-64.592498999999975,64.151931999999988],[-64.595276000000013,64.15498400000007],[-64.59584000000001,64.156647000000021],[-64.567779999999971,64.163605000000018],[-64.554169000000002,64.166931000000034],[-64.524444999999957,64.167206000000022],[-64.518111999999917,64.166214000000025],[-64.50111400000003,64.163314999999955],[-64.453339000000028,64.146942000000081],[-64.450287000000003,64.130264000000011],[-64.491104000000007,64.109146000000123]],[[-73.176940999999999,64.200271999999984],[-73.282776000000013,64.143326000000059],[-73.291945999999939,64.14387499999998],[-73.386397999999872,64.158874999999966],[-73.396956999999986,64.161102000000028],[-73.401672000000019,64.165543000000127],[-73.394729999999925,64.187759000000085],[-73.393065999999919,64.192474000000118],[-73.385559000000001,64.196365000000014],[-73.309433000000013,64.194977000000108],[-73.206664999999987,64.213882000000069],[-73.189986999999917,64.212203999999929],[-73.178054999999972,64.209991000000002],[-73.17332499999992,64.205261000000121],[-73.176940999999999,64.200271999999984]],[[-81.471389999999985,64.188873000000058],[-81.493606999999997,64.188309000000118],[-81.516112999999962,64.190536000000009],[-81.527785999999992,64.194137999999953],[-81.536666999999852,64.208603000000096],[-81.538054999999929,64.218048000000124],[-81.532226999999921,64.223038000000031],[-81.470000999999911,64.239426000000094],[-81.458618000000001,64.238876000000062],[-81.413329999999974,64.233322000000044],[-81.390288999999939,64.229155999999932],[-81.378601000000003,64.22554000000008],[-81.375823999999909,64.220825000000048],[-81.374999999999943,64.215820000000008],[-81.378875999999934,64.211929000000112],[-81.388901000000033,64.204987000000017],[-81.405272999999909,64.19470200000012],[-81.471389999999985,64.188873000000058]],[[-64.52027899999996,64.220261000000107],[-64.576401000000033,64.210541000000035],[-64.601668999999958,64.212493999999992],[-64.611938000000009,64.215820000000008],[-64.619445999999925,64.219711000000075],[-64.646956999999986,64.244141000000127],[-64.647781000000009,64.250000000000114],[-64.643616000000009,64.255829000000119],[-64.637512000000015,64.259995000000004],[-64.629715000000033,64.261658000000125],[-64.571670999999924,64.264998999999989],[-64.557525999999996,64.264862000000051],[-64.553054999999915,64.263321000000076],[-64.55221599999993,64.261658000000125],[-64.552490000000034,64.256653000000085],[-64.468062999999972,64.243316999999934],[-64.464721999999938,64.240814],[-64.462218999999948,64.237487999999928],[-64.464447000000007,64.234420999999998],[-64.471114999999998,64.231659000000093],[-64.52027899999996,64.220261000000107]],[[-75.551392000000021,64.303863999999976],[-75.691939999999988,64.302475000000129],[-75.702224999999999,64.305817000000104],[-75.708892999999989,64.315262000000132],[-75.705840999999964,64.341934000000037],[-75.696655000000021,64.351089000000115],[-75.686385999999914,64.353317000000061],[-75.665008999999998,64.350815000000011],[-75.578887999999949,64.346099999999979],[-75.572784000000013,64.344985999999949],[-75.502501999999936,64.319716999999969],[-75.493606999999997,64.316376000000105],[-75.50111400000003,64.313309000000004],[-75.511123999999938,64.311096000000077],[-75.551392000000021,64.303863999999976]],[[-64.938598999999954,64.235535000000027],[-64.989165999999955,64.209152000000017],[-65.00306699999993,64.21026599999999],[-65.048614999999984,64.218322999999998],[-65.052779999999984,64.219436999999971],[-65.059997999999894,64.223312000000135],[-65.065551999999968,64.227478000000019],[-65.073059000000001,64.240540000000067],[-65.102492999999981,64.296371000000136],[-65.109160999999972,64.310806000000071],[-65.113892000000021,64.323608000000036],[-65.114715999999987,64.329437000000041],[-65.114166000000012,64.334991000000059],[-65.112503000000004,64.339706000000092],[-65.110001000000011,64.343596999999988],[-65.101669000000015,64.346374999999966],[-65.08944699999995,64.349716000000001],[-65.028884999999889,64.361099000000024],[-65.021392999999932,64.362487999999985],[-65.010283999999956,64.361649000000057],[-65.006393000000003,64.360535000000084],[-65.001952999999958,64.356934000000024],[-64.99888599999997,64.354431000000034],[-64.982223999999974,64.333054000000004],[-64.884734999999921,64.28776600000009],[-64.886123999999938,64.283051000000057],[-64.890838999999971,64.276382000000012],[-64.926940999999943,64.242477000000065],[-64.938598999999954,64.235535000000027]],[[-73.876389000000017,64.301376000000005],[-73.883620999999948,64.298874000000069],[-73.951674999999966,64.304977000000008],[-73.96556099999998,64.30664100000007],[-73.972503999999958,64.309707999999944],[-73.97444200000001,64.313309000000004],[-73.960281000000009,64.362197999999978],[-73.95666499999993,64.368317000000047],[-73.952498999999932,64.370819000000097],[-73.942214999999919,64.372757000000036],[-73.932219999999916,64.37359600000002],[-73.918335000000013,64.371918000000051],[-73.909438999999963,64.369980000000112],[-73.889175000000023,64.359711000000118],[-73.879165999999941,64.351928999999984],[-73.874160999999958,64.343323000000055],[-73.87332200000003,64.305252000000053],[-73.876389000000017,64.301376000000005]],[[-73.69776899999988,64.269989000000066],[-73.704726999999934,64.268875000000037],[-73.72084000000001,64.272765999999933],[-73.75389100000001,64.28276100000005],[-73.776671999999962,64.294708000000014],[-73.823333999999988,64.324707000000046],[-73.833618000000001,64.331665000000044],[-73.781386999999995,64.405547999999953],[-73.776108000000022,64.407486000000119],[-73.765563999999983,64.409424000000058],[-73.749161000000015,64.410262999999986],[-73.744445999999982,64.405822999999998],[-73.730835000000013,64.386383000000023],[-73.729172000000005,64.386107999999979],[-73.726944000000003,64.383331000000055],[-73.724441999999954,64.377472000000068],[-73.702498999999989,64.322769000000108],[-73.699157999999954,64.314147999999989],[-73.690552000000025,64.276932000000045],[-73.691665999999998,64.273605000000089],[-73.694442999999922,64.271103000000039],[-73.69776899999988,64.269989000000066]],[[-64.849730999999963,64.307479999999998],[-64.861388999999974,64.307479999999998],[-64.877212999999983,64.313309000000004],[-64.888061999999991,64.321105999999986],[-64.937774999999988,64.361649000000057],[-64.944992000000013,64.37052900000009],[-64.955565999999976,64.383880999999917],[-64.959732000000031,64.397217000000069],[-64.958618000000001,64.405822999999998],[-64.951674999999909,64.411376999999959],[-64.946655000000021,64.413605000000132],[-64.932495000000017,64.417480000000126],[-64.925277999999992,64.418594000000098],[-64.910004000000015,64.416655999999989],[-64.902495999999985,64.412766000000147],[-64.897507000000019,64.408600000000092],[-64.820007000000032,64.379425000000026],[-64.771941999999967,64.348877000000016],[-64.770553999999947,64.345825000000104],[-64.773055999999997,64.34248400000007],[-64.849730999999963,64.307479999999998]],[[-74.27194199999991,64.413605000000132],[-74.285004000000015,64.41304000000008],[-74.357497999999964,64.421097000000088],[-74.377212999999983,64.424423000000104],[-74.423324999999977,64.443863000000079],[-74.437209999999936,64.450271999999927],[-74.439437999999996,64.453323000000125],[-74.338608000000022,64.49470500000001],[-74.331679999999949,64.496933000000126],[-74.31040999999999,64.49884000000003],[-74.285277999999948,64.481659000000036],[-74.228607000000011,64.451096000000064],[-74.205841000000021,64.44747899999993],[-74.183060000000012,64.443039000000113],[-74.17332499999992,64.439148000000046],[-74.174712999999997,64.434981999999991],[-74.178328999999962,64.433867999999961],[-74.27194199999991,64.413605000000132]],[[-73.744995000000017,64.426086000000055],[-73.758346999999958,64.425537000000077],[-73.77806099999998,64.428314],[-73.781386999999995,64.431931000000134],[-73.782776000000013,64.437484999999924],[-73.782500999999968,64.442474000000061],[-73.776108000000022,64.495818999999983],[-73.773894999999982,64.501937999999996],[-73.773330999999928,64.503326000000072],[-73.746917999999937,64.508513999999991],[-73.736664000000019,64.507216999999969],[-73.729172000000005,64.505264000000068],[-73.724166999999852,64.50221300000004],[-73.673049999999989,64.469711000000018],[-73.668610000000001,64.464432000000045],[-73.668334999999956,64.460265999999933],[-73.671936000000017,64.455826000000116],[-73.67971799999998,64.452208999999982],[-73.727218999999934,64.431091000000094],[-73.735001000000011,64.428040000000067],[-73.744995000000017,64.426086000000055]],[[-74.212783999999999,64.483046999999999],[-74.223327999999981,64.480270000000075],[-74.229171999999949,64.481369000000029],[-74.307495000000017,64.516098000000113],[-74.331116000000009,64.526656999999943],[-74.337508999999955,64.531096999999988],[-74.357773000000009,64.546936000000073],[-74.357773000000009,64.551086000000112],[-74.353881999999999,64.553589000000045],[-74.345550999999944,64.555251999999996],[-74.253066999999987,64.548035000000084],[-74.240554999999972,64.546371000000079],[-74.236114999999984,64.545532000000094],[-74.169723999999974,64.523880000000077],[-74.169448999999929,64.519714000000135],[-74.206664999999987,64.486374000000069],[-74.212783999999999,64.483046999999999]],[[-73.557495000000017,64.312758999999971],[-73.577788999999939,64.309982000000105],[-73.601669000000015,64.310257000000092],[-73.626388999999904,64.312758999999971],[-73.650283999999999,64.31721500000009],[-73.655563000000029,64.320267000000001],[-73.658339999999953,64.334991000000059],[-73.669532999999888,64.426849000000118],[-73.610442999999975,64.470489999999984],[-73.68249499999996,64.509720000000129],[-73.679992999999911,64.526093000000003],[-73.677779999999927,64.532211000000132],[-73.666655999999875,64.535538000000088],[-73.577224999999999,64.559982000000048],[-73.537215999999944,64.567764000000011],[-73.527785999999992,64.566940000000045],[-73.521118000000001,64.56303400000013],[-73.509170999999981,64.552475000000072],[-73.504729999999938,64.542480000000012],[-73.50306699999993,64.53414900000007],[-73.489165999999955,64.463318000000072],[-73.488051999999982,64.453598],[-73.48832699999997,64.443863000000079],[-73.490279999999927,64.439148000000046],[-73.555266999999958,64.314697000000137],[-73.557495000000017,64.312758999999971]],[[-65.492767000000015,64.517761000000007],[-65.658339999999953,64.509720000000129],[-65.669448999999929,64.510269000000108],[-65.67971799999998,64.512207000000046],[-65.686110999999926,64.515273999999977],[-65.689712999999983,64.51998900000001],[-65.690276999999924,64.524155000000064],[-65.689712999999983,64.52998400000007],[-65.686935000000005,64.538879000000122],[-65.672500999999954,64.56053200000008],[-65.660278000000005,64.573883000000023],[-65.651108000000022,64.580551000000014],[-65.615829000000019,64.599152000000004],[-65.563323999999909,64.615540000000067],[-65.554442999999992,64.618591000000094],[-65.546951000000035,64.622481999999991],[-65.449158000000011,64.678863999999976],[-65.443877999999927,64.684708000000001],[-65.43582200000003,64.696365000000128],[-65.381942999999922,64.716934000000037],[-65.292495999999971,64.735535000000084],[-65.256957999999941,64.709991000000059],[-65.252501999999936,64.706375000000037],[-65.258057000000008,64.700821000000019],[-65.266402999999912,64.6933140000001],[-65.249999999999886,64.663605000000075],[-65.208054000000004,64.639708999999982],[-65.208618000000001,64.631363000000079],[-65.213897999999915,64.626083000000051],[-65.228057999999919,64.6202550000001],[-65.309433000000013,64.60054000000008],[-65.420272999999952,64.55442800000003],[-65.452788999999939,64.532760999999994],[-65.450835999999924,64.528320000000065],[-65.453613000000018,64.524428999999998],[-65.460555999999997,64.521102999999982],[-65.468886999999995,64.519150000000025],[-65.492767000000015,64.517761000000007]],[[-63.353333000000021,64.994980000000112],[-63.349167000000023,64.991652999999985],[-63.34722099999999,64.991927999999973],[-63.330558999999994,64.986923000000104],[-63.257506999999976,64.92942800000003],[-63.256392999999889,64.926376000000118],[-63.258895999999936,64.921097000000145],[-63.27305599999994,64.918045000000063],[-63.281386999999938,64.918320000000051],[-63.37777699999998,64.940811000000053],[-63.385276999999974,64.944138000000009],[-63.393889999999942,64.951096000000007],[-63.417220999999984,64.97137499999991],[-63.420279999999934,64.976089000000059],[-63.420279999999934,64.978317000000004],[-63.418892000000028,64.982483000000116],[-63.415549999999996,64.986923000000104],[-63.395279000000016,64.995529000000033],[-63.376105999999993,64.998871000000008],[-63.363616999999977,64.997208000000057],[-63.353333000000021,64.994980000000112]],[[-63.243613999999923,65.254990000000134],[-63.251395999999943,65.253875999999991],[-63.256667999999991,65.256104000000107],[-63.310554999999965,65.290542999999957],[-63.313331999999946,65.293869000000029],[-63.311667999999941,65.298035000000084],[-63.306663999999898,65.302475000000129],[-63.257781999999963,65.320831000000112],[-63.244445999999925,65.322769000000051],[-63.236663999999962,65.321655000000078],[-63.227218999999991,65.313873000000115],[-63.166388999999924,65.286102000000085],[-63.165833000000021,65.282486000000006],[-63.166663999999969,65.27915999999999],[-63.235274999999888,65.256943000000092],[-63.243613999999923,65.254990000000134]],[[-66.92471299999994,65.284424000000115],[-66.933883999999978,65.283324999999991],[-66.962509000000011,65.283599999999979],[-66.976943999999946,65.284424000000115],[-66.989166000000012,65.286377000000073],[-66.99110399999995,65.288878999999952],[-67.011123999999938,65.319153000000028],[-67.011948000000018,65.323044000000095],[-67.010559000000001,65.333328000000108],[-67.005004999999926,65.339706000000092],[-66.992217999999923,65.346100000000092],[-66.974441999999954,65.350540000000137],[-66.932494999999903,65.358032000000094],[-66.920273000000009,65.358597000000088],[-66.910827999999867,65.356933999999967],[-66.908614999999998,65.355255],[-66.908050999999944,65.351089000000059],[-66.90943900000002,65.346100000000092],[-66.91194200000001,65.342209000000025],[-66.920273000000009,65.294434000000024],[-66.921386999999982,65.289703000000088],[-66.92471299999994,65.284424000000115]],[[-89.005568999999923,65.385544000000039],[-89.017501999999979,65.385544000000039],[-89.030288999999982,65.387496999999939],[-89.076110999999969,65.394714000000079],[-89.100280999999882,65.400818000000072],[-89.099990999999932,65.405822999999941],[-89.091674999999952,65.408325000000048],[-89.06806899999998,65.408325000000048],[-89.03195199999999,65.407211000000075],[-89.018615999999952,65.403320000000008],[-89.009445000000028,65.399155000000007],[-89.005279999999914,65.395538000000045],[-89.003066999999987,65.390549000000078],[-89.005568999999923,65.385544000000039]],[[-88.430282999999918,65.455261000000064],[-88.465011999999888,65.453597999999943],[-88.489990000000034,65.456650000000081],[-88.503615999999909,65.460541000000148],[-88.510284000000013,65.464995999999985],[-88.512222000000008,65.469711000000018],[-88.507506999999976,65.474991000000045],[-88.496383999999978,65.476928999999984],[-88.485001000000011,65.477767999999969],[-88.461120999999991,65.477478000000133],[-88.424163999999962,65.474426000000051],[-88.398620999999878,65.47026100000005],[-88.39416499999993,65.465820000000122],[-88.399733999999967,65.461380000000077],[-88.421386999999982,65.456940000000088],[-88.430282999999918,65.455261000000064]],[[-62.795005999999887,65.519988999999953],[-62.804442999999992,65.519150000000025],[-62.819450000000018,65.524155000000064],[-62.826950000000011,65.528046000000131],[-62.893889999999942,65.581100000000106],[-62.895553999999947,65.585541000000035],[-62.895553999999947,65.589981000000023],[-62.889724999999942,65.599152000000004],[-62.884444999999971,65.60554500000012],[-62.87471800000003,65.613602000000071],[-62.8663939999999,65.617477000000065],[-62.856392000000028,65.61914100000007],[-62.849723999999981,65.618866000000082],[-62.842773000000022,65.616378999999995],[-62.838051000000007,65.613602000000071],[-62.834998999999925,65.606644000000131],[-62.834998999999925,65.604705999999965],[-62.830001999999979,65.593048000000124],[-62.824448000000018,65.58526599999999],[-62.817504999999926,65.578598],[-62.810279999999977,65.574706999999933],[-62.785560999999973,65.564148000000102],[-62.765006999999969,65.557480000000112],[-62.750838999999985,65.551376000000062],[-62.788894999999968,65.523315000000025],[-62.795005999999887,65.519988999999953]],[[-83.882766999999944,65.666931000000091],[-83.893889999999942,65.664703000000145],[-83.906386999999938,65.666931000000091],[-83.937499999999943,65.677199999999914],[-83.943054000000018,65.681931000000077],[-83.942214999999976,65.686920000000043],[-83.93638599999997,65.691925000000083],[-83.928328999999962,65.69720500000011],[-83.896118000000001,65.710266000000047],[-83.884734999999978,65.712769000000037],[-83.872771999999941,65.712203999999986],[-83.864440999999943,65.707763999999997],[-83.868880999999988,65.696930000000123],[-83.871384000000035,65.686920000000043],[-83.876937999999939,65.672210999999947],[-83.882766999999944,65.666931000000091]],[[-67.472504000000015,65.705261000000007],[-67.55972300000002,65.702209000000096],[-67.584731999999974,65.703598000000113],[-67.640563999999927,65.696091000000138],[-67.691375999999934,65.685806000000014],[-67.701401000000033,65.686096000000077],[-67.706954999999937,65.688034000000016],[-67.713897999999858,65.696640000000116],[-67.715835999999967,65.701659999999947],[-67.713332999999921,65.705551000000014],[-67.695830999999885,65.720825000000104],[-67.658614999999998,65.725266000000033],[-67.577498999999989,65.731658999999979],[-67.529175000000009,65.734985000000052],[-67.499999999999943,65.734985000000052],[-67.48971599999993,65.734985000000052],[-67.424438000000009,65.735260000000039],[-67.446944999999914,65.718596999999988],[-67.472504000000015,65.705261000000007]],[[-62.268332999999984,65.701659999999947],[-62.259445000000028,65.699707000000046],[-62.238051999999982,65.702484000000084],[-62.221107000000018,65.708038000000101],[-62.20416999999992,65.711655000000064],[-62.186385999999914,65.711928999999998],[-62.167777999999942,65.70277399999992],[-62.131667999999934,65.678863999999976],[-62.128333999999938,65.674149000000114],[-62.131942999999978,65.657211000000018],[-62.135276999999974,65.651382000000012],[-62.142226999999991,65.64498900000001],[-62.194999999999993,65.612762000000032],[-62.202498999999989,65.610259999999982],[-62.215004000000022,65.609984999999938],[-62.22444200000001,65.611098999999967],[-62.296950999999979,65.624985000000095],[-62.455001999999979,65.659988000000112],[-62.466109999999958,65.663879000000009],[-62.483886999999925,65.721099999999922],[-62.484443999999939,65.726928999999984],[-62.483611999999994,65.731658999999979],[-62.480552999999873,65.737761999999918],[-62.473609999999951,65.74192800000003],[-62.46832999999998,65.744140999999956],[-62.461944999999957,65.745254999999986],[-62.283889999999928,65.74443100000002],[-62.27194199999991,65.744140999999956],[-62.260283999999956,65.74331699999999],[-62.252501999999993,65.74192800000003],[-62.251396,65.739151000000106],[-62.258613999999909,65.728592000000049],[-62.27027899999996,65.723038000000088],[-62.297501000000011,65.708602999999982],[-62.268332999999984,65.701659999999947]],[[-83.283889999999928,65.834152000000131],[-83.292220999999927,65.828872999999987],[-83.30360399999995,65.826385000000016],[-83.315551999999968,65.826096000000064],[-83.327498999999932,65.82748399999997],[-83.347777999999892,65.832489000000066],[-83.395279000000016,65.8316650000001],[-83.406661999999983,65.830276000000083],[-83.418059999999969,65.827774000000034],[-83.429168999999945,65.824432000000058],[-83.439986999999917,65.819153000000085],[-83.456389999999999,65.808867999999961],[-83.473327999999981,65.800262000000032],[-83.485274999999945,65.800812000000064],[-83.498046999999929,65.804152999999928],[-83.529723999999987,65.817489999999964],[-83.559157999999968,65.831100000000049],[-83.575561999999934,65.839980999999966],[-83.581679999999892,65.844711000000018],[-83.585007000000019,65.849426000000051],[-83.586120999999991,65.854156000000103],[-83.580291999999986,65.859420999999941],[-83.571670999999981,65.862488000000042],[-83.560271999999941,65.864990000000148],[-83.525283999999886,65.868317000000104],[-83.478058000000033,65.870255000000043],[-83.442490000000021,65.870818999999983],[-83.36999499999996,65.866653000000042],[-83.345551,65.863876000000005],[-83.333069000000023,65.860260000000096],[-83.291106999999954,65.843597000000045],[-83.285277999999948,65.838882000000012],[-83.283889999999928,65.834152000000131]],[[-65.645843999999954,65.813034000000073],[-65.656386999999995,65.812759000000028],[-65.660278000000005,65.819717000000026],[-65.654998999999918,65.869431000000077],[-65.651671999999962,65.876647999999989],[-65.647781000000009,65.879974000000004],[-65.636123999999882,65.88638300000008],[-65.623885999999914,65.891373000000101],[-65.583069000000023,65.902771000000143],[-65.542769999999962,65.908035000000098],[-65.531676999999945,65.908874999999966],[-65.516112999999962,65.906371999999976],[-65.511397999999929,65.903046000000131],[-65.512221999999895,65.894440000000031],[-65.513335999999981,65.890548999999965],[-65.52806099999998,65.859420999999941],[-65.559433000000013,65.834717000000012],[-65.645843999999954,65.813034000000073]],[[-85.480559999999969,65.791930999999977],[-85.468062999999972,65.790817000000004],[-85.456389999999942,65.791367000000037],[-85.445266999999944,65.793869000000086],[-85.424164000000019,65.801926000000094],[-85.413895000000025,65.807480000000055],[-85.40834000000001,65.812485000000095],[-85.404998999999975,65.817489999999964],[-85.404175000000009,65.822495000000004],[-85.393065999999862,65.832764000000054],[-85.381942999999978,65.835265999999933],[-85.369995000000017,65.834991000000116],[-85.333327999999995,65.832214000000022],[-85.313613999999916,65.830276000000083],[-85.288605000000018,65.826660000000004],[-85.263061999999991,65.821106000000043],[-85.213622999999984,65.808029000000033],[-85.202788999999939,65.803588999999988],[-85.18582200000003,65.794708000000071],[-85.162505999999894,65.78137200000009],[-85.156386999999938,65.776657000000057],[-85.049164000000019,65.621643000000006],[-85.047774999999945,65.616928000000144],[-85.048614999999984,65.611923000000104],[-85.051666000000012,65.606934000000138],[-85.067504999999926,65.59637500000008],[-85.08805799999999,65.585541000000035],[-85.120270000000005,65.574996999999996],[-85.142226999999934,65.569992000000127],[-85.175827000000027,65.563309000000118],[-85.232223999999917,65.554703000000018],[-85.24360699999994,65.55386400000009],[-85.267776000000026,65.555542000000003],[-85.280563000000029,65.55802900000009],[-85.291945999999882,65.557205000000124],[-85.302490000000034,65.552765000000079],[-85.307770000000005,65.547760000000039],[-85.311110999999926,65.542479999999955],[-85.311935000000005,65.537766000000033],[-85.308043999999995,65.533051],[-85.295836999999949,65.52388000000002],[-85.271118000000001,65.511658000000068],[-85.240829000000019,65.498322000000087],[-85.204178000000013,65.485809000000017],[-85.165557999999976,65.474991000000045],[-85.127776999999924,65.466095000000109],[-85.088608000000022,65.453597999999943],[-85.043609999999944,65.436371000000122],[-85.02694699999995,65.427475000000015],[-85.015015000000005,65.418319999999937],[-85.011123999999938,65.413605000000075],[-85.002791999999943,65.401382000000069],[-85.001403999999923,65.396652000000017],[-85.005004999999983,65.37692300000009],[-85.011672999999973,65.352203000000031],[-84.930557000000022,65.214157000000057],[-84.924712999999997,65.209717000000012],[-84.912216000000001,65.206375000000094],[-84.900283999999942,65.206100000000106],[-84.832503999999972,65.212494000000106],[-84.821395999999879,65.213882000000012],[-84.810271999999998,65.216385000000002],[-84.800277999999992,65.221649000000014],[-84.792496000000028,65.226929000000041],[-84.748046999999985,65.292755000000056],[-84.746947999999975,65.297485000000052],[-84.749724999999899,65.307204999999954],[-84.755004999999869,65.316666000000112],[-84.762221999999952,65.326096000000007],[-84.761123999999995,65.331099999999992],[-84.758056999999951,65.336105000000032],[-84.754729999999938,65.341095000000053],[-84.745834000000002,65.351379000000065],[-84.740279999999984,65.356368999999972],[-84.595839999999953,65.475540000000024],[-84.58555599999994,65.481093999999985],[-84.573623999999995,65.481659000000036],[-84.561934999999949,65.481093999999985],[-84.549437999999952,65.47886699999998],[-84.440276999999924,65.456650000000081],[-84.432220000000029,65.453323000000125],[-84.426392000000021,65.448593000000074],[-84.424712999999997,65.443863000000079],[-84.42582699999997,65.438873000000001],[-84.314437999999996,65.381653000000142],[-84.291945999999996,65.37692300000009],[-84.161391999999921,65.341934000000037],[-84.151107999999908,65.338593000000003],[-84.147507000000019,65.333878000000141],[-84.153060999999923,65.328598000000056],[-84.194153000000028,65.297485000000052],[-84.201950000000011,65.292206000000078],[-84.220839999999953,65.284713999999951],[-84.228881999999999,65.279434000000094],[-84.230834999999956,65.269440000000088],[-84.229720999999984,65.264708999999982],[-84.141388000000006,65.219986000000063],[-84.088333000000034,65.203873000000044],[-83.899993999999992,65.165543000000071],[-83.876098999999954,65.162766000000033],[-83.852782999999931,65.161652000000004],[-83.666945999999939,65.160811999999964],[-83.620543999999938,65.160811999999964],[-83.540282999999931,65.16415400000011],[-83.52806099999998,65.161925999999937],[-83.408614999999998,65.135544000000095],[-83.388061999999934,65.126647999999932],[-83.378875999999991,65.117203000000075],[-83.33805799999999,65.074707000000046],[-83.334732000000031,65.069992000000013],[-83.335830999999928,65.064986999999974],[-83.339447000000007,65.059982000000105],[-83.343063000000029,65.045258000000047],[-83.340835999999967,65.035537999999974],[-83.330840999999964,65.021378000000084],[-83.319457999999941,65.012207000000103],[-83.208053999999947,64.945526000000086],[-83.198043999999868,64.941086000000098],[-83.190552000000025,64.939423000000147],[-83.156386999999995,64.939972000000068],[-83.005004999999926,64.913039999999967],[-82.992766999999901,64.909714000000122],[-82.865828999999962,64.873596000000077],[-82.855834999999956,64.86914100000007],[-82.848052999999993,64.864426000000037],[-82.842498999999918,64.859985000000108],[-82.829726999999991,64.840819999999951],[-82.828613000000018,64.836104999999918],[-82.825287000000003,64.831375000000094],[-82.816390999999953,64.821930000000009],[-82.800277999999992,64.808868000000018],[-82.770003999999972,64.795532000000037],[-82.75778200000002,64.791092000000049],[-82.709166999999979,64.776382000000069],[-82.697220000000016,64.77388000000002],[-82.569732999999928,64.763885000000073],[-82.361388999999974,64.763610999999969],[-82.34944200000001,64.760269000000051],[-82.211944999999957,64.718323000000055],[-82.202224999999885,64.713608000000022],[-82.203339000000028,64.708602999999982],[-82.209166999999979,64.703598000000113],[-82.217498999999975,64.698593000000074],[-82.203612999999962,64.684417999999994],[-82.064437999999996,64.648605000000089],[-81.932495000000017,64.584427000000062],[-81.763061999999991,64.501099000000067],[-81.753890999999953,64.486923000000047],[-81.75140399999998,64.472488000000112],[-81.753066999999987,64.355820000000051],[-81.764174999999966,64.341095000000109],[-81.770003999999972,64.336105000000032],[-81.777221999999995,64.326096000000007],[-81.778885000000002,64.321105999999986],[-81.777221999999995,64.31164600000011],[-81.77416999999997,64.30664100000007],[-81.74888599999997,64.273605000000089],[-81.727218999999934,64.258330999999998],[-81.712783999999999,64.250000000000114],[-81.702788999999996,64.2452550000001],[-81.669723999999974,64.232758000000103],[-81.646118000000001,64.22554000000008],[-81.622498000000007,64.216660000000047],[-81.613051999999982,64.212203999999929],[-81.600280999999939,64.20277400000009],[-81.594451999999933,64.193313999999987],[-81.590835999999967,64.183594000000085],[-81.589995999999928,64.17886400000009],[-81.602492999999981,64.129974000000004],[-81.610824999999977,64.125809000000004],[-81.717772999999966,64.099426000000051],[-81.758621000000005,64.089432000000045],[-81.76916499999993,64.088043000000027],[-81.824447999999961,64.086380000000077],[-81.879165999999941,64.080826000000116],[-81.955840999999964,64.0619200000001],[-81.964171999999962,64.0577550000001],[-81.970000999999968,64.052765000000022],[-81.973617999999931,64.047759999999982],[-81.999160999999958,64.003326000000015],[-81.996384000000035,63.998604000000114],[-81.986938000000009,63.994155999999975],[-81.975005999999951,63.990546999999992],[-81.963897999999972,63.988884000000041],[-81.952498999999932,63.98832700000014],[-81.930556999999965,63.988045000000056],[-81.897507000000019,63.989990000000091],[-81.875823999999909,63.991661000000136],[-81.56082200000003,64.029433999999981],[-81.44027699999998,64.067764000000068],[-81.383620999999948,64.090546000000018],[-81.287780999999882,64.080276000000083],[-81.276397999999972,64.07748399999997],[-81.270003999999915,64.072495000000004],[-81.264174999999966,64.062759000000028],[-81.256957999999997,64.059143000000006],[-81.245543999999995,64.055542000000116],[-80.964721999999938,63.991936000000123],[-80.942489999999964,63.990546999999992],[-80.931670999999994,63.991936000000123],[-80.920837000000006,63.994995000000131],[-80.910277999999892,63.999161000000015],[-80.906661999999926,64.004166000000055],[-80.903335999999967,64.013885000000073],[-80.909163999999976,64.023315000000139],[-80.914168999999958,64.028046000000074],[-80.92582699999997,64.032761000000107],[-80.948607999999979,64.038879000000065],[-80.967498999999918,64.04803499999997],[-80.972778000000005,64.052765000000022],[-80.975554999999986,64.0577550000001],[-80.973891999999978,64.062485000000095],[-80.935821999999973,64.111923000000047],[-80.890838999999971,64.11554000000001],[-80.812209999999993,64.091094999999939],[-80.777495999999871,64.079437000000098],[-80.734726000000023,64.054153000000099],[-80.566100999999946,63.994155999999975],[-80.543335000000013,63.987770000000069],[-80.531677000000002,63.983330000000024],[-80.522507000000019,63.978600000000029],[-80.517501999999979,63.973877000000016],[-80.488327000000027,63.910545000000013],[-80.49221799999998,63.905548000000067],[-80.503066999999987,63.902489000000116],[-80.567504999999926,63.889435000000049],[-80.453063999999927,63.859436000000017],[-80.363051999999925,63.841102999999976],[-80.217223999999987,63.809989999999971],[-80.194480999999996,63.804474000000084],[-80.189986999999974,63.799995000000024],[-80.174712999999883,63.780822999999998],[-80.172225999999966,63.776100000000042],[-80.171660999999972,63.771102999999925],[-80.178878999999881,63.756660000000068],[-80.184998000000007,63.751663000000121],[-80.195830999999885,63.748604],[-80.346953999999982,63.728042999999957],[-80.357772999999952,63.728600000000085],[-80.369155999999975,63.73333000000008],[-80.380279999999971,63.734993000000031],[-80.391387999999949,63.734993000000031],[-80.402221999999995,63.734717999999987],[-80.434433000000013,63.731102000000135],[-80.454178000000013,63.727767999999969],[-80.485275000000001,63.715546000000018],[-80.493606999999997,63.710274000000084],[-80.504729999999995,63.690826000000129],[-80.506393000000003,63.685822000000144],[-80.510009999999966,63.681107000000111],[-80.52194199999991,63.671104000000071],[-80.587783999999999,63.635826000000066],[-80.608886999999982,63.628326000000015],[-80.774445000000014,63.573326000000122],[-80.912216000000001,63.526381999999955],[-80.922501000000011,63.521378000000027],[-80.930557000000022,63.516106000000093],[-80.936385999999914,63.511108000000092],[-80.938048999999864,63.50638600000002],[-80.9375,63.501389000000074],[-80.934433000000013,63.496658000000139],[-80.930557000000022,63.482208000000014],[-80.930282999999974,63.477486000000113],[-80.9375,63.467491000000052],[-80.958053999999947,63.458328000000051],[-80.968613000000005,63.455269000000044],[-80.989440999999999,63.450829000000056],[-81.011123999999995,63.449158000000011],[-81.032775999999956,63.44860100000011],[-81.054442999999992,63.449158000000011],[-81.076401000000033,63.451385000000016],[-81.110000999999954,63.458328000000051],[-81.386123999999938,63.526381999999955],[-81.694153000000028,63.607498000000135],[-81.734160999999972,63.625549000000092],[-81.757232999999985,63.634720000000073],[-81.768889999999999,63.638046000000088],[-81.779998999999975,63.639717000000132],[-81.801940999999943,63.641105999999979],[-81.823623999999995,63.639435000000105],[-81.855270000000019,63.63249200000007],[-81.876662999999951,63.629990000000021],[-81.887512000000015,63.62943300000012],[-81.909728999999913,63.631934999999999],[-81.995270000000005,63.661102000000142],[-82.01167299999986,63.667213000000004],[-82.026397999999972,63.676383999999985],[-82.031386999999938,63.681107000000111],[-82.041107000000011,63.685822000000144],[-82.052490000000034,63.689156000000139],[-82.06361400000003,63.690826000000129],[-82.107772999999952,63.692214999999919],[-82.129439999999988,63.691658000000018],[-82.214172000000019,63.687766999999951],[-82.224715999999887,63.686377999999991],[-82.285552999999993,63.678047000000049],[-82.296111999999937,63.674713000000111],[-82.299437999999952,63.669715999999994],[-82.298889000000031,63.664992999999981],[-82.302215999999987,63.659987999999942],[-82.307769999999948,63.654991000000052],[-82.318344000000025,63.651657000000057],[-82.328887999999949,63.65026899999998],[-82.339995999999871,63.650826000000052],[-82.351395000000025,63.653320000000008],[-82.472228999999913,63.680275000000051],[-82.483886999999982,63.68471500000004],[-82.491103999999893,63.689156000000139],[-82.535278000000005,63.726378999999952],[-82.545836999999949,63.735550000000103],[-82.549728000000016,63.745270000000005],[-82.550827000000027,63.750000000000057],[-82.546951000000035,63.764717000000019],[-82.543334999999956,63.769714000000135],[-82.532226999999978,63.779991000000109],[-82.514450000000011,63.790276000000063],[-82.504456000000005,63.795547000000056],[-82.484160999999972,63.804993000000024],[-82.473617999999931,63.80832700000002],[-82.431945999999982,63.820273999999984],[-82.420837000000006,63.820831000000055],[-82.40972899999997,63.819160000000011],[-82.398055999999883,63.815826000000015],[-82.386672999999973,63.814156000000025],[-82.376389000000017,63.81749700000006],[-82.372771999999998,63.82249500000006],[-82.353881999999942,63.852219000000105],[-82.351395000000025,63.861938000000066],[-82.358336999999949,63.900543000000027],[-82.361388999999974,63.905265999999983],[-82.368880999999988,63.909988000000112],[-82.378325999999959,63.91443600000008],[-82.413894999999968,63.926940999999999],[-82.525833000000034,63.966103000000032],[-82.548888999999974,63.96915400000006],[-82.828613000000018,63.979431000000034],[-82.967223999999987,63.965546000000131],[-82.978058000000033,63.963051000000121],[-83.064162999999951,63.951934999999992],[-83.086944999999957,63.954994000000113],[-83.098891999999921,63.959160000000054],[-83.12388599999997,63.972763000000043],[-83.129165999999941,63.977486000000056],[-83.145279000000016,64.001099000000124],[-83.139724999999999,64.006103999999993],[-83.095550999999887,64.028320000000008],[-83.029449,64.074707000000103],[-83.016113000000018,64.084991000000116],[-82.996947999999975,64.10026600000009],[-82.980285999999978,64.11554000000001],[-82.97084000000001,64.125534000000016],[-82.961944999999901,64.135818000000029],[-82.960555999999997,64.140548999999965],[-82.96166999999997,64.145538000000101],[-82.964721999999995,64.150269000000037],[-83.008346999999958,64.187484999999981],[-83.019729999999981,64.188873000000058],[-83.072783999999956,64.186646000000053],[-83.105269999999962,64.181655999999975],[-83.126388999999961,64.175811999999951],[-83.157227000000034,64.163040000000137],[-83.339447000000007,64.134720000000129],[-83.488327000000027,64.122482000000048],[-83.519729999999981,64.11442599999998],[-83.530288999999925,64.111099000000081],[-83.548339999999996,64.102478000000133],[-83.673324999999977,64.017212000000029],[-83.682220000000029,64.007217000000082],[-83.683318999999983,64.002212999999927],[-83.676666000000012,63.992766999999958],[-83.665833000000021,63.983603999999957],[-83.642501999999979,63.969986000000119],[-83.626099000000011,63.956099999999992],[-83.608611999999994,63.937492000000077],[-83.605559999999969,63.932770000000005],[-83.604171999999949,63.928047000000049],[-83.595839999999896,63.825829000000056],[-83.596664000000033,63.820831000000055],[-83.623046999999929,63.781661999999983],[-83.631942999999865,63.771659999999997],[-83.637222000000008,63.766388000000063],[-83.647507000000019,63.763054000000125],[-83.658614999999941,63.763611000000026],[-83.670272999999952,63.766937000000041],[-83.694442999999978,63.775826000000109],[-83.718613000000005,63.779991000000109],[-83.740554999999972,63.779991000000109],[-83.750838999999985,63.776657000000114],[-83.824172999999973,63.747490000000028],[-84.007232999999985,63.668053000000043],[-84.012786999999889,63.662765999999976],[-84.021117999999944,63.65277100000003],[-84.027495999999928,63.642769000000044],[-84.050277999999935,63.626938000000109],[-84.069457999999997,63.616386000000091],[-84.079453000000001,63.611938000000123],[-84.089447000000007,63.607773000000122],[-84.09973100000002,63.605270000000132],[-84.110000999999954,63.603607000000068],[-84.121383999999978,63.604163999999969],[-84.132767000000001,63.606658999999979],[-84.144729999999925,63.610825000000034],[-84.162216000000001,63.619713000000047],[-84.174164000000019,63.623047000000042],[-84.196380999999917,63.62499200000002],[-84.261123999999995,63.62082700000002],[-84.286117999999988,63.615546999999935],[-84.388061999999991,63.559158000000082],[-84.395279000000016,63.553879000000109],[-84.40055799999999,63.548607000000004],[-84.446380999999974,63.488045],[-84.449431999999888,63.483046999999999],[-84.452224999999942,63.472488000000112],[-84.447220000000016,63.453323000000012],[-84.449157999999954,63.443603999999993],[-84.477492999999981,63.3836060000001],[-84.563323999999966,63.337494000000049],[-84.754456000000005,63.264160000000061],[-84.774170000000026,63.257217000000082],[-84.793883999999991,63.250274999999988],[-84.823059000000001,63.237213000000111],[-84.841949,63.227211000000011],[-84.870834000000002,63.214157000000114],[-84.890563999999983,63.207214000000079],[-85.143341000000021,63.139992000000063],[-85.224166999999966,63.120827000000133],[-85.244995000000017,63.118598999999961],[-85.266402999999968,63.117493000000138],[-85.288054999999986,63.118324000000143],[-85.343338000000017,63.122765000000072],[-85.375823999999909,63.123877999999934],[-85.396956999999929,63.122765000000072],[-85.449158000000011,63.116661000000022],[-85.482223999999974,63.118598999999961],[-85.493331999999953,63.119987000000094],[-85.505004999999983,63.123046999999929],[-85.536391999999921,63.134995000000004],[-85.543883999999935,63.138328999999999],[-85.577788999999939,63.165543000000127],[-85.589171999999962,63.174712999999997],[-85.592498999999975,63.17943600000001],[-85.638061999999934,63.244995000000074],[-85.639175000000023,63.249718000000087],[-85.648345999999947,63.33554799999996],[-85.653884999999946,63.408882000000006],[-85.650833000000034,63.428604000000007],[-85.644454999999994,63.443603999999993],[-85.635833999999988,63.458603000000039],[-85.626098999999897,63.468880000000013],[-85.618057000000022,63.479156000000103],[-85.60722399999986,63.494438000000116],[-85.604995999999971,63.509163000000058],[-85.591110000000015,63.617493000000024],[-85.59333799999996,63.631934999999999],[-85.596114999999941,63.641380000000083],[-85.607497999999964,63.665268000000026],[-85.61332699999997,63.669715999999994],[-85.717498999999975,63.716103000000089],[-85.879439999999988,63.704711999999915],[-85.98582499999992,63.693320999999969],[-86.017226999999934,63.68832400000008],[-86.183608999999933,63.653046000000074],[-86.224441999999954,63.642769000000044],[-86.244995000000017,63.639435000000105],[-86.266952999999944,63.638046000000088],[-86.300277999999935,63.639717000000132],[-86.346114999999998,63.645546000000138],[-86.381377999999984,63.652214000000129],[-86.450286999999889,63.660545000000013],[-86.552779999999871,63.670273000000066],[-86.56361400000003,63.670546999999999],[-86.596114999999941,63.668602000000021],[-86.626937999999996,63.661659000000043],[-86.666397000000018,63.648331000000042],[-86.694442999999922,63.633606000000043],[-86.733886999999982,63.606658999999979],[-86.759170999999981,63.590271000000087],[-86.778060999999923,63.581108000000086],[-86.807495000000017,63.571380999999974],[-86.837783999999999,63.563323999999966],[-86.847778000000005,63.560822000000087],[-86.879165999999998,63.555549999999982],[-86.922225999999966,63.552773000000059],[-87.050551999999982,63.549720999999977],[-87.083618000000001,63.550270000000125],[-87.095275999999956,63.551384000000098],[-87.118606999999997,63.555824000000086],[-87.141388000000006,63.563881000000094],[-87.14973399999991,63.568329000000062],[-87.188048999999864,63.589989000000003],[-87.217223999999987,63.622215000000097],[-87.222778000000005,63.631660000000011],[-87.226394999999968,63.641105999999979],[-87.225280999999995,63.651099999999985],[-87.22193900000002,63.665825000000098],[-87.218886999999938,63.675827000000083],[-87.210830999999985,63.691100999999946],[-87.200835999999867,63.706657000000121],[-87.186661000000015,63.722213999999951],[-87.161117999999931,63.743607000000054],[-86.943877999999927,63.900543000000027],[-86.934432999999956,63.906097000000045],[-86.915282999999988,63.91443600000008],[-86.875823999999966,63.928604000000121],[-86.784163999999976,63.956940000000031],[-86.763625999999988,63.962212000000136],[-86.700287000000003,63.972214000000122],[-86.668609999999887,63.978324999999984],[-86.503890999999896,64.018326000000002],[-86.41361999999998,64.048598999999967],[-86.255004999999926,64.076096000000064],[-86.233611999999994,64.079437000000098],[-86.223327999999981,64.081940000000088],[-86.213333000000034,64.085541000000148],[-86.203888000000006,64.091094999999939],[-86.189437999999882,64.101653999999996],[-86.178328999999962,64.121918000000107],[-86.178878999999995,64.131653000000028],[-86.182220000000029,64.141373000000101],[-86.212219000000005,64.178589000000045],[-86.253066999999987,64.200546000000088],[-86.273894999999982,64.208878000000084],[-86.300551999999982,64.221924000000058],[-86.308884000000035,64.226379000000065],[-86.3125,64.230819999999994],[-86.354720999999984,64.289978000000133],[-86.384170999999981,64.36442599999998],[-86.401672000000019,64.436645999999996],[-86.401107999999965,64.441649999999925],[-86.383620999999948,64.564987000000087],[-86.368880999999988,64.629424999999969],[-86.315552000000025,64.701096000000064],[-86.272506999999962,64.768051000000014],[-86.24888599999997,64.793868999999916],[-86.238891999999964,64.804152999999985],[-86.231383999999935,64.809418000000051],[-86.221114999999998,64.813034000000073],[-86.210280999999952,64.814697000000024],[-86.198607999999922,64.81442300000009],[-86.187209999999993,64.815262000000018],[-86.176665999999955,64.817764000000125],[-86.171660999999915,64.823043999999982],[-86.152495999999928,64.918045000000063],[-86.151947000000007,64.923035000000084],[-86.153335999999911,64.927765000000136],[-86.157226999999978,64.932479999999998],[-86.181106999999997,64.955551000000014],[-86.187209999999993,64.959991000000002],[-86.212509000000011,64.966385000000059],[-86.22084000000001,64.970535000000041],[-86.226394999999968,64.979980000000126],[-86.227782999999988,64.983871000000022],[-86.225829999999974,64.998596000000134],[-86.225006000000008,65.003601000000003],[-86.212219000000005,65.03387500000008],[-86.206389999999885,65.043869000000086],[-86.198333999999988,65.054153000000099],[-86.189986999999917,65.064423000000033],[-86.18472300000002,65.069717000000026],[-86.165282999999931,65.080551000000071],[-86.144729999999981,65.08859300000006],[-86.138335999999924,65.094437000000028],[-86.138061999999991,65.099425999999994],[-86.135558999999944,65.1827550000001],[-86.137221999999952,65.197753999999975],[-86.141953000000001,65.212204000000099],[-86.146118000000001,65.216660000000047],[-86.151397999999972,65.226379000000009],[-86.164168999999958,65.250000000000114],[-86.170546999999942,65.269150000000081],[-86.171660999999915,65.278869999999984],[-86.153335999999911,65.384720000000073],[-86.149733999999967,65.394714000000079],[-86.111937999999952,65.494141000000013],[-86.097777999999948,65.529160000000104],[-86.013900999999976,65.709152000000074],[-86.010009999999909,65.714996000000099],[-85.993880999999988,65.730545000000006],[-85.982773000000009,65.740814000000057],[-85.975280999999882,65.746094000000085],[-85.888335999999981,65.799987999999928],[-85.832503999999915,65.832489000000066],[-85.791381999999999,65.853317000000118],[-85.770554000000004,65.862198000000035],[-85.728333000000021,65.879425000000083],[-85.696654999999907,65.891937000000041],[-85.621108999999933,65.917480000000012],[-85.56527699999998,65.930267000000015],[-85.542496000000028,65.933319000000097],[-85.506667999999991,65.934418000000051],[-85.493880999999988,65.932205000000124],[-85.491013000000009,65.931060999999943],[-85.482773000000009,65.927765000000079],[-85.476944000000003,65.923309000000017],[-85.468886999999938,65.913879000000122],[-85.469726999999978,65.908874999999966],[-85.473891999999978,65.898880000000077],[-85.488892000000021,65.878586000000098],[-85.511123999999995,65.857758000000047],[-85.520554000000004,65.84275800000006],[-85.523620999999991,65.823043999999982],[-85.520554000000004,65.813309000000061],[-85.516662999999994,65.808594000000028],[-85.510559000000001,65.804152999999928],[-85.493331999999953,65.795258000000103],[-85.480559999999969,65.791930999999977]],[[-62.136664999999937,65.851379000000009],[-62.141669999999976,65.849716000000058],[-62.154442000000017,65.850815000000068],[-62.162216000000001,65.854156000000103],[-62.210830999999985,65.880539000000056],[-62.296950999999979,65.927765000000079],[-62.296669000000009,65.938583000000051],[-62.281386999999995,65.946365000000014],[-62.265006999999969,65.946930000000066],[-62.230552999999986,65.943862999999965],[-62.167220999999984,65.932754999999986],[-62.137779000000023,65.925811999999951],[-62.139724999999999,65.913040000000137],[-62.118606999999997,65.881087999999977],[-62.129996999999889,65.859146000000123],[-62.136664999999937,65.851379000000009]],[[-67.138335999999981,65.92692599999998],[-67.145844000000011,65.926376000000118],[-67.154448999999943,65.92886400000009],[-67.161117999999988,65.932205000000124],[-67.185271999999941,65.948317999999972],[-67.209166999999923,65.978867000000037],[-67.211945000000014,65.982758000000103],[-67.208892999999989,65.984421000000054],[-67.199158000000011,65.986373999999955],[-67.181380999999874,65.987198000000092],[-67.166945999999939,65.984984999999995],[-67.153885000000002,65.978591999999992],[-67.152785999999992,65.974990999999989],[-67.152602999999885,65.970733999999993],[-67.134445000000028,65.933044000000052],[-67.134734999999921,65.930267000000015],[-67.138335999999981,65.92692599999998]],[[-83.576950000000011,65.983047000000056],[-83.588607999999965,65.981658999999922],[-83.60082999999986,65.983322000000044],[-83.604445999999996,65.987762000000089],[-83.60082999999986,65.993042000000116],[-83.588897999999972,66.003052000000025],[-83.570007000000032,66.013611000000083],[-83.547500999999954,66.019440000000088],[-83.511397999999986,66.019989000000066],[-83.498885999999914,66.01748699999996],[-83.493056999999965,66.012771999999927],[-83.50140399999998,66.00749200000007],[-83.510009999999966,66.003325999999959],[-83.554442999999935,65.988876000000062],[-83.576950000000011,65.983047000000056]],[[-84.722777999999948,65.546097000000088],[-84.733886999999982,65.544708000000128],[-84.746108999999933,65.545822000000101],[-84.78472899999997,65.556640999999956],[-84.803604000000007,65.565536000000009],[-84.828612999999962,65.578873000000044],[-84.840835999999967,65.588043000000084],[-84.848052999999879,65.597487999999998],[-84.853333000000021,65.606934000000138],[-84.852218999999934,65.611923000000104],[-84.857772999999952,65.645827999999995],[-84.858886999999925,65.650818000000072],[-84.866393999999957,65.659988000000112],[-84.878601000000003,65.669144000000074],[-84.900283999999942,65.67804000000001],[-85.028609999999958,65.711655000000064],[-85.063048999999921,65.723312000000021],[-85.073897999999986,65.727768000000083],[-85.082229999999981,65.732208000000128],[-85.106948999999929,65.750548999999921],[-85.118057000000022,65.764709000000039],[-85.181945999999982,65.945526000000086],[-85.173049999999932,65.994705000000067],[-85.143889999999942,66.021103000000039],[-85.137222000000008,66.023315000000082],[-85.081679999999949,66.026657],[-85.057495000000017,66.02609300000006],[-84.9375,66.010543999999982],[-84.924712999999997,66.008040999999992],[-84.910277999999892,66.000000000000114],[-84.887221999999952,65.945526000000086],[-84.883330999999885,65.940811000000053],[-84.807770000000005,65.895828000000108],[-84.755004999999869,65.853317000000118],[-84.716110000000015,65.817215000000147],[-84.714171999999962,65.807205000000067],[-84.712783999999942,65.802200000000028],[-84.707779000000016,65.792755000000113],[-84.637222000000008,65.712203999999986],[-84.597503999999958,65.696640000000116],[-84.586670000000026,65.692200000000071],[-84.574172999999917,65.639160000000004],[-84.576110999999969,65.629150000000095],[-84.585006999999962,65.61914100000007],[-84.598617999999931,65.608597000000032],[-84.667769999999962,65.560532000000023],[-84.722777999999948,65.546097000000088]],[[-83.608611999999994,66.044144000000074],[-83.642226999999991,66.034988000000112],[-83.652221999999995,66.036652000000117],[-83.653609999999901,66.04136699999998],[-83.647507000000019,66.046646000000123],[-83.644164999999987,66.051650999999993],[-83.626099000000011,66.066940000000102],[-83.618056999999965,66.072220000000129],[-83.607223999999974,66.07748400000014],[-83.597778000000005,66.078873000000101],[-83.583618000000001,66.070540999999935],[-83.577788999999996,66.06581100000011],[-83.570847000000015,66.056366000000025],[-83.574447999999961,66.051376000000005],[-83.58555599999994,66.048035000000141],[-83.59722899999997,66.046646000000123],[-83.608611999999994,66.044144000000074]],[[-85.019164999999987,66.05720500000001],[-85.135558999999944,66.044434000000081],[-85.147781000000009,66.045821999999987],[-85.149170000000026,66.05053700000002],[-85.107773000000009,66.084427000000119],[-85.09973100000002,66.089706000000092],[-85.063323999999966,66.087769000000037],[-85.038604999999961,66.086105000000032],[-85.016112999999905,66.079712000000086],[-85.008620999999948,66.070540999999935],[-85.006957999999941,66.065536000000066],[-85.010283999999956,66.060531999999967],[-85.019164999999987,66.05720500000001]],[[-83.649444999999901,66.083602999999982],[-83.661117999999988,66.081940000000031],[-83.673614999999984,66.083327999999938],[-83.692490000000021,66.091370000000097],[-83.696105999999986,66.096099999999979],[-83.689986999999974,66.111099000000024],[-83.685271999999941,66.121093999999914],[-83.678878999999995,66.125259000000142],[-83.606658999999979,66.124146000000053],[-83.593886999999938,66.121643000000063],[-83.587783999999999,66.117203000000075],[-83.591674999999896,66.112197999999978],[-83.604445999999996,66.105820000000051],[-83.610549999999932,66.10165399999994],[-83.638061999999991,66.086928999999998],[-83.649444999999901,66.083602999999982]],[[-83.921386999999982,66.009720000000016],[-83.730834999999956,65.947754000000032],[-83.705840999999964,65.934143000000063],[-83.694152999999972,65.924697999999978],[-83.683318999999983,65.910538000000088],[-83.680832000000009,65.901093000000003],[-83.689163000000008,65.866653000000042],[-83.699721999999952,65.851379000000009],[-83.713897999999972,65.841094999999939],[-83.724715999999944,65.836929000000055],[-83.73582499999992,65.833603000000039],[-83.727492999999924,65.799713000000111],[-83.525008999999955,65.737761999999918],[-83.360001000000011,65.727478000000076],[-83.348052999999993,65.726928999999984],[-83.25111400000003,65.716934000000037],[-83.226944000000003,65.714157000000114],[-83.214447000000007,65.710541000000092],[-83.210830999999871,65.705826000000059],[-83.25111400000003,65.654709000000139],[-83.259445000000028,65.649429000000055],[-83.288894999999968,65.632750999999985],[-83.299727999999959,65.629424999999969],[-83.311110999999983,65.627196999999967],[-83.345000999999968,65.62081900000004],[-83.379165999999998,65.615540000000067],[-83.391387999999949,65.617203000000131],[-83.399170000000026,65.62081900000004],[-83.406113000000005,65.630264000000068],[-83.41194200000001,65.634720000000016],[-83.419998000000021,65.639435000000049],[-83.430557000000022,65.643875000000037],[-83.443328999999949,65.648041000000148],[-83.468612999999948,65.654984000000127],[-83.493056999999965,65.65776100000005],[-83.505004999999926,65.658324999999991],[-83.528610000000015,65.658324999999991],[-83.598891999999978,65.656372000000033],[-83.660277999999948,65.647217000000012],[-83.829726999999991,65.64498900000001],[-83.842772999999909,65.649155000000121],[-83.846114999999941,65.653869999999984],[-83.84973100000002,65.668320000000108],[-83.846389999999985,65.673309000000074],[-83.840560999999866,65.678589000000102],[-83.794158999999979,65.719437000000028],[-83.785827999999981,65.724700999999982],[-83.775009000000011,65.728043000000127],[-83.740828999999962,65.733322000000101],[-83.695266999999944,65.741089000000045],[-83.684158000000025,65.74443100000002],[-83.682769999999948,65.749419999999986],[-83.688888999999961,65.754166000000055],[-83.785278000000005,65.788879000000065],[-83.797501000000011,65.789429000000098],[-83.808883999999978,65.78804000000008],[-83.84973100000002,65.780548000000124],[-83.90583799999996,65.767487000000017],[-83.927490000000034,65.759720000000073],[-83.938048999999978,65.74443100000002],[-83.948607999999922,65.740265000000079],[-83.960007000000019,65.737761999999918],[-83.971664000000033,65.737198000000149],[-83.983886999999925,65.738586000000055],[-84.071121000000005,65.75],[-84.120543999999938,65.758331000000055],[-84.133330999999941,65.760817999999972],[-84.143615999999952,65.764160000000061],[-84.145003999999972,65.769149999999968],[-84.141388000000006,65.774155000000007],[-84.11721799999998,65.789703000000031],[-84.111388999999974,65.794983000000059],[-84.103333000000021,65.809981999999934],[-84.101105000000018,65.819717000000026],[-84.123610999999926,65.900269000000037],[-84.189437999999996,65.968322999999998],[-84.198043999999925,65.973038000000031],[-84.208617999999888,65.977203000000031],[-84.286391999999978,65.999145999999996],[-84.299438000000009,66.002487000000031],[-84.31138599999997,66.003052000000025],[-84.323333999999988,66.002487000000031],[-84.358046999999999,65.997756999999979],[-84.369995000000017,65.997208000000057],[-84.382766999999944,66.000549000000092],[-84.424163999999962,66.028046000000018],[-84.436110999999926,66.037201000000096],[-84.464447000000007,66.060257000000092],[-84.468062999999972,66.064986999999974],[-84.469161999999983,66.069992000000013],[-84.470001000000025,66.089431999999988],[-84.471114999999998,66.128311000000053],[-84.470275999999956,66.133331000000112],[-84.464447000000007,66.138321000000133],[-84.455841000000021,66.141663000000051],[-84.433060000000012,66.138885000000073],[-84.381103999999993,66.129149999999981],[-84.368056999999908,66.125808999999947],[-84.240279999999927,66.098328000000095],[-84.146392999999875,66.081099999999992],[-84.039443999999946,66.076934999999992],[-84.00167799999997,66.033600000000035],[-83.921386999999982,66.009720000000016]],[[-84.579726999999991,66.141373000000044],[-84.627486999999917,66.139160000000118],[-84.639998999999989,66.140549000000078],[-84.648346000000004,66.144989000000123],[-84.654449,66.149429000000112],[-84.675827000000027,66.173035000000027],[-84.678604000000007,66.182480000000055],[-84.667220999999927,66.184981999999991],[-84.618880999999988,66.176651000000049],[-84.59333799999996,66.171097000000088],[-84.589447000000007,66.166382000000056],[-84.574448000000018,66.147491000000002],[-84.579726999999991,66.141373000000044]],[[-84.265288999999996,66.177765000000022],[-84.276947000000007,66.175262000000089],[-84.289169000000015,66.175537000000077],[-84.301391999999964,66.176926000000094],[-84.313889000000017,66.179428000000144],[-84.353333000000021,66.190262000000018],[-84.361937999999952,66.194702000000063],[-84.364440999999943,66.204436999999928],[-84.363616999999977,66.209427000000005],[-84.360001000000011,66.214432000000045],[-84.348343,66.215820000000122],[-84.335830999999985,66.214432000000045],[-84.30972300000002,66.207764000000054],[-84.299164000000019,66.203322999999955],[-84.27305599999994,66.196640000000002],[-84.264450000000011,66.192199999999957],[-84.258347000000015,66.187759000000085],[-84.256957999999997,66.1827550000001],[-84.265288999999996,66.177765000000022]],[[-62.183883999999864,66.237198000000092],[-62.199164999999994,66.216933999999924],[-62.404998999999862,66.218597000000045],[-62.415276000000006,66.219147000000078],[-62.421668999999952,66.222214000000008],[-62.42999999999995,66.229156000000103],[-62.426665999999898,66.233046999999999],[-62.419167000000016,66.237762000000032],[-62.319450000000018,66.269440000000031],[-62.301940999999999,66.274994000000049],[-62.287223999999924,66.278046000000131],[-62.278336000000024,66.279709000000082],[-62.261672999999973,66.280273000000022],[-62.24888599999997,66.278595000000109],[-62.243057000000022,66.276931999999988],[-62.231383999999935,66.269440000000031],[-62.183883999999864,66.237198000000092]],[[-83.067229999999881,66.255554000000075],[-83.054992999999911,66.254990000000134],[-83.043059999999969,66.255264000000068],[-83.031113000000005,66.256653000000028],[-83.019454999999994,66.259155000000135],[-82.996947999999975,66.265823000000069],[-82.960830999999985,66.272491000000059],[-82.937209999999936,66.275269000000037],[-82.91332999999986,66.276093000000003],[-82.902495999999985,66.271652000000131],[-82.904175000000009,66.266662999999937],[-82.910278000000005,66.261658000000068],[-82.918610000000001,66.257492000000013],[-82.92971799999998,66.25221300000004],[-82.935546999999929,66.251389000000074],[-82.990279999999984,66.203598],[-82.996384000000035,66.19859300000013],[-83.00778200000002,66.195250999999985],[-83.019729999999981,66.194977000000051],[-83.080291999999986,66.196640000000002],[-83.093062999999972,66.198868000000118],[-83.263335999999981,66.247208000000001],[-83.287216000000001,66.256104000000107],[-83.293335000000013,66.260544000000095],[-83.296660999999972,66.265273999999977],[-83.297775000000001,66.270263999999997],[-83.298339999999882,66.313873000000115],[-83.285004000000015,66.329163000000108],[-83.273055999999997,66.339432000000102],[-83.264175000000023,66.343597000000102],[-83.252228000000002,66.344986000000119],[-83.226944000000003,66.33998100000008],[-83.216110000000015,66.335541000000035],[-83.204726999999934,66.316666000000112],[-83.173889000000031,66.288589000000115],[-83.168059999999912,66.283874999999966],[-83.067229999999881,66.255554000000075]],[[-66.62332200000003,66.280823000000055],[-66.641952999999944,66.279434000000037],[-66.656951999999933,66.280273000000022],[-66.667495999999971,66.282760999999994],[-66.678878999999995,66.286925999999994],[-66.701400999999976,66.297760000000039],[-66.741942999999878,66.316376000000105],[-66.843063000000029,66.362487999999985],[-66.905837999999903,66.376648000000046],[-66.916107000000011,66.379974000000118],[-66.944716999999969,66.394989000000066],[-66.956115999999952,66.401932000000045],[-66.958617999999944,66.40637200000009],[-66.958344000000011,66.411926000000051],[-66.955276000000026,66.413605000000075],[-66.944442999999922,66.413879000000009],[-66.851943999999946,66.402205999999978],[-66.829726999999991,66.398330999999985],[-66.823059000000001,66.392761000000121],[-66.820846999999958,66.388046000000088],[-66.801101999999958,66.375534000000073],[-66.782227000000034,66.369141000000127],[-66.726944000000003,66.354980000000126],[-66.705565999999976,66.349715999999944],[-66.678329000000019,66.345535000000041],[-66.662216000000001,66.343597000000102],[-66.650283999999942,66.34304800000001],[-66.639724999999999,66.340546000000074],[-66.62388599999997,66.335266000000047],[-66.584441999999967,66.320541000000105],[-66.575012000000015,66.313873000000115],[-66.573623999999995,66.310806000000014],[-66.591675000000009,66.293593999999985],[-66.605269999999962,66.286652000000061],[-66.62332200000003,66.280823000000055]],[[-66.998336999999935,66.493042000000003],[-66.990279999999984,66.489150999999936],[-66.976104999999961,66.489150999999936],[-66.963332999999977,66.487198000000035],[-66.873321999999973,66.468596999999988],[-66.868880999999988,66.464431999999988],[-66.871384000000035,66.460541000000092],[-66.878052000000025,66.458327999999995],[-66.936110999999926,66.445525999999973],[-66.948883000000023,66.444702000000007],[-66.987212999999997,66.445250999999928],[-67.030288999999925,66.45248400000014],[-67.036666999999966,66.456099999999992],[-67.038329999999974,66.472488000000055],[-67.038054999999986,66.478043000000127],[-67.035278000000005,66.484711000000118],[-67.025008999999955,66.489975000000129],[-67.006957999999884,66.493042000000003],[-66.998336999999935,66.493042000000003]],[[-107.92304999999993,66.850540000000024],[-107.93499799999989,66.849152000000117],[-107.94611399999991,66.851089000000115],[-107.94554099999993,66.856934000000024],[-107.837784,67.003875999999991],[-107.83029199999993,67.008606000000043],[-107.81696299999993,67.009155000000135],[-107.80666400000001,67.005829000000119],[-107.79499800000002,66.997208000000001],[-107.79110699999995,66.988312000000064],[-107.78971899999999,66.985259999999982],[-107.79055800000003,66.979705999999965],[-107.82389799999999,66.901093000000003],[-107.83000199999992,66.895538000000101],[-107.89499699999999,66.860809000000017],[-107.90360999999996,66.856934000000024],[-107.92304999999993,66.850540000000024]],[[-108.01445000000001,66.897766000000047],[-108.025284,66.895538000000101],[-108.03859699999998,66.897217000000126],[-108.04444899999993,66.901382000000126],[-108.09638999999993,66.967484000000013],[-108.09777800000001,66.972762999999986],[-108.10659799999996,67.026001000000065],[-108.06360599999988,67.001099000000067],[-107.93831599999999,66.946930000000066],[-107.95944199999991,66.931655999999975],[-107.96665999999993,66.926651000000106],[-108.00583599999987,66.901931999999931],[-108.01445000000001,66.897766000000047]],[[-63.059166000000005,66.957764000000111],[-63.083327999999995,66.954987000000017],[-63.095550999999944,66.955826000000002],[-63.116942999999992,66.963043000000084],[-63.136391000000003,66.974701000000096],[-63.163054999999929,66.995255000000043],[-63.165549999999996,66.999145999999939],[-63.166106999999954,67.004990000000134],[-63.159163999999976,67.015549000000021],[-63.154166999999973,67.021378000000027],[-63.144446999999957,67.028869999999984],[-63.127494999999954,67.033599999999979],[-63.123055000000022,67.034713999999951],[-63.110831999999903,67.033875000000023],[-63.101668999999902,67.029709000000082],[-63.098052999999936,67.027205999999978],[-63.097778000000005,67.023315000000082],[-63.021111000000019,66.996643000000006],[-63.011672999999973,66.992477000000065],[-63.003890999999953,66.988585999999998],[-62.999999999999886,66.984420999999998],[-62.999442999999985,66.978591999999992],[-63.002228000000002,66.97554000000008],[-63.020835999999974,66.966385000000002],[-63.040000999999961,66.960815000000139],[-63.059166000000005,66.957764000000111]],[[-62.918334999999956,67.009720000000016],[-62.938048999999978,67.005829000000119],[-62.977775999999949,67.006653000000085],[-63.009726999999998,67.009995000000004],[-63.037780999999939,67.015823000000125],[-63.068335999999988,67.025543000000027],[-63.092772999999966,67.035812000000078],[-63.12388599999997,67.049149000000114],[-63.135559000000001,67.054703000000075],[-63.138892999999996,67.059418000000107],[-63.138054000000011,67.065262000000132],[-63.135833999999988,67.069716999999969],[-63.130279999999914,67.074158000000068],[-63.11721799999998,67.078873000000101],[-63.110557999999969,67.080276000000026],[-63.100081999999929,67.079712000000086],[-63.002228000000002,67.069443000000035],[-62.978333000000021,67.062759000000142],[-62.961112999999955,67.054703000000075],[-62.941108999999926,67.043593999999985],[-62.922500999999954,67.031097000000045],[-62.914444000000003,67.023041000000148],[-62.912215999999944,67.014708999999982],[-62.918334999999956,67.009720000000016]],[[-62.64416499999993,67.057479999999998],[-62.646949999999947,67.049988000000042],[-62.65166499999998,67.04693600000013],[-62.752501999999993,67.010543999999982],[-62.764449999999954,67.009155000000135],[-62.782775999999956,67.009430000000009],[-62.813056999999958,67.016937000000098],[-62.832222000000002,67.024429000000055],[-62.899445000000014,67.058318999999983],[-62.894599999999969,67.059113000000082],[-62.865004999999996,67.057479999999998],[-62.82028200000002,67.055817000000047],[-62.810279999999977,67.05693100000002],[-62.806664000000012,67.05914300000012],[-62.702869000000021,67.128685000000075],[-62.652221999999995,67.166091999999992],[-62.641945000000021,67.174149],[-62.631942999999865,67.176926000000037],[-62.547782999999924,67.186096000000134],[-62.533889999999985,67.187195000000088],[-62.425277999999992,67.191085999999984],[-62.418059999999969,67.19081099999994],[-62.37888299999986,67.169708000000071],[-62.375274999999931,67.165817000000004],[-62.376105999999936,67.164429000000098],[-62.388054000000011,67.157486000000063],[-62.443610999999919,67.135817999999972],[-62.451942000000031,67.132751000000042],[-62.472495999999978,67.126083000000051],[-62.504172999999923,67.119430999999963],[-62.538612000000001,67.113876000000062],[-62.569449999999961,67.105819999999994],[-62.580001999999979,67.102203000000088],[-62.596106999999961,67.092209000000025],[-62.631667999999934,67.069991999999957],[-62.638610999999912,67.063873000000115],[-62.64416499999993,67.057479999999998]],[[-107.40778399999999,67.083054000000004],[-107.49054699999999,67.071380999999974],[-107.50639299999995,67.072495000000117],[-107.51750199999987,67.074706999999989],[-107.52778599999999,67.078048999999965],[-107.54972800000002,67.08998100000008],[-107.56500199999999,67.103317000000061],[-107.57444799999996,67.112198000000149],[-107.58389299999988,67.121368000000018],[-107.59110999999996,67.130813999999987],[-107.62917299999992,67.18331900000004],[-107.63054699999992,67.188582999999994],[-107.62970699999988,67.194138000000066],[-107.62666300000001,67.200272000000098],[-107.62053700000001,67.206100000000049],[-107.60833700000001,67.20748900000001],[-107.59777799999995,67.204162999999994],[-107.58168000000001,67.196365000000128],[-107.57584400000002,67.192200000000128],[-107.56194299999987,67.183868000000132],[-107.51000999999991,67.15637200000009],[-107.47778299999993,67.140823000000012],[-107.46193700000003,67.133331000000055],[-107.44360399999999,67.126083000000051],[-107.412781,67.115814000000057],[-107.40055799999993,67.113037000000134],[-107.40778399999999,67.083054000000004]],[[-95.361663999999962,67.197754000000145],[-95.373610999999926,67.196365000000128],[-95.400557999999933,67.197204999999997],[-95.415282999999988,67.199707000000103],[-95.430831999999896,67.202773999999977],[-95.527495999999928,67.223037999999974],[-95.543334999999956,67.226379000000009],[-95.551392000000021,67.230270000000075],[-95.552779999999927,67.235260000000096],[-95.542220999999984,67.238585999999941],[-95.391112999999962,67.263046000000145],[-95.377776999999924,67.262772000000041],[-95.317229999999995,67.255554000000018],[-95.307220000000029,67.252486999999917],[-95.305832000000009,67.247757000000092],[-95.309432999999956,67.242203000000075],[-95.314712999999927,67.238585999999941],[-95.336669999999913,67.212769000000094],[-95.342772999999966,67.206940000000088],[-95.361663999999962,67.197754000000145]],[[-107.66278099999994,67.22026100000005],[-107.675003,67.218872000000033],[-107.73029300000002,67.289978000000076],[-107.73306300000002,67.300261999999918],[-107.73029300000002,67.306366000000139],[-107.72501399999993,67.31303400000013],[-107.71083099999998,67.319153000000142],[-107.67777999999993,67.311919999999986],[-107.66944899999993,67.30802900000009],[-107.66000399999996,67.298874000000012],[-107.64472999999998,67.269150000000025],[-107.64028899999994,67.253601000000117],[-107.63945000000001,67.242752000000053],[-107.64250199999992,67.236649000000114],[-107.64778100000001,67.229980000000012],[-107.65416699999997,67.224426000000051],[-107.66278099999994,67.22026100000005]],[[-63.366393999999957,67.287766000000033],[-63.396111000000019,67.269988999999953],[-63.417777999999998,67.26638800000012],[-63.456107999999972,67.264434999999992],[-63.507506999999976,67.269440000000031],[-63.541945999999939,67.272491000000059],[-63.55972300000002,67.273041000000092],[-63.578339000000028,67.273315000000025],[-63.62027699999993,67.269150000000025],[-63.763618000000008,67.272491000000059],[-63.81361400000003,67.279160000000104],[-63.829726999999878,67.28414900000007],[-63.819449999999961,67.289978000000076],[-63.796668999999952,67.299987999999985],[-63.688331999999889,67.341660000000047],[-63.666663999999969,67.345535000000041],[-63.646110999999962,67.348038000000031],[-63.605559999999969,67.352203000000031],[-63.585830999999871,67.353317000000004],[-63.485001000000011,67.341094999999996],[-63.369164000000012,67.302475000000072],[-63.357779999999991,67.293868999999972],[-63.366393999999957,67.287766000000033]],[[-107.91082799999998,67.310532000000023],[-107.93443300000001,67.306640999999956],[-107.94803599999995,67.308319000000097],[-108.08444199999997,67.381363000000079],[-108.076683,67.424698000000035],[-108.07389799999993,67.430817000000104],[-108.06861899999996,67.437485000000038],[-108.06111099999993,67.442200000000071],[-107.94748700000002,67.479980000000012],[-107.91776999999996,67.48942599999998],[-107.90306099999992,67.489151000000106],[-107.89472999999992,67.485535000000084],[-107.88722200000001,67.476089000000115],[-107.88276699999989,67.462494000000049],[-107.89806399999998,67.319717000000082],[-107.90110799999997,67.313598999999954],[-107.91082799999998,67.310532000000023]],[[-108.36833200000001,67.467209000000082],[-108.38194299999998,67.466660000000104],[-108.39806399999998,67.467758000000003],[-108.43388399999998,67.47665400000011],[-108.44444299999992,67.479980000000012],[-108.45278899999994,67.483871000000079],[-108.45889299999988,67.488037000000134],[-108.49249299999997,67.519714000000079],[-108.49638400000003,67.524429000000112],[-108.49582700000002,67.529984000000013],[-108.49137899999999,67.563034000000073],[-108.48137700000001,67.566375999999991],[-108.45777899999996,67.568054000000132],[-108.33583099999993,67.565810999999997],[-108.29750100000001,67.557205000000067],[-108.28582799999998,67.54304500000012],[-108.28443899999996,67.537766000000147],[-108.29527299999995,67.49693300000007],[-108.30166600000001,67.491089000000045],[-108.35722399999986,67.469437000000028],[-108.36833200000001,67.467209000000082]],[[-108.14111300000002,67.449997000000053],[-108.16944899999993,67.449707000000046],[-108.23665599999993,67.456650000000025],[-108.25167799999997,67.458878000000141],[-108.26222200000001,67.462204000000042],[-108.26806599999992,67.466660000000104],[-108.27194199999991,67.471374999999966],[-108.275284,67.481658999999979],[-108.22556299999997,67.565536000000122],[-108.21916199999987,67.571106000000043],[-108.20638999999994,67.570540999999992],[-108.19833399999999,67.566665999999998],[-108.17360699999995,67.552475000000015],[-108.1661069999999,67.54304500000012],[-108.13137799999993,67.481934000000024],[-108.12970699999994,67.47665400000011],[-108.12888299999997,67.465820000000065],[-108.12943999999999,67.460266000000047],[-108.13249200000001,67.454163000000108],[-108.14111300000002,67.449997000000053]],[[-108.32277699999997,67.589980999999966],[-108.32362399999994,67.586655000000121],[-108.33944700000001,67.587769000000094],[-108.42027300000001,67.599426000000051],[-108.48222399999992,67.631363000000022],[-108.48388699999992,67.636658000000068],[-108.475281,67.640548999999965],[-108.46389799999992,67.643051000000071],[-108.44803599999995,67.641937000000041],[-108.41832699999992,67.63638300000008],[-108.40334299999995,67.634155000000135],[-108.390289,67.631088000000034],[-108.379707,67.627762000000132],[-108.37138400000003,67.62414600000011],[-108.33416699999992,67.604156000000103],[-108.32277699999997,67.589980999999966]],[[-63.881942999999978,67.503326000000015],[-63.935555000000022,67.501938000000109],[-63.979163999999912,67.503052000000082],[-63.99500299999994,67.504166000000055],[-64.005279999999914,67.505263999999954],[-64.025283999999942,67.510544000000039],[-64.029723999999874,67.513885000000073],[-64.031677000000002,67.518600000000106],[-64.034728999999913,67.52887000000004],[-64.038054999999872,67.542755000000113],[-64.034438999999907,67.558594000000028],[-63.981110000000001,67.644150000000025],[-63.976944000000003,67.649428999999998],[-63.969993999999986,67.653595000000109],[-63.962775999999963,67.65554800000001],[-63.952498999999989,67.654434000000037],[-63.945549000000028,67.651382000000126],[-63.93721800000003,67.645263999999997],[-63.926392000000021,67.633330999999941],[-63.922226000000023,67.624985000000038],[-63.915549999999996,67.617203000000131],[-63.904442000000017,67.60803199999998],[-63.875556999999958,67.593048000000067],[-63.853888999999924,67.585541000000148],[-63.815276999999924,67.566665999999998],[-63.787223999999981,67.550537000000077],[-63.769996999999989,67.537766000000147],[-63.763618000000008,67.529709000000025],[-63.758056999999951,67.520538000000045],[-63.760833999999988,67.51527400000009],[-63.769447000000014,67.513321000000133],[-63.818335999999988,67.5086060000001],[-63.842223999999931,67.506377999999984],[-63.881942999999978,67.503326000000015]],[[-108.05999799999995,67.475266000000033],[-108.08972199999994,67.465546000000131],[-108.10333300000002,67.467209000000082],[-108.109444,67.471374999999966],[-108.11332700000003,67.476089000000115],[-108.14389,67.530547999999953],[-108.14277600000003,67.541655999999989],[-108.13362099999989,67.628036000000066],[-108.13221699999997,67.639434999999992],[-108.11776699999996,67.669982999999945],[-108.11361699999998,67.675261999999975],[-108.10109699999992,67.676651000000106],[-108.087219,67.674988000000042],[-108.01418299999995,67.662491000000045],[-108.00361599999997,67.65914900000007],[-107.99553700000001,67.655258000000003],[-107.98944099999994,67.651093000000003],[-107.98332199999999,67.644714000000135],[-107.92832900000002,67.561645999999996],[-107.92304999999993,67.551651000000049],[-107.92138699999992,67.54664600000001],[-107.922234,67.540817000000004],[-107.92749000000003,67.534424000000058],[-108.05999799999995,67.475266000000033]],[[-97.502791999999943,67.624420000000043],[-97.515563999999927,67.623871000000065],[-97.530288999999982,67.624985000000038],[-97.541381999999999,67.628860000000032],[-97.549437999999952,67.638045999999974],[-97.551391999999964,67.642761000000007],[-97.553054999999915,67.647766000000104],[-97.560546999999929,67.692748999999992],[-97.40055799999999,67.731658999999922],[-97.387786999999889,67.732208000000071],[-97.360001000000011,67.731658999999922],[-97.346389999999928,67.728317000000004],[-97.337783999999999,67.724152000000004],[-97.337783999999999,67.721100000000092],[-97.33277899999996,67.70637499999998],[-97.327224999999999,67.681655999999975],[-97.33277899999996,67.675812000000008],[-97.341675000000009,67.670532000000094],[-97.370543999999882,67.657760999999994],[-97.433608999999933,67.637497000000053],[-97.478881999999942,67.627472000000125],[-97.502791999999943,67.624420000000043]],[[-109.11221299999994,67.763321000000076],[-109.12581599999987,67.76249700000011],[-109.14111299999996,67.764998999999989],[-109.195267,67.775543000000027],[-109.20612299999993,67.778869999999984],[-109.20777900000002,67.783875000000023],[-109.16944899999999,67.797759999999926],[-109.15943899999996,67.801085999999998],[-109.135559,67.802764999999965],[-109.0933379999999,67.803863999999976],[-109.07584400000002,67.802199999999971],[-109.06054699999999,67.799713000000054],[-109.03916899999996,67.793320000000108],[-109.04083299999996,67.788315000000068],[-109.05277999999993,67.782486000000063],[-109.08000199999987,67.771103000000039],[-109.08972199999994,67.768051000000128],[-109.11221299999994,67.763321000000076]],[[-96.170546999999999,67.773041000000148],[-96.182769999999948,67.77165199999996],[-96.192490000000021,67.773605000000089],[-96.196380999999917,67.778046000000018],[-96.185821999999973,67.794708000000014],[-96.179992999999968,67.800262000000032],[-96.171386999999925,67.806366000000025],[-96.098617999999988,67.832213999999965],[-96.077224999999942,67.838882000000126],[-96.065552000000025,67.841095000000109],[-96.053328999999962,67.842758000000003],[-96.040282999999931,67.843323000000055],[-96.02806099999998,67.841659999999933],[-95.997498000000007,67.820830999999998],[-95.996384000000035,67.81581100000011],[-96.004729999999995,67.809708000000001],[-96.016113000000018,67.807479999999998],[-96.040832999999964,67.804428000000087],[-96.170546999999999,67.773041000000148]],[[-114.11501299999998,67.883880999999974],[-114.08222999999998,67.883041000000105],[-114.02223200000003,67.884155000000078],[-114.00583599999999,67.8836060000001],[-113.95500199999998,67.881362999999965],[-113.92138699999998,67.878036000000009],[-113.925003,67.874694999999974],[-113.94138299999986,67.875259000000142],[-113.98638899999997,67.874419999999986],[-113.99999999999994,67.873306000000014],[-114.01027699999992,67.871368000000075],[-114.05166600000001,67.870254999999986],[-114.08306900000002,67.87052900000009],[-114.195267,67.872482000000048],[-114.22972099999987,67.874146000000053],[-114.25250199999999,67.879974000000004],[-114.29638699999998,67.892212000000029],[-114.29695100000004,67.895263999999941],[-114.27555799999999,67.900542999999914],[-114.25110599999994,67.904433999999981],[-114.21972700000003,67.904160000000047],[-114.20612299999993,67.901932000000102],[-114.17388899999997,67.892487000000074],[-114.14862099999999,67.887206999999989],[-114.13305700000001,67.885269000000051],[-114.11501299999998,67.883880999999974]],[[-97.856383999999935,67.850539999999967],[-97.866942999999992,67.846939000000134],[-97.924164000000019,67.849991000000045],[-97.954453000000001,67.856368999999972],[-97.963333000000034,67.860260000000039],[-97.970001000000025,67.86442599999998],[-97.974166999999909,67.869141000000013],[-97.973327999999924,67.874146000000053],[-97.976944000000003,67.884155000000078],[-97.97444200000001,67.904984000000013],[-97.961120999999991,67.90554800000001],[-97.933318999999983,67.89888000000002],[-97.920272999999952,67.893600000000106],[-97.91361999999998,67.889160000000118],[-97.895554000000004,67.881362999999965],[-97.86221299999994,67.859985000000052],[-97.858046999999942,67.855255],[-97.856383999999935,67.850539999999967]],[[-108.64695699999999,67.86943100000002],[-108.66082799999998,67.868865999999969],[-108.66915899999998,67.872482000000048],[-108.64666699999998,67.887206999999989],[-108.58500700000002,67.915543000000071],[-108.56610099999989,67.922759999999982],[-108.54472399999997,67.928314],[-108.531113,67.928864000000033],[-108.38027999999997,67.922484999999995],[-108.37082699999996,67.919708000000071],[-108.36444099999994,67.915543000000071],[-108.36110699999989,67.905257999999947],[-108.35944399999994,67.899993999999992],[-108.41221599999994,67.885817999999972],[-108.64695699999999,67.86943100000002]],[[-113.390289,67.897766000000047],[-113.46389799999997,67.895828000000108],[-113.52694699999995,67.896378000000141],[-113.55972300000002,67.897491000000002],[-113.59416199999993,67.899428999999941],[-113.60333299999991,67.903046000000074],[-113.59750399999996,67.906647000000135],[-113.58528100000001,67.908600000000092],[-113.41972399999997,67.925262000000089],[-113.39111300000002,67.926651000000049],[-113.34750400000001,67.928040000000067],[-113.27390299999996,67.929977000000122],[-113.25723299999993,67.929428000000144],[-113.25029000000001,67.925262000000089],[-113.24694799999997,67.914429000000098],[-113.25361599999997,67.909424000000058],[-113.27778599999999,67.905822999999998],[-113.297234,67.904433999999981],[-113.33444199999991,67.901092999999946],[-113.390289,67.897766000000047]],[[-112.93055700000002,67.916655999999989],[-112.98361199999999,67.915268000000083],[-112.99999999999989,67.916092000000049],[-113.06027199999994,67.915268000000083],[-113.13110399999999,67.911652000000004],[-113.14750700000002,67.912200999999982],[-113.14750700000002,67.915817000000004],[-113.13806199999999,67.919144000000131],[-112.94304699999998,67.931091000000094],[-112.89639299999999,67.93081699999999],[-112.88722199999995,67.927200000000028],[-112.890289,67.921921000000054],[-112.90110800000002,67.919144000000131],[-112.93055700000002,67.916655999999989]],[[-111.07167099999998,67.847488000000055],[-111.08666999999997,67.847488000000055],[-111.0911099999999,67.852203000000088],[-111.08693700000003,67.858871000000079],[-111.07028200000002,67.867203000000075],[-110.84889199999998,67.954711999999972],[-110.83917200000002,67.958037999999988],[-110.82668299999995,67.959717000000012],[-110.81388900000002,67.959152000000017],[-110.80722000000003,67.954987000000017],[-110.80943300000001,67.948867999999948],[-110.81696299999999,67.940262000000018],[-110.86221299999994,67.894989000000123],[-110.86945300000002,67.889984000000084],[-110.88027999999991,67.887496999999996],[-111.05943300000001,67.849152000000061],[-111.07167099999998,67.847488000000055]],[[-114.21916199999998,67.945250999999985],[-114.29583699999995,67.944702000000063],[-114.30999799999995,67.945816000000036],[-114.31722999999988,67.949707000000103],[-114.31082200000003,67.954711999999972],[-114.30027799999988,67.957489000000066],[-114.25446299999987,67.963318000000072],[-114.17138699999992,67.969147000000078],[-114.13999899999999,67.96887200000009],[-114.12416099999996,67.967209000000139],[-114.12110899999993,67.961929000000055],[-114.12332199999992,67.958037999999988],[-114.16332999999986,67.949142000000052],[-114.20388800000001,67.945816000000036],[-114.21916199999998,67.945250999999985]],[[-108.13806199999999,67.872482000000048],[-108.15167199999996,67.871918000000107],[-108.24553699999996,67.878036000000009],[-108.25418100000002,67.881927000000076],[-108.25556899999992,67.887206999999989],[-108.23916599999995,67.920258000000103],[-108.236107,67.926376000000062],[-108.23111,67.933044000000052],[-108.22471599999994,67.938873000000058],[-108.198036,67.950821000000076],[-108.14723200000003,67.96665999999999],[-108.12581599999999,67.972214000000008],[-108.114441,67.974426000000051],[-108.10056299999997,67.974991000000102],[-108.08416699999998,67.97387700000013],[-108.07140399999992,67.971100000000035],[-108.06054699999999,67.967758000000117],[-108.05444299999988,67.963318000000072],[-108.05055199999998,67.958603000000039],[-108.048607,67.949142000000052],[-108.05139200000002,67.926651000000049],[-108.06331599999993,67.902206000000035],[-108.06833599999999,67.895538000000045],[-108.07501200000002,67.889709000000039],[-108.08249699999999,67.884995000000117],[-108.09137699999985,67.880814000000044],[-108.11277799999999,67.87553400000013],[-108.13806199999999,67.872482000000048]],[[-113.72000099999997,67.973312000000078],[-113.72778299999993,67.969147000000078],[-113.73998999999998,67.967209000000139],[-113.75361599999997,67.966094999999996],[-113.79750099999995,67.964705999999978],[-113.99305699999996,67.961104999999918],[-113.99109599999997,67.964995999999985],[-113.98249800000002,67.967209000000139],[-113.97250400000001,67.968597000000045],[-113.91639700000002,67.972214000000008],[-113.88639799999999,67.972762999999986],[-113.83833299999998,67.971924000000001],[-113.81111099999993,67.97387700000013],[-113.78527800000001,67.976929000000041],[-113.77223199999997,67.980270000000075],[-113.74082899999996,67.979980000000069],[-113.72501399999999,67.978043000000014],[-113.72000099999997,67.973312000000078]],[[-109.195267,67.989974999999959],[-109.04998799999993,67.958328000000051],[-109.03028899999993,67.966933999999924],[-108.99082900000002,67.976379000000009],[-108.97693599999997,67.976929000000041],[-108.95111099999991,67.973312000000078],[-108.89723199999997,67.956940000000088],[-108.88445300000001,67.94859300000013],[-108.86554699999999,67.905822999999998],[-108.86609599999991,67.90026899999998],[-108.87943999999999,67.875259000000142],[-108.88806199999999,67.871093999999971],[-108.90055799999999,67.869705000000124],[-108.916946,67.87052900000009],[-109.04888900000003,67.90387000000004],[-109.10305799999998,67.920258000000103],[-109.135559,67.930267000000129],[-109.16972399999992,67.945250999999985],[-109.18888899999996,67.957764000000054],[-109.195267,67.962204000000099],[-109.19888299999997,67.972488000000112],[-109.198036,67.983871000000136],[-109.195267,67.989974999999959]],[[-110.33444199999997,68.011658000000125],[-110.39362299999993,68.011108000000092],[-110.41000400000001,68.011932000000058],[-110.42111199999994,68.014998999999932],[-110.42083700000001,68.020827999999995],[-110.41055299999999,68.024704000000042],[-110.32640099999992,68.047760000000096],[-110.317497,68.049712999999997],[-110.31082199999992,68.045532000000094],[-110.30888400000003,68.037491000000045],[-110.316101,68.019150000000025],[-110.32333399999999,68.014160000000004],[-110.33444199999997,68.011658000000125]],[[-98.951401000000033,67.979980000000069],[-98.963622999999927,67.978317000000118],[-98.979445999999939,67.980270000000075],[-99.005004999999983,67.987198000000092],[-99.014450000000011,67.991088999999988],[-99.028335999999911,67.999420000000043],[-99.078612999999905,68.045592999999997],[-99.051392000000021,68.055817000000047],[-98.990554999999858,68.078323000000069],[-98.975554999999986,68.077209000000039],[-98.968886999999995,68.073044000000039],[-98.964721999999995,68.064987000000087],[-98.934432999999956,67.99664300000012],[-98.934998000000007,67.991363999999976],[-98.942763999999954,67.985259999999926],[-98.951401000000033,67.979980000000069]],[[-65.397232000000031,68.039978000000133],[-65.409163999999976,68.039428999999984],[-65.500290000000007,68.046097000000145],[-65.510833999999988,68.04942299999999],[-65.516662999999994,68.05442800000003],[-65.519729999999981,68.067490000000078],[-65.518065999999976,68.072220000000073],[-65.505279999999971,68.076385000000073],[-65.43582200000003,68.088042999999971],[-65.394454999999994,68.08998100000008],[-65.386397999999929,68.088318000000129],[-65.390288999999996,68.078323000000069],[-65.383057000000008,68.053314000000057],[-65.383330999999941,68.048599000000024],[-65.387222000000008,68.043320000000051],[-65.397232000000031,68.039978000000133]],[[-108.50611900000001,68.034714000000122],[-108.51862299999993,68.033324999999934],[-108.53388999999999,68.035538000000088],[-108.54028299999993,68.039978000000133],[-108.53751399999999,68.046097000000145],[-108.45472699999999,68.090546000000074],[-108.44748700000002,68.087769000000037],[-108.44583099999994,68.082489000000123],[-108.44611399999991,68.074706999999989],[-108.45140100000003,68.068054000000018],[-108.46665999999999,68.058319000000097],[-108.49722299999996,68.038879000000122],[-108.50611900000001,68.034714000000122]],[[-109.32167099999998,67.981094000000041],[-109.33556399999992,67.980270000000075],[-109.35193600000002,67.981369000000086],[-109.37805199999991,67.986923000000047],[-109.432503,68.003052000000025],[-109.49804699999993,68.022766000000104],[-109.50666799999993,68.026382000000126],[-109.53888699999999,68.047485000000052],[-109.54305999999991,68.052200000000084],[-109.50473,68.088882000000069],[-109.49749799999989,68.093597000000102],[-109.484734,68.095260999999937],[-109.44722000000002,68.092209000000025],[-109.41055299999999,68.071930000000066],[-109.32167099999998,68.039978000000133],[-109.31527699999987,68.035812000000021],[-109.3116609999999,68.025543000000027],[-109.31111099999987,67.997756999999922],[-109.3116609999999,67.991928000000087],[-109.31416299999995,67.985809000000074],[-109.32167099999998,67.981094000000041]],[[-108.36054999999999,68.049712999999997],[-108.37444299999993,68.048874000000069],[-108.38751200000002,68.05192599999998],[-108.40638699999994,68.064697000000081],[-108.40805099999994,68.069716999999969],[-108.40167200000002,68.075546000000145],[-108.38221699999991,68.092758000000003],[-108.37444299999993,68.095535000000041],[-108.36193800000001,68.096939000000077],[-108.32000699999992,68.098877000000016],[-108.306107,68.099425999999937],[-108.29444899999999,68.097214000000065],[-108.297234,68.091095000000053],[-108.29778299999998,68.085541000000035],[-108.30082700000003,68.079437000000041],[-108.30860899999999,68.074706999999989],[-108.34916699999997,68.05192599999998],[-108.36054999999999,68.049712999999997]],[[-110.21362299999998,68.038039999999967],[-110.23998999999998,68.035812000000021],[-110.25639299999995,68.036652000000061],[-110.25862100000001,68.041931000000034],[-110.25,68.046097000000145],[-110.22165699999994,68.056641000000013],[-110.18195300000002,68.069716999999969],[-109.93276999999989,68.131927000000076],[-109.92166099999997,68.134155000000021],[-109.89639299999999,68.13749700000011],[-109.88583399999993,68.136383000000137],[-109.87721299999993,68.12692300000009],[-109.87748699999997,68.121368000000018],[-109.882767,68.114151000000106],[-109.88527699999997,68.108032000000037],[-109.88999899999993,68.101379000000065],[-109.89584399999995,68.095535000000041],[-109.90334300000001,68.090546000000074],[-109.92111199999994,68.081664999999987],[-109.93222000000003,68.079163000000108],[-110.08721899999995,68.053314000000057],[-110.21362299999998,68.038039999999967]],[[-112.78056299999997,68.131088000000091],[-112.79276999999996,68.129424999999969],[-112.88999899999999,68.137207000000103],[-112.9058379999999,68.139160000000061],[-112.91722099999998,68.142211999999972],[-112.922234,68.146652000000017],[-112.91832699999992,68.153594999999996],[-112.91306299999997,68.159424000000001],[-112.90638699999994,68.164429000000041],[-112.89835399999998,68.168869000000086],[-112.88861099999997,68.172211000000004],[-112.87638900000002,68.173874000000126],[-112.86110699999995,68.174149000000114],[-112.76722699999993,68.166656000000103],[-112.75167799999997,68.164703000000145],[-112.74973299999994,68.158034999999984],[-112.74472000000003,68.153594999999996],[-112.74638399999998,68.147490999999945],[-112.75334199999998,68.142211999999972],[-112.76139799999993,68.138046000000088],[-112.78056299999997,68.131088000000091]],[[-74.21556099999998,68.117751999999939],[-74.164718999999991,68.065536000000066],[-73.974716000000001,68.041092000000106],[-73.736388999999974,68.013611000000026],[-73.655471999999975,68.007705999999985],[-73.643340999999907,68.012207000000046],[-73.619995000000017,68.014998999999932],[-73.608886999999868,68.015548999999965],[-73.578063999999983,68.014434999999992],[-73.567504999999983,68.013046000000031],[-73.543883999999935,68.008330999999998],[-73.439986999999974,67.985535000000141],[-73.428329000000019,67.982208000000014],[-73.418883999999991,67.97886699999998],[-73.411666999999966,67.974991000000102],[-73.409728999999913,67.970534999999984],[-73.348617999999988,67.828048999999965],[-73.361664000000019,67.810257000000092],[-73.377776999999867,67.793869000000029],[-73.383330999999941,67.789429000000041],[-73.404175000000009,67.774994000000106],[-73.411391999999921,67.770537999999988],[-73.418609999999944,67.766388000000006],[-73.429442999999992,67.762771999999927],[-73.449431999999945,67.76249700000011],[-73.664168999999958,67.774704000000099],[-73.932219999999916,67.78637700000013],[-73.993057000000022,67.788040000000024],[-74.038329999999917,67.788589000000002],[-74.083892999999875,67.788315000000068],[-74.113327000000027,67.787201000000096],[-74.168059999999855,67.78276100000005],[-74.228881999999942,67.775268999999923],[-74.251952999999901,67.772491000000116],[-74.263061999999991,67.77165199999996],[-74.305832000000009,67.768600000000049],[-74.32028200000002,67.768875000000094],[-74.388610999999969,67.775268999999923],[-74.400833000000034,67.776657000000057],[-74.481109999999944,67.789429000000041],[-74.535278000000005,67.804703000000131],[-74.564162999999951,67.814423000000033],[-74.581680000000006,67.821381000000031],[-74.59722899999997,67.828598000000113],[-74.640838999999971,67.852203000000088],[-74.659728999999913,67.864700000000084],[-74.684433000000013,67.881927000000076],[-74.758895999999993,67.950271999999984],[-74.772232000000031,67.963318000000072],[-74.775557999999876,67.969147000000078],[-74.777221999999995,67.97387700000013],[-74.778060999999923,68.006104000000107],[-74.777495999999985,68.017761000000064],[-74.773055999999997,68.029984000000127],[-74.760009999999966,68.05442800000003],[-74.754181000000017,68.06053200000008],[-74.748610999999926,68.065536000000066],[-74.731948999999872,68.070831000000112],[-74.718613000000005,68.072220000000073],[-74.629990000000021,68.078598000000056],[-74.615279999999984,68.078323000000069],[-74.436661000000015,68.097487999999998],[-74.363892000000021,68.166381999999999],[-74.355834999999956,68.172759999999982],[-74.346953999999926,68.176376000000005],[-74.339447000000007,68.177199999999971],[-74.322509999999909,68.173035000000141],[-74.268889999999999,68.154984000000013],[-74.239440999999999,68.144989000000066],[-74.231673999999941,68.141936999999984],[-74.216399999999965,68.134155000000021],[-74.212509000000011,68.130538999999942],[-74.210830999999985,68.124984999999981],[-74.21556099999998,68.117751999999939]],[[-65.642226999999991,68.159424000000001],[-65.56639100000001,68.152205999999978],[-65.512787000000003,68.15277100000003],[-65.502791999999999,68.151093000000117],[-65.497771999999941,68.14776599999999],[-65.494445999999925,68.142487000000017],[-65.495543999999995,68.128310999999997],[-65.500838999999985,68.121918000000051],[-65.516953000000001,68.113037000000077],[-65.525283999999999,68.109711000000061],[-65.675551999999982,68.096100000000092],[-65.686935000000005,68.095825000000104],[-65.696105999999929,68.098877000000016],[-65.709731999999974,68.106094000000098],[-65.713897999999972,68.112762000000089],[-65.721938999999963,68.164429000000041],[-65.716949,68.175812000000064],[-65.711670000000026,68.180267000000072],[-65.701400999999976,68.181366000000082],[-65.67582699999997,68.179977000000065],[-65.656661999999926,68.175262000000032],[-65.648345999999947,68.168594000000041],[-65.646666999999923,68.163605000000075],[-65.642226999999991,68.159424000000001]],[[-107.47361799999993,68.144714000000079],[-107.48500100000001,68.142487000000017],[-107.50140399999998,68.143600000000049],[-107.55499299999991,68.160537999999974],[-107.55416899999994,68.166091999999992],[-107.54499800000002,68.169983000000059],[-107.5038909999999,68.182480000000055],[-107.49472000000003,68.18664600000011],[-107.48444399999994,68.189697000000137],[-107.46806300000003,68.188582999999994],[-107.46193700000003,68.184142999999949],[-107.46028100000001,68.179153000000099],[-107.45935800000001,68.175629000000015],[-107.45667299999997,68.174423000000047],[-107.45527600000003,68.169144000000074],[-107.45584099999996,68.163605000000075],[-107.46694899999994,68.15026899999998],[-107.47361799999993,68.144714000000079]],[[-104.453056,68.102203000000031],[-104.48277299999995,68.079712000000029],[-104.497772,68.080275999999969],[-104.50334199999992,68.084717000000069],[-104.55304699999999,68.140274000000034],[-104.55610699999994,68.145264000000111],[-104.55695299999996,68.15026899999998],[-104.55387899999999,68.161651999999947],[-104.54666099999997,68.164992999999981],[-104.42639200000002,68.199997000000053],[-104.41555799999998,68.202773999999977],[-104.391953,68.206940000000088],[-104.37721299999998,68.199707000000046],[-104.36860699999994,68.190536000000122],[-104.370003,68.184982000000105],[-104.37416100000002,68.178863999999976],[-104.40499899999992,68.139435000000049],[-104.453056,68.102203000000031]],[[-107.38890100000003,68.172211000000004],[-107.40278599999999,68.171645999999953],[-107.41111799999999,68.17553700000002],[-107.44167299999992,68.196929999999952],[-107.445267,68.201660000000004],[-107.43998699999997,68.208327999999995],[-107.42944299999999,68.211380000000077],[-107.41443599999997,68.211105000000089],[-107.30972300000002,68.209152000000131],[-107.295547,68.20748900000001],[-107.29167200000001,68.202773999999977],[-107.31054699999999,68.196091000000024],[-107.38890100000003,68.172211000000004]],[[-111.83332799999999,68.181931000000077],[-111.84722899999997,68.180817000000104],[-111.860817,68.183594000000028],[-111.86554699999999,68.188034000000016],[-111.83222999999998,68.204987000000131],[-111.81416300000001,68.212494000000049],[-111.79194599999994,68.21775800000006],[-111.77944899999994,68.219437000000028],[-111.764183,68.219437000000028],[-111.75499699999995,68.215820000000122],[-111.75945299999995,68.209152000000131],[-111.76666299999994,68.206375000000037],[-111.79194599999994,68.193588000000034],[-111.81111099999998,68.186920000000043],[-111.83332799999999,68.181931000000077]],[[-98.650283999999999,68.180267000000072],[-98.674438000000009,68.173874000000126],[-98.704453000000001,68.176085999999998],[-98.702788999999996,68.191650000000095],[-98.693328999999949,68.213608000000022],[-98.684433000000013,68.218872000000033],[-98.672226000000023,68.220534999999927],[-98.657226999999978,68.219437000000028],[-98.643065999999976,68.216095000000109],[-98.638610999999969,68.211655000000121],[-98.636672999999917,68.206650000000025],[-98.643065999999976,68.201660000000004],[-98.650283999999999,68.180267000000072]],[[-74.062774999999988,68.151657000000057],[-74.073623999999938,68.150818000000072],[-74.138335999999924,68.170258000000047],[-74.169723999999974,68.195525999999973],[-74.176392000000021,68.204162999999994],[-74.171386999999982,68.208602999999982],[-74.15583799999996,68.217484000000127],[-74.138061999999991,68.225815000000011],[-74.117217999999923,68.232207999999957],[-74.105835000000013,68.235260000000096],[-74.097228999999913,68.236649000000057],[-74.086944999999957,68.235260000000096],[-74.079726999999991,68.232483000000002],[-74.075286999999946,68.227767999999969],[-74.073059000000001,68.223877000000073],[-74.063323999999909,68.203049000000021],[-74.055557000000022,68.172485000000108],[-74.054442999999992,68.159988000000112],[-74.057219999999973,68.154984000000013],[-74.062774999999988,68.151657000000057]],[[-108.59028599999999,68.214431999999988],[-108.63944999999995,68.151382000000012],[-108.6499859999999,68.152481000000023],[-108.65862299999998,68.156097000000045],[-108.67748999999998,68.168869000000086],[-108.67360699999995,68.186371000000122],[-108.67194399999994,68.191085999999984],[-108.63500999999997,68.228592000000106],[-108.62748699999992,68.233597000000145],[-108.60555999999997,68.23692299999999],[-108.56610099999989,68.240540000000124],[-108.55972300000002,68.236099000000024],[-108.59028599999999,68.214431999999988]],[[-109.78388999999999,68.13749700000011],[-109.81166099999996,68.136107999999979],[-109.828056,68.136932000000115],[-109.84137699999997,68.139708999999982],[-109.84999099999999,68.143325999999945],[-109.85665899999998,68.14776599999999],[-109.85417200000001,68.153869999999984],[-109.845551,68.158034999999984],[-109.77194199999997,68.188309000000061],[-109.676941,68.224152000000061],[-109.64417300000002,68.232207999999957],[-109.58889799999997,68.245254999999986],[-109.57749899999988,68.247482000000048],[-109.56806899999998,68.247208000000114],[-109.57055699999995,68.241089000000102],[-109.57695000000001,68.232483000000002],[-109.58194700000001,68.225815000000011],[-109.59416199999993,68.214431999999988],[-109.67388899999997,68.173309000000074],[-109.7625119999999,68.143325999999945],[-109.77250699999991,68.139984000000027],[-109.78388999999999,68.13749700000011]],[[-66.31361400000003,68.14776599999999],[-66.326950000000011,68.147490999999945],[-66.354995999999971,68.153319999999951],[-66.381103999999937,68.158600000000035],[-66.396392999999932,68.161102000000085],[-66.468612999999948,68.171097000000032],[-66.527785999999878,68.177765000000022],[-66.570847000000015,68.181366000000082],[-66.601944000000003,68.182480000000055],[-66.607223999999974,68.217209000000082],[-66.5,68.239700000000084],[-66.299437999999952,68.254440000000045],[-66.221938999999963,68.241089000000102],[-66.256667999999991,68.163605000000075],[-66.269729999999925,68.158600000000035],[-66.301391999999964,68.149154999999951],[-66.31361400000003,68.14776599999999]],[[-96.384170999999924,68.200821000000019],[-96.422775000000001,68.198318000000086],[-96.436935000000005,68.198593000000074],[-96.448607999999922,68.20248400000014],[-96.454726999999934,68.206650000000025],[-96.462783999999999,68.216095000000109],[-96.456664999999987,68.221649000000127],[-96.375,68.254715000000033],[-96.364166000000012,68.258041000000105],[-96.350829999999974,68.258605999999929],[-96.344451999999933,68.254166000000112],[-96.317504999999926,68.231934000000024],[-96.324448000000018,68.221099999999979],[-96.338897999999915,68.212204000000042],[-96.348891999999864,68.208037999999988],[-96.360001000000011,68.204712000000086],[-96.384170999999924,68.200821000000019]],[[-78.571670999999981,68.200272000000098],[-78.655563000000029,68.187759000000028],[-78.662216000000001,68.189147999999989],[-78.660277999999892,68.196365000000128],[-78.643065999999976,68.218323000000055],[-78.607223999999917,68.248322000000087],[-78.593886999999881,68.255554000000018],[-78.581115999999952,68.258880999999974],[-78.550277999999992,68.263610999999969],[-78.548049999999989,68.263046000000145],[-78.545273000000009,68.25],[-78.525283999999999,68.233597000000145],[-78.517226999999934,68.223312000000021],[-78.522506999999905,68.21775800000006],[-78.532226999999978,68.213043000000027],[-78.558883999999978,68.203049000000021],[-78.571670999999981,68.200272000000098]],[[-86.426391999999964,68.069152999999972],[-86.397507000000019,68.021652000000131],[-86.378325999999959,67.993317000000104],[-86.376662999999951,67.988585999999998],[-86.368606999999997,67.954711999999972],[-86.370833999999945,67.939972000000012],[-86.396117999999944,67.859711000000118],[-86.403609999999958,67.848877000000073],[-86.465012000000002,67.786652000000117],[-86.47084000000001,67.78137200000009],[-86.489989999999977,67.770537999999988],[-86.571945000000028,67.728867000000037],[-86.583617999999944,67.725266000000147],[-86.596663999999976,67.72554000000008],[-86.676665999999955,67.731658999999922],[-86.690552000000025,67.733871000000022],[-86.858336999999949,67.79693599999996],[-86.879439999999931,67.810257000000092],[-86.883895999999936,67.814986999999974],[-86.910278000000005,67.8477630000001],[-86.918610000000001,67.86192299999999],[-86.926940999999999,67.876373000000115],[-86.945830999999941,67.909424000000058],[-86.951949999999897,67.923874000000012],[-86.948607999999979,67.928864000000033],[-86.940551999999968,67.934418000000051],[-86.926101999999958,67.931366000000082],[-86.913329999999974,67.931931000000134],[-86.854445999999882,67.954163000000051],[-86.84333799999996,67.958603000000039],[-86.838897999999972,67.986374000000126],[-86.836945000000014,68.001099000000067],[-86.840835999999911,68.010818000000029],[-86.847503999999958,68.020263999999997],[-86.851944000000003,68.024994000000049],[-86.863892000000021,68.029159999999933],[-86.878325999999959,68.032210999999961],[-86.904175000000009,68.030548000000067],[-86.932495000000017,68.035812000000021],[-86.942214999999976,68.040267999999969],[-86.986664000000019,68.061646000000053],[-86.992766999999901,68.066666000000112],[-86.991942999999935,68.071655000000078],[-86.98832699999997,68.081664999999987],[-86.978881999999999,68.096939000000077],[-86.906386999999938,68.180267000000072],[-86.89805599999994,68.185531999999967],[-86.742492999999911,68.282760999999937],[-86.711944999999957,68.299149],[-86.700561999999934,68.303589000000045],[-86.675003000000004,68.306091000000094],[-86.646666999999923,68.301651000000106],[-86.602782999999988,68.291367000000037],[-86.538605000000018,68.270538000000101],[-86.487503000000004,68.24859600000002],[-86.458617999999888,68.235535000000084],[-86.411117999999988,68.208878000000027],[-86.406661999999983,68.204162999999994],[-86.402785999999992,68.194427000000019],[-86.434998000000007,68.162491000000102],[-86.433884000000035,68.098601999999971],[-86.432495000000017,68.088882000000069],[-86.426391999999964,68.069152999999972]],[[-111.71028100000001,68.220534999999927],[-111.72556299999997,68.220260999999994],[-111.74221799999998,68.221099999999979],[-111.75583599999993,68.223602000000028],[-111.76500699999997,68.227203000000088],[-111.77194199999991,68.231369000000029],[-111.77639799999992,68.236099000000024],[-111.77887699999997,68.241089000000102],[-111.77916699999997,68.246933000000126],[-111.77722199999999,68.253052000000139],[-111.77166699999998,68.258880999999974],[-111.71501199999994,68.296936000000073],[-111.70388799999989,68.299422999999933],[-111.52887699999991,68.310806000000127],[-111.51363400000002,68.311096000000134],[-111.49944299999993,68.296936000000073],[-111.50446299999999,68.292480000000126],[-111.52861000000001,68.290543000000071],[-111.55777,68.289429000000098],[-111.58277899999996,68.286101999999971],[-111.60526999999996,68.281096999999932],[-111.61361699999998,68.276657000000114],[-111.62777699999998,68.266663000000108],[-111.633331,68.260818000000029],[-111.63305699999995,68.249709999999993],[-111.63054699999992,68.24443100000002],[-111.63249200000001,68.238312000000008],[-111.63945000000001,68.23332199999993],[-111.64943700000003,68.229980000000012],[-111.67166099999997,68.224701000000039],[-111.696663,68.221375000000023],[-111.71028100000001,68.220534999999927]],[[-75.582779000000016,68.300262000000089],[-75.5625,68.294433999999967],[-75.453888000000006,68.266663000000108],[-75.42971799999998,68.262206999999989],[-75.386672999999917,68.258041000000105],[-75.263061999999934,68.247208000000114],[-75.228881999999942,68.24552900000009],[-75.199158000000011,68.24552900000009],[-75.183059999999955,68.243866000000025],[-75.158614999999941,68.239975000000129],[-75.134734999999864,68.234711000000118],[-75.121933000000013,68.229156000000046],[-75.030563000000029,68.167205999999965],[-75.011948000000018,68.14776599999999],[-75.003066999999987,68.132202000000063],[-75,68.119690000000105],[-75.002227999999945,68.114426000000094],[-75.049163999999962,68.041367000000093],[-75.052490000000034,68.036652000000061],[-75.063323999999966,68.027206000000092],[-75.091675000000009,68.009995000000004],[-75.148055999999997,67.974426000000051],[-75.153609999999901,67.969437000000084],[-75.164443999999946,67.954163000000051],[-75.164443999999946,67.949417000000096],[-75.162780999999939,67.943863000000079],[-75.113891999999964,67.86192299999999],[-75.104445999999996,67.847488000000055],[-75.064162999999951,67.782486000000063],[-75.025008999999955,67.625534000000016],[-75.025283999999999,67.619431000000077],[-75.068892999999889,67.542755000000113],[-75.071944999999971,67.538879000000065],[-75.133620999999948,67.481658999999979],[-75.161117999999988,67.463882000000126],[-75.198607999999979,67.443314000000044],[-75.388061999999934,67.354705999999965],[-75.395843999999954,67.353043000000071],[-75.553603999999893,67.333603000000096],[-75.662506000000008,67.305251999999996],[-75.84445199999999,67.264159999999947],[-75.946105999999929,67.251937999999996],[-76.116652999999928,67.255554000000018],[-76.226943999999946,67.260818000000029],[-76.30860899999999,67.253601000000117],[-76.490829000000019,67.236374000000069],[-76.66361999999998,67.219986000000006],[-76.693053999999961,67.221099999999979],[-76.978057999999976,67.245529000000147],[-77.026672000000019,67.254990000000078],[-77.044723999999917,67.260544000000095],[-77.057219999999916,67.267212000000086],[-77.074448000000018,67.280823000000055],[-77.101395000000025,67.30581699999999],[-77.246947999999975,67.451934999999992],[-77.247222999999963,67.457214000000135],[-77.236937999999952,67.495254999999986],[-77.224441999999954,67.535538000000031],[-77.225829999999974,67.543869000000086],[-77.230285999999978,67.554428000000144],[-77.242217999999923,67.569153000000085],[-77.275008999999955,67.614699999999971],[-77.312209999999993,67.676376000000118],[-77.320847000000015,67.691649999999981],[-77.322509999999909,67.698029000000076],[-77.319167999999991,67.71138000000002],[-77.258346999999958,67.816375999999934],[-77.251953000000015,67.82638500000013],[-77.243332000000009,67.837494000000049],[-77.233062999999959,67.848877000000073],[-77.228333000000021,67.853867000000093],[-77.220551,67.86192299999999],[-77.203888000000006,67.876373000000115],[-76.865554999999972,68.15776100000005],[-76.858886999999925,68.161651999999947],[-76.726105000000018,68.238876000000118],[-76.702498999999932,68.24859600000002],[-76.673888999999974,68.259155000000078],[-76.635009999999909,68.271927000000062],[-76.606948999999929,68.279434000000037],[-76.28195199999999,68.332764000000111],[-76.267226999999934,68.332764000000111],[-76.258346999999901,68.3316650000001],[-76.251953000000015,68.328598],[-76.25,68.323044000000039],[-76.25306699999993,68.313599000000124],[-76.249161000000015,68.307480000000112],[-76.235824999999977,68.303314],[-76.221663999999976,68.301376000000062],[-76.116104000000007,68.296646000000067],[-76.083327999999995,68.295257999999933],[-76.060546999999985,68.296936000000073],[-76.052779999999984,68.298598999999967],[-76.032227000000034,68.304703000000018],[-76.000564999999995,68.316939999999988],[-75.985001000000011,68.324432000000115],[-75.966399999999965,68.331100000000106],[-75.954178000000013,68.333878000000084],[-75.930831999999953,68.336929000000112],[-75.917495999999915,68.338318000000072],[-75.887511999999958,68.339705999999978],[-75.818068999999866,68.336655000000007],[-75.756667999999991,68.332489000000066],[-75.726105000000018,68.33027600000014],[-75.695540999999878,68.326935000000105],[-75.667496000000028,68.322768999999994],[-75.62249799999995,68.313034000000073],[-75.602492999999868,68.307480000000112],[-75.582779000000016,68.300262000000089]],[[-79.020553999999947,68.169144000000074],[-79.032500999999911,68.165268000000026],[-79.075012000000015,68.168320000000108],[-79.089721999999938,68.170258000000047],[-79.101669000000015,68.175262000000032],[-79.171386999999868,68.205261000000064],[-79.176940999999943,68.209427000000119],[-79.179992999999968,68.215545999999961],[-79.188323999999966,68.247208000000114],[-79.191100999999946,68.319442999999978],[-79.151671999999962,68.346649000000014],[-79.141952999999944,68.34887700000013],[-79.125548999999978,68.350266000000147],[-79.099441999999954,68.348602000000142],[-79.044997999999964,68.343322999999941],[-78.929992999999911,68.338882000000012],[-78.826110999999969,68.295532000000037],[-78.809998000000007,68.287490999999989],[-78.804717999999923,68.283051],[-78.801666000000012,68.279160000000104],[-78.80221599999993,68.272491000000002],[-78.805266999999958,68.266663000000108],[-78.815551999999911,68.255554000000018],[-78.823333999999932,68.250548999999978],[-78.841948999999886,68.240540000000124],[-79.020553999999947,68.169144000000074]],[[-100.07472200000001,68.349716000000114],[-100.08640299999996,68.296097000000088],[-100.09166700000003,68.284987999999998],[-100.09944200000001,68.278595000000053],[-100.11221299999994,68.276382000000069],[-100.12832600000002,68.278320000000065],[-100.14028899999994,68.281661999999983],[-100.16443600000002,68.288589000000059],[-100.20056199999999,68.299149],[-100.22693600000002,68.316086000000041],[-100.23082699999992,68.319717000000082],[-100.21556099999998,68.318603999999993],[-100.20249899999988,68.319717000000082],[-100.19110099999995,68.322220000000073],[-100.1183319999999,68.347214000000008],[-100.11000100000001,68.352478000000019],[-100.08583099999998,68.368866000000082],[-100.07668299999989,68.359711000000004],[-100.07444799999996,68.354980000000069],[-100.07472200000001,68.349716000000114]],[[-82.05999799999995,68.306091000000094],[-82.072509999999966,68.303040000000067],[-82.271117999999944,68.338593000000117],[-82.312774999999988,68.349151999999947],[-82.326675000000023,68.353591999999992],[-82.33805799999999,68.358322000000044],[-82.344451999999876,68.362762000000032],[-82.345550999999944,68.36775200000011],[-82.333327999999995,68.371917999999994],[-82.230559999999969,68.385543999999982],[-82.216949,68.384155000000135],[-82.135558999999944,68.372756999999979],[-82.012512000000015,68.350815000000068],[-82.001113999999973,68.34637500000008],[-81.99722300000002,68.34137000000004],[-82.010009999999909,68.332764000000111],[-82.05999799999995,68.306091000000094]],[[-111.11444099999994,68.405823000000055],[-111.12832600000002,68.404984000000127],[-111.13751199999996,68.408599999999979],[-111.141953,68.413315000000011],[-111.14890300000002,68.428863999999919],[-111.14917000000003,68.439972000000125],[-111.141953,68.444976999999994],[-111.13054699999992,68.447479000000044],[-111.11527999999998,68.447754000000089],[-111.09861799999999,68.446930000000123],[-111.08249699999993,68.44470200000012],[-111.07611099999991,68.436919999999986],[-111.08416699999998,68.424988000000042],[-111.10582699999998,68.409988000000055],[-111.11444099999994,68.405823000000055]],[[-99.045273000000009,68.423874000000069],[-99.054992999999911,68.408324999999991],[-99.147781000000009,68.442200000000071],[-99.154723999999987,68.446365000000071],[-99.159163999999919,68.451096000000007],[-99.149733999999853,68.455261000000007],[-99.12110899999999,68.454987000000074],[-99.105269999999962,68.453048999999965],[-99.087219000000005,68.449416999999983],[-99.045273000000009,68.423874000000069]],[[-74.162216000000001,68.246093999999971],[-74.190552000000025,68.242477000000008],[-74.20777899999996,68.243317000000047],[-74.221114999999998,68.247208000000114],[-74.228881999999942,68.250823999999966],[-74.244155999999862,68.261383000000023],[-74.260559000000001,68.273314999999968],[-74.388610999999969,68.398330999999985],[-74.399733999999967,68.42025799999999],[-74.402221999999938,68.427765000000136],[-74.400283999999999,68.43414300000012],[-74.393065999999919,68.445251000000098],[-74.376937999999882,68.459717000000126],[-74.360275000000001,68.463882000000126],[-74.340835999999911,68.462493999999992],[-74.307769999999948,68.461655000000064],[-74.293883999999991,68.460541000000092],[-74.279448999999943,68.458328000000108],[-74.269729999999868,68.454712000000029],[-74.217498999999862,68.426086000000112],[-74.198043999999982,68.414992999999924],[-74.079452999999944,68.338593000000117],[-74.074722000000008,68.330825999999945],[-74.077498999999989,68.325546000000088],[-74.144454999999937,68.254440000000045],[-74.149733999999853,68.25],[-74.162216000000001,68.246093999999971]],[[-100.71056399999998,68.402480999999966],[-100.72416699999997,68.401657],[-100.78943599999997,68.409988000000055],[-100.88971699999996,68.45277400000009],[-100.88027999999997,68.457214000000135],[-100.84889199999992,68.464996000000099],[-100.83029199999999,68.468596999999932],[-100.79332699999986,68.468872000000147],[-100.78611799999999,68.464706000000092],[-100.71806300000003,68.411926000000051],[-100.71305799999999,68.407486000000006],[-100.71056399999998,68.402480999999966]],[[-110.86250299999995,68.474152000000061],[-110.92610199999996,68.465820000000065],[-111.05444299999999,68.469711000000132],[-111.08833299999998,68.473311999999964],[-111.09750400000001,68.477203000000031],[-111.09750400000001,68.482757999999933],[-111.09249899999998,68.487198000000149],[-111.08528099999995,68.492203000000018],[-111.07528699999995,68.495529000000033],[-110.984734,68.515549000000078],[-110.82167099999998,68.54803499999997],[-110.80332899999996,68.546371000000136],[-110.79222099999998,68.543319999999937],[-110.76390100000003,68.533600000000035],[-110.74582700000002,68.526382000000069],[-110.69833399999999,68.491364000000033],[-110.69611399999991,68.486374000000012],[-110.70889299999988,68.484711000000061],[-110.72833300000002,68.484421000000054],[-110.79499799999996,68.479980000000126],[-110.86250299999995,68.474152000000061]],[[-110.58693700000003,68.524155000000007],[-110.625,68.519440000000145],[-110.6600039999999,68.521927000000005],[-110.72112299999998,68.531097000000102],[-110.73249800000002,68.534149000000014],[-110.74610899999999,68.542480000000069],[-110.75974300000001,68.55664100000007],[-110.76194800000002,68.561645999999939],[-110.75473,68.566665999999998],[-110.63861099999997,68.569443000000092],[-110.62832600000002,68.559143000000006],[-110.52971600000001,68.54803499999997],[-110.520554,68.544144000000074],[-110.51834100000002,68.539154000000053],[-110.52722199999988,68.534987999999942],[-110.53859699999992,68.532486000000063],[-110.58693700000003,68.524155000000007]],[[-104.54527300000001,68.396102999999982],[-104.58667000000003,68.394440000000088],[-104.64666699999998,68.395827999999995],[-104.69332900000001,68.402480999999966],[-104.708618,68.40525800000006],[-104.75974299999996,68.418045000000063],[-104.88305699999995,68.449996999999996],[-104.91915899999992,68.459991000000059],[-104.9375,68.46748400000007],[-105.08167999999995,68.546371000000136],[-105.04415899999998,68.562759000000028],[-105.024719,68.570540999999992],[-105.01390100000003,68.573318000000086],[-104.98999000000003,68.57748400000014],[-104.93859900000001,68.583327999999995],[-104.91000399999996,68.583878000000027],[-104.76167299999997,68.582764000000054],[-104.74610899999993,68.582214000000022],[-104.71193699999998,68.578597999999943],[-104.682503,68.57388300000008],[-104.55332899999996,68.537201000000096],[-104.52999899999992,68.530548000000124],[-104.50917099999992,68.523315000000139],[-104.48277299999995,68.511658000000011],[-104.46916199999998,68.503326000000015],[-104.46362299999998,68.498871000000008],[-104.44915799999995,68.485260000000039],[-104.44055200000003,68.476089000000059],[-104.42777999999987,68.456940000000031],[-104.42527799999999,68.441360000000032],[-104.426941,68.435806000000014],[-104.43083199999995,68.429703000000075],[-104.43499799999995,68.423599000000024],[-104.44138299999997,68.417206000000078],[-104.45111099999991,68.413315000000011],[-104.48332199999999,68.404709000000082],[-104.51917299999997,68.398330999999985],[-104.54527300000001,68.396102999999982]],[[-105.139183,68.53637700000013],[-105.12609900000001,68.533325000000048],[-105.11305199999998,68.534424000000001],[-105.10109699999998,68.536652000000004],[-105.08693699999998,68.536926000000108],[-105.07861300000002,68.533051000000114],[-105.06639099999995,68.519149999999968],[-105.05972300000002,68.509430000000066],[-105.05888400000003,68.504166000000055],[-105.06833599999999,68.500274999999988],[-105.08612099999999,68.502777000000037],[-105.11193800000001,68.508881000000088],[-105.23361199999994,68.541091999999992],[-105.24416400000001,68.544708000000071],[-105.29110700000001,68.576935000000049],[-105.29222099999998,68.582214000000022],[-105.28138699999994,68.584991000000116],[-105.25611900000001,68.588318000000015],[-105.24305700000002,68.589705999999978],[-105.228882,68.589980999999966],[-105.21112099999993,68.587769000000094],[-105.18582200000003,68.580826000000116],[-105.18611099999998,68.576660000000004],[-105.18167099999994,68.566665999999998],[-105.17832900000002,68.561645999999939],[-105.139183,68.53637700000013]],[[-113.78611799999999,68.582764000000054],[-113.80166599999995,68.58248900000001],[-113.85249299999998,68.584152000000131],[-113.88945000000001,68.586929000000055],[-113.93138099999999,68.593872000000033],[-113.95259099999987,68.597389000000078],[-113.95966299999998,68.603195000000142],[-113.96611000000001,68.611099000000081],[-113.95667300000002,68.614699999999914],[-113.94248999999996,68.615814000000114],[-113.91388699999999,68.615814000000114],[-113.89972699999998,68.616928000000087],[-113.83693700000003,68.608871000000079],[-113.80027799999999,68.606093999999985],[-113.78611799999999,68.60386699999998],[-113.77667200000002,68.60026600000009],[-113.76194800000002,68.592209000000082],[-113.761124,68.586655000000121],[-113.77223199999997,68.583878000000027],[-113.78611799999999,68.582764000000054]],[[-100.74054699999999,68.596375000000023],[-100.78388999999993,68.594437000000084],[-100.86805699999991,68.603043000000014],[-100.88249200000001,68.611374000000069],[-100.87666300000001,68.616379000000109],[-100.86527999999998,68.619141000000013],[-100.85305800000003,68.620818999999983],[-100.83972199999999,68.62164300000012],[-100.81388900000002,68.619141000000013],[-100.75556899999992,68.607758000000047],[-100.74082899999996,68.604706000000078],[-100.73361199999994,68.600540000000024],[-100.74054699999999,68.596375000000023]],[[-78.468886999999995,68.563873000000001],[-78.474441999999897,68.55831900000004],[-78.482223999999917,68.553313999999943],[-78.503066999999987,68.545532000000037],[-78.530837999999903,68.541091999999992],[-78.545836999999949,68.540817000000004],[-78.562209999999993,68.541930999999977],[-78.599227999999925,68.550644000000034],[-78.614554999999939,68.553650000000061],[-78.638901000000033,68.558028999999976],[-78.654723999999987,68.558594000000028],[-78.668883999999991,68.554153000000099],[-78.724715999999944,68.521927000000005],[-78.715835999999911,68.515823000000012],[-78.691375999999991,68.509155000000021],[-78.674438000000009,68.509720000000073],[-78.653335999999967,68.512496999999939],[-78.636123999999938,68.513046000000088],[-78.621947999999975,68.509720000000073],[-78.617615000000001,68.507217000000082],[-78.610275000000001,68.502213000000097],[-78.610824999999977,68.498032000000023],[-78.618056999999965,68.492203000000018],[-78.705565999999976,68.451660000000118],[-78.716110000000015,68.447754000000089],[-78.743057000000022,68.442748999999992],[-78.776672000000019,68.439147999999989],[-78.795272999999952,68.438583000000108],[-78.813048999999921,68.438873000000115],[-78.828063999999983,68.440811000000053],[-78.861663999999962,68.446365000000071],[-78.876389000000017,68.450546000000145],[-78.959732000000031,68.474700999999982],[-78.946105999999986,68.508041000000048],[-78.943328999999949,68.511932000000115],[-78.936935000000005,68.516388000000006],[-78.822784000000013,68.547759999999982],[-78.809432999999956,68.550537000000077],[-78.791672000000005,68.550262000000032],[-78.759170999999981,68.54803499999997],[-78.743880999999988,68.546097000000032],[-78.723891999999978,68.547484999999938],[-78.704177999999899,68.554703000000131],[-78.698883000000023,68.558028999999976],[-78.688889000000017,68.564697000000137],[-78.670837000000006,68.578872999999987],[-78.668609999999944,68.583327999999995],[-78.672774999999945,68.58859300000006],[-78.680557000000022,68.593323000000112],[-78.693054000000018,68.596939000000134],[-78.705841000000021,68.600540000000024],[-78.784163999999976,68.618590999999981],[-78.851395000000025,68.634155000000078],[-78.894454999999994,68.646378000000141],[-78.89805599999994,68.64888000000002],[-78.889724999999942,68.652771000000087],[-78.863892000000021,68.659714000000122],[-78.837783999999886,68.661102000000028],[-78.720001000000025,68.657211000000132],[-78.689437999999939,68.653320000000065],[-78.495834000000002,68.627762000000132],[-78.481948999999929,68.624985000000038],[-78.469451999999933,68.621093999999971],[-78.460555999999997,68.617203000000075],[-78.467223999999987,68.569153000000085],[-78.468886999999995,68.563873000000001]],[[-74.768889999999999,68.673874000000012],[-74.756667999999991,68.672760000000039],[-74.65583799999996,68.65498400000007],[-74.648346000000004,68.652206000000092],[-74.522231999999974,68.565262000000018],[-74.518340999999907,68.558594000000028],[-74.531951999999876,68.552765000000022],[-74.551392000000021,68.550537000000077],[-74.586944999999957,68.548874000000126],[-74.726668999999902,68.556091000000038],[-74.742767000000015,68.557480000000055],[-74.807219999999916,68.563599000000067],[-74.821945000000028,68.56581099999994],[-74.833892999999989,68.569717000000026],[-74.84333799999996,68.575821000000076],[-74.870543999999995,68.598877000000073],[-74.883056999999894,68.61303700000002],[-74.890288999999996,68.624985000000038],[-74.805832000000009,68.668868999999972],[-74.796111999999994,68.671646000000067],[-74.787216000000001,68.673035000000027],[-74.779998999999975,68.673874000000012],[-74.77194199999991,68.673035000000027],[-74.768889999999999,68.673874000000012]],[[-114.04723399999995,68.613602000000014],[-114.06139399999995,68.612488000000042],[-114.075287,68.614699999999914],[-114.10193600000002,68.625809000000004],[-114.12666299999995,68.637206999999989],[-114.14890299999996,68.649428999999998],[-114.16166699999991,68.658035000000098],[-114.18998699999986,68.680266999999958],[-114.18639400000001,68.683594000000085],[-114.15387699999991,68.679703000000018],[-114.141953,68.676925999999924],[-114.14111299999996,68.671097000000088],[-114.05638099999987,68.635818000000029],[-114.04888900000003,68.631927000000132],[-114.04167200000001,68.627762000000132],[-114.03778099999994,68.616928000000087],[-114.04723399999995,68.613602000000014]],[[-74.811385999999914,68.320541000000048],[-74.817504999999926,68.318603999999993],[-75,68.333344000000125],[-75.002227999999945,68.333603000000039],[-75.008346999999958,68.337204000000099],[-75.010284000000013,68.346649000000014],[-75.005004999999926,68.353591999999992],[-75.002791999999999,68.35914600000001],[-75.00140399999998,68.366378999999995],[-75.015014999999948,68.379700000000128],[-75.029174999999952,68.390549000000021],[-75.037505999999951,68.394714000000022],[-75.081679999999892,68.404984000000127],[-75.10943599999996,68.406937000000084],[-75.138061999999991,68.409988000000055],[-75.153060999999866,68.413040000000024],[-75.241378999999995,68.436371000000065],[-75.263900999999919,68.444976999999994],[-75.294723999999974,68.457763999999997],[-75.369995000000017,68.489700000000028],[-75.396118000000001,68.503601000000003],[-75.416397000000018,68.518051000000128],[-75.416397000000018,68.524429000000112],[-75.396956999999873,68.611099000000081],[-75.389175000000023,68.62303200000008],[-75.307770000000005,68.694702000000063],[-75.299727999999959,68.700546000000088],[-75.280562999999972,68.709717000000069],[-75.254729999999881,68.717484000000013],[-75.239440999999999,68.718048000000124],[-75.014450000000011,68.677200000000028],[-75,68.672241000000099],[-74.942764000000011,68.576096000000064],[-74.938323999999909,68.571655000000135],[-74.931380999999931,68.566665999999998],[-74.836945000000014,68.511658000000011],[-74.801940999999999,68.501099000000124],[-74.785004000000015,68.494705000000067],[-74.780288999999982,68.490265000000079],[-74.772232000000031,68.479980000000126],[-74.768341000000021,68.473311999999964],[-74.776397999999915,68.410537999999917],[-74.811385999999914,68.320541000000048]],[[-84.808043999999938,68.763885000000016],[-84.821395999999879,68.763611000000083],[-84.835830999999985,68.766662999999994],[-84.939163000000008,68.793594000000041],[-84.907776000000013,68.803589000000102],[-84.895279000000016,68.80720500000001],[-84.882492000000013,68.809707999999944],[-84.855835000000013,68.810806000000014],[-84.841385000000002,68.807479999999998],[-84.837219000000005,68.802765000000136],[-84.837783999999999,68.79693600000013],[-84.801665999999955,68.769150000000081],[-84.808043999999938,68.763885000000016]],[[-68.110275000000001,68.78276100000005],[-67.807494999999903,68.733597000000032],[-67.781676999999945,68.729155999999932],[-67.679169000000002,68.711379999999963],[-67.668335000000013,68.707214000000079],[-67.661391999999921,68.701935000000105],[-67.662216000000001,68.698317999999972],[-67.676666000000012,68.695816000000093],[-67.850554999999929,68.697754000000032],[-67.869720000000029,68.69859299999996],[-67.897781000000009,68.704987000000017],[-67.918609999999887,68.712493999999936],[-67.951400999999976,68.721649000000014],[-68.039169000000015,68.738037000000077],[-68.188323999999909,68.763885000000016],[-68.306106999999997,68.779434000000094],[-68.323623999999995,68.779984000000127],[-68.339995999999985,68.778594999999939],[-68.352492999999981,68.775543000000027],[-68.367492999999854,68.774994000000106],[-68.433608999999933,68.781097000000045],[-68.451400999999976,68.783875000000023],[-68.457779000000016,68.785812000000078],[-68.459441999999967,68.791092000000106],[-68.455275999999969,68.802199999999914],[-68.450835999999867,68.80720500000001],[-68.439163000000008,68.812485000000038],[-68.428328999999962,68.813034000000016],[-68.418899999999894,68.810257000000092],[-68.375548999999921,68.808029000000147],[-68.241942999999935,68.798874000000069],[-68.224716000000001,68.797485000000108],[-68.110275000000001,68.78276100000005]],[[-101.83112299999999,68.566940000000102],[-101.84555099999989,68.566665999999998],[-101.86028299999998,68.569717000000026],[-101.88527699999986,68.576385000000016],[-101.90527299999991,68.583878000000027],[-102.00583599999999,68.613875999999948],[-102.112213,68.62359600000002],[-102.23000300000001,68.64027399999992],[-102.254997,68.646942000000081],[-102.31639100000001,68.672211000000061],[-102.3125,68.688583000000051],[-102.21665999999999,68.718322999999998],[-102.14862099999999,68.734984999999938],[-102.13639799999993,68.736923000000104],[-102.11389200000002,68.742477000000065],[-102.09249899999998,68.748871000000122],[-102.073059,68.756943000000092],[-102.05638099999993,68.768051000000071],[-102.05166600000001,68.773880000000077],[-102.04943799999995,68.779434000000094],[-102.04972799999996,68.784714000000008],[-102.05555699999996,68.794434000000081],[-102.05555699999996,68.799713000000054],[-102.05082700000003,68.805542000000059],[-102.04276999999996,68.811096000000077],[-102.02306399999992,68.819443000000035],[-101.99833699999999,68.823044000000095],[-101.98500099999995,68.824158000000068],[-101.95612299999999,68.824158000000068],[-101.93943799999994,68.822494999999947],[-101.9119419999999,68.816086000000098],[-101.77861000000001,68.783875000000023],[-101.69387799999993,68.768051000000071],[-101.69999699999994,68.737762000000032],[-101.68055699999996,68.672484999999995],[-101.68250299999994,68.661652000000061],[-101.701683,68.637772000000041],[-101.83112299999999,68.566940000000102]],[[-102.60082999999997,68.813309000000004],[-102.60749799999996,68.80914300000012],[-102.69695299999995,68.813034000000016],[-102.70722999999992,68.816666000000112],[-102.68888900000002,68.833328000000108],[-102.67859599999997,68.836928999999998],[-102.64055599999995,68.841934000000037],[-102.61277799999993,68.84304800000001],[-102.59889199999986,68.841095000000053],[-102.60221899999999,68.834152000000074],[-102.60082999999997,68.813309000000004]],[[-89.944442999999978,68.662200999999982],[-89.956389999999942,68.661652000000061],[-89.974166999999966,68.705826000000002],[-89.999160999999958,68.730819999999937],[-90.017226999999934,68.740540000000067],[-90.022507000000019,68.74581900000004],[-90.027495999999985,68.752486999999974],[-90.027785999999992,68.758606000000043],[-90.025557999999933,68.771927000000005],[-90.00306699999993,68.806641000000013],[-89.958618000000001,68.838042999999971],[-89.944442999999978,68.847488000000055],[-89.931945999999982,68.852203000000088],[-89.921935999999903,68.853867000000093],[-89.914443999999946,68.853043000000127],[-89.781677000000002,68.766662999999994],[-89.784163999999919,68.760818000000086],[-89.791381999999999,68.752486999999974],[-89.808884000000035,68.733322000000044],[-89.857498000000021,68.700546000000088],[-89.877486999999917,68.690810999999997],[-89.944442999999978,68.662200999999982]],[[-114.35082999999997,68.871643000000063],[-114.37917299999992,68.86943100000002],[-114.39639299999999,68.869705000000124],[-114.429169,68.87359600000002],[-114.45333900000003,68.879425000000026],[-114.46305799999999,68.882751000000042],[-114.468613,68.887206999999989],[-114.47165699999999,68.892487000000017],[-114.46056399999998,68.895264000000111],[-114.44444299999998,68.896103000000096],[-114.424713,68.896942000000024],[-114.37609899999995,68.893600000000106],[-114.34084300000001,68.890549000000078],[-114.32888800000001,68.887496999999996],[-114.32333399999999,68.883041000000048],[-114.32861299999996,68.87692300000009],[-114.33805799999993,68.87359600000002],[-114.35082999999997,68.871643000000063]],[[-67.847777999999948,68.851928999999984],[-67.863891999999964,68.849425999999994],[-67.883056999999951,68.849990999999989],[-67.897232000000031,68.853043000000127],[-67.908051,68.857208000000128],[-67.956389999999942,68.915268000000026],[-67.96055599999994,68.922484999999995],[-67.96055599999994,68.929977000000065],[-67.954726999999934,68.935806000000127],[-67.946654999999964,68.940810999999997],[-67.938048999999978,68.944427000000019],[-67.923889000000031,68.94859300000013],[-67.892226999999991,68.951660000000004],[-67.876388999999961,68.949417000000096],[-67.869445999999982,68.944138000000066],[-67.83944699999995,68.911926000000108],[-67.831389999999999,68.875809000000118],[-67.833068999999909,68.861374000000012],[-67.837509000000011,68.856368999999972],[-67.847777999999948,68.851928999999984]],[[-85.341675000000009,68.983596999999975],[-85.351669000000015,68.981094000000041],[-85.379165999999941,68.981934000000081],[-85.407227000000034,68.984420999999941],[-85.437209999999993,68.991928000000087],[-85.446944999999971,68.996368000000075],[-85.451400999999976,69.001099000000011],[-85.453063999999983,69.005829000000062],[-85.44387799999987,69.010269000000108],[-85.418883999999991,69.009430000000123],[-85.369995000000017,69.001937999999996],[-85.354720999999927,68.997757000000092],[-85.342223999999931,68.993317000000104],[-85.337783999999999,68.988585999999941],[-85.341675000000009,68.983596999999975]],[[-89.90834000000001,68.917755000000113],[-89.915008999999998,68.913315000000125],[-89.952498999999875,68.926376000000062],[-89.978332999999964,68.933867999999961],[-90,68.937575999999979],[-90.03195199999999,68.943039000000113],[-90.075561999999991,68.948028999999963],[-90.070557000000008,68.981934000000081],[-89.946380999999917,69.010269000000108],[-89.93360899999999,69.011658000000068],[-89.920837000000006,69.010269000000108],[-89.914169000000015,69.006943000000035],[-89.910277999999948,69.003052000000139],[-89.906661999999983,68.922484999999995],[-89.90834000000001,68.917755000000113]],[[-100.17555199999987,68.794708000000014],[-100.22083999999995,68.764435000000049],[-100.25446299999999,68.769150000000081],[-100.26917300000002,68.772217000000012],[-100.28555299999994,68.774155000000121],[-100.29915599999998,68.773315000000082],[-100.30860899999999,68.768875000000037],[-100.31639100000001,68.76249700000011],[-100.35749799999996,68.71527100000003],[-100.36694299999994,68.710541000000035],[-100.40722699999998,68.708038000000045],[-100.423607,68.709991000000002],[-100.61332700000003,68.758040999999992],[-100.62304699999999,68.761932000000058],[-100.62805199999997,68.766388000000006],[-100.632767,68.77609300000006],[-100.62581599999999,68.912490999999932],[-100.59999099999999,69.000548999999978],[-100.56111099999993,69.025818000000015],[-100.54360999999994,69.036652000000061],[-100.52916699999997,69.036652000000061],[-100.497772,69.034714000000122],[-100.41610700000001,69.026382000000126],[-100.38110399999994,69.020828000000108],[-100.35082999999997,69.014709000000096],[-100.34111000000001,69.010818000000029],[-100.33361799999994,69.006653000000028],[-100.32861300000002,69.00221300000004],[-100.32362399999994,68.996093999999971],[-100.32888800000001,68.989975000000129],[-100.33168000000001,68.984420999999941],[-100.33168000000001,68.979431000000091],[-100.326683,68.974701000000039],[-100.31276700000001,68.965820000000122],[-100.23889200000002,68.924149],[-100.22888199999994,68.920258000000103],[-100.21665999999988,68.916930999999977],[-100.20361300000002,68.915543000000071],[-100.16027799999995,68.915268000000026],[-100.14362299999993,68.913315000000125],[-100.13110399999999,68.909987999999998],[-100.12638899999996,68.905548000000124],[-100.17194399999994,68.799423000000047],[-100.17555199999987,68.794708000000014]],[[-85.119445999999925,69.014709000000096],[-85.132216999999855,69.013045999999974],[-85.166107000000011,69.031096999999988],[-85.170273000000009,69.035812000000021],[-85.155562999999972,69.056090999999981],[-85.14555399999989,69.058319000000097],[-85.095551,69.048035000000084],[-85.068343999999968,69.041367000000093],[-85.061385999999914,69.036652000000061],[-85.075835999999924,69.031096999999988],[-85.119445999999925,69.014709000000096]],[[-85.265288999999996,69.072495000000117],[-85.343886999999938,69.06303400000013],[-85.357773000000009,69.063598999999954],[-85.373046999999929,69.067763999999954],[-85.392776000000026,69.076660000000118],[-85.397232000000031,69.081374999999923],[-85.398894999999982,69.086104999999975],[-85.392501999999979,69.09137000000004],[-85.380279999999914,69.095825000000048],[-85.301392000000021,69.104155999999989],[-85.287780999999882,69.104706000000022],[-85.258895999999993,69.100266000000147],[-85.248885999999914,69.095825000000048],[-85.241942999999992,69.09137000000004],[-85.245543999999995,69.086104999999975],[-85.246658000000025,69.081374999999923],[-85.253066999999987,69.07609599999995],[-85.265288999999996,69.072495000000117]],[[-99.999434999999949,68.943588000000034],[-100.006958,68.939423000000033],[-100.021118,68.939696999999967],[-100.03778099999988,68.941360000000088],[-100.12000299999994,68.950821000000076],[-100.16166699999997,68.961380000000133],[-100.18138099999999,68.968872000000033],[-100.19860799999998,68.976929000000041],[-100.20612299999988,68.981094000000041],[-100.23693800000001,69.008605999999986],[-100.25666799999999,69.026656999999943],[-100.25890399999992,69.031661999999983],[-100.25862099999995,69.041931000000034],[-100.23693800000001,69.081374999999923],[-100.23194899999993,69.087203999999986],[-100.21333300000003,69.097214000000065],[-100.12970699999994,69.130264000000125],[-100.09555099999994,69.117477000000122],[-100.05304699999999,69.102478000000019],[-100.03333299999991,69.094711000000075],[-100.02834299999995,69.090271000000087],[-99.978881999999999,69.01388500000013],[-99.976943999999946,69.003876000000105],[-99.999434999999949,68.943588000000034]],[[-90.124709999999993,69.04942299999999],[-90.12721299999987,69.044982999999945],[-90.138061999999991,69.04525799999999],[-90.231948999999986,69.065536000000009],[-90.247498000000007,69.070267000000115],[-90.279175000000009,69.098328000000038],[-90.276397999999858,69.125809000000061],[-90.263335999999924,69.141936999999928],[-90.262511999999958,69.142761000000064],[-90.253890999999953,69.142761000000064],[-90.147231999999974,69.103591999999992],[-90.125,69.055542000000003],[-90.124709999999993,69.04942299999999]],[[-101.66416900000002,69.083603000000096],[-101.67749000000003,69.082764000000111],[-101.69027699999998,69.086104999999975],[-101.69554099999993,69.090546000000074],[-101.69833399999993,69.095261000000107],[-101.71806300000003,69.178588999999931],[-101.71584300000001,69.189147999999989],[-101.71112099999993,69.195251000000098],[-101.70361300000002,69.201660000000004],[-101.695267,69.206940000000031],[-101.68443300000001,69.210815000000025],[-101.65834000000001,69.213608000000022],[-101.60166899999996,69.215546000000131],[-101.55860899999999,69.216660000000104],[-101.53527799999995,69.209427000000119],[-101.5202789999999,69.197479000000101],[-101.497772,69.170258000000047],[-101.49500299999994,69.165543000000014],[-101.49500299999994,69.160262999999929],[-101.49999999999994,69.154434000000094],[-101.55555699999991,69.105255000000113],[-101.56360599999999,69.099990999999989],[-101.65139799999997,69.085541000000035],[-101.66416900000002,69.083603000000096]],[[-90.512512000000015,69.20248400000014],[-90.575561999999991,69.198593000000074],[-90.613327000000027,69.207763999999997],[-90.777221999999995,69.272491000000002],[-90.778609999999901,69.317215000000147],[-90.775832999999977,69.32998699999996],[-90.762512000000015,69.345534999999984],[-90.757232999999985,69.349426000000051],[-90.740829000000019,69.357483000000059],[-90.692215000000033,69.37164300000012],[-90.67332499999992,69.373871000000065],[-90.655272999999966,69.374695000000031],[-90.638610999999969,69.373871000000065],[-90.608046999999999,69.36970500000001],[-90.595001000000025,69.365264999999965],[-90.582503999999972,69.359711000000004],[-90.559433000000013,69.347214000000008],[-90.548614999999984,69.339981000000023],[-90.47193900000002,69.281097000000102],[-90.460830999999928,69.267487000000017],[-90.455565999999976,69.234711000000118],[-90.454452999999887,69.226379000000122],[-90.457503999999972,69.222763000000043],[-90.512512000000015,69.20248400000014]],[[-78.412215999999887,69.379700000000128],[-78.396392999999932,69.377761999999962],[-78.338608000000022,69.3808140000001],[-78.305832000000009,69.377761999999962],[-78.291381999999999,69.374985000000095],[-78.279723999999987,69.370255000000043],[-78.270844000000011,69.364150999999993],[-78.211394999999925,69.299987999999985],[-78.210830999999985,69.294434000000138],[-78.214447000000007,69.288315000000125],[-78.318344000000025,69.238312000000008],[-78.396118000000001,69.210541000000092],[-78.472504000000015,69.191360000000032],[-78.551392000000021,69.089157000000057],[-78.556655999999919,69.083603000000096],[-78.572234999999921,69.073317999999972],[-78.601943999999946,69.066086000000041],[-78.62777699999998,69.058593999999914],[-78.707229999999981,69.014709000000096],[-78.715011999999945,69.009720000000129],[-78.718062999999972,69.003601000000117],[-78.71665999999999,68.99664300000012],[-78.712783999999999,68.984985000000108],[-78.716110000000015,68.979156000000103],[-78.725280999999995,68.968872000000033],[-78.735000999999954,68.963608000000079],[-78.830291999999929,68.91304000000008],[-78.840285999999935,68.908600000000092],[-78.867492999999968,68.900543000000084],[-78.934433000000013,68.888596000000121],[-78.978881999999999,68.882477000000108],[-79.033614999999998,68.877197000000024],[-79.095275999999956,68.872757000000036],[-79.185271999999941,68.853317000000061],[-79.194152999999972,68.849425999999994],[-79.197219999999902,68.839157000000114],[-79.204726999999991,68.833878000000141],[-79.216949,68.829987000000074],[-79.238892000000021,68.827484000000084],[-79.287216000000001,68.83137499999998],[-79.353332999999964,68.844147000000021],[-79.366103999999893,68.847763000000043],[-79.386948000000018,68.856093999999985],[-79.392501999999865,68.860535000000084],[-79.396392999999932,68.864990000000091],[-79.400283999999999,68.871918000000051],[-79.402221999999938,68.923598999999967],[-79.379439999999931,68.931656000000089],[-79.353881999999999,68.943863000000079],[-79.330565999999976,68.958327999999995],[-79.309432999999956,68.973602000000085],[-79.303878999999938,68.978317000000118],[-79.292769999999962,68.995818999999983],[-79.283065999999963,69.012772000000041],[-79.238892000000021,69.066376000000048],[-79.227218999999991,69.076385000000073],[-79.216949,69.081100000000106],[-79.146117999999944,69.093597000000102],[-79.049438000000009,69.102203000000031],[-78.985824999999977,69.099990999999989],[-78.974441999999954,69.100266000000147],[-78.960280999999952,69.102478000000019],[-78.864165999999955,69.141098],[-78.855834999999956,69.145537999999988],[-78.749160999999901,69.261107999999979],[-78.721938999999963,69.310532000000023],[-78.726668999999902,69.318603999999993],[-78.724715999999944,69.331100000000049],[-78.722778000000005,69.336105000000089],[-78.716110000000015,69.34027100000003],[-78.606948999999986,69.371368000000132],[-78.577498999999989,69.377197000000137],[-78.568618999999956,69.378860000000032],[-78.489989999999977,69.391098000000113],[-78.47084000000001,69.392212000000086],[-78.458617999999944,69.38998400000014],[-78.412215999999887,69.379700000000128]],[[-135.28890999999993,69.309418000000051],[-135.29751599999997,69.304977000000122],[-135.33138999999989,69.322768999999994],[-135.34805299999994,69.330551000000128],[-135.38613899999996,69.344986000000063],[-135.39779699999997,69.348037999999974],[-135.44000199999999,69.355820000000108],[-135.48693800000001,69.362198000000092],[-135.51501500000001,69.367477000000065],[-135.52694699999995,69.370529000000147],[-135.55999800000001,69.380264000000068],[-135.56527700000004,69.384995000000004],[-135.56555199999997,69.390548999999965],[-135.55999800000001,69.396652000000131],[-135.54998799999998,69.399994000000049],[-135.52444499999996,69.403595000000109],[-135.50723300000004,69.403046000000131],[-135.42028799999997,69.397491000000059],[-135.365814,69.393599999999992],[-135.33776899999992,69.388596000000064],[-135.32806400000004,69.384995000000004],[-135.27224699999988,69.358321999999987],[-135.27139299999999,69.346938999999963],[-135.27722199999999,69.328322999999955],[-135.28332499999988,69.315262000000018],[-135.28890999999993,69.309418000000051]],[[-76.950835999999867,69.395263999999997],[-76.923614999999984,69.393599999999992],[-76.902221999999995,69.394713999999965],[-76.804168999999945,69.400269000000037],[-76.787780999999995,69.402480999999966],[-76.779174999999952,69.403870000000097],[-76.760833999999875,69.40914900000007],[-76.75140399999998,69.412766000000033],[-76.744445999999982,69.416931000000034],[-76.732772999999952,69.422760000000039],[-76.723327999999981,69.423599000000024],[-76.716400000000021,69.422211000000118],[-76.705840999999964,69.418868999999972],[-76.652221999999938,69.38638300000008],[-76.644729999999925,69.381363000000022],[-76.643889999999942,69.374420000000043],[-76.646666999999979,69.336929000000055],[-76.648894999999925,69.331940000000088],[-76.676391999999964,69.306091000000094],[-76.706389999999999,69.303588999999988],[-76.718886999999995,69.301651000000049],[-76.736937999999952,69.296371000000022],[-76.799438000000009,69.272491000000002],[-76.926392000000021,69.21748400000007],[-76.933608999999933,69.213882000000126],[-76.939986999999974,69.209152000000074],[-76.945830999999998,69.203598000000113],[-76.949431999999945,69.197479000000101],[-76.950561999999934,69.1933140000001],[-76.958892999999989,69.14248699999996],[-77.118057000000022,69.119431000000134],[-77.137787000000003,69.116652999999928],[-77.171660999999915,69.117202999999961],[-77.213622999999984,69.125809000000061],[-77.238601999999958,69.132750999999985],[-77.25778200000002,69.139984000000027],[-77.285827999999924,69.153594999999996],[-77.301392000000021,69.164153999999996],[-77.320281999999963,69.181366000000025],[-77.381942999999865,69.247482000000048],[-77.384170999999981,69.263610999999969],[-77.383330999999941,69.270538000000045],[-77.359725999999966,69.392761000000064],[-77.356383999999935,69.396652000000131],[-77.348342999999943,69.401657],[-77.288329999999917,69.417755],[-77.259170999999924,69.424698000000035],[-77.189162999999951,69.438309000000004],[-77.153610000000015,69.444427000000076],[-77.129989999999964,69.445251000000042],[-77.113616999999977,69.441650000000038],[-77.075561999999991,69.428314000000057],[-77.043335000000013,69.417206000000078],[-77.006957999999997,69.406372000000033],[-76.978332999999907,69.399994000000049],[-76.950835999999867,69.395263999999997]],[[-90.329453000000001,69.235809000000017],[-90.34722899999997,69.234711000000118],[-90.361388999999974,69.238312000000008],[-90.506392999999946,69.329162999999994],[-90.510009999999909,69.334717000000012],[-90.514450000000011,69.363876000000005],[-90.501113999999973,69.372482000000105],[-90.491669000000002,69.376647999999989],[-90.301940999999943,69.434418000000107],[-90.205275999999913,69.445816000000093],[-90.200835999999981,69.444427000000076],[-90.199722000000008,69.439148000000102],[-90.195267000000001,69.416931000000034],[-90.178604000000007,69.409988000000055],[-90.149733999999967,69.375534000000016],[-90.148345999999947,69.370255000000043],[-90.154723999999987,69.350815000000068],[-90.15972899999997,69.34526100000005],[-90.271666999999923,69.255554000000018],[-90.288605000000018,69.249419999999986],[-90.329453000000001,69.235809000000017]],[[-135.59222399999999,69.482208000000071],[-135.574432,69.446640000000059],[-135.61999499999996,69.468597000000102],[-135.62942499999991,69.472214000000065],[-135.66528299999999,69.481368999999916],[-135.69360399999999,69.486649],[-135.74081399999994,69.493041999999946],[-135.77835099999999,69.496094000000085],[-135.81054700000004,69.497756999999979],[-135.81555200000003,69.502487000000031],[-135.8125,69.508041000000048],[-135.79528799999997,69.516663000000051],[-135.78555299999999,69.519989000000066],[-135.77389500000004,69.52276599999999],[-135.76113899999996,69.524429000000055],[-135.74526999999995,69.524704000000099],[-135.66610700000001,69.505828999999949],[-135.59942599999999,69.486098999999967],[-135.59222399999999,69.482208000000071]],[[-101.05304699999999,69.504439999999988],[-101.00611900000001,69.486923000000104],[-101.00862099999995,69.450272000000041],[-101.12526700000001,69.401382000000126],[-101.21861299999989,69.371368000000132],[-101.23029299999996,69.368591000000038],[-101.24305700000002,69.371917999999994],[-101.26888999999994,69.378860000000032],[-101.27916700000003,69.382476999999994],[-101.271118,69.385818000000029],[-101.256958,69.386658000000068],[-101.24526999999995,69.389434999999992],[-101.2369379999999,69.394713999999965],[-101.23166699999996,69.400818000000015],[-101.18888899999996,69.469711000000075],[-101.18639400000001,69.475265999999976],[-101.22749299999992,69.495529000000033],[-101.23805199999998,69.499145999999996],[-101.2538909999999,69.500274999999988],[-101.266953,69.49832200000003],[-101.31749699999995,69.511107999999922],[-101.38445300000001,69.53276100000005],[-101.38722199999995,69.53776600000009],[-101.35833700000001,69.566940000000102],[-101.34973099999996,69.572495000000004],[-101.34056099999992,69.574707000000046],[-101.27555799999993,69.580826000000059],[-101.26167299999992,69.581665000000044],[-101.07305899999994,69.534988000000112],[-101.06276699999995,69.53137200000009],[-101.05999800000001,69.526382000000012],[-101.05304699999999,69.504439999999988]],[[-96.663054999999929,69.569717000000026],[-96.563323999999966,69.564147999999989],[-96.461120999999991,69.564147999999989],[-96.401671999999905,69.562759000000028],[-96.373610999999983,69.560806000000071],[-96.358886999999868,69.55720500000001],[-96.351943999999946,69.55304000000001],[-96.345275999999899,69.548599000000081],[-96.343886999999995,69.543594000000041],[-96.335555999999997,69.534424000000001],[-96.328613000000018,69.529983999999956],[-96.31639100000001,69.526382000000012],[-96.291671999999892,69.531097000000045],[-96.218063000000029,69.546371000000136],[-96.207229999999981,69.55053700000002],[-96.198333999999875,69.55664100000007],[-96.194442999999978,69.561920000000043],[-96.184432999999956,69.56721500000009],[-96.169723999999917,69.566940000000102],[-96.152221999999995,69.563599000000067],[-96.139998999999932,69.559982000000105],[-96.133330999999941,69.555542000000059],[-96.134445000000028,69.550262000000032],[-96.136397999999986,69.546097000000032],[-96.104171999999949,69.49832200000003],[-96.101104999999961,69.493041999999946],[-96.097778000000005,69.483322000000044],[-96.096114999999998,69.46804800000001],[-96.098617999999988,69.457763999999941],[-96.143065999999919,69.351379000000009],[-96.146666999999979,69.345824999999991],[-96.163329999999974,69.348037999999974],[-96.233886999999982,69.359711000000004],[-96.248610999999926,69.36303700000002],[-96.270003999999972,69.370818999999983],[-96.288604999999961,69.378860000000032],[-96.304992999999911,69.387497000000053],[-96.325286999999946,69.400269000000037],[-96.333617999999944,69.409714000000122],[-96.348343,69.423035000000084],[-96.382216999999912,69.44470200000012],[-96.401108000000022,69.453048999999908],[-96.430557000000022,69.459717000000069],[-96.461944999999957,69.462493999999992],[-96.507232999999985,69.464432000000102],[-96.524719000000005,69.467484000000013],[-96.548889000000031,69.474990999999989],[-96.630828999999949,69.512207000000103],[-96.654175000000009,69.524994000000106],[-96.736663999999962,69.576660000000004],[-96.735549999999989,69.581940000000031],[-96.721663999999919,69.58248900000001],[-96.691665999999884,69.581940000000031],[-96.676940999999999,69.578323000000125],[-96.663054999999929,69.569717000000026]],[[-67.310546999999929,69.549149000000114],[-67.324172999999973,69.533875000000023],[-67.331680000000006,69.53137200000009],[-67.351105000000018,69.530823000000112],[-67.388610999999969,69.533051000000057],[-67.473052999999936,69.533875000000023],[-67.492766999999958,69.533051000000057],[-67.53083799999996,69.52915999999999],[-67.545272999999895,69.525818000000072],[-67.552489999999977,69.523041000000148],[-67.549437999999896,69.519714000000022],[-67.507232999999985,69.514998999999989],[-67.499999999999943,69.512833000000057],[-67.49888599999997,69.51249700000011],[-67.489990000000034,69.508606000000043],[-67.481673999999941,69.500000000000114],[-67.492492999999854,69.495529000000033],[-67.50778200000002,69.494980000000112],[-67.573623999999995,69.506653000000085],[-67.58555599999994,69.50749200000007],[-67.598891999999978,69.506378000000097],[-67.626662999999951,69.500549000000092],[-67.642226999999878,69.500274999999988],[-67.731948999999929,69.513611000000083],[-67.744445999999925,69.515822999999955],[-67.749725000000012,69.521103000000039],[-67.739440999999943,69.540817000000118],[-67.730834999999956,69.544434000000081],[-67.723052999999993,69.545258000000047],[-67.707229999999981,69.544434000000081],[-67.686661000000015,69.541091999999992],[-67.674712999999883,69.540268000000026],[-67.663329999999974,69.54193099999992],[-67.578063999999983,69.559708000000001],[-67.550277999999935,69.565536000000122],[-67.541381999999999,69.569153000000028],[-67.531386999999995,69.576384999999959],[-67.527221999999995,69.581940000000031],[-67.48443599999996,69.590271000000143],[-67.425002999999947,69.588882000000126],[-67.394454999999994,69.584991000000059],[-67.367217999999923,69.578323000000125],[-67.321395999999993,69.560531999999967],[-67.314437999999996,69.55664100000007],[-67.309433000000013,69.552765000000022],[-67.310546999999929,69.549149000000114]],[[-96.760558999999944,69.54553199999998],[-96.770003999999915,69.543594000000041],[-96.786666999999909,69.54553199999998],[-96.868880999999874,69.555817000000104],[-96.883895999999993,69.55914300000012],[-96.888061999999991,69.563873000000001],[-96.902221999999995,69.5977630000001],[-96.900283999999999,69.602203000000088],[-96.870543999999995,69.601379000000122],[-96.851395000000025,69.599425999999994],[-96.840835999999967,69.597488000000055],[-96.81639100000001,69.590271000000143],[-96.809433000000013,69.585815000000025],[-96.766402999999968,69.554977000000065],[-96.761947999999961,69.55053700000002],[-96.760558999999944,69.54553199999998]],[[-91.110001000000011,69.549423000000047],[-91.119155999999975,69.548324999999977],[-91.140288999999939,69.560806000000071],[-91.142501999999922,69.564986999999974],[-91.136397999999986,69.575546000000031],[-91.121384000000035,69.593048000000067],[-91.108886999999925,69.602203000000088],[-91.037215999999944,69.614990000000091],[-90.969161999999926,69.618317000000047],[-90.959732000000031,69.61943100000002],[-90.937499999999943,69.616379000000109],[-90.923049999999932,69.611374000000069],[-90.920272999999952,69.608032000000094],[-90.919158999999979,69.606093999999985],[-90.930832000000009,69.599152000000061],[-91.110001000000011,69.549423000000047]],[[-133.93222000000003,69.560256999999922],[-133.948059,69.560256999999922],[-133.96304299999997,69.561371000000122],[-133.98611499999998,69.565536000000122],[-134.01196299999992,69.571381000000031],[-134.01666299999994,69.576096000000064],[-134.01419099999998,69.58248900000001],[-134.01028400000001,69.585541000000092],[-133.94528199999996,69.613312000000008],[-133.93362399999995,69.616089000000102],[-133.89446999999996,69.621093999999971],[-133.87997399999995,69.621918000000107],[-133.86581399999994,69.619141000000013],[-133.84472700000003,69.600815000000011],[-133.84695399999998,69.588882000000126],[-133.868042,69.56721500000009],[-133.87719699999997,69.565261999999962],[-133.93222000000003,69.560256999999922]],[[-95.488892000000021,69.565536000000122],[-95.452498999999932,69.550262000000032],[-95.375548999999978,69.517761000000121],[-95.366104000000007,69.513611000000083],[-95.359726000000023,69.509155000000021],[-95.362212999999997,69.498870999999951],[-95.402495999999985,69.383330999999998],[-95.515839000000028,69.330826000000116],[-95.527221999999995,69.327484000000027],[-95.539718999999991,69.325271999999927],[-95.606383999999935,69.319153000000085],[-95.620270000000005,69.318603999999993],[-95.634170999999924,69.318329000000119],[-95.692489999999964,69.319153000000085],[-95.706954999999994,69.319442999999922],[-95.722778000000005,69.320831000000055],[-95.736938000000009,69.324432000000058],[-95.741104000000007,69.329162999999994],[-95.741668999999945,69.334717000000012],[-95.731673999999941,69.373031999999967],[-95.727782999999874,69.378585999999927],[-95.716949,69.382750999999928],[-95.693877999999984,69.389434999999992],[-95.669158999999979,69.394150000000025],[-95.657776000000013,69.397217000000126],[-95.648346000000004,69.403320000000065],[-95.666397000000018,69.497756999999979],[-95.669158999999979,69.50749200000007],[-95.694442999999978,69.540268000000026],[-95.708053999999947,69.548874000000126],[-95.720001000000025,69.552765000000022],[-95.736663999999905,69.554977000000065],[-95.815826000000015,69.562759000000028],[-95.827498999999932,69.559708000000001],[-95.831680000000006,69.554153000000099],[-95.822784000000013,69.514435000000049],[-95.817504999999926,69.504990000000021],[-95.809432999999956,69.495529000000033],[-95.797225999999966,69.481658999999979],[-95.862212999999997,69.348037999999974],[-95.87222300000002,69.34275800000006],[-95.899445000000014,69.340820000000122],[-95.961670000000026,69.346375000000023],[-95.978881999999999,69.349426000000051],[-95.990829000000019,69.353317000000118],[-96.011123999999882,69.478043000000071],[-96.009734999999978,69.483047000000056],[-95.919998000000021,69.595260999999994],[-95.909164000000033,69.599425999999994],[-95.789443999999946,69.634155000000078],[-95.773894999999925,69.632751000000098],[-95.625548999999921,69.616089000000102],[-95.61221299999994,69.61442599999998],[-95.488892000000021,69.565536000000122]],[[-138.86721799999992,69.588318000000015],[-138.87332200000003,69.583054000000061],[-138.88305699999995,69.579437000000098],[-138.91000399999996,69.576096000000064],[-138.945831,69.57887299999993],[-138.97720300000003,69.583054000000061],[-138.99609399999997,69.584152000000131],[-139.02307099999996,69.580826000000059],[-139.03417999999999,69.578048999999965],[-139.05306999999999,69.570540999999992],[-139.12109399999997,69.52915999999999],[-139.137787,69.530823000000112],[-139.33248899999995,69.566085999999927],[-139.32998699999996,69.571655000000135],[-139.32223499999992,69.576096000000064],[-139.26779199999993,69.605820000000051],[-139.24221799999992,69.618317000000047],[-139.23275799999999,69.621918000000107],[-139.19973800000002,69.630538999999999],[-139.14416499999999,69.644989000000123],[-139.13305700000001,69.647766000000047],[-139.12027,69.649993999999992],[-139.10333299999996,69.648041000000035],[-139.02029399999998,69.633331000000112],[-138.95611600000001,69.619705000000124],[-138.92111199999994,69.610535000000084],[-138.88055399999996,69.596939000000134],[-138.872772,69.59275800000006],[-138.86721799999992,69.588318000000015]],[[-135.51724199999995,69.569153000000028],[-135.54305999999997,69.565536000000122],[-135.55721999999997,69.568054000000075],[-135.57138099999997,69.576934999999992],[-135.58111600000001,69.580551000000071],[-135.5883179999999,69.584717000000126],[-135.591095,69.589980999999966],[-135.58944699999989,69.596099999999979],[-135.58612099999993,69.601653999999996],[-135.57888800000001,69.606644000000017],[-135.55471799999992,69.620254999999986],[-135.51196299999998,69.641663000000108],[-135.50030500000003,69.644439999999975],[-135.43972799999995,69.65248100000008],[-135.42388900000003,69.65248100000008],[-135.40972899999991,69.649993999999992],[-135.39779699999997,69.646942000000081],[-135.40917999999999,69.634995000000117],[-135.4655459999999,69.585541000000092],[-135.474152,69.581375000000037],[-135.505585,69.571655000000135],[-135.51724199999995,69.569153000000028]],[[-67.920273000000009,69.521927000000005],[-67.935271999999941,69.518875000000094],[-68.002228000000002,69.526657000000057],[-68.049437999999952,69.533875000000023],[-68.238892000000021,69.570267000000058],[-68.248885999999914,69.596649000000127],[-68.078339000000028,69.665268000000083],[-67.970839999999896,69.701935000000049],[-67.959731999999974,69.704987000000017],[-67.946380999999974,69.706375000000094],[-67.895553999999947,69.708603000000039],[-67.889724999999999,69.708328000000051],[-67.869720000000029,69.700821000000076],[-67.821120999999948,69.676376000000062],[-67.831680000000006,69.601928999999984],[-67.910278000000005,69.526657000000057],[-67.920273000000009,69.521927000000005]],[[-134.26058999999987,68.733535999999958],[-134.23248299999989,68.706100000000106],[-134.22778299999993,68.701385000000073],[-134.22726399999999,68.696426000000088],[-134.23580900000002,68.694977000000108],[-134.26779199999999,68.695816000000093],[-134.35693400000002,68.703049000000078],[-134.38861099999997,68.707214000000079],[-134.436127,68.713608000000136],[-134.45748899999995,68.719147000000135],[-134.46194499999996,68.72387700000013],[-134.49554399999994,68.75221300000004],[-134.53640699999994,68.786926000000051],[-134.66946399999989,68.894440000000145],[-134.741669,68.935531999999967],[-134.75500499999987,68.944427000000019],[-134.76696799999991,68.953323000000125],[-134.78306599999996,68.965355000000045],[-134.82583599999998,68.97886699999998],[-134.85278299999999,68.976379000000009],[-134.89224200000001,68.971924000000001],[-134.90472399999999,68.969986000000006],[-134.91473400000001,68.96665999999999],[-134.92028799999997,68.960815000000082],[-134.91973899999994,68.949417000000096],[-134.91723599999995,68.944138000000066],[-134.91641199999998,68.926926000000094],[-134.92028799999997,68.914703000000031],[-134.92584199999999,68.908600000000092],[-134.93307499999997,68.903594999999996],[-134.94137599999999,68.899429000000112],[-134.96112099999999,68.892487000000017],[-134.97500599999995,68.891663000000051],[-134.99999999999994,68.892082000000073],[-135.00750699999998,68.892212000000029],[-135.12609900000001,68.899429000000112],[-135.14196800000002,68.901382000000069],[-135.167236,68.907211000000075],[-135.17083699999995,68.911102000000142],[-135.17806999999999,68.920822000000044],[-135.18084699999997,68.926085999999998],[-135.20165999999995,68.9327550000001],[-135.23330699999991,68.934708000000001],[-135.262787,68.933594000000028],[-135.36111500000004,68.926651000000049],[-135.39196799999996,68.926651000000049],[-135.42138699999987,68.928864000000033],[-135.444458,68.934981999999934],[-135.45388799999995,68.938582999999994],[-135.46081499999997,68.942749000000106],[-135.76916499999993,68.896378000000084],[-135.808044,68.895264000000111],[-135.843323,68.897217000000069],[-135.88247699999999,68.905258000000117],[-135.90585299999992,68.911376999999959],[-135.94805899999994,68.924698000000092],[-135.99527,68.942474000000061],[-136.00250199999999,68.946640000000002],[-136.00527999999997,68.951935000000049],[-135.98916599999995,69.029160000000104],[-135.98525999999998,69.035812000000021],[-135.97833299999996,69.040817000000061],[-135.96859699999999,69.044434000000024],[-135.95443699999998,69.045532000000094],[-135.88861099999991,69.026093000000003],[-135.85012800000004,69.007401000000129],[-135.83389299999993,68.998322000000144],[-135.82888799999989,68.993591000000038],[-135.80248999999992,68.989426000000037],[-135.77001999999999,68.989150999999993],[-135.64889499999998,68.991928000000087],[-135.63473499999998,68.993042000000059],[-135.57861300000002,69.006104000000107],[-135.52557399999995,69.021102999999982],[-135.51779199999999,69.023880000000077],[-135.529449,69.026931999999988],[-135.72082499999999,69.046097000000145],[-135.91583300000002,69.088318000000129],[-135.92748999999998,69.09137000000004],[-135.93472299999996,69.095535000000041],[-135.95138499999996,69.142761000000064],[-135.96582000000001,69.197754000000089],[-135.96722399999999,69.214706000000092],[-135.95944199999997,69.228317000000061],[-135.94695999999993,69.23942599999998],[-135.92611699999998,69.254715000000033],[-135.915009,69.257492000000127],[-135.89862099999999,69.255554000000018],[-135.89138800000001,69.251389000000017],[-135.82138099999986,69.215271000000143],[-135.75140399999998,69.179428000000087],[-135.74194299999999,69.175812000000064],[-135.66610700000001,69.146941999999967],[-135.65667699999995,69.143600000000049],[-135.56750499999993,69.11775200000011],[-135.55279499999989,69.116652999999928],[-135.48693800000001,69.113312000000121],[-135.49581899999993,69.124145999999996],[-135.60720799999996,69.145264000000054],[-135.6305539999999,69.151382000000012],[-135.64001499999995,69.154984000000127],[-135.81082199999997,69.242751999999996],[-135.83999600000004,69.259430000000066],[-135.85220300000003,69.268051000000014],[-135.85498000000001,69.273315000000139],[-135.8558349999999,69.284714000000065],[-135.85415599999999,69.290817000000004],[-135.84860199999997,69.296936000000017],[-135.8416749999999,69.301926000000094],[-135.83331299999998,69.306366000000082],[-135.80389400000001,69.316666000000055],[-135.79251099999999,69.319442999999922],[-135.57192999999995,69.33859300000006],[-135.5561219999999,69.338882000000012],[-135.48580900000002,69.33526599999999],[-135.44860799999998,69.332214000000022],[-135.41332999999997,69.323043999999982],[-135.39196799999996,69.309981999999991],[-135.38723800000002,69.30525200000011],[-135.379974,69.301086000000055],[-135.37027,69.297484999999995],[-135.32333399999999,69.285262999999986],[-135.25778200000002,69.271378000000084],[-135.24386599999997,69.268600000000106],[-135.22970599999996,69.266098000000056],[-135.18554699999993,69.258880999999917],[-135.17056300000002,69.257766999999944],[-135.16223099999996,69.261931999999945],[-135.15805099999994,69.268600000000106],[-135.15835599999997,69.274429000000112],[-135.16500899999994,69.279160000000047],[-135.17443800000001,69.283051000000114],[-135.23971599999987,69.3316650000001],[-135.28695699999992,69.413605000000018],[-135.28723100000002,69.419144000000017],[-135.28527800000001,69.425537000000134],[-135.278076,69.430542000000003],[-135.26834099999996,69.434143000000063],[-135.16082800000004,69.473602000000142],[-135.15084799999994,69.476929000000098],[-135.137787,69.478592000000049],[-134.99664300000001,69.48414600000001],[-134.91528299999993,69.485259999999982],[-134.69473300000004,69.481658999999979],[-134.67749000000003,69.480819999999994],[-134.64251699999988,69.477203000000031],[-134.62832599999996,69.474426000000108],[-134.60861199999988,69.468597000000102],[-134.570831,69.453873000000044],[-134.55917399999987,69.450821000000133],[-134.53112799999997,69.445526000000086],[-134.49609399999997,69.441925000000026],[-134.48165900000004,69.442748999999992],[-134.46859699999993,69.444427000000076],[-134.43832399999997,69.454712000000029],[-134.42083699999995,69.463042999999914],[-134.413635,69.468322999999998],[-134.40777600000001,69.474152000000004],[-134.40557899999993,69.480270000000132],[-134.40835600000003,69.491364000000033],[-134.41778599999992,69.500549000000092],[-134.43667600000003,69.508041000000048],[-134.44833399999999,69.511107999999922],[-134.46887200000003,69.542755000000056],[-134.40167199999996,69.638321000000133],[-134.40249600000004,69.649719000000005],[-134.406677,69.654434000000037],[-134.44277999999997,69.68081699999999],[-134.48580899999996,69.706100000000049],[-134.49054000000001,69.710815000000082],[-134.49304199999995,69.715819999999951],[-134.49108899999993,69.722214000000008],[-134.47637900000001,69.723037999999974],[-134.30972299999996,69.715819999999951],[-134.20388799999995,69.668868999999972],[-134.17748999999998,69.64027400000009],[-134.19638099999992,69.621093999999971],[-134.20388799999995,69.616089000000102],[-134.24026500000002,69.585815000000025],[-134.24472000000003,69.579162999999994],[-134.24472000000003,69.573318000000029],[-134.24221799999998,69.568054000000075],[-134.11331200000001,69.538879000000009],[-134.09860199999997,69.539978000000019],[-134.08111600000001,69.548324999999977],[-134.06195099999997,69.555817000000104],[-134.03750600000001,69.560256999999922],[-134.02001999999999,69.559417999999994],[-134.00836200000003,69.556091000000038],[-134.00140399999998,69.551926000000037],[-133.97778299999999,69.528594999999996],[-133.96112099999999,69.509155000000021],[-133.94723499999992,69.506378000000097],[-133.91833499999996,69.508331000000055],[-133.87914999999998,69.513321000000076],[-133.86749299999997,69.515822999999955],[-133.86026000000004,69.520828000000051],[-133.82250999999997,69.555252000000053],[-133.823151,69.5600740000001],[-133.81973300000004,69.564986999999974],[-133.801941,69.573608000000092],[-133.79168699999997,69.576934999999992],[-133.77835099999993,69.576384999999959],[-133.75057999999996,69.547485000000108],[-133.74832199999992,69.542205999999965],[-133.79861500000004,69.481094000000098],[-133.81805399999996,69.464157000000114],[-133.85055499999999,69.445816000000093],[-133.87692300000003,69.433044000000109],[-133.92083699999995,69.412201000000039],[-133.94137599999999,69.405258000000003],[-133.96444699999995,69.400269000000037],[-134.08554100000003,69.340546000000018],[-134.21112099999993,69.276092999999946],[-134.21832299999988,69.271103000000096],[-134.27557400000001,69.226089000000115],[-134.27999899999986,69.219437000000028],[-134.28222699999998,69.213318000000015],[-134.28195199999999,69.20748900000001],[-134.27722199999994,69.202773999999977],[-134.27471899999995,69.197754000000089],[-134.27444500000001,69.186096000000077],[-134.28030399999994,69.180267000000072],[-134.287781,69.175262000000032],[-134.38363599999997,69.11831699999999],[-134.39779699999997,69.117477000000122],[-134.44888300000002,69.119705000000067],[-134.47720300000003,69.118042000000116],[-134.53112799999997,69.112762000000089],[-134.5680539999999,69.106644000000131],[-134.58526599999999,69.098038000000031],[-134.67361500000004,69.017761000000007],[-134.67584199999993,69.01138300000008],[-134.675568,69.005829000000062],[-134.66973899999999,68.9727630000001],[-134.67166099999997,68.966385000000002],[-134.66665599999999,68.956100000000049],[-134.65280200000001,68.947754000000145],[-134.60665900000004,68.935256999999979],[-134.58831799999996,68.928040000000067],[-134.51419099999987,68.887496999999996],[-134.50723300000004,68.883041000000048],[-134.48858599999994,68.870254999999986],[-134.47470099999998,68.856093999999985],[-134.46417199999991,68.84248400000007],[-134.45693999999997,68.826934999999992],[-134.44750999999991,68.811920000000043],[-134.44027700000004,68.80192599999998],[-134.43112199999996,68.792755000000056],[-134.417236,68.784423999999944],[-134.39889499999998,68.777205999999978],[-134.37609899999995,68.770827999999995],[-134.3511049999999,68.764998999999989],[-134.29666099999992,68.754440000000102],[-134.28750599999995,68.75082400000008],[-134.28057899999999,68.746643000000006],[-134.26058999999987,68.733535999999958]],[[-102.14527900000002,69.648604999999975],[-102.16027800000001,69.648331000000042],[-102.17832900000002,69.651093000000003],[-102.21028099999995,69.662200999999982],[-102.22609699999992,69.670258000000103],[-102.23166700000002,69.674698000000149],[-102.24305699999996,69.694138000000123],[-102.243607,69.704436999999984],[-102.24137899999999,69.71026599999999],[-102.23416099999997,69.716660000000047],[-102.22556299999991,69.721924000000001],[-102.21584300000001,69.726654000000053],[-102.15778399999999,69.736099000000081],[-102.13474300000001,69.724701000000096],[-102.12943999999993,69.72026100000005],[-102.12332199999997,69.71276899999998],[-102.12026999999989,69.708038000000045],[-102.11721799999998,69.697753999999975],[-102.11554699999999,69.666655999999989],[-102.11805700000002,69.660812000000135],[-102.12277199999994,69.65498400000007],[-102.13221699999991,69.650542999999971],[-102.14527900000002,69.648604999999975]],[[-77.946655000000021,69.646652000000074],[-77.944992000000013,69.639709000000039],[-77.946105999999986,69.633331000000112],[-77.965835999999967,69.624985000000038],[-78.07028200000002,69.59275800000006],[-78.169997999999964,69.570540999999992],[-78.311934999999949,69.54304500000012],[-78.397780999999952,69.520828000000051],[-78.505004999999869,69.488876000000062],[-78.576401000000033,69.501663000000065],[-78.588057999999933,69.506103999999993],[-78.611388999999917,69.509430000000009],[-78.626098999999954,69.50999500000006],[-78.646117999999888,69.50999500000006],[-78.664443999999889,69.50749200000007],[-78.685271999999941,69.49832200000003],[-78.698043999999982,69.489151000000049],[-78.718886999999938,69.479980000000126],[-78.756957999999941,69.467484000000013],[-78.801940999999943,69.455826000000002],[-78.817504999999926,69.45277400000009],[-78.838608000000022,69.451385000000073],[-78.853058000000033,69.454163000000108],[-78.861938000000009,69.457489000000123],[-78.868331999999953,69.460541000000035],[-78.873885999999857,69.464706000000035],[-78.880279999999971,69.476929000000098],[-78.87860099999989,69.479980000000126],[-78.874160999999958,69.486923000000104],[-78.865004999999996,69.494980000000112],[-78.841385000000002,69.508041000000048],[-78.826110999999969,69.511657999999954],[-78.809722999999963,69.514160000000061],[-78.783324999999991,69.521103000000039],[-78.764175000000023,69.527205999999978],[-78.717772999999966,69.544708000000014],[-78.695266999999944,69.556931000000077],[-78.674438000000009,69.568329000000062],[-78.652785999999935,69.581940000000031],[-78.628051999999968,69.608597000000145],[-78.615554999999915,69.617477000000008],[-78.586394999999925,69.631927000000132],[-78.575835999999981,69.636383000000023],[-78.522506999999905,69.648331000000042],[-78.499724999999899,69.650542999999971],[-78.482772999999895,69.649428999999941],[-78.400283999999999,69.643326000000002],[-78.260833999999932,69.659987999999998],[-78.245270000000005,69.663605000000132],[-78.229445999999996,69.67164600000001],[-78.228057999999976,69.677475000000072],[-78.236938000000009,69.688583000000051],[-78.244995000000017,69.693313999999987],[-78.256957999999941,69.705825999999945],[-78.263625999999931,69.713608000000079],[-78.26916499999993,69.728043000000014],[-78.268615999999952,69.732208000000014],[-78.265838999999971,69.733871000000136],[-78.180557000000022,69.75221300000004],[-78.164168999999958,69.752486999999974],[-78.154174999999952,69.750549000000035],[-78.141953000000001,69.742477000000065],[-78.080001999999979,69.72943099999992],[-78.018341000000021,69.708328000000051],[-77.992767000000015,69.699417000000096],[-77.982773000000009,69.694702000000063],[-77.973891999999978,69.688583000000051],[-77.966110000000015,69.681655999999975],[-77.955565999999976,69.668319999999994],[-77.946655000000021,69.646652000000074]],[[-82.507781999999963,69.704987000000017],[-82.542770000000019,69.704163000000051],[-82.678878999999995,69.726379000000009],[-82.720001000000025,69.733321999999987],[-82.865004999999996,69.770827999999995],[-82.877776999999924,69.774994000000049],[-82.879439999999931,69.778595000000109],[-82.856383999999991,69.800261999999975],[-82.846664000000033,69.803040000000124],[-82.839171999999962,69.80386400000009],[-82.811661000000015,69.806090999999981],[-82.803054999999915,69.805817000000047],[-82.796111999999994,69.805251999999996],[-82.776108000000022,69.804153000000042],[-82.677779999999927,69.794707999999957],[-82.629990000000021,69.789153999999996],[-82.563889000000017,69.778595000000109],[-82.460281000000009,69.761658000000125],[-82.453063999999983,69.720534999999984],[-82.455001999999922,69.714432000000045],[-82.467223999999987,69.709990999999945],[-82.507781999999963,69.704987000000017]],[[-79.423049999999989,69.784988000000055],[-79.331680000000006,69.713318000000072],[-79.328338999999971,69.707214000000079],[-79.329452999999944,69.701385000000016],[-79.333892999999989,69.697478999999987],[-79.354720999999984,69.688034000000073],[-79.482223999999917,69.646103000000096],[-79.544997999999964,69.626647999999932],[-79.571670999999981,69.61943100000002],[-79.600280999999995,69.612761999999975],[-79.631667999999934,69.608871000000079],[-79.957503999999972,69.619979999999998],[-79.963333000000034,69.626373000000115],[-79.974166999999852,69.631652999999972],[-79.994995000000017,69.638596000000007],[-80.02194199999991,69.643599999999935],[-80.038054999999986,69.645263999999941],[-80.059432999999899,69.64387499999998],[-80.065552000000025,69.641663000000108],[-80.081954999999994,69.630538999999999],[-80.082779000000016,69.626923000000147],[-80.078887999999949,69.622208000000114],[-80.032776000000013,69.587204000000042],[-79.991378999999938,69.568878000000041],[-79.937774999999931,69.531937000000084],[-79.935546999999985,69.527205999999978],[-79.93638599999997,69.523604999999918],[-79.940276999999924,69.518875000000094],[-79.974441999999954,69.502213000000097],[-79.993880999999931,69.494431000000134],[-80.011948000000018,69.491652999999985],[-80.021117999999944,69.49275200000011],[-80.046111999999937,69.497756999999979],[-80.200561999999991,69.530823000000112],[-80.214721999999995,69.586655000000064],[-80.353606999999954,69.614700000000084],[-80.461944999999957,69.656372000000147],[-80.492767000000015,69.664993000000038],[-80.577788999999996,69.667480000000126],[-80.74360699999994,69.666092000000049],[-80.761123999999995,69.666930999999977],[-80.793334999999956,69.670258000000103],[-80.804442999999878,69.675537000000077],[-80.809433000000013,69.683044000000052],[-80.809433000000013,69.68942300000009],[-80.801392000000021,69.701096000000121],[-80.730835000000013,69.746368000000132],[-80.725006000000008,69.74914600000011],[-80.720275999999899,69.750549000000035],[-80.649733999999967,69.748596000000077],[-80.520003999999972,69.720825000000048],[-80.498610999999983,69.759719999999959],[-80.50111400000003,69.762497000000053],[-80.502791999999943,69.76638800000012],[-80.504455999999948,69.774994000000049],[-80.503066999999987,69.779984000000127],[-80.499999999999943,69.783324999999991],[-80.490554999999972,69.788589000000115],[-80.46665999999999,69.791931000000091],[-80.388901000000033,69.799988000000042],[-80.371384000000035,69.799149000000057],[-80.340285999999992,69.794707999999957],[-80.338607999999908,69.790542999999957],[-80.343063000000029,69.784149000000127],[-80.34445199999999,69.776931999999988],[-80.329726999999991,69.774155000000121],[-80.314712999999983,69.778045999999961],[-80.289444000000003,69.786652000000061],[-80.264175000000023,69.79525799999999],[-80.246657999999968,69.798599000000024],[-80.232773000000009,69.79942299999999],[-80.20666499999993,69.798035000000084],[-80.191665999999884,69.79525799999999],[-80.182769999999948,69.792755000000056],[-80.129165999999941,69.765549000000021],[-80.073058999999944,69.74971000000005],[-79.972778000000005,69.723312000000078],[-79.862777999999935,69.741088999999988],[-79.768065999999976,69.75277699999998],[-79.756392999999889,69.778869999999927],[-79.752501999999993,69.783599999999979],[-79.744720000000029,69.788589000000115],[-79.687209999999993,69.814697000000081],[-79.678329000000019,69.814423000000147],[-79.512787000000003,69.80693100000002],[-79.476943999999946,69.803589000000102],[-79.453888000000006,69.798874000000069],[-79.442489999999907,69.794983000000002],[-79.431670999999938,69.789703000000088],[-79.423049999999989,69.784988000000055]],[[-83.674437999999952,69.719986000000063],[-83.688598999999954,69.719436999999914],[-83.717772999999966,69.723312000000078],[-83.776947000000007,69.732758000000047],[-83.806945999999982,69.739426000000037],[-83.898894999999982,69.764434999999992],[-83.908614999999998,69.769150000000025],[-83.917220999999984,69.778595000000109],[-83.913054999999986,69.793320000000051],[-83.900833000000034,69.808318999999926],[-83.886948000000018,69.81860400000005],[-83.873885999999914,69.823044000000095],[-83.860274999999945,69.824432000000002],[-83.832503999999972,69.825272000000041],[-83.577498999999989,69.797760000000096],[-83.533324999999934,69.791366999999923],[-83.529174999999952,69.786652000000061],[-83.542220999999984,69.783324999999991],[-83.576675000000023,69.780823000000055],[-83.601944000000003,69.779984000000127],[-83.695830999999998,69.763884999999959],[-83.708618000000001,69.759429999999952],[-83.712783999999999,69.754440000000102],[-83.705840999999964,69.750000000000057],[-83.693329000000006,69.745529000000147],[-83.662506000000008,69.736923000000047],[-83.655838000000017,69.732208000000014],[-83.654175000000009,69.727203000000145],[-83.661117999999988,69.722214000000008],[-83.674437999999952,69.719986000000063]],[[-82.429442999999992,69.782210999999961],[-82.444153000000028,69.778320000000122],[-82.470551,69.781372000000033],[-82.513335999999867,69.788315000000011],[-82.526107999999965,69.790542999999957],[-82.551392000000021,69.796646000000123],[-82.564437999999996,69.800812000000008],[-82.688599000000011,69.850815000000125],[-82.674438000000009,69.874984999999981],[-82.673049999999989,69.875809000000118],[-82.660552999999993,69.876083000000051],[-82.636397999999986,69.871094000000085],[-82.555831999999953,69.860809000000131],[-82.517226999999934,69.854155999999989],[-82.446105999999986,69.822220000000129],[-82.436661000000015,69.817490000000078],[-82.428878999999938,69.812195000000031],[-82.426666000000012,69.799988000000042],[-82.425827000000027,69.793045000000063],[-82.426101999999958,69.786925999999994],[-82.429442999999992,69.782210999999961]],[[-91.520003999999915,69.731369000000086],[-91.535278000000005,69.726929000000041],[-91.549438000000009,69.727203000000145],[-91.560271999999884,69.728316999999947],[-91.725280999999995,69.784149000000127],[-91.735549999999989,69.789153999999996],[-91.733321999999873,69.791931000000091],[-91.475829999999974,69.875534000000073],[-91.449432000000002,69.879149999999981],[-91.433883999999978,69.880538999999942],[-91.419448999999986,69.879974000000118],[-91.409164000000033,69.874984999999981],[-91.456664999999987,69.774994000000049],[-91.463332999999977,69.763611000000026],[-91.470551,69.755554000000075],[-91.520003999999915,69.731369000000086]],[[-91.819167999999934,69.821655000000078],[-91.833892999999989,69.821105999999929],[-91.844727000000034,69.822220000000129],[-91.860001000000011,69.838593000000003],[-91.864166000000012,69.844146999999964],[-91.860549999999989,69.848877000000016],[-91.84944200000001,69.858871000000022],[-91.821120999999891,69.868042000000003],[-91.782501000000025,69.877762000000075],[-91.763901000000033,69.880264000000125],[-91.745543999999995,69.881653000000142],[-91.728607000000011,69.880813999999987],[-91.71305799999999,69.878310999999997],[-91.701110999999969,69.875259000000085],[-91.644454999999937,69.859421000000054],[-91.639724999999999,69.854980000000126],[-91.651671999999962,69.851089000000059],[-91.666397000000018,69.847487999999998],[-91.819167999999934,69.821655000000078]],[[-97.397781000000009,69.685532000000023],[-97.41194200000001,69.684708000000057],[-97.441939999999931,69.685532000000023],[-97.455841000000021,69.684708000000057],[-97.468338000000017,69.682480000000112],[-97.479720999999984,69.678864000000033],[-97.489440999999999,69.673874000000012],[-97.490279999999871,69.668594000000098],[-97.476944000000003,69.654709000000025],[-97.398346000000004,69.597488000000055],[-97.391388000000006,69.593323000000055],[-97.378875999999934,69.592484000000127],[-97.372771999999998,69.598328000000095],[-97.351943999999946,69.631362999999965],[-97.350829999999974,69.636658000000068],[-97.347504000000015,69.642212000000029],[-97.329726999999878,69.669708000000071],[-97.31639100000001,69.686645999999996],[-97.303878999999938,69.698317999999915],[-97.289168999999958,69.69802900000002],[-97.273894999999982,69.694702000000063],[-97.226395000000025,69.675537000000077],[-97.206954999999937,69.667480000000126],[-97.113892000000021,69.622208000000114],[-97.106948999999929,69.617751999999996],[-97.103607000000011,69.614150999999936],[-97.101944000000003,69.609146000000067],[-97.102782999999931,69.603867000000093],[-97.09944200000001,69.594147000000021],[-97.09056099999998,69.584991000000059],[-97.064437999999939,69.572769000000108],[-96.955565999999976,69.523315000000082],[-96.879165999999998,69.491364000000033],[-96.866942999999992,69.487762000000089],[-96.637786999999946,69.437194999999974],[-96.502501999999936,69.409714000000122],[-96.32028200000002,69.354705999999965],[-96.301391999999964,69.346648999999957],[-96.208892999999989,69.306931000000134],[-96.202224999999942,69.302765000000022],[-96.189986999999974,69.288879000000065],[-96.172226000000023,69.26527400000009],[-96.170546999999999,69.260544000000039],[-96.171935999999903,69.255264000000011],[-96.175551999999925,69.249709999999993],[-96.193329000000006,69.237488000000042],[-96.203339000000028,69.232482999999945],[-96.209732000000031,69.22665399999994],[-96.21305799999999,69.211105000000032],[-96.223617999999931,69.141936999999928],[-96.235000999999954,69.064148000000102],[-96.23361199999988,69.059418000000051],[-96.229720999999984,69.054703000000018],[-96.225554999999986,69.049987999999985],[-96.218886999999995,69.045822000000101],[-96.195266999999944,69.038315000000011],[-96.166396999999904,69.031371999999976],[-96.1324919999999,69.024994000000049],[-96.118880999999931,69.025542999999971],[-96.115279999999984,69.030823000000055],[-96.113891999999964,69.036102000000028],[-96.129990000000021,69.054703000000018],[-96.152221999999995,69.103043000000071],[-96.15695199999999,69.163315000000068],[-96.155838000000017,69.168594000000041],[-96.149444999999901,69.174423000000047],[-96.073623999999995,69.231658999999979],[-96.05972300000002,69.232208000000128],[-96.047774999999888,69.228317000000061],[-96.041107000000011,69.223877000000073],[-95.955565999999919,69.141936999999928],[-95.951675000000023,69.13749700000011],[-95.924438000000009,69.089432000000102],[-95.925827000000027,69.084427000000062],[-95.93472300000002,69.078323000000012],[-95.953612999999905,69.067215000000033],[-95.971389999999928,69.054976999999951],[-95.977782999999988,69.049149000000057],[-95.978881999999999,69.043868999999972],[-95.97084000000001,69.034714000000122],[-95.938599000000011,69.003876000000105],[-95.925551999999982,68.995255000000043],[-95.843886999999995,68.923035000000027],[-95.82028200000002,68.870254999999986],[-95.770554000000004,68.891098000000056],[-95.756957999999997,68.891373000000044],[-95.745833999999945,68.888596000000121],[-95.674163999999962,68.869980000000112],[-95.670272999999895,68.865540000000124],[-95.668609999999944,68.860535000000084],[-95.667495999999971,68.855545000000006],[-95.671386999999982,68.850266000000033],[-95.667220999999984,68.835266000000047],[-95.663329999999974,68.830826000000059],[-95.654175000000009,68.826659999999947],[-95.626098999999954,68.826659999999947],[-95.575835999999981,68.830276000000026],[-95.550277999999878,68.833054000000004],[-95.528335999999911,68.840271000000087],[-95.510284000000013,68.852478000000076],[-95.489989999999977,68.861649000000057],[-95.446655000000021,68.879149999999981],[-95.42471299999994,68.886658000000011],[-95.389998999999989,68.895264000000111],[-95.378052000000025,68.89776599999999],[-95.365004999999996,68.899155000000007],[-95.351395000000025,68.899429000000112],[-95.335555999999997,68.897217000000069],[-95.321395999999993,68.893600000000106],[-95.240279999999984,68.86692800000003],[-95.228881999999942,68.863037000000134],[-95.21055599999994,68.854706000000022],[-95.206954999999994,68.850266000000033],[-95.210830999999985,68.844711000000132],[-95.263061999999991,68.802765000000136],[-95.273055999999997,68.797485000000108],[-95.476395000000025,68.711929000000112],[-95.543610000000001,68.702484000000027],[-95.539992999999924,68.708038000000045],[-95.538895000000025,68.713318000000129],[-95.538895000000025,68.723312000000135],[-95.546386999999982,68.732483000000059],[-95.559433000000013,68.741364000000033],[-95.568344000000025,68.745529000000033],[-95.593886999999938,68.752777000000037],[-95.608046999999885,68.753326000000129],[-95.621932999999956,68.752777000000037],[-95.790558000000033,68.737198000000092],[-95.801666000000012,68.733870999999965],[-95.848343,68.669983000000116],[-95.859726000000023,68.653320000000065],[-95.988891999999964,68.62164300000012],[-96.000838999999928,68.61943100000002],[-96.14973399999991,68.55720500000001],[-96.256393000000003,68.503326000000015],[-96.262512000000015,68.497481999999991],[-96.264724999999885,68.487198000000149],[-96.270844000000011,68.481368999999972],[-96.291381999999942,68.473038000000031],[-96.30221599999993,68.469711000000132],[-96.313888999999961,68.467209000000025],[-96.503615999999909,68.446091000000138],[-96.530563000000029,68.444976999999994],[-96.717498999999918,68.474990999999989],[-96.768341000000021,68.485260000000039],[-96.913895000000025,68.518051000000128],[-96.928328999999962,68.521378000000084],[-97.094451999999876,68.539154000000053],[-97.095550999999944,68.534149000000014],[-97.098891999999978,68.528594999999996],[-97.11999499999996,68.520828000000051],[-97.130828999999949,68.517487000000017],[-97.142501999999979,68.514999000000046],[-97.154175000000009,68.512771999999984],[-97.181106999999997,68.511382999999967],[-97.460007000000019,68.534149000000014],[-97.475005999999951,68.535537999999974],[-97.506118999999956,68.541930999999977],[-97.553329000000019,68.55664100000007],[-97.574172999999917,68.564148000000046],[-97.583618000000001,68.568054000000075],[-97.667220999999927,68.60386699999998],[-97.727218999999991,68.63220199999995],[-97.918609999999944,68.675537000000134],[-98.020554000000004,68.693588000000091],[-98.035552999999936,68.694702000000063],[-98.049987999999985,68.694977000000108],[-98.062774999999988,68.693588000000091],[-98.078338999999971,68.683319000000097],[-98.083892999999989,68.677475000000072],[-98.09333799999996,68.672211000000061],[-98.104995999999971,68.669708000000128],[-98.11999499999996,68.670822000000101],[-98.129715000000033,68.674698000000149],[-98.240279999999984,68.720825000000048],[-98.261123999999938,68.733597000000032],[-98.281677000000002,68.746368000000132],[-98.290558000000033,68.755554000000075],[-98.292495999999971,68.760543999999982],[-98.291945999999939,68.765823000000125],[-98.286117999999931,68.771652000000131],[-98.269729999999981,68.783875000000023],[-98.260833999999932,68.789153999999996],[-98.249161000000015,68.800812000000008],[-98.243056999999965,68.811920000000043],[-98.244155999999975,68.822220000000129],[-98.263061999999991,68.829987000000074],[-98.275283999999886,68.833602999999982],[-98.369719999999973,68.857483000000116],[-98.383330999999941,68.859985000000052],[-98.408051,68.855820000000051],[-98.418609999999944,68.852478000000076],[-98.425003000000004,68.841370000000097],[-98.415282999999988,68.815262000000132],[-98.40194699999995,68.801650999999993],[-98.393615999999952,68.787201000000039],[-98.394729999999925,68.776932000000045],[-98.400283999999942,68.770827999999995],[-98.408614999999941,68.764708999999982],[-98.418609999999944,68.760543999999982],[-98.451110999999969,68.750000000000114],[-98.476395000000025,68.746933000000013],[-98.489990000000034,68.746094000000028],[-98.519454999999994,68.747481999999934],[-98.724715999999887,68.791092000000106],[-98.84722899999997,68.825546000000145],[-98.859436000000017,68.829163000000108],[-98.866394000000014,68.833328000000108],[-98.875548999999978,68.84248400000007],[-98.879714999999976,68.852203000000088],[-98.879165999999941,68.857483000000116],[-98.86999499999996,68.874146000000053],[-98.864440999999999,68.879974000000118],[-98.856383999999991,68.886383000000023],[-98.847503999999958,68.891663000000051],[-98.826675000000023,68.899429000000112],[-98.817504999999869,68.904709000000025],[-98.811934999999949,68.910538000000031],[-98.811385999999914,68.915817000000004],[-98.820556999999951,68.924987999999928],[-98.827498999999989,68.929152999999928],[-98.84944200000001,68.933594000000028],[-98.965835999999967,68.949417000000096],[-98.981109999999944,68.950546000000031],[-98.993057000000022,68.947754000000145],[-99.077498999999989,68.918319999999994],[-99.09584000000001,68.899429000000112],[-99.076401000000033,68.891663000000051],[-99.062209999999936,68.883041000000048],[-99.043883999999935,68.864990000000091],[-99.044158999999866,68.859711000000118],[-99.176102000000014,68.825821000000019],[-99.188599000000011,68.824158000000068],[-99.21055599999994,68.831664999999987],[-99.236664000000019,68.848877000000016],[-99.24610899999999,68.852768000000083],[-99.267226999999991,68.859146000000067],[-99.311385999999914,68.868866000000139],[-99.413329999999974,68.884155000000021],[-99.428054999999972,68.887206999999989],[-99.437774999999988,68.891098000000056],[-99.444992000000013,68.895538000000045],[-99.449722000000008,68.899993999999992],[-99.454178000000013,68.909714000000065],[-99.451110999999912,68.915268000000026],[-99.447768999999994,68.926085999999998],[-99.448882999999967,68.936645999999996],[-99.450835999999981,68.941650000000095],[-99.460555999999997,68.950821000000076],[-99.489166000000012,68.967484000000127],[-99.523330999999871,68.983596999999975],[-99.562499999999943,68.99914600000011],[-99.589721999999881,69.011108000000036],[-99.594161999999983,69.015823000000069],[-99.596389999999928,69.020538000000101],[-99.596114999999998,69.025818000000015],[-99.593338000000017,69.031371999999976],[-99.579880000000003,69.043930000000046],[-99.513625999999874,69.101929000000098],[-99.492217999999866,69.1202550000001],[-99.485824999999977,69.125259000000028],[-99.476943999999946,69.13081399999993],[-99.466659999999933,69.13499500000006],[-99.311385999999914,69.158875000000023],[-99.296660999999972,69.158600000000035],[-99.238051999999982,69.149719000000061],[-99.168334999999956,69.138321000000076],[-99.035278000000005,69.135818000000086],[-99.006957999999997,69.136383000000137],[-98.798049999999989,69.17053199999998],[-98.774445000000014,69.17553700000002],[-98.730559999999969,69.189423000000033],[-98.720275999999956,69.193863000000022],[-98.711120999999991,69.199141999999995],[-98.702788999999996,69.205261000000007],[-98.699722000000008,69.210815000000025],[-98.701110999999969,69.220825000000104],[-98.705275999999969,69.230820000000051],[-98.615554999999915,69.294708000000071],[-98.533889999999928,69.291367000000037],[-98.441375999999877,69.298035000000027],[-98.415558000000033,69.301086000000055],[-98.403335999999967,69.303588999999988],[-98.393341000000021,69.308029000000033],[-98.387512000000015,69.313873000000058],[-98.384170999999981,69.319442999999922],[-98.388061999999991,69.329162999999994],[-98.397232000000031,69.338318000000072],[-98.44027699999998,69.363876000000005],[-98.457229999999981,69.371917999999994],[-98.476944000000003,69.379974000000061],[-98.488892000000021,69.383605999999986],[-98.523330999999985,69.388321000000019],[-98.535552999999936,69.391937000000098],[-98.555556999999965,69.399994000000049],[-98.562499999999943,69.404159999999933],[-98.598052999999993,69.430542000000003],[-98.611937999999952,69.444138000000009],[-98.608886999999868,69.449706999999989],[-98.591675000000009,69.467484000000013],[-98.585555999999997,69.473312000000135],[-98.577224999999999,69.479430999999977],[-98.563323999999909,69.477203000000031],[-98.553329000000019,69.473312000000135],[-98.540833000000021,69.469711000000075],[-98.508347000000015,69.463318000000129],[-98.477492999999924,69.461928999999941],[-98.447768999999994,69.461655000000007],[-98.422501000000011,69.465820000000008],[-98.419448999999986,69.47137499999991],[-98.424164000000019,69.475815000000125],[-98.44888299999991,69.483047000000056],[-98.463897999999972,69.486374000000012],[-98.549438000000009,69.501389000000131],[-98.564712999999927,69.504715000000147],[-98.577224999999999,69.508331000000055],[-98.586944999999901,69.512207000000103],[-98.601669000000015,69.520828000000051],[-98.605559999999912,69.530548000000124],[-98.604995999999971,69.535812000000078],[-98.601943999999946,69.541091999999992],[-98.592772999999909,69.552765000000022],[-98.575561999999991,69.570267000000058],[-98.566955999999948,69.576384999999959],[-98.556655999999862,69.580826000000059],[-98.531386999999938,69.584991000000059],[-98.501403999999923,69.584427000000119],[-98.485549999999989,69.583327999999995],[-98.433318999999983,69.575546000000031],[-98.385559000000001,69.566085999999927],[-98.357773000000009,69.55914300000012],[-98.350554999999929,69.554703000000131],[-98.338897999999972,69.546097000000032],[-98.334166999999979,69.54136699999998],[-98.322509999999909,69.532486000000063],[-98.310821999999973,69.523880000000133],[-98.28443900000002,69.506378000000097],[-98.248610999999983,69.484984999999995],[-98.092498999999975,69.424988000000042],[-98.078613000000018,69.422760000000039],[-98.049727999999959,69.423035000000084],[-98.036666999999852,69.424698000000035],[-98.024719000000005,69.427200000000084],[-98.00389100000001,69.435806000000014],[-97.997771999999998,69.441650000000038],[-97.99722300000002,69.446930000000066],[-98.006957999999997,69.450821000000133],[-98.071395999999993,69.468872000000147],[-98.157226999999978,69.4994200000001],[-98.166945999999996,69.503326000000015],[-98.188599000000011,69.516098],[-98.211394999999925,69.538879000000009],[-98.255843999999968,69.574707000000046],[-98.263061999999991,69.57887299999993],[-98.295837000000006,69.585266000000104],[-98.330291999999986,69.590271000000143],[-98.360549999999932,69.596649000000127],[-98.367767000000015,69.601089000000115],[-98.321670999999981,69.713608000000079],[-98.314163000000008,69.722214000000008],[-98.281951999999933,69.751663000000008],[-98.230285999999978,69.788879000000122],[-98.211120999999991,69.79942299999999],[-98.199722000000008,69.802765000000136],[-98.187209999999936,69.805251999999996],[-98.143889999999942,69.806366000000025],[-98.118057000000022,69.81053200000008],[-98.107772999999895,69.814697000000081],[-98.088608000000022,69.825272000000041],[-98.079726999999991,69.83137499999998],[-98.061661000000015,69.848877000000016],[-98.058333999999888,69.854431000000034],[-98.049164000000019,69.865814],[-98.043059999999969,69.871643000000006],[-98.034164000000033,69.878036000000009],[-98.012222000000008,69.885817999999972],[-97.999725000000012,69.888046000000088],[-97.974166999999909,69.892211999999972],[-97.945540999999992,69.893600000000106],[-97.930557000000022,69.893325999999945],[-97.913329999999974,69.891098],[-97.880279999999914,69.88499500000006],[-97.755004999999926,69.851379000000065],[-97.691101000000003,69.819992000000127],[-97.689162999999951,69.815262000000132],[-97.682219999999973,69.810806000000014],[-97.660004000000015,69.803314000000057],[-97.610000999999954,69.788589000000115],[-97.579726999999991,69.781937000000028],[-97.449158000000011,69.760269000000108],[-97.341109999999958,69.706375000000094],[-97.33944699999995,69.701385000000016],[-97.348052999999879,69.695251000000042],[-97.358611999999994,69.690810999999997],[-97.37110899999999,69.688583000000051],[-97.397781000000009,69.685532000000023]],[[-97.325012000000015,69.889160000000061],[-97.315276999999924,69.888046000000088],[-97.301665999999955,69.889709000000039],[-97.289992999999924,69.893051000000128],[-97.276947000000007,69.894440000000145],[-97.267775999999969,69.894440000000145],[-97.25,69.891373000000044],[-97.237503000000004,69.887771999999984],[-97.230559999999912,69.883331000000055],[-97.226943999999946,69.873596000000134],[-97.230559999999912,69.868042000000003],[-97.236937999999896,69.862198000000149],[-97.243880999999988,69.857483000000116],[-97.269164999999987,69.852478000000076],[-97.283889999999985,69.852768000000083],[-97.299163999999905,69.856094000000098],[-97.308883999999978,69.860260000000039],[-97.317779999999914,69.869431000000134],[-97.418334999999956,69.893600000000106],[-97.448883000000023,69.894149999999911],[-97.465835999999911,69.896378000000084],[-97.480285999999921,69.898880000000133],[-97.488892000000021,69.908035000000041],[-97.492767000000015,69.917755000000113],[-97.488602000000014,69.943863000000079],[-97.485000999999954,69.949417000000039],[-97.476105000000018,69.955551000000071],[-97.466399999999965,69.960815000000082],[-97.453612999999962,69.963043000000027],[-97.4375,69.961929000000055],[-97.350829999999974,69.949417000000039],[-97.335555999999997,69.946091000000024],[-97.328339000000028,69.941650000000095],[-97.327498999999989,69.931656000000089],[-97.346114999999998,69.917205999999965],[-97.349730999999963,69.911651999999947],[-97.351669000000015,69.901382000000012],[-97.347228999999913,69.896652000000017],[-97.337509000000011,69.892761000000121],[-97.325012000000015,69.889160000000061]],[[-100.84973099999991,69.925537000000077],[-100.86389199999991,69.924698000000092],[-100.87444299999999,69.928588999999988],[-100.87999000000002,69.933043999999995],[-100.87999000000002,69.938309000000061],[-100.85861199999994,69.977767999999969],[-100.85333300000002,69.983597000000145],[-100.84333800000002,69.98803700000002],[-100.83112299999993,69.990814000000057],[-100.81500199999994,69.989700000000084],[-100.80695300000002,69.985809000000017],[-100.80526700000001,69.980270000000019],[-100.80721999999997,69.97526600000009],[-100.80721999999997,69.969986000000006],[-100.81249999999994,69.958878000000027],[-100.83112299999993,69.935531999999967],[-100.83999599999999,69.929977000000065],[-100.84973099999991,69.925537000000077]],[[-87.091385000000002,70.150269000000094],[-87.06361400000003,70.147766000000104],[-87.051665999999955,70.141937000000098],[-87.02555799999999,70.135543999999982],[-87.020843999999954,70.131927000000019],[-87.023894999999982,70.127762000000018],[-87.021941999999967,70.121094000000028],[-87.009170999999924,70.116378999999995],[-86.994155999999975,70.113602000000071],[-86.922501000000011,70.104156000000103],[-86.905562999999972,70.103043000000071],[-86.87388599999997,70.09887700000013],[-86.856658999999922,70.097762999999986],[-86.825835999999924,70.092758000000117],[-86.798889000000031,70.087204000000099],[-86.778060999999923,70.089706000000035],[-86.761123999999938,70.093597000000102],[-86.688599000000011,70.115265000000022],[-86.670273000000009,70.118042000000116],[-86.639724999999999,70.116653000000099],[-86.611664000000019,70.111923000000104],[-86.598617999999988,70.108597000000032],[-86.586670000000026,70.104430999999977],[-86.545546999999942,70.081375000000094],[-86.549728000000016,70.07249500000006],[-86.550551999999982,70.066376000000048],[-86.536666999999909,70.062484999999981],[-86.511123999999995,70.053040000000067],[-86.505004999999983,70.048035000000027],[-86.503615999999965,70.036925999999994],[-86.505844000000025,70.028595000000053],[-86.50556899999998,70.023315000000025],[-86.502501999999993,70.020828000000108],[-86.487503000000004,70.017761000000007],[-86.47193900000002,70.015823000000069],[-86.460555999999997,70.012206999999989],[-86.45666499999993,70.007491999999957],[-86.460006999999962,70.00471500000009],[-86.468886999999995,69.999709999999993],[-86.489715999999987,69.983871000000079],[-86.502791999999999,69.980545000000063],[-86.523620999999991,69.978042999999957],[-86.542496000000028,69.977478000000133],[-86.662216000000001,69.967484000000127],[-86.714447000000007,69.966934000000094],[-86.747771999999998,69.969437000000084],[-86.76556399999987,69.969711000000018],[-86.833069000000023,69.974426000000051],[-86.864440999999999,69.978592000000106],[-86.881377999999984,69.979706000000078],[-86.89805599999994,69.982207999999957],[-86.926391999999964,69.989150999999993],[-86.938599000000011,69.993317000000047],[-86.962219000000005,70.00471500000009],[-86.985274999999945,70.01388500000013],[-87.002227999999945,70.014999000000103],[-87.016113000000018,70.010544000000095],[-87.021941999999967,70.005264000000011],[-87.029449,70.000824000000023],[-87.037215999999944,69.99664300000012],[-87.050277999999878,69.991653000000042],[-87.066665999999998,69.989150999999993],[-87.086394999999925,69.987761999999975],[-87.104172000000005,69.987761999999975],[-87.135009999999966,69.992752000000053],[-87.148055999999997,69.997482000000048],[-87.168883999999991,70.008605999999929],[-87.182769999999948,70.01388500000013],[-87.195830999999998,70.017212000000029],[-87.21362299999987,70.017487000000074],[-87.229445999999996,70.019440000000031],[-87.240828999999906,70.021378000000141],[-87.255004999999983,70.025269000000037],[-87.274444999999957,70.034987999999998],[-87.277495999999985,70.038879000000065],[-87.27694699999995,70.044983000000116],[-87.273620999999991,70.050812000000121],[-87.272507000000019,70.054703000000018],[-87.272780999999952,70.059981999999991],[-87.278335999999967,70.067490000000021],[-87.288329999999974,70.073317999999972],[-87.295837000000006,70.077484000000027],[-87.307495000000017,70.080826000000002],[-87.319457999999884,70.083328000000051],[-87.335555999999997,70.085541000000035],[-87.34973100000002,70.086104999999975],[-87.363892000000021,70.088593000000117],[-87.376937999999939,70.093322999999941],[-87.378325999999959,70.096100000000035],[-87.376099000000011,70.099426000000108],[-87.371384000000035,70.103867000000037],[-87.355834999999956,70.107208000000071],[-87.341948999999886,70.108597000000032],[-87.307495000000017,70.107208000000071],[-87.277785999999992,70.114699999999971],[-87.267226999999878,70.113312000000064],[-87.265609999999924,70.113556000000017],[-87.254729999999995,70.112198000000092],[-87.222503999999901,70.111374000000126],[-87.187774999999931,70.108322000000044],[-87.180557000000022,70.109420999999998],[-87.173049999999989,70.112198000000092],[-87.164443999999946,70.117203000000131],[-87.156112999999891,70.11914100000007],[-87.130829000000006,70.120255000000043],[-87.118332000000009,70.11914100000007],[-87.102782999999988,70.12081900000004],[-87.099730999999963,70.123596000000077],[-87.100554999999929,70.125534000000073],[-87.143065999999976,70.139435000000049],[-87.145279000000016,70.142761000000064],[-87.141388000000006,70.146378000000027],[-87.128326000000015,70.149719000000061],[-87.113891999999964,70.148880000000077],[-87.091385000000002,70.150269000000094]],[[-125.05695299999996,70.118317000000104],[-125.08500700000002,70.116333000000111],[-125.10221899999993,70.118072999999981],[-125.11971999999997,70.124954000000002],[-125.122772,70.130066000000056],[-125.12332200000003,70.13546800000006],[-125.12110899999999,70.141372999999987],[-125.11277799999999,70.14697300000006],[-125.10333300000002,70.151688000000092],[-125.08332799999999,70.159973000000093],[-125.07055700000001,70.16187999999994],[-125,70.162933000000066],[-124.97693600000002,70.167206000000078],[-124.96305799999999,70.168320000000051],[-124.95500199999998,70.164153999999996],[-124.98832700000003,70.134430000000009],[-124.99777199999994,70.129974000000061],[-125.04415899999992,70.120315999999946],[-125.05695299999996,70.118317000000104]],[[-124.67944299999994,70.161652000000117],[-124.69444299999998,70.161377000000073],[-124.73750299999995,70.174149000000114],[-124.75361599999991,70.182479999999998],[-124.75917099999998,70.186919999999986],[-124.76194799999996,70.191925000000083],[-124.75890400000003,70.196640000000116],[-124.74471999999997,70.197754000000089],[-124.55110200000001,70.208602999999925],[-124.53611799999987,70.208602999999925],[-124.51888999999994,70.206940000000031],[-124.51055899999994,70.20277399999992],[-124.50527999999997,70.198318000000029],[-124.50750700000003,70.192749000000049],[-124.53694200000001,70.18193100000002],[-124.67944299999994,70.161652000000117]],[[-112.65527299999991,70.266098],[-112.67223399999995,70.266098],[-112.69193999999999,70.267487000000017],[-112.72193900000002,70.272491000000002],[-112.74722300000002,70.278594999999996],[-112.75499699999995,70.282761000000107],[-112.76027699999992,70.287201000000096],[-112.76306199999993,70.292480000000069],[-112.76139799999993,70.298598999999967],[-112.75389100000001,70.303588999999988],[-112.73111,70.309708000000001],[-112.71611000000001,70.310531999999967],[-112.699997,70.309417999999994],[-112.6875,70.306366000000082],[-112.67971799999992,70.302475000000015],[-112.67859599999991,70.300812000000064],[-112.64334099999996,70.28137200000009],[-112.64277600000003,70.275818000000129],[-112.64472999999987,70.269714000000079],[-112.65527299999991,70.266098]],[[-112.96972700000003,70.28137200000009],[-113.00306699999999,70.281097000000102],[-113.104446,70.281936999999971],[-113.14083899999997,70.283325000000048],[-113.15834000000001,70.285262999999986],[-113.20361300000002,70.292480000000069],[-113.16972399999992,70.306931000000134],[-113.15750100000002,70.309708000000001],[-113.12888299999997,70.312485000000095],[-113.11054999999993,70.3119200000001],[-112.993607,70.299423000000104],[-112.97609699999992,70.297484999999938],[-112.96362299999998,70.294434000000138],[-112.95333900000003,70.290817000000004],[-112.94554099999999,70.286652000000004],[-112.95612299999999,70.283325000000048],[-112.96972700000003,70.28137200000009]],[[-100.765289,70.25],[-100.78083800000002,70.25],[-100.7938769999999,70.253326000000015],[-100.84166699999997,70.278320000000008],[-100.86305199999993,70.291091999999992],[-100.86833200000001,70.295532000000037],[-100.85193600000002,70.323883000000137],[-100.83889799999992,70.325546000000031],[-100.80943300000001,70.324158000000125],[-100.77639799999997,70.322495000000004],[-100.75890399999997,70.320540999999992],[-100.74804699999999,70.316940000000102],[-100.74082899999996,70.310531999999967],[-100.75890399999997,70.254990000000021],[-100.765289,70.25]],[[-116.80526699999996,70.509430000000009],[-116.78971899999993,70.507217000000026],[-116.75418100000002,70.50749200000007],[-116.63390400000003,70.493591000000094],[-116.60722399999997,70.488037000000077],[-116.59638999999993,70.484984999999995],[-116.56833599999999,70.473876999999959],[-116.57305899999989,70.467758000000117],[-116.70111099999997,70.468597000000102],[-116.71916199999993,70.470261000000107],[-116.787781,70.483597000000032],[-116.814438,70.488876000000062],[-116.82055700000001,70.493591000000094],[-116.82861300000002,70.503601000000003],[-116.82224300000001,70.508881000000031],[-116.80526699999996,70.509430000000009]],[[-116.287781,70.553314000000114],[-116.26027699999992,70.549988000000042],[-116.24333199999995,70.550261999999975],[-116.18943799999994,70.54553199999998],[-116.140556,70.538589000000002],[-116.12748699999997,70.535812000000078],[-116.13110399999999,70.532486000000006],[-116.29110699999995,70.515549000000021],[-116.32333399999993,70.513611000000083],[-116.44611399999991,70.508881000000031],[-116.46472199999999,70.509154999999964],[-116.47778299999999,70.511932000000058],[-116.495003,70.519989000000066],[-116.49582700000002,70.522765999999933],[-116.47000099999997,70.538040000000024],[-116.30304699999988,70.552199999999971],[-116.287781,70.553314000000114]],[[-116.56304899999998,70.534424000000001],[-116.57833900000003,70.533051000000057],[-116.596947,70.533324999999991],[-116.75028999999995,70.539153999999996],[-116.76363400000002,70.541931000000091],[-116.77443700000003,70.545258000000047],[-116.766953,70.548324999999977],[-116.75527999999991,70.551085999999941],[-116.72361799999987,70.556366000000025],[-116.71193699999998,70.559417999999937],[-116.68167099999999,70.561920000000043],[-116.66471899999999,70.562485000000038],[-116.64611799999994,70.562195000000031],[-116.54305999999997,70.559707999999944],[-116.52278100000001,70.558593999999971],[-116.50945300000001,70.556091000000038],[-116.50778200000002,70.550261999999975],[-116.51806599999998,70.546646000000123],[-116.56304899999998,70.534424000000001]],[[-115.92054699999989,70.54136699999998],[-115.95445299999994,70.540267999999969],[-115.99333200000001,70.541656000000103],[-116.051941,70.54553199999998],[-116.06111099999993,70.548324999999977],[-116.04250299999995,70.552199999999971],[-115.98388699999998,70.560806000000071],[-115.97222899999991,70.563599000000011],[-115.91972399999997,70.572494999999947],[-115.87917299999998,70.578598000000113],[-115.86389200000002,70.579987000000074],[-115.82501199999996,70.578323000000069],[-115.81416300000001,70.574997000000053],[-115.80803700000001,70.570541000000105],[-115.81082199999997,70.564986999999974],[-115.81916799999999,70.560806000000071],[-115.84111000000001,70.554153000000042],[-115.86638599999998,70.549423000000047],[-115.92054699999989,70.54136699999998]],[[-116.87943999999993,70.547485000000108],[-116.88945000000001,70.543869000000029],[-116.923317,70.542755000000056],[-117.03611799999993,70.546371000000136],[-117.18331899999998,70.537491000000102],[-117.20195000000001,70.53776600000009],[-117.22000099999997,70.539153999999996],[-117.27555799999993,70.550261999999975],[-117.28888699999993,70.55304000000001],[-117.29778299999998,70.556931000000077],[-117.30166600000001,70.561920000000043],[-117.29778299999998,70.571380999999974],[-117.26083399999999,70.584717000000126],[-117.25140399999992,70.587204000000042],[-117.23805199999998,70.589156999999943],[-117.21640000000002,70.591095000000109],[-117.19943199999994,70.591660000000104],[-117.16332999999997,70.588593000000003],[-116.89444700000001,70.556091000000038],[-116.88362100000001,70.552765000000136],[-116.87943999999993,70.547485000000108]],[[-128.08612099999999,70.605545000000006],[-128.10415599999999,70.595825000000104],[-128.1201779999999,70.597214000000122],[-128.11444099999994,70.591934000000037],[-128.11721799999992,70.580551000000014],[-128.12387100000001,70.57388300000008],[-128.13275099999993,70.569153000000028],[-128.34054599999996,70.539153999999996],[-128.34167499999995,70.542205999999908],[-128.252228,70.646378000000084],[-128.24581899999998,70.653046000000074],[-128.23416099999986,70.656097000000102],[-128.21639999999996,70.654709000000025],[-128.18832399999997,70.648604999999975],[-128.11498999999998,70.628036000000009],[-128.10360699999995,70.624419999999986],[-128.09472700000003,70.62052900000009],[-128.0883179999999,70.616089000000045],[-128.08499099999995,70.611099000000024],[-128.08612099999999,70.605545000000006]],[[-100.23082699999992,70.451660000000061],[-100.24333199999995,70.449142000000109],[-100.26000999999985,70.449996999999996],[-100.27610799999997,70.453049000000078],[-100.47250400000001,70.496367999999961],[-100.49916100000002,70.503326000000129],[-100.63054699999998,70.543320000000108],[-100.662781,70.554703000000075],[-100.67083700000001,70.558868000000075],[-100.67639199999996,70.563309000000004],[-100.68138099999993,70.573044000000095],[-100.68138099999993,70.583602999999982],[-100.67832900000002,70.594147000000021],[-100.66443599999991,70.637771999999984],[-100.65194699999995,70.669708000000071],[-100.51194800000002,70.676376000000062],[-100.49500299999988,70.675262000000089],[-100.48000300000001,70.673309000000131],[-100.46916199999998,70.669434000000138],[-100.46112099999999,70.659987999999998],[-100.451683,70.651932000000102],[-100.44360399999999,70.64776599999999],[-100.34722899999991,70.608032000000094],[-100.33640300000002,70.604431000000034],[-100.31945799999994,70.603317000000061],[-100.21833799999996,70.564422999999977],[-100.22444200000001,70.456649999999968],[-100.23082699999992,70.451660000000061]],[[-103.17777999999993,70.622482000000048],[-103.19360399999994,70.622208000000114],[-103.24833699999994,70.622757000000036],[-103.26640299999991,70.624146000000053],[-103.27500900000001,70.628311000000053],[-103.28111299999995,70.632751000000042],[-103.281387,70.638046000000088],[-103.26834099999996,70.666382000000056],[-103.22582999999986,70.676376000000062],[-103.21000700000002,70.676651000000049],[-103.19415299999997,70.673035000000027],[-103.173607,70.6336060000001],[-103.17304999999999,70.628586000000041],[-103.17777999999993,70.622482000000048]],[[-103.35082999999992,70.687195000000088],[-103.36416599999995,70.685256999999979],[-103.38110399999988,70.685806000000127],[-103.39499699999999,70.689148000000046],[-103.42887899999994,70.69999700000011],[-103.43776700000001,70.703872999999987],[-103.44638099999997,70.708037999999988],[-103.45249899999993,70.712494000000106],[-103.45889299999999,70.722214000000008],[-103.46278399999994,70.732208000000014],[-103.45694700000001,70.737198000000035],[-103.44360399999999,70.739150999999993],[-103.42777999999998,70.739426000000037],[-103.39917000000003,70.737198000000035],[-103.36361699999992,70.727767999999969],[-103.34111000000001,70.72026100000005],[-103.33500699999996,70.716094999999996],[-103.33444199999997,70.710815000000082],[-103.33860800000002,70.699417000000096],[-103.34333799999996,70.693588000000091],[-103.35082999999992,70.687195000000088]],[[-71.471664000000033,71.012772000000041],[-71.428878999999995,71.012206999999989],[-71.389175000000023,71.013885000000073],[-71.371108999999933,71.011931999999945],[-71.357497999999964,71.009720000000073],[-71.344727000000034,71.005554000000018],[-71.339171999999962,70.998322000000087],[-71.339721999999995,70.99136400000009],[-71.343063000000029,70.984985000000052],[-71.386672999999917,70.922485000000108],[-71.392226999999991,70.916656000000103],[-71.402495999999871,70.911926000000051],[-71.415557999999976,70.90776100000005],[-71.433060000000012,70.904709000000139],[-71.451110999999912,70.903046000000018],[-71.474441999999954,70.902481000000023],[-71.495543999999938,70.90277100000003],[-71.654448999999943,70.890822999999955],[-71.733063000000016,70.874984999999924],[-71.933884000000035,70.833328000000051],[-71.937774999999931,70.824706999999989],[-71.946380999999974,70.820831000000112],[-71.955565999999976,70.818329000000006],[-71.991668999999945,70.814697000000081],[-72.038605000000018,70.811371000000008],[-72.081954999999994,70.809708000000114],[-72.096664000000033,70.809708000000114],[-72.112212999999997,70.811371000000008],[-72.198607999999979,70.882750999999985],[-72.223327999999981,70.916931000000091],[-72.225280999999939,70.924423000000047],[-72.226395000000025,70.930542000000059],[-72.213897999999915,70.934708000000001],[-72.202224999999999,70.93664600000011],[-72.166655999999989,70.938034000000016],[-72.148894999999925,70.936371000000065],[-72.136672999999973,70.933594000000028],[-72.133620999999948,70.931656000000032],[-72.145554000000004,70.926085999999998],[-72.149170000000026,70.921097000000032],[-72.136123999999995,70.916931000000091],[-72.117492999999911,70.917205999999965],[-72.097778000000005,70.919708000000014],[-72.078339000000028,70.923599000000081],[-72.057769999999948,70.933043999999995],[-72.044723999999917,70.944426999999962],[-72.039443999999946,70.950272000000098],[-72.033324999999934,70.963042999999971],[-72.026672000000019,70.98275799999999],[-72.019729999999868,71.034424000000058],[-72.021392999999989,71.041930999999977],[-72.008620999999948,71.049713000000111],[-71.916107000000011,71.06442300000009],[-71.884170999999924,71.068878000000097],[-71.851669000000015,71.072220000000016],[-71.831680000000006,71.071106000000043],[-71.794723999999974,71.053040000000067],[-71.730834999999956,71.045532000000037],[-71.644454999999994,71.034987999999998],[-71.546950999999979,71.018600000000106],[-71.471664000000033,71.012772000000041]],[[-96.563323999999966,71.292205999999965],[-96.546950999999979,71.289154000000053],[-96.535552999999993,71.28276100000005],[-96.472504000000015,71.232208000000071],[-96.470275999999956,71.226089000000059],[-96.480835000000013,71.208878000000141],[-96.487503000000004,71.203598000000056],[-96.561110999999983,71.208328000000108],[-96.578063999999983,71.210541000000035],[-96.628601000000003,71.220260999999937],[-96.638610999999912,71.226089000000059],[-96.641678000000013,71.231368999999972],[-96.642776000000026,71.234421000000054],[-96.652495999999985,71.287201000000096],[-96.649170000000026,71.29304500000012],[-96.610549999999989,71.290543000000014],[-96.581116000000009,71.293594000000041],[-96.563323999999966,71.292205999999965]],[[-98.895554000000004,71.27777100000003],[-98.90834000000001,71.273040999999978],[-98.97444200000001,71.284714000000008],[-98.989715999999987,71.290543000000014],[-99.000290000000007,71.297211000000004],[-99.00556899999998,71.301926000000037],[-99.008621000000005,71.308029000000147],[-99.008895999999936,71.313873000000001],[-99.00306699999993,71.319443000000092],[-98.963622999999927,71.352203000000088],[-98.955840999999964,71.352203000000088],[-98.930283000000031,71.342209000000082],[-98.923324999999977,71.337769000000094],[-98.914443999999946,71.331665000000044],[-98.895554000000004,71.27777100000003]],[[-73.120543999999995,71.479705999999965],[-73.129439999999931,71.450821000000076],[-73.077498999999932,71.466385000000002],[-73.043335000000013,71.47886699999998],[-73.035552999999936,71.48414600000001],[-73.016402999999968,71.500000000000114],[-73.005844000000025,71.511658000000125],[-72.998046999999985,71.517211999999915],[-72.985275000000001,71.521378000000027],[-72.97222899999997,71.521378000000027],[-72.962508999999955,71.51998900000001],[-72.934157999999968,71.509155000000135],[-72.827498999999989,71.454987000000017],[-72.820281999999963,71.449707000000103],[-72.817504999999983,71.444977000000108],[-72.823333999999988,71.439697000000024],[-72.831954999999994,71.435806000000127],[-72.849730999999963,71.4327550000001],[-72.872497999999894,71.43081699999999],[-72.921660999999972,71.428314],[-72.992767000000015,71.419433999999967],[-73.010009999999966,71.415543000000071],[-73.022780999999952,71.411101999999971],[-73.031112999999948,71.406646999999964],[-73.028885000000002,71.399155000000064],[-73.007507000000032,71.352203000000088],[-72.978881999999942,71.329712000000086],[-72.974166999999909,71.324997000000053],[-72.97193900000002,71.317490000000134],[-72.973617999999874,71.313309000000061],[-72.983886999999982,71.308594000000028],[-72.996657999999911,71.304153000000099],[-73.025283999999999,71.297485000000108],[-73.060546999999929,71.294708000000014],[-73.089446999999893,71.313873000000001],[-73.163329999999917,71.33248900000001],[-73.198607999999922,71.336380000000077],[-73.244995000000017,71.348877000000073],[-73.265288999999939,71.357483000000002],[-73.272506999999962,71.36192299999999],[-73.275008999999955,71.365814000000057],[-73.276397999999972,71.379150000000038],[-73.265015000000005,71.396378000000141],[-73.255004999999926,71.408874999999966],[-73.254729999999995,71.415268000000083],[-73.293609999999887,71.454711999999972],[-73.301392000000021,71.459717000000012],[-73.320556999999894,71.469711000000075],[-73.347504000000015,71.477768000000026],[-73.362502999999947,71.481094000000041],[-73.374160999999901,71.485809000000074],[-73.379990000000021,71.519714000000022],[-73.377212999999983,71.522766000000104],[-73.366942999999992,71.527480999999966],[-73.189986999999917,71.565536000000066],[-73.176940999999999,71.566376000000105],[-73.147507000000019,71.564423000000147],[-73.132216999999912,71.561371000000065],[-73.090285999999935,71.546371000000079],[-73.081116000000009,71.542206000000078],[-73.073623999999938,71.536926000000051],[-73.074722000000008,71.531372000000033],[-73.11332699999997,71.485809000000074],[-73.120543999999995,71.479705999999965]],[[-72.760833999999875,71.531937000000084],[-72.786391999999978,71.530273000000022],[-72.830841000000021,71.531096999999988],[-72.848891999999921,71.532211000000018],[-72.867492999999911,71.533875000000023],[-72.949996999999996,71.547211000000118],[-72.982497999999907,71.553589000000102],[-73.008895999999879,71.56109600000002],[-73.020554000000004,71.565811000000053],[-73.030562999999916,71.571655000000078],[-73.035277999999948,71.575546000000145],[-73.039992999999981,71.579987000000074],[-73.037506000000008,71.587203999999986],[-73.034164000000033,71.592209000000025],[-72.968062999999972,71.636658000000011],[-72.948607999999979,71.644714000000079],[-72.924712999999997,71.649429000000112],[-72.806655999999919,71.659149000000014],[-72.781113000000005,71.660812000000135],[-72.745269999999948,71.659987999999942],[-72.726669000000015,71.658325000000048],[-72.709166999999979,71.655258000000117],[-72.695830999999941,71.651093000000117],[-72.684433000000013,71.642761000000121],[-72.662215999999944,71.604431000000034],[-72.660552999999936,71.598038000000031],[-72.671111999999994,71.585815000000025],[-72.682495000000017,71.574706999999989],[-72.701110999999912,71.557479999999998],[-72.712783999999942,71.547211000000118],[-72.718886999999995,71.542755000000056],[-72.727492999999981,71.538589000000115],[-72.742492999999968,71.534149000000127],[-72.760833999999875,71.531937000000084]],[[-73.370270000000005,71.554428000000087],[-73.394454999999937,71.554428000000087],[-73.406661999999983,71.556366000000025],[-73.418335000000013,71.56109600000002],[-73.42860399999995,71.566940000000045],[-73.436934999999949,71.573318000000029],[-73.450561999999991,71.584152000000074],[-73.449721999999952,71.58998100000008],[-73.448043999999925,71.594146999999964],[-73.441939999999988,71.598877000000016],[-73.388610999999912,71.634155000000021],[-73.348342999999943,71.658325000000048],[-73.276108000000022,71.691924999999912],[-73.243332000000009,71.696639999999945],[-73.213332999999977,71.698593000000074],[-73.209166999999979,71.698868000000118],[-73.190552000000025,71.697204999999997],[-73.167496000000028,71.692200000000128],[-73.155562999999972,71.687195000000088],[-73.148894999999982,71.679977000000065],[-73.149993999999992,71.674423000000104],[-73.170546999999942,71.668319999999937],[-73.221114999999998,71.660262999999986],[-73.249434999999949,71.652481000000023],[-73.262511999999958,71.648041000000035],[-73.282776000000013,71.637771999999984],[-73.303604000000007,71.621918000000051],[-73.320281999999963,71.605545000000006],[-73.325012000000015,71.599152000000061],[-73.331679999999949,71.588042999999971],[-73.338607999999965,71.571105999999929],[-73.339721999999938,71.565262000000132],[-73.352492999999981,71.557479999999998],[-73.370270000000005,71.554428000000087]],[[-96.958892999999932,71.704437000000098],[-96.99888599999997,71.701096000000064],[-97.036391999999921,71.701385000000016],[-97.050277999999935,71.704162999999994],[-97.049727999999902,71.709991000000116],[-97.040282999999988,71.72026100000005],[-97.02416999999997,71.731093999999985],[-96.99888599999997,71.741363999999919],[-96.991668999999945,71.743042000000059],[-96.990829000000019,71.743866000000025],[-96.96945199999999,71.74859600000002],[-96.963897999999972,71.752212999999983],[-96.924163999999962,71.755554000000018],[-96.886397999999986,71.755264000000011],[-96.866942999999992,71.753601000000117],[-96.850554999999872,71.749419999999986],[-96.84445199999999,71.744141000000013],[-96.851104999999905,71.738875999999948],[-96.86860699999994,71.728592000000106],[-96.881377999999927,71.723312000000078],[-96.896956999999929,71.718323000000112],[-96.915832999999964,71.713608000000079],[-96.958892999999932,71.704437000000098]],[[-95.339995999999928,71.731369000000029],[-95.39805599999994,71.729431000000091],[-95.43582200000003,71.729980000000012],[-95.471114999999941,71.733597000000145],[-95.483062999999902,71.736923000000047],[-95.48832699999997,71.740814000000114],[-95.488051999999868,71.745529000000147],[-95.450286999999946,71.818877999999927],[-95.44027699999998,71.824158000000011],[-95.420836999999892,71.828873000000044],[-95.384170999999981,71.836104999999975],[-95.348891999999978,71.840546000000074],[-95.328613000000018,71.842208999999968],[-95.301666000000012,71.844147000000135],[-95.286666999999966,71.843048000000124],[-95.275832999999977,71.84027100000003],[-95.265838999999971,71.836655000000007],[-95.261672999999973,71.833328000000051],[-95.259734999999921,71.827484000000027],[-95.310546999999929,71.737198000000035],[-95.324721999999952,71.732758000000047],[-95.339995999999928,71.731369000000029]],[[-134.49554399999994,68.75221300000004],[-134.48803699999991,68.736649],[-134.48803699999991,68.731094000000098],[-134.48306299999996,68.720535000000041],[-134.47387700000002,68.711379999999963],[-134.46472199999994,68.707489000000066],[-134.44638099999997,68.700271999999984],[-134.40112299999993,68.687759000000085],[-134.37387100000001,68.682480000000112],[-134.33999599999999,68.67886400000009],[-134.30804399999994,68.678040000000124],[-134.28277600000001,68.681366000000139],[-134.24636799999996,68.687484999999981],[-134.23071299999998,68.692841000000101],[-134.22692899999998,68.694138000000123],[-134.22332800000004,68.699706999999933],[-134.26058999999987,68.733535999999958],[-134.26251200000002,68.736374000000126],[-134.28750599999995,68.753601000000003],[-134.30835000000002,68.766097999999943],[-134.32638499999996,68.773605000000089],[-134.42306500000001,68.831664999999987],[-134.54168700000002,68.919708000000071],[-134.558044,68.933043999999995],[-134.614441,68.983321999999987],[-134.62387099999995,68.992752000000053],[-134.62887599999999,69.003052000000139],[-134.62914999999992,69.008880999999974],[-134.62469499999992,69.015548999999965],[-134.56222499999996,69.082764000000111],[-134.55499299999997,69.08776899999998],[-134.53750600000001,69.09387200000009],[-134.49194299999999,69.104155999999989],[-134.46362299999998,69.106094000000098],[-134.44805899999989,69.106094000000098],[-134.36303699999996,69.102203000000031],[-134.34887700000002,69.103043000000071],[-134.33889799999992,69.106369000000086],[-134.22747800000002,69.174988000000099],[-134.22305299999999,69.181656000000032],[-134.22082499999993,69.188034000000016],[-134.22137499999997,69.216385000000116],[-134.21694899999989,69.223038000000088],[-134.162781,69.254715000000033],[-134.15389999999996,69.258880999999917],[-134.142517,69.261383000000023],[-134.12832599999996,69.262206999999989],[-134.06915299999997,69.262771999999984],[-134.05471799999998,69.263610999999969],[-134.02917500000001,69.266936999999984],[-133.92861899999991,69.282211000000075],[-133.90557899999988,69.287490999999989],[-133.89529400000004,69.290817000000004],[-133.88668799999999,69.294983000000116],[-133.87914999999998,69.299987999999985],[-133.87332199999997,69.30581699999999],[-133.86859100000004,69.312484999999924],[-133.86886599999997,69.318329000000119],[-133.87332199999997,69.323043999999982],[-133.87582399999997,69.328322999999955],[-133.86972000000003,69.33415199999996],[-133.67028799999997,69.386658000000068],[-133.65863000000002,69.389160000000004],[-133.55056799999994,69.405823000000055],[-133.40777600000001,69.414703000000088],[-133.37222299999991,69.412201000000039],[-133.35583499999996,69.409988000000055],[-133.32806400000004,69.404709000000082],[-133.30972299999996,69.402771000000143],[-133.23443599999996,69.397217000000126],[-133.21749899999992,69.39637799999997],[-133.20584099999991,69.398880000000077],[-133.073059,69.434982000000048],[-132.99941999999999,69.481934000000138],[-132.966095,69.511657999999954],[-132.95220899999998,69.563309000000061],[-132.95193499999999,69.569153000000028],[-132.95666499999993,69.57388300000008],[-132.96581999999995,69.57748400000014],[-132.98638900000003,69.590271000000143],[-132.988586,69.595260999999994],[-132.98361199999994,69.602203000000088],[-132.97747800000002,69.608032000000094],[-132.92251599999997,69.642212000000029],[-132.904449,69.650542999999971],[-132.89388999999994,69.65387000000004],[-132.86471599999999,69.658325000000104],[-132.82110599999999,69.660538000000031],[-132.78778099999994,69.659714000000065],[-132.66229199999998,69.651206999999999],[-132.628784,69.648048000000074],[-132.62028499999997,69.646378000000141],[-132.61479199999991,69.644043000000011],[-132.606628,69.639046000000121],[-132.55279499999995,69.631362999999965],[-132.53527800000001,69.630264000000011],[-132.41751099999993,69.635544000000039],[-132.39389,69.64027400000009],[-132.372772,69.646942000000081],[-132.34527600000001,69.659424000000058],[-132.33248900000001,69.671097000000088],[-132.32748399999997,69.677765000000079],[-132.333618,69.682480000000112],[-132.441101,69.702484000000027],[-132.45748900000001,69.704711999999972],[-132.46777299999991,69.701385000000016],[-132.51779199999999,69.68331900000004],[-132.54823299999998,69.685310000000129],[-132.55523700000003,69.683823000000018],[-132.57455400000003,69.683983000000126],[-132.582718,69.685654],[-132.586884,69.688148000000126],[-132.58673099999993,69.691649999999981],[-132.54833999999994,69.735809000000074],[-132.54055799999998,69.740814000000114],[-132.52749600000004,69.742477000000065],[-132.47305299999999,69.747756999999922],[-132.39974999999998,69.751663000000008],[-132.28918499999992,69.724991000000102],[-132.21304299999997,69.690810999999997],[-132.19888300000002,69.688034000000073],[-132.16305499999999,69.685256999999979],[-132.14697299999995,69.685256999999979],[-132.12304700000004,69.713608000000079],[-132.11663799999991,69.719436999999914],[-132.10720800000001,69.723602000000085],[-132.08331299999992,69.728591999999992],[-131.95443699999998,69.75471500000009],[-131.87469499999992,69.763884999999959],[-131.85861199999999,69.763611000000026],[-131.84527600000001,69.765273999999977],[-131.8347169999999,69.768599999999992],[-131.76556400000004,69.794707999999957],[-131.75891100000001,69.800536999999963],[-131.75836200000003,69.806366000000025],[-131.76028400000001,69.811646000000053],[-131.7647399999999,69.816376000000105],[-131.76666299999994,69.821655000000078],[-131.76000999999997,69.827484000000084],[-131.75058000000001,69.83137499999998],[-131.64501999999999,69.864990000000034],[-131.62359600000002,69.871368000000018],[-131.44778400000001,69.918594000000041],[-131.42639199999991,69.947479000000101],[-131.42111199999994,69.954162999999994],[-131.41027799999995,69.957214000000022],[-131.34887700000002,69.95248400000014],[-131.26916499999993,69.937759000000028],[-131.24609399999991,69.931091000000038],[-131.237213,69.927199999999971],[-131.23055999999991,69.923035000000141],[-131.20916699999998,69.899155000000007],[-131.20333899999997,69.889160000000061],[-131.20138499999996,69.883881000000088],[-131.20193499999999,69.878036000000009],[-131.2049869999999,69.871918000000051],[-131.21054099999998,69.865265000000079],[-131.21722399999987,69.859421000000054],[-131.22164899999996,69.854155999999989],[-131.22222899999991,69.848328000000038],[-131.220551,69.84304800000001],[-131.21194499999996,69.833603000000096],[-131.20526100000001,69.829437000000041],[-131.19638099999997,69.825546000000145],[-131.18499799999995,69.824158000000068],[-131.08056599999998,69.88499500000006],[-131.07501199999996,69.891663000000051],[-131.03140299999995,69.949417000000039],[-131.01028399999996,69.98692299999999],[-131.01278699999995,70.023315000000025],[-131.01947000000001,70.027771000000087],[-130.93029799999999,70.083054000000118],[-130.89224200000001,70.099152000000004],[-130.74832199999997,70.081940000000145],[-130.65612799999991,70.108597000000032],[-130.554169,70.165267999999969],[-130.54305999999991,70.168320000000051],[-130.48721299999994,70.173309000000017],[-130.47222899999997,70.173874000000069],[-130.46771200000001,70.170089999999959],[-130.47271699999993,70.167099000000121],[-130.48388699999998,70.164992999999981],[-130.51141399999995,70.162201000000039],[-130.52224699999994,70.158875000000023],[-130.54724099999999,70.127472000000012],[-130.54806499999995,70.121643000000006],[-130.54638699999992,70.116378999999995],[-130.54223599999995,70.111648999999943],[-130.53555299999999,70.107483000000059],[-130.52416999999997,70.103867000000037],[-130.5102839999999,70.101089000000002],[-130.49527,70.101654000000053],[-130.48416099999992,70.104705999999965],[-130.43237299999998,70.125870000000134],[-130.40722700000003,70.140533000000119],[-130.35360699999995,70.132202000000007],[-130.33084099999996,70.110809000000074],[-130.32250999999997,70.101379000000009],[-130.18472299999996,70.053589000000045],[-130.16861,70.053314],[-129.97555499999993,70.069442999999978],[-129.96304299999997,70.071655000000021],[-129.92611699999992,70.078598],[-129.89083900000003,70.092758000000117],[-129.86444099999994,70.126923000000033],[-129.84609999999986,70.154984000000127],[-129.8324889999999,70.195525999999916],[-129.79000899999994,70.219986000000119],[-129.73138399999999,70.253052000000082],[-129.69778400000001,70.262496999999996],[-129.68667600000003,70.265549000000078],[-129.67306499999995,70.266936999999984],[-129.64724699999999,70.251663000000065],[-129.60916099999992,70.213042999999971],[-129.45916699999998,70.147491000000116],[-129.40472399999999,70.123031999999967],[-129.40335099999999,70.11775200000011],[-129.40527299999997,70.106369000000086],[-129.40640300000001,70.10054000000008],[-129.4100039999999,70.094436999999971],[-129.433899,70.068054000000132],[-129.49749800000001,70.020538000000101],[-129.57360799999998,69.997757000000092],[-129.59555099999994,69.991363999999919],[-129.88946499999992,69.917205999999965],[-129.99304199999989,69.892487000000017],[-130.22805800000003,69.840546000000131],[-130.49581899999998,69.78166200000004],[-130.55999800000001,69.737198000000092],[-130.56140099999999,69.725815000000068],[-130.56472799999995,69.719711000000018],[-130.57028200000002,69.713043000000084],[-130.57833900000003,69.708038000000045],[-130.62136799999996,69.695251000000042],[-130.64697299999989,69.691360000000145],[-130.70416299999994,69.688309000000118],[-130.75750700000003,69.682480000000112],[-130.78030399999994,69.676926000000094],[-130.78973400000001,69.672760000000039],[-130.83639500000004,69.6336060000001],[-130.83944699999995,69.627472000000068],[-130.84081999999995,69.616089000000102],[-130.83667000000003,69.611099000000024],[-130.83749399999999,69.605545000000063],[-130.84414699999996,69.599716000000001],[-130.91915899999998,69.56721500000009],[-130.92861899999997,69.563309000000061],[-130.94473299999999,69.565536000000122],[-131.02667199999996,69.593048000000067],[-131.03973399999995,69.601653999999996],[-131.04168699999997,69.606934000000024],[-131.04083300000002,69.612761999999975],[-131.05306999999999,69.637206999999989],[-131.16332999999992,69.627762000000132],[-131.18859900000001,69.623871000000065],[-131.32861299999996,69.579987000000131],[-131.40750099999997,69.586655000000064],[-131.58694500000001,69.567490000000134],[-131.69168100000002,69.551650999999993],[-131.70498699999996,69.560256999999922],[-131.71389799999992,69.563873000000001],[-131.72778299999999,69.566940000000102],[-131.74108899999993,69.567490000000134],[-131.75585899999999,69.566940000000102],[-131.99722299999991,69.53137200000009],[-132.00640899999996,69.527205999999978],[-132.03890999999999,69.508331000000055],[-132.04666099999992,69.503326000000015],[-132.0799869999999,69.480819999999994],[-132.14169300000003,69.412766000000033],[-132.13305699999995,69.403320000000065],[-132.12164299999995,69.399994000000049],[-132.09750399999996,69.396057000000098],[-132.08526599999999,69.390823000000069],[-132.08084099999996,69.386108000000036],[-132.07888800000001,69.3808140000001],[-132.08166499999999,69.374695000000031],[-132.09472700000003,69.362762000000032],[-132.11663799999991,69.357208000000014],[-132.32916299999999,69.31442300000009],[-132.52417000000003,69.277771000000087],[-132.53195199999999,69.280547999999953],[-132.54556300000002,69.283325000000048],[-132.56167599999998,69.285812000000135],[-132.57998699999996,69.287490999999989],[-132.59222399999993,69.287200999999982],[-132.70611600000001,69.26887499999998],[-132.71777299999997,69.266388000000063],[-132.739441,69.260817999999972],[-132.76028399999996,69.254166000000112],[-132.76779199999999,69.249146000000053],[-132.90722699999998,69.1244200000001],[-132.90722699999998,69.118866000000082],[-132.90527299999997,69.042755],[-132.94610599999999,69.037491000000045],[-133.05084199999999,69.054703000000018],[-133.10638399999993,69.050537000000134],[-133.1719359999999,69.043320000000051],[-133.18331899999998,69.040817000000061],[-133.19332900000001,69.037491000000045],[-133.20083599999987,69.032485999999949],[-133.20556599999998,69.025818000000015],[-133.21499600000004,69.006653000000028],[-133.21664399999997,69.001937999999996],[-133.21444700000001,68.99664300000012],[-133.209991,68.991928000000087],[-133.20333900000003,68.987761999999975],[-133.19860799999998,68.983046999999942],[-133.19888300000002,68.977203000000145],[-133.21304299999991,68.938034000000073],[-133.22610499999996,68.913605000000132],[-133.23361199999999,68.908600000000092],[-133.31332399999985,68.871918000000051],[-133.32333399999993,68.868590999999924],[-133.33471699999996,68.866089000000045],[-133.34887699999996,68.865265000000079],[-133.36331200000001,68.866652999999985],[-133.37692300000003,68.869140999999956],[-133.38583399999999,68.873032000000023],[-133.39944500000001,68.881362999999965],[-133.40167199999991,68.886658000000011],[-133.39529400000004,68.89027400000009],[-133.37969999999996,68.89027400000009],[-133.36694299999994,68.891936999999984],[-133.359711,68.896942000000024],[-133.35360700000001,68.90277100000003],[-133.35803199999992,68.907486000000063],[-133.36944599999993,68.910538000000031],[-133.38275099999998,68.911102000000142],[-133.39556899999997,68.909424000000058],[-133.46112099999999,68.892761000000121],[-133.466095,68.888321000000133],[-133.484711,68.850266000000033],[-133.493042,68.826659999999947],[-133.49081399999994,68.821655000000078],[-133.48416099999997,68.81164600000011],[-133.47082499999999,68.797485000000108],[-133.46389799999992,68.793320000000108],[-133.4549869999999,68.789703000000145],[-133.40557899999999,68.772217000000012],[-133.32138099999992,68.746368000000132],[-133.16418499999992,68.707214000000079],[-133.08999599999999,68.694977000000108],[-133.05416899999994,68.691360000000145],[-133.03750599999995,68.690536000000009],[-133.02334599999995,68.691360000000145],[-133.01083399999987,68.693038999999999],[-132.98803699999996,68.697754000000032],[-132.95861799999994,68.69859299999996],[-132.94305399999996,68.696365000000014],[-132.91833500000001,68.690262000000075],[-132.92056299999996,68.695526000000029],[-132.9336239999999,68.709717000000069],[-132.94250499999998,68.713318000000129],[-132.95471199999997,68.71527100000003],[-133.00723299999999,68.719711000000075],[-133.02252199999998,68.719711000000075],[-133.03527800000001,68.718048000000124],[-133.04583699999995,68.711379999999963],[-133.11248799999998,68.714996000000042],[-133.142517,68.718597000000102],[-133.15249599999993,68.720825000000048],[-133.25500499999998,68.758606000000043],[-133.25945999999999,68.763321000000076],[-133.26611299999996,68.778869999999984],[-133.26141399999995,68.785537999999974],[-133.24999999999994,68.788040000000024],[-133.23416099999992,68.785812000000078],[-133.225281,68.782211000000018],[-133.22082499999999,68.777480999999966],[-133.22082499999999,68.771652000000131],[-133.21664399999997,68.766937000000098],[-133.20306399999998,68.764160000000004],[-133.16168200000004,68.75749200000007],[-133.14752199999998,68.758330999999998],[-133.13891599999994,68.76249700000011],[-133.1397399999999,68.766937000000098],[-133.21139499999998,68.790817000000118],[-133.23498499999999,68.795821999999987],[-133.250854,68.798035000000141],[-133.28178399999996,68.794426000000101],[-133.28863499999989,68.793097999999986],[-133.30145300000004,68.789429000000041],[-133.32556199999999,68.787491000000045],[-133.33554099999992,68.789703000000145],[-133.34445199999993,68.793594000000041],[-133.35665899999992,68.801085999999941],[-133.35888699999998,68.806366000000025],[-133.35415599999993,68.832214000000135],[-133.332764,68.843872000000147],[-133.27722199999988,68.856934000000024],[-133.26583900000003,68.859421000000054],[-133.23776199999998,68.861099000000024],[-133.22192399999994,68.858871000000022],[-133.18804899999986,68.849152000000061],[-133.16778599999998,68.836655000000064],[-133.15917999999999,68.827209000000096],[-133.15222199999999,68.823044000000095],[-133.12191799999994,68.805817000000047],[-133.10833700000001,68.80304000000001],[-133.09167500000001,68.802199999999914],[-133.06222500000001,68.802765000000136],[-133.00527999999997,68.815262000000132],[-132.95803799999993,68.835541000000092],[-132.962219,68.846099999999922],[-132.9619449999999,68.85165400000011],[-132.95193499999999,68.854979999999955],[-132.93667599999998,68.854979999999955],[-132.86749299999997,68.846099999999922],[-132.85611,68.842758000000003],[-132.78594999999996,68.818428000000097],[-132.75363199999998,68.802765000000136],[-132.49194299999994,68.801085999999941],[-132.48055999999991,68.803589000000102],[-132.47027600000001,68.806931000000077],[-132.40557899999999,68.842758000000003],[-132.40029900000002,68.847214000000122],[-132.39529400000004,68.853867000000093],[-132.39279199999999,68.859985000000052],[-132.396973,68.864700000000084],[-132.49249299999997,68.90637200000009],[-132.50363200000004,68.909714000000065],[-132.55334499999998,68.916091999999992],[-132.56750499999998,68.915268000000026],[-132.57638499999996,68.911102000000142],[-132.574432,68.906097000000102],[-132.56777999999991,68.901657000000057],[-132.54055799999998,68.896103000000096],[-132.55557299999992,68.878311000000053],[-132.66528299999993,68.841934000000037],[-132.67806999999993,68.840271000000087],[-132.69360399999994,68.840546000000131],[-132.76229899999998,68.857491000000095],[-132.77094999999997,68.858147000000031],[-132.77778599999999,68.860153000000082],[-132.78027299999991,68.862983999999983],[-132.833618,68.917755000000113],[-132.85998499999988,68.989150999999993],[-132.868042,69.021378000000141],[-132.87191799999999,69.056641000000013],[-132.86944600000004,69.062759000000085],[-132.86553999999995,69.068329000000006],[-132.81527699999998,69.08638000000002],[-132.80526699999996,69.089432000000102],[-132.77111799999994,69.085541000000035],[-132.75418100000002,69.084717000000069],[-132.68917799999991,69.082489000000123],[-132.67501800000002,69.083328000000051],[-132.66332999999997,69.085815000000139],[-132.54083300000002,69.135268999999994],[-132.46081500000003,69.124695000000088],[-132.46472199999999,69.119141000000127],[-132.46749899999998,69.107208000000071],[-132.45916699999992,69.108032000000037],[-132.42861900000003,69.11775200000011],[-132.40777599999996,69.1244200000001],[-132.38500999999997,69.139160000000061],[-132.37887599999999,69.145264000000054],[-132.36886600000003,69.158600000000035],[-132.36138899999997,69.171371000000136],[-132.343323,69.203323000000069],[-132.34249899999992,69.220260999999994],[-132.33972199999994,69.22665399999994],[-132.33056599999998,69.230820000000051],[-132.32055699999995,69.233871000000079],[-132.30612199999996,69.234711000000118],[-132.22360199999997,69.213608000000022],[-132.2225039999999,69.141662999999994],[-132.16805999999997,69.213882000000126],[-132.11694299999999,69.242203000000075],[-132.05804399999994,69.242203000000075],[-131.99600199999998,69.251632999999913],[-131.96389799999997,69.256942999999978],[-131.87527499999999,69.279709000000025],[-131.86499000000003,69.283051000000114],[-131.8052669999999,69.316375999999991],[-131.79751599999986,69.321381000000088],[-131.79110700000001,69.327208999999982],[-131.71444699999995,69.397766000000104],[-131.72555499999993,69.401093000000003],[-131.73416099999997,69.400542999999971],[-131.80667099999999,69.39137299999993],[-131.950287,69.395827999999938],[-131.96499600000004,69.397217000000126],[-131.97277800000001,69.400269000000037],[-131.97000099999997,69.406372000000033],[-131.65222199999994,69.471924000000058],[-131.63919099999998,69.473602000000142],[-131.60748299999995,69.473312000000135],[-131.59136999999993,69.470825000000048],[-131.45889299999999,69.449141999999938],[-131.44528200000002,69.446365000000071],[-131.432953,69.437194999999974],[-131.42910799999993,69.434700000000134],[-131.43160999999998,69.431365999999969],[-131.43710299999992,69.429031000000066],[-131.45193499999999,69.420532000000094],[-131.46221899999995,69.417206000000078],[-131.47164900000001,69.413039999999967],[-131.47943099999998,69.408035000000098],[-131.48611500000004,69.402206000000092],[-131.53472899999997,69.333327999999995],[-131.52584799999994,69.329436999999928],[-131.49941999999999,69.332489000000066],[-131.42083700000001,69.361649000000114],[-131.41278099999994,69.366653000000099],[-131.40750099999997,69.373306000000071],[-131.38989300000003,69.404159999999933],[-131.377228,69.427483000000052],[-131.32193000000001,69.49331699999999],[-131.27166699999992,69.501099000000124],[-131.25723299999999,69.501663000000065],[-131.24581899999998,69.49832200000003],[-131.23330699999991,69.48414600000001],[-131.22387700000002,69.463608000000136],[-131.22027599999996,69.453323000000012],[-131.21664399999992,69.442748999999992],[-131.21276899999992,69.422202999999968],[-131.21093799999989,69.4125370000001],[-131.21026599999999,69.406044000000065],[-131.21304299999997,69.387497000000053],[-131.22360200000003,69.384430000000123],[-131.23330699999991,69.384720000000129],[-131.24526999999995,69.382202000000007],[-131.26641799999993,69.375809000000061],[-131.31777999999997,69.358871000000136],[-131.39529399999998,69.318603999999993],[-131.40307599999994,69.313873000000058],[-131.415009,69.301376000000062],[-131.41445899999997,69.296936000000017],[-131.33526599999993,69.316666000000055],[-131.32470699999999,69.31999200000007],[-131.19332899999995,69.365264999999965],[-131.18859900000001,69.368317000000104],[-131.16650400000003,69.404930000000093],[-131.16223099999996,69.490540000000067],[-131.16418499999997,69.495529000000033],[-131.23123199999992,69.543892000000028],[-131.25385999999997,69.571846000000107],[-131.22546399999999,69.580719000000101],[-131.20681799999994,69.55720500000001],[-131.15046699999994,69.518600000000049],[-131.13006599999994,69.516388000000006],[-131.11053499999997,69.485329000000036],[-131.130157,69.429375000000107],[-131.14851399999992,69.403534000000036],[-131.1458439999999,69.374695000000031],[-131.13583399999999,69.359985000000108],[-131.12832599999996,69.361923000000047],[-131.10122699999999,69.393921000000091],[-131.08525099999991,69.440514000000007],[-131.06085199999995,69.470688000000109],[-131.06617699999993,69.491096000000084],[-131.06394999999998,69.512389999999982],[-131.08924899999994,69.531914000000143],[-131.10920699999997,69.543449000000123],[-131.127838,69.554543000000024],[-131.14781199999993,69.561195000000112],[-131.16599999999988,69.567856000000006],[-131.18832399999991,69.574707000000046],[-131.19473300000004,69.57887299999993],[-131.19665499999991,69.584152000000131],[-131.19610599999999,69.589980999999966],[-131.19055199999997,69.596649000000127],[-131.183899,69.602478000000133],[-131.17471299999994,69.606369000000029],[-131.13833599999998,69.614150999999936],[-131.12359600000002,69.614700000000084],[-131.10748299999989,69.612488000000042],[-131.09359699999999,69.609421000000111],[-131.087219,69.605255],[-131.08306900000002,69.600539999999967],[-131.04577599999999,69.524429000000055],[-131.02999899999998,69.485809000000131],[-131.02780200000001,69.463882000000069],[-131.03390499999995,69.429153000000042],[-131.03695700000003,69.423035000000084],[-131.07028200000002,69.367477000000065],[-131.10803199999992,69.33526599999999],[-131.11331200000001,69.328598],[-131.11639400000001,69.32249500000006],[-131.10888699999998,69.321655000000021],[-131.09973100000002,69.325821000000076],[-131.05084199999993,69.354431000000091],[-131.02667199999996,69.383865000000128],[-130.98999000000003,69.449141999999938],[-130.99121099999996,69.50104500000009],[-130.9922029999999,69.504203999999959],[-130.99026500000002,69.539429000000041],[-130.98083499999996,69.543594000000041],[-130.96887200000003,69.545821999999987],[-130.952789,69.543320000000108],[-130.94638099999992,69.539154000000053],[-130.94222999999994,69.534148999999957],[-130.94055200000003,69.52915999999999],[-130.9244379999999,69.448593000000017],[-130.93971299999998,69.421486000000016],[-130.94154400000002,69.417816000000073],[-130.94555699999995,69.414314000000047],[-130.95039399999996,69.411324000000093],[-130.98580900000002,69.383040999999935],[-131.02583299999998,69.347878000000037],[-131.02984600000002,69.344368000000088],[-131.03317300000003,69.340377999999987],[-131.03199799999999,69.337212000000022],[-131.03668200000004,69.310532000000023],[-131.02780200000001,69.306641000000127],[-131.01696800000002,69.307480000000055],[-131.01419099999993,69.313873000000058],[-131.01333599999998,69.319442999999922],[-131.010559,69.325546000000088],[-131.00500499999998,69.332214000000022],[-130.99832200000003,69.338043000000027],[-130.95693999999997,69.371917999999994],[-130.93194599999998,69.38348400000001],[-130.92710899999992,69.386490000000038],[-130.91844200000003,69.386818000000005],[-130.91177400000004,69.384818999999993],[-130.90928599999995,69.381980999999996],[-130.89611799999994,69.380539000000056],[-130.89889500000004,69.352768000000026],[-130.90249600000004,69.340820000000122],[-130.90640300000001,69.328872999999987],[-130.91427599999992,69.318313999999987],[-130.93194599999998,69.304977000000122],[-130.93972799999995,69.299987999999985],[-130.96362299999987,69.285262999999986],[-131.00057999999996,69.256653000000142],[-131.024719,69.209717000000126],[-131.01806599999992,69.141936999999928],[-131.01419099999993,69.136932000000058],[-130.99832200000003,69.134720000000016],[-130.9372249999999,69.134430000000009],[-130.92861899999997,69.145264000000054],[-130.93112199999996,69.222488000000055],[-130.93276999999995,69.227767999999912],[-130.93917799999991,69.232208000000128],[-130.9513849999999,69.246368000000075],[-130.950287,69.257766999999944],[-130.94723499999998,69.264160000000118],[-130.94168100000002,69.270538000000045],[-130.93499800000001,69.276382000000069],[-130.82110599999993,69.374695000000031],[-130.81304899999998,69.379700000000128],[-130.77139299999999,69.398880000000077],[-130.76055899999994,69.402206000000092],[-130.73165899999998,69.403320000000065],[-130.71472199999999,69.402206000000092],[-130.70028699999995,69.402771000000143],[-130.689728,69.406096999999988],[-130.66027800000001,69.42942800000003],[-130.65472399999993,69.43609600000002],[-130.64529400000004,69.454712000000029],[-130.65280200000001,69.457763999999941],[-130.667236,69.457214000000079],[-130.74777199999994,69.449141999999938],[-130.71499599999993,69.462203999999986],[-130.52502400000003,69.543594000000041],[-130.50723300000004,69.552474999999959],[-130.47860700000001,69.574707000000046],[-130.392517,69.645828000000108],[-130.385559,69.651657000000114],[-130.36248799999998,69.673874000000012],[-130.36608899999987,69.686371000000008],[-130.28112799999991,69.700271999999984],[-130.03308099999998,69.731934000000081],[-129.691956,69.784424000000115],[-129.67251599999992,69.792480000000012],[-129.65307599999994,69.800536999999963],[-129.624146,69.812485000000038],[-129.60220300000003,69.818877999999984],[-129.41332999999992,69.838042999999971],[-129.31555199999997,69.84664900000007],[-129.24276699999984,69.849990999999989],[-129.17999299999997,69.849152000000004],[-129.14862099999993,69.849990999999989],[-129.09942599999994,69.858871000000022],[-129.05889899999988,69.873871000000008],[-129.04196199999996,69.883606000000043],[-129.02722199999999,69.895264000000111],[-129.01501499999995,69.908325000000048],[-129.00058000000001,69.933043999999995],[-128.98831199999995,69.946091000000024],[-128.97360200000003,69.95748900000001],[-128.96527100000003,69.962494000000049],[-128.95526100000001,69.966385000000116],[-128.94415300000003,69.969437000000084],[-128.93194600000004,69.971649000000127],[-128.90084799999994,69.971924000000115],[-128.88723799999997,69.968872000000033],[-128.86471599999999,69.961655000000121],[-128.85610999999989,69.957764000000054],[-128.85470599999996,69.954711999999915],[-128.93444799999992,69.844146999999964],[-128.94665499999991,69.841934000000037],[-128.96417199999996,69.843322999999998],[-129.03805499999999,69.851929000000098],[-129.08248899999995,69.850540000000137],[-129.10971099999989,69.847763000000043],[-129.134186,69.843322999999998],[-129.14529399999998,69.840271000000087],[-129.15612799999997,69.836928999999998],[-129.163635,69.83137499999998],[-129.169464,69.824706999999989],[-129.16027799999995,69.715819999999951],[-129.15390000000002,69.700271999999984],[-129.14999399999994,69.695526000000029],[-129.14138800000001,69.691649999999981],[-129.13027999999991,69.688034000000073],[-128.97747800000002,69.674698000000149],[-128.96304299999997,69.675262000000089],[-128.92501799999997,69.68081699999999],[-128.78613300000001,69.760818000000086],[-128.64001500000001,69.84304800000001],[-128.54473899999999,69.885268999999994],[-128.44195599999989,69.921920999999998],[-128.32415800000001,69.948318000000086],[-128.31054700000004,69.958327999999995],[-128.30862400000001,70.008041000000105],[-128.31222499999996,70.012772000000041],[-128.349152,70.03915400000011],[-128.35638399999999,70.048874000000012],[-128.36138900000003,70.058868000000018],[-128.36972000000003,70.095825000000048],[-128.36831699999988,70.101654000000053],[-128.36193800000001,70.108322000000044],[-128.35333299999996,70.113037000000077],[-128.34304799999995,70.116928000000144],[-128.31054700000004,70.126923000000033],[-128.24414099999996,70.146378000000027],[-128.10916099999997,70.182204999999954],[-128.09414700000002,70.182479999999998],[-128.05667099999994,70.178039999999953],[-128.01055899999994,70.178314000000114],[-127.99472000000003,70.179428000000087],[-127.96833799999996,70.182754999999986],[-127.84861799999999,70.208878000000141],[-127.61501299999992,70.228867000000093],[-127.58500699999996,70.229431000000034],[-127.54998799999998,70.22665400000011],[-127.51500699999985,70.22164900000007],[-127.51750199999998,70.225540000000137],[-127.55082700000003,70.236374000000012],[-127.578056,70.242751999999996],[-127.61305199999987,70.247757000000036],[-127.71665999999999,70.259720000000073],[-127.73166700000002,70.261382999999967],[-127.79194599999994,70.25999500000006],[-127.85833699999995,70.263046000000088],[-127.87581599999987,70.264435000000105],[-128.02835099999993,70.28637700000013],[-128.03695700000003,70.290543000000071],[-128.06664999999987,70.307205000000067],[-128.07611099999991,70.343597000000045],[-128.07843000000003,70.346436000000097],[-128.07144199999988,70.348267000000078],[-128.0616149999999,70.347923000000037],[-128.05343599999998,70.346092000000056],[-128.04661599999986,70.343933000000106],[-128.02711499999998,70.340766999999971],[-127.98889200000002,70.345824999999991],[-127.97250399999996,70.34526100000005],[-127.96000699999996,70.347488000000112],[-127.94860799999998,70.350540000000024],[-127.94082600000002,70.356094000000041],[-127.90194699999995,70.393326000000059],[-127.91555800000003,70.396652000000074],[-127.93195300000002,70.396942000000081],[-127.95417799999996,70.39387499999998],[-127.97693600000002,70.387772000000041],[-127.987213,70.383880999999974],[-128.02166699999998,70.374695000000031],[-128.06500199999994,70.377312000000018],[-128.13833599999992,70.37598400000013],[-128.15183999999994,70.380310000000122],[-128.15933199999995,70.385483000000022],[-128.19665499999996,70.391937000000041],[-128.19888300000002,70.40248100000008],[-128.19055200000003,70.436646000000053],[-128.17749000000003,70.460815000000139],[-128.16055299999999,70.491364000000033],[-128.15249600000004,70.503601000000003],[-128.13583399999993,70.523041000000148],[-128.006958,70.588593000000003],[-127.99665799999997,70.590546000000131],[-127.97138999999999,70.583878000000141],[-127.90360999999996,70.562485000000038],[-127.83556399999998,70.540817000000118],[-127.68028300000003,70.486098999999967],[-127.51583900000003,70.426086000000055],[-127.42859599999991,70.393326000000059],[-127.27471899999995,70.326096000000064],[-127.24889399999995,70.314148000000046],[-127.18831599999999,70.280548000000124],[-127.173607,70.272217000000069],[-127.125,70.237198000000149],[-127.07640100000003,70.196365000000071],[-127.05499299999997,70.178039999999953],[-127.03443899999996,70.148880000000077],[-126.89334099999996,70.008880999999974],[-126.87888299999997,70.000548999999978],[-126.81276700000001,69.910537999999974],[-126.81194299999993,69.905258000000117],[-126.80526700000001,69.895538000000045],[-126.74388099999999,69.813873000000115],[-126.71472199999999,69.775269000000094],[-126.70584099999996,69.766098000000113],[-126.69999699999994,69.76138300000008],[-126.6808319999999,69.748031999999967],[-126.67250100000001,69.743866000000082],[-126.62053699999996,69.719986000000063],[-126.60166899999996,69.712479000000144],[-126.45944199999997,69.644149999999968],[-126.29055799999998,69.558594000000028],[-126.26777599999997,69.540817000000118],[-126.26722699999993,69.535537999999974],[-126.25583599999999,69.526657000000057],[-126.11221299999994,69.469436999999971],[-126.08860800000002,69.462493999999992],[-126.0497279999999,69.45277400000009],[-126.03666699999997,69.449706999999989],[-125.98889199999996,69.430542000000003],[-125.96806299999997,69.423035000000084],[-125.95749699999999,69.419434000000024],[-125.91055299999999,69.405548000000067],[-125.88474300000001,69.399155000000064],[-125.83972199999999,69.389160000000004],[-125.55110200000001,69.33718900000008],[-125.42639200000002,69.312180000000126],[-125.41528299999987,69.313019000000054],[-125.37249800000001,69.33580000000012],[-125.36554699999999,69.342468000000054],[-125.39083900000003,69.370513999999957],[-125.40110800000002,69.374130000000036],[-125.37748699999997,69.396087999999963],[-125.21000699999996,69.381912],[-125.16528299999999,69.381638000000066],[-125.14167800000001,69.38638300000008],[-125.13249200000001,69.391098000000113],[-125.12554899999998,69.397491000000059],[-125.11193800000001,69.415817000000061],[-125.08944700000001,69.449706999999989],[-125.11277799999999,69.464157000000114],[-125.12304699999993,69.468032999999991],[-125.462784,69.452469000000065],[-125.53056300000003,69.435242000000073],[-125.609444,69.415253000000121],[-125.62249799999995,69.418593999999985],[-125.61805700000002,69.42442299999999],[-125.57805599999995,69.471649000000014],[-125.48832700000003,69.50749200000007],[-125.47721899999993,69.510268999999994],[-125.46472199999988,69.512207000000103],[-125.449997,69.51249700000011],[-125.30695300000002,69.499984999999981],[-125.14723200000003,69.485519000000124],[-125.13166799999993,69.484694999999988],[-125.11805699999996,69.485793999999942],[-125.12082700000002,69.490798999999981],[-125.13137799999993,69.49441500000006],[-125.18554699999987,69.507202000000063],[-125.21640000000002,69.513031000000069],[-125.25499699999995,69.523026000000016],[-125.265556,69.526917000000083],[-125.41000399999996,69.628036000000066],[-125.41306299999997,69.633041000000105],[-125.41361999999992,69.638321000000133],[-125.41166699999991,69.64387499999998],[-125.37805200000003,69.678589000000045],[-125.36554699999999,69.690262000000075],[-125.35527000000002,69.694138000000123],[-125.079453,69.742752000000053],[-125.06555200000003,69.743591000000038],[-125.04972800000002,69.743042000000116],[-125.016953,69.740524000000107],[-125,69.738190000000088],[-124.98581699999994,69.734711000000004],[-124.97528099999994,69.730820000000108],[-124.96749899999998,69.726929000000041],[-124.93554699999999,69.678314],[-124.92500299999995,69.644714000000135],[-124.90638699999994,69.65387000000004],[-124.88166799999999,69.670532000000037],[-124.82195300000001,69.714995999999985],[-124.82972699999999,69.719147000000078],[-124.86165599999993,69.735809000000074],[-124.88555899999994,69.748031999999967],[-124.89750700000002,69.750549000000035],[-125.01418299999995,69.750534000000016],[-125.22805799999998,69.759140000000116],[-125.24137899999999,69.760254000000089],[-125.25890399999992,69.784103000000016],[-125.27639799999997,69.808243000000061],[-125.225281,69.839676000000054],[-125.20638999999994,69.849120999999968],[-125.19611399999997,69.853026999999997],[-125.18443299999996,69.855804000000091],[-125.16750300000001,69.85414099999997],[-125.16194199999995,69.849700999999982],[-125.15722700000003,69.823563000000036],[-125.15666199999998,69.818283000000122],[-125.17083700000001,69.805496000000119],[-125.170547,69.800216999999975],[-125.165009,69.795502000000113],[-125.15055799999999,69.793564000000003],[-125.05666399999996,69.795242000000087],[-125.03222700000003,69.817200000000071],[-125.00945300000001,69.845520000000079],[-124.94748700000002,69.910537999999974],[-124.94027699999987,69.916930999999977],[-124.89334100000002,69.940262000000018],[-124.76444999999995,69.970824999999991],[-124.79527299999995,70.008880999999974],[-124.82695000000001,70.012496999999996],[-124.88694799999996,70.011932000000002],[-124.99027999999998,70.00610400000005],[-125.025284,69.998000999999988],[-125.04695100000004,69.989990000000091],[-125.08640299999996,69.968535999999915],[-125.10722399999997,69.953522000000078],[-125.10759699999994,69.947975000000099],[-125.11138899999997,69.941940000000102],[-125.12389400000001,69.939956999999993],[-125.19082600000002,69.932433999999944],[-125.20667299999991,69.933228000000099],[-125.21721599999995,69.936905000000081],[-125.21777299999997,69.942337000000066],[-125.20221699999991,69.998581000000058],[-125.19748700000002,70.004501000000118],[-125.18831599999999,70.009033000000102],[-125.016953,70.076218000000097],[-125,70.079987000000017],[-124.98972300000003,70.078598],[-124.98166700000002,70.074432000000115],[-124.97556299999991,70.064697000000024],[-124.97528099999994,70.059418000000051],[-124.98194899999999,70.047760000000039],[-124.98665599999998,70.041655999999989],[-124.99610899999999,70.036925999999994],[-124.99768799999998,70.036925999999994],[-125,70.036925999999994],[-125.03999299999992,70.029068000000109],[-125.04804999999999,70.023041000000092],[-125.04527300000001,70.017990000000111],[-125.03443900000002,70.013931000000014],[-125.01999699999993,70.011993000000075],[-124.90139799999997,70.021378000000141],[-124.86332699999997,70.027206000000092],[-124.85527000000002,70.03054800000001],[-124.86972000000003,70.032760999999994],[-124.93916299999995,70.02748100000008],[-124.95500199999998,70.028320000000065],[-124.95694699999996,70.032211000000132],[-124.93916299999995,70.042480000000126],[-124.92859599999997,70.046097000000088],[-124.81416300000001,70.061645999999996],[-124.71444700000001,70.069153000000142],[-124.67527799999993,70.071930000000066],[-124.64527900000002,70.071930000000066],[-124.63474300000001,70.068329000000006],[-124.63417099999992,70.057754999999929],[-124.60333300000002,70.019714000000135],[-124.59777799999995,70.01527400000009],[-124.58473199999992,70.011932000000002],[-124.56861899999996,70.011108000000036],[-124.55583199999995,70.013046000000145],[-124.45754999999997,70.035706000000118],[-124.45172100000002,70.038376000000028],[-124.44672400000002,70.0417020000001],[-124.423607,70.056366000000139],[-124.44138299999997,70.076096000000121],[-124.449432,70.08027600000014],[-124.506958,70.100266000000147],[-124.51999699999999,70.103867000000037],[-124.54888899999997,70.109984999999938],[-124.58556399999992,70.115265000000022],[-124.59944199999995,70.114151000000049],[-124.62053700000001,70.106644000000074],[-124.63221699999997,70.103867000000037],[-124.68138099999999,70.094436999999971],[-124.71972699999998,70.088593000000117],[-124.735817,70.089432000000102],[-124.73889200000002,70.094436999999971],[-124.75195299999996,70.116378999999995],[-124.75250199999999,70.121643000000006],[-124.74388099999999,70.127197000000137],[-124.734444,70.131927000000019],[-124.70472699999993,70.14498900000001],[-124.69415299999997,70.148605000000089],[-124.68028299999997,70.149719000000061],[-124.43611099999998,70.15109300000006],[-124.39138800000001,70.134155000000135],[-124.35861199999988,70.068603999999993],[-124.36945299999996,70.034987999999998],[-124.37193300000001,70.029434000000037],[-124.38394199999993,70.017761000000007],[-124.41776999999996,69.98942599999998],[-124.42610199999996,69.983871000000079],[-124.45944199999991,69.956375000000037],[-124.42971799999992,69.849425999999937],[-124.44249000000002,69.832763999999997],[-124.45722999999998,69.819716999999969],[-124.47972099999998,69.803589000000102],[-124.50167799999991,69.784424000000115],[-124.50361599999997,69.730820000000108],[-124.5005569999999,69.725815000000068],[-124.49526999999995,69.72137500000008],[-124.487503,69.717209000000139],[-124.45916699999998,69.710815000000082],[-124.36138900000003,69.701096000000121],[-124.29499800000002,69.695251000000042],[-124.28111299999995,69.696091000000081],[-124.26862299999993,69.69802900000002],[-124.2433319999999,69.714705999999978],[-124.23388699999998,69.719147000000078],[-124.21305799999993,69.726654000000053],[-124.20140099999998,69.72943099999992],[-124.1875,69.73054500000012],[-124.06973299999987,69.723602000000085],[-124.04083300000002,69.701385000000016],[-124.05526700000001,69.670532000000037],[-124.21193699999998,69.586380000000077],[-124.24054699999994,69.550262000000032],[-124.24999999999994,69.54553199999998],[-124.28028899999998,69.533600000000035],[-124.33444199999997,69.516936999999984],[-124.37777699999992,69.496933000000013],[-124.39527899999996,69.486923000000104],[-124.51888999999994,69.404159999999933],[-124.51390099999998,69.399428999999998],[-124.48000300000001,69.378036000000066],[-124.47222899999991,69.37414600000011],[-124.44666299999994,69.367203000000131],[-124.32584399999996,69.351929000000041],[-124.26363399999997,69.348602000000085],[-124.21888699999994,69.347762999999929],[-124.16194200000001,69.349152000000117],[-124.12026999999995,69.351379000000009],[-124.09528399999999,69.354980000000069],[-124.01640299999997,69.379150000000095],[-123.962219,69.383040999999935],[-123.83138999999994,69.38888500000013],[-123.81696299999999,69.38888500000013],[-123.73055999999997,69.377472000000125],[-123.702789,69.371094000000028],[-123.69776899999988,69.366378999999995],[-123.69748699999997,69.361099000000081],[-123.69248999999996,69.356644000000074],[-123.67999299999991,69.353317000000118],[-123.66639700000002,69.354156000000103],[-123.502792,69.377197000000137],[-123.47778299999993,69.381088000000034],[-123.46611000000001,69.383881000000031],[-123.41915899999998,69.404434000000037],[-123.40750100000002,69.416092000000106],[-123.43276999999995,69.423035000000084],[-123.44027699999998,69.427200000000084],[-123.45084399999996,69.446930000000066],[-123.45084399999996,69.452209000000039],[-123.44833399999993,69.457763999999941],[-123.44332900000001,69.463882000000069],[-123.43611099999998,69.470261000000107],[-123.42859599999991,69.476379000000065],[-123.39998599999996,69.490265000000079],[-123.36527999999998,69.49832200000003],[-123.33999599999999,69.502213000000097],[-123.30110200000001,69.506653000000085],[-123.27306399999998,69.507767000000115],[-123.26139799999999,69.504990000000021],[-123.26287799999994,69.500267000000008],[-123.25723299999999,69.496094000000085],[-123.19275699999997,69.490814],[-123.17999299999991,69.492477000000122],[-123.16861,69.4952550000001],[-123.16332999999992,69.501389000000131],[-123.13166799999999,69.559708000000001],[-123.12666300000001,69.571105999999986],[-123.09638999999999,69.670532000000037],[-123.09612299999998,69.686371000000008],[-123.10637700000001,69.743042000000116],[-123.10888699999998,69.747756999999922],[-123.11665299999993,69.75221300000004],[-123.10527000000002,69.77915999999999],[-123.01583900000003,69.818329000000062],[-122.97083999999995,69.830826000000002],[-122.95916699999992,69.833603000000096],[-122.94332900000001,69.832763999999997],[-122.90499899999998,69.822220000000129],[-122.876938,69.810257000000092],[-122.85388199999994,69.803040000000124],[-122.82584400000002,69.796371000000079],[-122.80803699999996,69.793593999999985],[-122.79332699999992,69.793593999999985],[-122.779449,69.794707999999957],[-122.76666299999999,69.796371000000079],[-122.754997,69.799149000000057],[-122.74610899999999,69.80442800000003],[-122.66443599999997,69.818054000000018],[-122.61554699999999,69.812195000000031],[-122.58833300000003,69.807479999999998],[-122.47778299999999,69.802765000000136],[-122.45805399999995,69.802475000000129],[-122.24333200000001,69.802200000000084],[-122.12777699999992,69.802475000000129],[-122.06220999999999,69.813309000000004],[-122.04415899999998,69.813599000000011],[-121.89639299999999,69.805542000000059],[-121.71916199999993,69.79582199999993],[-121.68388400000003,69.793593999999985],[-121.44304699999998,69.765549000000021],[-121.41639700000002,69.760818000000086],[-121.38054699999992,69.75221300000004],[-121.33332799999994,69.740814000000114],[-121.28611799999999,69.729156000000103],[-121.18305999999995,69.702484000000027],[-121.12027,69.6827550000001],[-121.08667000000003,69.673598999999967],[-121.03555299999999,69.663315000000125],[-121.00890400000003,69.658325000000104],[-120.93415800000002,69.648604999999975],[-120.88110399999994,69.638885000000073],[-120.82556199999999,69.62359600000002],[-120.79638699999992,69.613036999999963],[-120.760559,69.598328000000095],[-120.73999000000003,69.585266000000104],[-120.73528299999992,69.580276000000026],[-120.72860700000001,69.575821000000019],[-120.70111099999997,69.558594000000028],[-120.67859599999991,69.546097000000032],[-120.61609599999997,69.520264000000054],[-120.39334100000002,69.439697000000081],[-120.27528399999994,69.404159999999933],[-120.23166700000002,69.391662999999937],[-119.98222399999986,69.344711000000018],[-119.93499800000001,69.339705999999978],[-119.91776999999996,69.338318000000072],[-119.63527699999997,69.315810999999997],[-119.46140300000002,69.303314],[-119.33500700000002,69.301926000000094],[-119.31582599999996,69.301086000000055],[-119.23000300000001,69.294434000000138],[-118.94082600000002,69.259430000000066],[-118.85555999999997,69.252487000000087],[-118.84056099999992,69.250548999999978],[-118.79998799999993,69.243317000000047],[-118.69360399999999,69.223602000000028],[-118.65527299999997,69.215820000000065],[-118.64472999999998,69.212494000000049],[-118.63639799999993,69.20887799999997],[-118.58168000000001,69.180267000000072],[-118.55248999999998,69.163605000000075],[-118.53999299999998,69.154984000000127],[-118.502228,69.134720000000016],[-118.48554999999999,69.12692300000009],[-118.45777900000002,69.117477000000122],[-118.432503,69.112198000000092],[-118.18611099999998,69.063873000000115],[-118.08167999999995,69.031371999999976],[-118.03555299999999,69.019714000000135],[-118.010559,69.014434999999992],[-117.87053700000001,68.985535000000141],[-117.83693700000003,68.982483000000002],[-117.74221799999998,68.978043000000014],[-117.63390400000003,68.973602000000085],[-117.59612300000003,68.971649000000127],[-117.5625,68.968597000000045],[-117.41583299999996,68.953598],[-117.26917300000002,68.915268000000026],[-117.19110099999995,68.893874999999923],[-117.15387699999997,68.885544000000039],[-117.13667299999997,68.885544000000039],[-116.978882,68.899993999999992],[-116.96639999999996,68.902206000000035],[-116.96056399999992,68.907211000000075],[-116.93907899999994,68.911003000000107],[-116.88667299999992,68.90887500000008],[-116.74445299999996,68.880538999999999],[-116.515289,68.858032000000094],[-116.50029000000001,68.857208000000128],[-116.43611099999998,68.858597000000088],[-116.42054699999994,68.859146000000067],[-116.41111799999999,68.862761999999918],[-116.40666199999998,68.868590999999924],[-116.40943899999996,68.879974000000118],[-116.39862099999999,68.882751000000042],[-116.38137799999998,68.882477000000108],[-116.36472300000003,68.880813999999987],[-116.34028599999994,68.875259000000085],[-116.28555299999999,68.859711000000118],[-116.22721899999993,68.839157000000114],[-116.22138999999999,68.834427000000119],[-116.21362299999998,68.830551000000014],[-116.12304699999993,68.818329000000062],[-116.10637700000001,68.816666000000112],[-115.99388099999999,68.806641000000013],[-115.96000699999996,68.804703000000075],[-115.94915800000001,68.807479999999998],[-115.94138299999997,68.811920000000043],[-115.94471699999997,68.816940000000045],[-115.95249899999993,68.820831000000112],[-116.12193299999996,68.872481999999991],[-116.31639099999995,68.94747899999993],[-116.32417299999992,68.951660000000004],[-116.33000199999992,68.956100000000049],[-116.325287,68.961929000000055],[-116.31610099999995,68.965546000000018],[-116.30526699999996,68.968597000000045],[-116.26139799999987,68.979980000000069],[-116.239441,68.985535000000141],[-116.20500199999987,68.984985000000108],[-116.19027699999998,68.982758000000047],[-116.068893,68.960541000000148],[-116.00750700000003,68.946365000000128],[-115.96833799999996,68.938582999999994],[-115.88417099999998,68.924698000000092],[-115.86749299999991,68.922759999999982],[-115.77806099999987,68.936371000000122],[-115.76695299999994,68.939148000000046],[-115.77500900000001,68.943039000000113],[-115.80943299999996,68.952208999999982],[-115.83332799999999,68.992477000000008],[-115.59306300000003,68.971649000000127],[-115.44638099999992,68.937759000000028],[-115.06471299999993,68.867476999999951],[-115.05055199999993,68.868866000000139],[-115.03500400000001,68.869140999999956],[-115.01640299999997,68.868042000000003],[-114.98999000000003,68.862761999999918],[-114.97805800000003,68.859146000000067],[-114.82167099999998,68.809707999999944],[-114.79194599999994,68.799423000000047],[-114.77916699999992,68.77915999999999],[-114.77055399999995,68.769440000000088],[-114.74916100000002,68.751389000000074],[-114.729446,68.744431000000134],[-114.71528599999999,68.742203000000131],[-114.69666299999994,68.740814],[-114.66555799999998,68.741653000000099],[-114.57833899999997,68.728043000000071],[-114.54250300000001,68.719436999999971],[-114.44833399999999,68.689697000000024],[-114.44055200000003,68.685805999999957],[-114.46028100000001,68.670532000000094],[-114.46528599999999,68.664428999999927],[-114.46221899999995,68.659424000000058],[-114.45667300000002,68.654709000000025],[-114.40471600000001,68.614990000000148],[-114.39499699999993,68.611374000000069],[-114.30444299999988,68.586929000000055],[-114.23361199999994,68.569443000000092],[-114.12165799999997,68.517487000000017],[-114.10665899999992,68.509430000000066],[-114.08889799999997,68.496368000000018],[-114.07055699999995,68.477478000000076],[-114.064438,68.467209000000025],[-114.06054699999993,68.456650000000025],[-114.01112399999994,68.250275000000045],[-114.01390100000003,68.244979999999998],[-114.02333099999998,68.24136400000009],[-114.03582799999998,68.23942599999998],[-114.28806299999997,68.228866999999923],[-114.32000700000003,68.229156000000046],[-114.33805799999993,68.230545000000063],[-114.35166900000002,68.233597000000145],[-114.37053700000001,68.240540000000124],[-114.37805199999997,68.24443100000002],[-114.38305700000001,68.248871000000065],[-114.390556,68.253052000000139],[-114.41166699999997,68.259430000000066],[-114.42555199999998,68.261932000000002],[-114.44167299999987,68.263610999999969],[-114.47361799999987,68.26388500000013],[-114.70249899999999,68.250275000000045],[-114.75527999999997,68.189697000000137],[-114.76471699999996,68.186096000000077],[-114.861107,68.153594999999996],[-114.87193300000001,68.151093000000117],[-114.89639299999999,68.146942000000024],[-114.92971799999992,68.14776599999999],[-114.97749299999992,68.153319999999951],[-115.00750700000003,68.157211000000018],[-115.076683,68.168869000000086],[-115.17054699999994,68.180542000000116],[-115.22501399999993,68.184142999999949],[-115.23721299999988,68.18220500000001],[-115.24194299999999,68.176376000000005],[-115.24388099999993,68.041367000000093],[-115.24054699999994,68.036377000000073],[-115.23528299999998,68.03166200000004],[-115.220551,68.023880000000077],[-115.204453,68.021927000000119],[-115.17138699999998,68.021102999999982],[-115.15638699999994,68.021652000000131],[-115.12526699999995,68.020263999999997],[-115.11389200000002,68.017487000000131],[-115.11054999999999,68.012207000000046],[-115.11665299999999,68.007217000000026],[-115.12581599999999,68.003601000000117],[-115.20472699999993,67.978043000000014],[-115.216949,67.976089000000002],[-115.34221599999995,67.958037999999988],[-115.50334199999986,67.934418000000051],[-115.52749599999999,67.930267000000129],[-115.53639199999998,67.926651000000049],[-115.5425029999999,67.92164600000001],[-115.53694200000001,67.905257999999947],[-115.53388999999993,67.899993999999992],[-115.52834299999995,67.895538000000045],[-115.521118,67.891663000000108],[-115.50723299999993,67.889435000000105],[-115.281387,67.866379000000109],[-115.27610800000002,67.861649000000057],[-115.20028699999995,67.821930000000123],[-115.19082599999996,67.818329000000062],[-115.11361699999998,67.798599000000081],[-115.1036069999999,67.796646000000123],[-115.02887699999985,67.786652000000117],[-115.01251200000002,67.78637700000013],[-114.99916099999996,67.787491000000102],[-114.93611099999998,67.79553199999998],[-114.88667299999997,67.802764999999965],[-114.84916699999991,67.807755000000043],[-114.80999800000001,67.812195000000031],[-114.78307299999989,67.814423000000033],[-114.75334199999992,67.814986999999974],[-114.73693799999995,67.814697000000137],[-114.718887,67.813309000000061],[-114.70749699999999,67.810531999999967],[-114.6866609999999,67.804153000000099],[-114.67722299999997,67.800812000000064],[-114.65527299999997,67.788879000000009],[-114.64499699999999,67.779709000000139],[-114.637787,67.775543000000027],[-114.29778299999992,67.718597000000102],[-114.28362300000003,67.717484000000013],[-114.27139299999999,67.719436999999971],[-114.25029000000001,67.724700999999982],[-114.24109599999991,67.728317000000004],[-114.22000099999997,67.733871000000022],[-114.19583099999994,67.737762000000089],[-114.1808319999999,67.738037000000077],[-114.14835399999993,67.736923000000104],[-114.11472300000003,67.733871000000022],[-113.99694799999992,67.723038000000031],[-113.98332199999999,67.720535000000041],[-113.94943199999994,67.711655000000007],[-113.89250199999992,67.696930000000066],[-113.84584000000001,67.691359999999975],[-113.76862299999999,67.691086000000041],[-113.70889299999999,67.691925000000026],[-113.55082699999997,67.698029000000076],[-113.25583599999999,67.704436999999984],[-113.24082899999996,67.704436999999984],[-113.20694700000001,67.702484000000084],[-113.17804699999988,67.698029000000076],[-113.15556300000003,67.692200000000014],[-113.11916399999996,67.678040000000124],[-113.10777300000001,67.674988000000042],[-113.06777999999997,67.667480000000012],[-113.04998799999993,67.666092000000106],[-112.965012,67.669708000000128],[-112.73972300000003,67.669434000000024],[-112.3958439999999,67.679153000000042],[-112.370003,67.68193100000002],[-112.348343,67.687194999999974],[-112.34056099999998,67.691359999999975],[-112.33361799999989,67.696365000000014],[-112.18331899999993,67.727768000000083],[-111.912781,67.754166000000055],[-111.88305700000001,67.754439999999988],[-111.79972799999996,67.75082400000008],[-111.66000399999996,67.733322000000044],[-111.57277699999992,67.744431000000134],[-111.45861799999989,67.763046000000088],[-111.37082699999991,67.781097000000045],[-111.32250999999991,67.806931000000077],[-111.31276699999995,67.810531999999967],[-111.29083299999996,67.815536000000066],[-111.200287,67.834152000000131],[-111.17582699999991,67.837494000000049],[-111.15943900000002,67.836655000000064],[-111.14835399999998,67.833602999999982],[-111.14388999999994,67.82887299999993],[-111.146118,67.822769000000108],[-111.12082700000002,67.780823000000112],[-111.03443899999996,67.764160000000061],[-111.01834100000002,67.763321000000076],[-111.00583599999999,67.764998999999989],[-110.84056099999998,67.800262000000032],[-110.83222999999998,67.804428000000087],[-110.80972300000002,67.818604000000107],[-110.78859699999998,67.833602999999982],[-110.78278399999994,67.839431999999988],[-110.75890400000003,67.852767999999969],[-110.74221799999992,67.861099000000024],[-110.73249800000002,67.86442599999998],[-110.41443600000002,67.947754000000145],[-110.33999599999999,67.965546000000018],[-110.1991579999999,67.972214000000008],[-110.17999299999991,67.994431000000077],[-110.1725009999999,67.999420000000043],[-110.162781,68.00277699999998],[-110.15167200000002,68.005264000000068],[-110.13054699999998,68.008040999999992],[-110.11694299999994,68.008881000000031],[-110.08389299999999,68.006943000000092],[-110.07084699999996,68.004165999999998],[-110.04888900000003,67.997756999999922],[-110.00110599999999,67.979705999999965],[-109.979446,67.967483999999956],[-109.97083999999995,67.958037999999988],[-109.96888699999994,67.953049000000021],[-109.96749899999992,67.941360000000145],[-109.97028399999999,67.929703000000018],[-109.97749299999987,67.911377000000016],[-109.99166899999994,67.891373000000044],[-110.00110599999999,67.872482000000048],[-110.00361599999991,67.866379000000109],[-110.00361599999991,67.860535000000084],[-109.99749799999995,67.850815000000011],[-109.98889200000002,67.841370000000097],[-109.98249800000002,67.837204000000042],[-109.97389199999998,67.833602999999982],[-109.96305799999993,67.830276000000026],[-109.948036,67.830276000000026],[-109.93554699999999,67.831940000000031],[-109.92582699999997,67.835266000000104],[-109.91722099999998,67.839157],[-109.91251399999999,67.845824999999934],[-109.912216,67.85165399999994],[-109.91639700000002,67.856093999999985],[-109.94888300000002,67.877197000000081],[-109.95305599999995,67.881927000000076],[-109.94193999999993,67.884430000000066],[-109.89028899999994,67.879974000000004],[-109.86193799999995,67.874985000000038],[-109.823059,67.866089000000102],[-109.81416299999995,67.862198000000035],[-109.80777,67.858032000000094],[-109.76722699999993,67.827773999999977],[-109.73082699999998,67.791931000000091],[-109.72917200000001,67.767761000000121],[-109.73581699999994,67.74275200000011],[-109.74553700000001,67.739426000000094],[-109.75167799999991,67.733597000000088],[-109.74973299999994,67.728592000000049],[-109.7369379999999,67.720261000000107],[-109.72609699999998,67.716933999999981],[-109.55222300000003,67.687759000000142],[-109.53472899999991,67.685806000000014],[-109.52250700000002,67.687484999999981],[-109.51139799999999,67.689697000000081],[-109.50279199999994,67.693862999999965],[-109.48805199999993,67.703873000000044],[-109.37026999999995,67.729155999999989],[-109.25361599999997,67.731934000000138],[-109.21028100000001,67.732208000000071],[-109.15915699999999,67.727478000000019],[-109.06582600000002,67.714157000000114],[-109.05972300000002,67.709991000000002],[-109.01471699999996,67.676651000000106],[-109.00279199999994,67.662491000000045],[-108.91915899999992,67.535812000000135],[-108.921944,67.529709000000025],[-108.95388800000001,67.511932000000115],[-108.96362299999998,67.5086060000001],[-108.99665800000002,67.501389000000017],[-109.00119000000001,67.5],[-109.00666799999993,67.498322000000087],[-109.01528899999994,67.494141000000013],[-109.02139299999999,67.488311999999951],[-109.02528399999994,67.483322000000101],[-109.01806599999998,67.462494000000049],[-109.002228,67.443587999999977],[-108.98554999999993,67.436096000000077],[-108.84999099999993,67.388596000000064],[-108.83112299999993,67.353591999999992],[-108.82501200000002,67.349426000000108],[-108.81276700000001,67.348876999999959],[-108.80416899999994,67.352768000000026],[-108.79666099999986,67.357758000000103],[-108.79055799999998,67.363602000000128],[-108.76611299999996,67.396378000000027],[-108.75834700000001,67.409149000000127],[-108.75583599999999,67.415267999999969],[-108.74445299999996,67.445525999999973],[-108.74109599999997,67.457214000000135],[-108.73638900000003,67.481093999999985],[-108.735817,67.486649000000057],[-108.734734,67.547759999999982],[-108.735817,67.558594000000028],[-108.73777799999993,67.563873000000058],[-108.73889200000002,67.574707000000103],[-108.73916599999995,67.596938999999963],[-108.73638900000003,67.603043000000014],[-108.73000299999995,67.608597000000032],[-108.71472199999999,67.61914100000007],[-108.70612299999988,67.623306000000071],[-108.69611399999997,67.626373000000001],[-108.67027299999995,67.628586000000098],[-108.65527299999991,67.62831100000011],[-108.62053700000001,67.624695000000031],[-108.6100009999999,67.621093999999971],[-108.58500700000002,67.609985000000108],[-108.57888799999989,67.605545000000063],[-108.516953,67.497482000000048],[-108.51139799999999,67.487487999999985],[-108.510559,67.47665400000011],[-108.51334399999996,67.470535000000098],[-108.52333099999993,67.45748900000001],[-108.52390300000002,67.451659999999947],[-108.52278100000001,67.44081100000011],[-108.49804699999993,67.363037000000077],[-108.49027999999998,67.353591999999992],[-108.48416099999997,67.349426000000108],[-108.47138999999993,67.346649000000014],[-108.458054,67.347214000000065],[-108.43720999999994,67.352768000000026],[-108.42971799999998,67.357483000000059],[-108.42471299999994,67.364151000000049],[-108.421944,67.3702550000001],[-108.42944299999999,67.379700000000128],[-108.43554699999999,67.383881000000031],[-108.439438,67.388596000000064],[-108.44275699999997,67.399155000000121],[-108.43998699999992,67.427475000000129],[-108.43472300000002,67.431656000000032],[-108.39388999999994,67.443587999999977],[-108.38166799999999,67.445251000000098],[-108.36694299999994,67.444976999999994],[-108.34361299999989,67.438582999999937],[-108.33556399999998,67.434982000000105],[-108.32112100000001,67.426926000000037],[-108.30750299999988,67.413040000000024],[-108.301941,67.403320000000122],[-108.30027799999999,67.398041000000148],[-108.29666099999997,67.393326000000116],[-108.28832999999997,67.389435000000049],[-108.13417099999992,67.329163000000051],[-108.06360599999988,67.305251999999996],[-108.02583300000003,67.296371000000022],[-108.015289,67.293045000000006],[-107.98554999999999,67.271927000000119],[-107.94471699999997,67.236374000000069],[-107.94082600000002,67.231659000000036],[-107.875,67.140823000000012],[-107.87526700000001,67.052765000000136],[-107.88054699999998,67.04832499999992],[-107.89362299999999,67.047760000000096],[-107.90499899999998,67.049713000000054],[-107.95028699999995,67.062195000000031],[-108.00834699999996,67.077484000000084],[-108.02084399999995,67.080551000000014],[-108.03666699999991,67.081664999999987],[-108.14862099999993,67.076660000000118],[-108.15722700000003,67.072769000000051],[-108.18916300000001,67.054977000000008],[-108.19304699999986,67.049713000000054],[-108.192207,67.038878999999952],[-108.19082600000002,67.033599999999979],[-108.19138299999992,67.028046000000018],[-108.19526699999994,67.022766000000104],[-108.20388799999995,67.018875000000037],[-108.21611000000001,67.017211999999915],[-108.23277300000001,67.019150000000081],[-108.24527,67.022217000000012],[-108.45028699999995,67.083328000000108],[-108.46056399999992,67.086928999999998],[-108.495003,67.102203000000088],[-108.51722699999999,67.113876000000062],[-108.541382,67.130813999999987],[-108.55555700000002,67.138885000000073],[-108.58029199999999,67.15026899999998],[-108.59056099999998,67.153594999999996],[-108.6063769999999,67.154708999999968],[-108.61971999999997,67.15387000000004],[-108.622772,67.149993999999936],[-108.53028899999993,67.042480000000012],[-108.52416999999997,67.038315000000011],[-108.51611300000002,67.034423999999944],[-108.50140399999998,67.032211000000018],[-108.491669,67.0352630000001],[-108.48554999999988,67.041092000000106],[-108.48500100000001,67.046646000000123],[-108.48665599999998,67.05192599999998],[-108.49054699999988,67.056641000000013],[-108.48944099999994,67.067764000000011],[-108.48194899999999,67.072769000000051],[-108.468887,67.073318000000029],[-108.45612299999999,67.070541000000105],[-108.44193999999999,67.062485000000038],[-108.39222699999993,67.028869999999984],[-108.35637700000001,67.003326000000129],[-108.34665699999994,66.994431000000077],[-108.33056599999998,66.986923000000104],[-108.31806899999998,66.983871000000136],[-108.28971899999993,66.979980000000069],[-108.25862099999995,66.977768000000026],[-108.22860700000001,66.976654000000053],[-108.19695300000001,66.972214000000008],[-108.16639700000002,66.962204000000099],[-108.14998600000001,66.954436999999984],[-108.11472299999997,66.928864000000033],[-107.98528299999998,66.828598000000113],[-107.94138299999997,66.788315000000068],[-107.93831599999999,66.778046000000074],[-107.93971299999993,66.766663000000051],[-107.94193999999999,66.749709999999936],[-107.94471699999997,66.743591000000094],[-107.94803599999995,66.731933999999967],[-107.949432,66.720535000000098],[-107.94583099999994,66.715820000000065],[-107.89444699999996,66.671646000000123],[-107.88276699999989,66.663315000000011],[-107.87082699999996,66.662491000000045],[-107.86444099999989,66.668320000000051],[-107.86389200000002,66.673874000000069],[-107.86776700000001,66.71138000000002],[-107.88474299999996,66.750823999999909],[-107.88834400000002,66.755554000000132],[-107.88194299999992,66.759155000000021],[-107.86776700000001,66.758881000000088],[-107.85333299999996,66.756378000000097],[-107.829453,66.744980000000112],[-107.81777999999997,66.736374000000012],[-107.76500699999997,66.686919999999986],[-107.72416699999991,66.629700000000128],[-107.64750699999996,66.574707000000103],[-107.62805199999997,66.562194999999974],[-107.60082999999997,66.546097000000088],[-107.56945799999994,66.53054800000001],[-107.55721999999997,66.527771000000087],[-107.43305999999995,66.453598000000113],[-107.2911069999999,66.36831699999999],[-107.26027699999986,66.353043000000071],[-107.24804699999993,66.349990999999989],[-107.23500100000001,66.348602000000142],[-107.22222899999997,66.349152000000004],[-107.21140299999996,66.351379000000065],[-107.203056,66.355254999999943],[-107.196663,66.360809000000131],[-107.195831,66.366379000000052],[-107.19722000000002,66.371643000000006],[-107.20056199999993,66.376373000000058],[-107.23554999999993,66.407486000000063],[-107.34221599999995,66.461655000000064],[-107.43888899999996,66.513046000000145],[-107.56220999999994,66.591369999999984],[-107.56582599999996,66.596100000000035],[-107.56861899999996,66.606644000000074],[-107.56777999999991,66.612198000000092],[-107.56916799999999,66.617477000000065],[-107.57055700000001,66.622482000000105],[-107.57417299999997,66.627471999999955],[-107.62416100000002,66.660812000000021],[-107.64943700000003,66.693862999999965],[-107.69387799999998,66.755829000000006],[-107.74665800000002,66.922760000000039],[-107.68861399999997,66.977097000000128],[-107.63806199999999,67.024429000000055],[-107.66665599999993,67.063034000000016],[-107.66805999999985,67.068329000000062],[-107.66166699999997,67.073883000000023],[-107.65083299999992,67.076096000000007],[-107.63612399999994,67.073883000000023],[-107.60777299999995,67.063309000000004],[-107.58361799999994,67.051650999999993],[-107.52390300000002,67.020264000000054],[-107.51666299999999,67.010543999999982],[-107.48388699999998,66.924149],[-107.48473399999995,66.918593999999928],[-107.49694799999997,66.917206000000022],[-107.57972699999988,66.916382000000056],[-107.59445199999999,66.918868999999972],[-107.60221899999988,66.922760000000039],[-107.608047,66.926926000000094],[-107.62332200000003,66.940262000000075],[-107.626938,66.944977000000108],[-107.632767,66.949417000000096],[-107.64083899999997,66.953049000000078],[-107.647064,66.942711000000031],[-107.65521999999999,66.943710000000067],[-107.66238399999997,66.942879000000062],[-107.66754900000001,66.940376000000072],[-107.67138699999998,66.937035000000037],[-107.67038700000001,66.933868000000018],[-107.63527699999997,66.892212000000029],[-107.57028199999991,66.837769000000094],[-107.564438,66.833602999999982],[-107.51306199999993,66.822220000000016],[-107.42832900000002,66.804703000000131],[-107.41610699999995,66.806091000000038],[-107.40888999999993,66.811096000000077],[-107.39111299999996,66.891373000000101],[-107.39584400000001,66.901382000000126],[-107.422234,66.939697000000024],[-107.42944299999999,66.949142000000109],[-107.43888899999996,66.958328000000051],[-107.44471699999997,66.962493999999936],[-107.44387799999993,66.968048000000124],[-107.435272,66.972214000000008],[-107.421944,66.972762999999986],[-107.40611299999995,66.97137500000008],[-107.37943999999993,66.966094999999996],[-107.35916099999992,66.959427000000005],[-107.23388699999992,66.902206000000092],[-107.21806299999997,66.894714000000135],[-107.21028099999995,66.890823000000069],[-107.1875,66.87359600000002],[-107.15750099999991,66.846939000000134],[-107.15055799999999,66.837494000000049],[-107.14916999999991,66.832214000000022],[-107.137787,66.823608000000092],[-107.12554899999992,66.820540999999992],[-107.09472700000003,66.818329000000119],[-107.08361799999994,66.820540999999992],[-107.15527299999997,66.899719000000005],[-107.20388800000001,66.944702000000063],[-107.22666900000002,66.961655000000007],[-107.24027999999998,66.969986000000063],[-107.29750100000001,67.001938000000052],[-107.3052669999999,67.005829000000119],[-107.31139399999995,67.127197000000024],[-107.38806199999993,67.144440000000145],[-107.43083200000001,67.158325000000048],[-107.44915800000001,67.165543000000071],[-107.47332799999992,67.176926000000037],[-107.48137700000001,67.180816999999934],[-107.50306699999993,67.192749000000106],[-107.53250100000002,67.214157],[-107.64862099999993,67.359984999999995],[-107.57694999999995,67.475540000000137],[-107.57389799999993,67.481658999999979],[-107.57528699999995,67.48692299999999],[-107.57888800000001,67.491652999999985],[-107.58277899999996,67.496368000000018],[-107.58860799999991,67.500823999999966],[-107.71833800000002,67.573318000000086],[-107.74054699999994,67.585265999999933],[-107.77362099999999,67.600540000000024],[-107.81331599999999,67.614426000000037],[-107.84472700000003,67.624420000000043],[-107.89055599999989,67.642487000000074],[-107.96916199999998,67.676651000000106],[-107.98972300000003,67.688873000000115],[-107.99944299999999,67.698029000000076],[-108.006958,67.707489000000123],[-108.01334399999996,67.728317000000004],[-108.01445000000001,67.73414600000001],[-108.015289,67.744980000000055],[-108.01390099999998,67.756103999999993],[-108.00805699999995,67.768326000000116],[-107.99249299999997,67.788040000000024],[-107.94833399999993,67.841095000000109],[-107.94193999999999,67.846939000000134],[-107.93415800000002,67.85165399999994],[-107.92278299999998,67.853867000000093],[-107.890289,67.85165399999994],[-107.87777699999992,67.853317000000061],[-107.85527000000002,67.85775799999999],[-107.75666799999993,67.880814000000044],[-107.71472199999994,67.892487000000074],[-107.70472699999993,67.895828000000108],[-107.674713,67.916092000000049],[-107.66166699999997,67.927475000000015],[-107.65110800000002,67.940535999999952],[-107.65499899999992,67.945250999999985],[-107.66555800000003,67.94859300000013],[-107.77050800000001,67.96526300000005],[-107.81133999999992,67.971596000000034],[-107.91027800000001,67.988585999999998],[-107.91639699999996,67.993042000000059],[-107.91999800000002,67.997756999999922],[-107.89055599999989,68.081664999999987],[-107.88527699999997,68.088318000000129],[-107.87888299999997,68.093872000000147],[-107.86332699999997,68.103592000000049],[-107.85166899999996,68.106094000000098],[-107.837784,68.104430999999977],[-107.72112300000003,68.082763999999941],[-107.69943199999994,68.075821000000133],[-107.69360399999994,68.071655000000078],[-107.69776899999994,68.066376000000105],[-107.70667300000002,68.062485000000038],[-107.72721899999993,68.056090999999981],[-107.73860200000001,68.05386400000009],[-107.77250700000002,68.05693100000002],[-107.78778099999994,68.057205000000124],[-107.80027799999999,68.055817000000047],[-107.80943299999996,68.051650999999936],[-107.83332799999988,68.013046000000031],[-107.83389299999999,68.007217000000026],[-107.82778899999988,68.003052000000025],[-107.8038479999999,68.004264999999975],[-107.78733799999998,67.997597000000042],[-107.77900699999998,67.996765000000096],[-107.763847,67.998428000000047],[-107.75699599999996,67.999771000000123],[-107.75426500000003,68.006812999999966],[-107.73306300000002,68.020827999999995],[-107.72501399999993,68.025818000000015],[-107.69027699999992,68.042480000000012],[-107.67999299999997,68.04582199999993],[-107.61028299999998,68.058593999999971],[-107.58583099999998,68.059982000000048],[-107.57084700000001,68.059708000000114],[-107.53806299999997,68.057479999999998],[-107.45028699999989,68.047211000000118],[-107.38890100000003,68.04525799999999],[-107.36221299999994,68.04693600000013],[-107.34944200000001,68.048599000000024],[-107.32640099999998,68.053040000000124],[-107.28778099999994,68.064987000000087],[-107.25140399999998,68.080826000000002],[-107.22638699999993,68.094436999999971],[-107.154449,68.12692300000009],[-107.141953,68.128310999999997],[-107.11028299999998,68.12692300000009],[-107.10665899999998,68.122208000000057],[-107.11888099999987,68.084717000000069],[-106.96556099999998,68.113312000000121],[-106.95278899999988,68.114700000000028],[-106.85611,68.116927999999973],[-106.84111000000001,68.116379000000052],[-106.80194099999994,68.197479000000101],[-106.80943300000001,68.207214000000022],[-106.80610699999994,68.213043000000027],[-106.80027799999993,68.217484000000127],[-106.79110700000001,68.221375000000023],[-106.62748699999997,68.246643000000063],[-106.61444099999994,68.24803200000008],[-106.5994419999999,68.247482000000048],[-106.58860800000002,68.244141000000013],[-106.468613,68.190536000000122],[-106.45777900000002,68.176376000000005],[-106.45417799999996,68.160812000000078],[-106.45056199999999,68.155823000000112],[-106.44471699999991,68.151657000000057],[-106.43195300000002,68.153046000000018],[-106.42138699999987,68.156097000000045],[-106.35056299999997,68.179153000000099],[-106.34472699999998,68.183318999999983],[-106.35056299999997,68.187759000000028],[-106.35888699999992,68.191650000000095],[-106.39277600000003,68.201660000000004],[-106.42083700000001,68.207214000000022],[-106.468887,68.214431999999988],[-106.48194899999993,68.217484000000127],[-106.48999000000003,68.221375000000023],[-106.49582699999996,68.225540000000024],[-106.49722300000002,68.230820000000051],[-106.46833799999996,68.329711999999972],[-106.46501199999994,68.335815000000139],[-106.45667299999991,68.340820000000008],[-106.44748700000002,68.344711000000075],[-106.42639200000002,68.350815000000068],[-106.25611900000001,68.387772000000098],[-106.24416400000001,68.38998400000014],[-106.21833800000002,68.392487000000131],[-106.203056,68.392211999999915],[-106.185272,68.38998400000014],[-106.17471299999994,68.386658000000125],[-106.16665599999999,68.382750999999985],[-106.15471599999989,68.373871000000122],[-105.79638699999998,68.422211000000118],[-105.79055799999998,68.418045000000063],[-105.78222699999998,68.413878999999952],[-105.76583900000003,68.41276600000009],[-105.75167799999991,68.413040000000024],[-105.73972300000003,68.415267999999969],[-105.73029300000002,68.419144000000017],[-105.72305299999999,68.424698000000035],[-105.70111099999991,68.469711000000132],[-105.69721999999996,68.486649],[-105.69833399999993,68.49192800000003],[-105.70278899999994,68.501938000000109],[-105.71444699999995,68.510544000000039],[-105.74305700000002,68.564697000000137],[-105.724716,68.574158000000125],[-105.64499699999999,68.633880999999974],[-105.65083300000003,68.638046000000145],[-105.66639699999996,68.638596000000007],[-105.90222199999999,68.635269000000051],[-105.92832899999996,68.632476999999994],[-106.02944899999994,68.619704999999954],[-106.041382,68.617477000000008],[-106.04972799999996,68.612761999999975],[-106.04750100000001,68.602203000000145],[-106.05332900000002,68.595824999999991],[-106.06416300000001,68.59275800000006],[-106.2077789999999,68.567764000000068],[-106.23638900000003,68.566665999999998],[-106.37027,68.545258000000103],[-106.51083399999999,68.518326000000002],[-106.54387700000001,68.511932000000115],[-106.62470999999999,68.46748400000007],[-106.63166799999999,68.461928999999998],[-106.62888299999992,68.45138500000013],[-106.62165799999997,68.441925000000026],[-106.61582899999996,68.437759000000142],[-106.59528399999994,68.425261999999975],[-106.58473200000003,68.421646000000123],[-106.57167099999992,68.418593999999985],[-106.55387899999994,68.416656000000046],[-106.52194199999997,68.414992999999924],[-106.50446299999999,68.41276600000009],[-106.493607,68.409424000000115],[-106.48777799999988,68.404984000000127],[-106.48055999999997,68.395537999999988],[-106.52722199999994,68.300812000000121],[-106.53415699999999,68.295257999999933],[-106.54332699999998,68.291367000000037],[-106.556107,68.289978000000076],[-106.57277699999986,68.291092000000049],[-106.58444199999991,68.293319999999994],[-106.59500099999997,68.296646000000067],[-106.60109699999998,68.301086000000055],[-106.6119379999999,68.315262000000075],[-106.6383439999999,68.343048000000124],[-106.64444700000001,68.347487999999942],[-106.77887699999997,68.408034999999984],[-106.78971899999999,68.411652000000117],[-106.80277999999993,68.414428999999984],[-107.01363400000002,68.369431000000077],[-107.02166699999998,68.364699999999971],[-107.02027899999996,68.359420999999998],[-107.01666299999999,68.354705999999965],[-107.01750199999998,68.349151999999947],[-107.03138699999994,68.33776899999998],[-107.13221699999991,68.283325000000104],[-107.24610899999999,68.261383000000023],[-107.25890400000003,68.259995000000117],[-107.26500699999997,68.264160000000118],[-107.274719,68.273314999999968],[-107.28611799999993,68.287490999999989],[-107.29611199999994,68.296646000000067],[-107.30194099999994,68.300812000000121],[-107.32721699999991,68.312484999999981],[-107.33805799999999,68.315810999999997],[-107.54666099999992,68.347487999999942],[-107.56082200000003,68.349151999999947],[-107.81331599999999,68.342484000000013],[-107.82611099999997,68.341094999999996],[-107.83640300000002,68.338043000000084],[-107.84973100000002,68.326385000000073],[-107.85500299999995,68.31999200000007],[-107.88527699999997,68.26887499999998],[-107.88362100000001,68.263610999999969],[-107.879707,68.258880999999974],[-107.85417199999995,68.247482000000048],[-107.83029199999993,68.241089000000102],[-107.74194299999999,68.216934000000094],[-107.61332700000003,68.178588999999988],[-107.60249299999998,68.175262000000032],[-107.59861799999999,68.17053199999998],[-107.60305800000003,68.165268000000026],[-107.61582900000002,68.163879000000009],[-107.63221699999997,68.164992999999981],[-107.68998699999997,68.174423000000047],[-107.78639199999992,68.183868000000132],[-107.80027799999999,68.183318999999983],[-107.82584399999996,68.180542000000116],[-107.87193300000001,68.171371000000136],[-108.03388999999999,68.168594000000041],[-108.16139199999986,68.172759999999982],[-108.18694299999999,68.169983000000059],[-108.19695300000001,68.166656000000103],[-108.22028399999999,68.152205999999978],[-108.24944299999993,68.141663000000051],[-108.30055199999993,68.125809000000118],[-108.33222999999998,68.117203000000018],[-108.37026999999989,68.112762000000089],[-108.38555899999994,68.113037000000077],[-108.40306099999998,68.114990000000034],[-108.41388699999993,68.11831699999999],[-108.42250099999995,68.122208000000057],[-108.43277,68.131088000000091],[-108.43611099999987,68.141373000000044],[-108.43306000000001,68.147490999999945],[-108.42804699999994,68.154160000000047],[-108.40888999999999,68.16137700000013],[-108.39750700000002,68.163605000000075],[-108.36694299999994,68.161102000000085],[-108.36277799999993,68.15637200000009],[-108.36582899999996,68.15026899999998],[-108.37361099999993,68.145264000000111],[-108.37998999999996,68.139708999999982],[-108.37832599999996,68.134430000000009],[-108.36527999999993,68.133606000000043],[-108.34612299999998,68.140823000000012],[-108.33860800000002,68.145828000000051],[-108.33332799999994,68.152205999999978],[-108.33056599999998,68.158600000000035],[-108.32695000000001,68.170258000000047],[-108.32444800000002,68.192749000000049],[-108.32945299999989,68.208327999999995],[-108.3958439999999,68.289978000000076],[-108.40222199999994,68.294144000000131],[-108.44360399999999,68.308029000000033],[-108.46000700000002,68.309143000000006],[-108.484444,68.305251999999939],[-108.504997,68.298874000000012],[-108.55999800000001,68.275542999999971],[-108.56500199999999,68.26887499999998],[-108.56806899999992,68.262772000000041],[-108.57444799999996,68.257216999999969],[-108.58444199999997,68.253876000000105],[-108.71556099999998,68.231369000000029],[-108.72944599999988,68.230820000000051],[-108.74610899999993,68.231934000000024],[-108.756958,68.235260000000096],[-108.765556,68.238876000000118],[-108.81527699999998,68.262206999999989],[-108.81916799999993,68.266663000000108],[-108.81416299999989,68.273314999999968],[-108.74889400000001,68.33776899999998],[-108.74109599999997,68.342758000000117],[-108.71417199999996,68.354705999999965],[-108.70417799999996,68.35803199999998],[-108.69387799999993,68.361098999999911],[-108.67083700000001,68.365813999999943],[-108.63999899999993,68.375534000000016],[-108.62082700000002,68.382750999999985],[-108.61193800000001,68.386658000000125],[-108.58112299999999,68.406372000000033],[-108.56667299999998,68.416931000000091],[-108.53443900000002,68.445526000000086],[-108.52916699999992,68.452209000000096],[-108.52278100000001,68.458038000000101],[-108.43167099999994,68.538315000000068],[-108.40416700000003,68.560256999999979],[-108.383331,68.576660000000004],[-108.36888099999999,68.587204000000042],[-108.34528399999994,68.601928999999984],[-108.31416300000001,68.611374000000069],[-108.27916700000003,68.618317000000047],[-108.25195299999996,68.620529000000147],[-108.1702729999999,68.626647999999989],[-107.93331899999998,68.64027399999992],[-107.80499299999997,68.645538000000101],[-107.63834399999996,68.665543000000127],[-107.43167099999994,68.690536000000009],[-107.23137700000001,68.71887200000009],[-107.10833700000001,68.748596000000134],[-106.96140300000002,68.783051000000057],[-106.93859899999995,68.788315000000011],[-106.82084700000001,68.811371000000065],[-106.79444899999993,68.813872999999944],[-106.765556,68.814986999999917],[-106.63500999999991,68.818329000000062],[-106.31555200000003,68.892761000000121],[-106.27250699999996,68.904709000000025],[-106.262787,68.90887500000008],[-106.25446299999993,68.913605000000132],[-106.24833699999988,68.919983000000059],[-106.24472000000003,68.926085999999998],[-106.24360699999994,68.931656000000089],[-106.23998999999998,68.937759000000028],[-106.22917200000001,68.940810999999997],[-106.21472199999999,68.941360000000088],[-106.20140100000003,68.940536000000122],[-106.14943699999998,68.933594000000028],[-106.08084099999996,68.918869000000086],[-105.81360599999988,68.881927000000076],[-105.79804999999999,68.879425000000026],[-105.77639799999997,68.872481999999991],[-105.71806300000003,68.844985999999949],[-105.48693800000001,68.729430999999977],[-105.475281,68.720535000000041],[-105.47165699999999,68.715820000000008],[-105.47833300000002,68.69859299999996],[-105.48194899999999,68.692474000000118],[-105.4891659999999,68.68691999999993],[-105.49889400000001,68.683044000000052],[-105.49944299999999,68.621368000000075],[-105.41443600000002,68.528594999999996],[-105.38082900000001,68.486649],[-105.40888999999999,68.492477000000122],[-105.42304999999999,68.49192800000003],[-105.43388400000003,68.489151000000106],[-105.44360399999994,68.485260000000039],[-105.52944899999994,68.450272000000041],[-105.53806299999991,68.445526000000086],[-105.54387700000001,68.439147999999989],[-105.54778299999998,68.433044000000109],[-105.54888900000003,68.427475000000129],[-105.54804999999999,68.422211000000118],[-105.54110699999995,68.41276600000009],[-105.53307299999994,68.408599999999979],[-105.51777600000003,68.406096999999988],[-105.41639700000002,68.406937000000084],[-105.39028899999988,68.409424000000115],[-105.34528399999999,68.384155000000135],[-105.34889199999992,68.378036000000122],[-105.350281,68.372482000000105],[-105.34472700000003,68.368042000000116],[-105.29499800000002,68.339157000000057],[-105.28694200000001,68.33526599999999],[-105.10082999999992,68.266098000000056],[-105.07305899999994,68.260269000000051],[-105.05555700000002,68.258041000000105],[-105.02639799999992,68.257767000000001],[-105.00894900000003,68.264938000000029],[-105.00661500000001,68.268599999999935],[-105.00578300000001,68.272094999999922],[-105.00666799999993,68.278595000000053],[-105.01695299999994,68.282211000000132],[-105.02610800000002,68.309418000000051],[-104.88474300000001,68.339705999999978],[-104.86416600000001,68.332489000000066],[-104.84805299999999,68.324707000000103],[-104.83917200000002,68.315536000000009],[-104.83583099999998,68.310806000000127],[-104.83416699999998,68.300262000000089],[-104.83944699999995,68.288589000000059],[-104.84584000000001,68.282211000000132],[-104.85305800000003,68.276657000000114],[-104.86277799999993,68.272766000000047],[-104.87332199999997,68.269714000000135],[-104.94554099999999,68.258041000000105],[-104.952789,68.252487000000087],[-104.95194999999995,68.247482000000048],[-104.94055200000003,68.238586000000112],[-104.924713,68.230545000000063],[-104.91443600000002,68.227203000000088],[-104.900284,68.22526600000009],[-104.88639799999999,68.225540000000024],[-104.87332199999997,68.226928999999984],[-104.79750100000001,68.24443100000002],[-104.73111,68.250275000000045],[-104.68776699999995,68.250275000000045],[-104.63999899999999,68.246933000000126],[-104.609734,68.24136400000009],[-104.59889199999998,68.232483000000002],[-104.59722899999997,68.222214000000122],[-104.61277799999999,68.198029000000133],[-104.61888099999993,68.191650000000095],[-104.6324919999999,68.179428000000087],[-104.65471600000001,68.162766000000147],[-104.66722099999993,68.149994000000106],[-104.67027299999995,68.138596000000121],[-104.59221599999989,68.083603000000096],[-104.50778200000002,68.035812000000021],[-104.5,68.031937000000028],[-104.48638900000003,68.029984000000127],[-104.45722999999992,68.029709000000082],[-104.36694299999994,68.034149000000127],[-104.21472199999994,68.024155000000064],[-104.199997,68.021378000000027],[-104.16665599999993,68.017487000000131],[-104.12470999999994,68.018326000000059],[-104.11193800000001,68.019440000000031],[-104.06471299999998,68.027480999999966],[-104.01139799999999,68.042206000000078],[-103.99944299999999,68.044144000000017],[-103.98554999999999,68.044434000000024],[-103.97084000000001,68.043869000000029],[-103.94082600000002,68.038315000000011],[-103.92832900000002,68.034988000000055],[-103.89806399999998,68.024155000000064],[-103.88362100000001,68.021378000000027],[-103.87082699999996,68.020263999999997],[-103.84306300000003,68.020827999999995],[-103.791382,68.025269000000094],[-103.76695299999994,68.028320000000065],[-103.55526700000001,68.057205000000124],[-103.54444899999987,68.059982000000048],[-103.53694200000001,68.065536000000066],[-103.53278399999999,68.071655000000078],[-103.53333299999991,68.076660000000118],[-103.53639199999998,68.081664999999987],[-103.54472399999997,68.090820000000008],[-103.55526700000001,68.099715999999944],[-103.55803699999996,68.104430999999977],[-103.55304699999999,68.109711000000061],[-103.52139299999999,68.130813999999987],[-103.50389099999995,68.140274000000034],[-103.49526999999995,68.144714000000079],[-103.46694899999994,68.156936999999914],[-103.45722999999998,68.160537999999974],[-103.42166099999997,68.166656000000103],[-103.40416700000003,68.164154000000053],[-103.38971700000002,68.16137700000013],[-103.38194299999992,68.157211000000018],[-103.36888099999999,68.148880000000133],[-103.34416199999993,68.121094000000085],[-103.34137699999991,68.116089000000045],[-103.34028599999988,68.105819999999994],[-103.341949,68.100265999999976],[-103.37249799999995,68.06860400000005],[-103.36916399999996,68.010818000000029],[-103.36609599999997,68.005829000000062],[-103.25418100000002,67.966385000000002],[-103.22084000000001,67.962204000000099],[-103.20612299999999,67.961380000000133],[-103.17832899999996,67.961929000000055],[-103.14943699999998,67.961380000000133],[-103.13694800000002,67.958037999999988],[-103.12943999999999,67.953872999999987],[-103.12416100000002,67.949707000000103],[-103.11277799999999,67.930267000000129],[-103.1052699999999,67.926086000000055],[-103.09306300000003,67.923035000000027],[-103.01471700000002,67.913605000000132],[-103.00083899999998,67.913879000000065],[-102.99082899999996,67.917480000000126],[-102.98222399999997,67.922211000000061],[-102.97250399999996,67.925812000000121],[-102.95944199999985,67.926926000000094],[-102.94972199999995,67.923309000000131],[-102.94444299999998,67.918868999999916],[-102.939438,67.914429000000098],[-102.92111199999999,67.896378000000141],[-102.82972699999993,67.831940000000031],[-102.80027799999993,67.820830999999998],[-102.68639400000001,67.804703000000131],[-102.67054699999994,67.80304000000001],[-102.53611799999999,67.795258000000047],[-102.50446299999999,67.791931000000091],[-102.47083999999995,67.786926000000051],[-102.446663,67.780273000000079],[-102.39306599999992,67.76249700000011],[-102.33972199999994,67.744705000000067],[-102.25110599999999,67.725266000000147],[-102.22444199999995,67.733871000000022],[-102.21556099999992,67.738312000000121],[-102.15139799999997,67.765549000000021],[-102.1416779999999,67.769150000000081],[-101.92610200000001,67.760268999999994],[-101.76471699999991,67.723312000000135],[-101.671944,67.691649999999981],[-101.54250300000001,67.67942800000003],[-101.51500699999997,67.67942800000003],[-101.446663,67.732483000000116],[-101.43388400000003,67.733322000000044],[-101.10582699999992,67.741928000000144],[-101.09889199999998,67.737762000000089],[-101.01278699999995,67.742477000000122],[-100.99973299999999,67.74331699999999],[-100.92749000000003,67.753325999999959],[-100.90387699999991,67.756942999999922],[-100.89277600000003,67.759720000000016],[-100.81139400000001,67.794708000000014],[-100.72028399999994,67.834427000000119],[-100.58167999999995,67.834152000000131],[-100.39555399999995,67.847488000000055],[-100.18415799999997,67.843048000000067],[-100.16832699999998,67.841095000000109],[-100.156387,67.837769000000037],[-100.14723200000003,67.828598000000113],[-100.135559,67.825272000000098],[-100.083618,67.814986999999974],[-99.820006999999919,67.795821999999987],[-99.618606999999997,67.789153999999996],[-99.607772999999952,67.791931000000091],[-99.589172000000019,67.800812000000064],[-99.577788999999996,67.803314000000114],[-99.500564999999938,67.799713000000054],[-99.412215999999887,67.788315000000068],[-99.403060999999923,67.784424000000001],[-99.398620999999991,67.779983999999956],[-99.396666999999979,67.774994000000106],[-99.387787000000003,67.765822999999955],[-99.378325999999959,67.761932000000058],[-99.236114999999984,67.713608000000136],[-99.21055599999994,67.706940000000145],[-98.986938000000009,67.718322999999998],[-98.813613999999973,67.741928000000144],[-98.528884999999889,67.777481000000023],[-98.385833999999988,67.785812000000078],[-98.363327000000027,67.790817000000118],[-98.354445999999996,67.796097000000032],[-98.358046999999942,67.805817000000104],[-98.442490000000021,67.861374000000069],[-98.449431999999945,67.865814000000057],[-98.463333000000034,67.868865999999969],[-98.475554999999986,67.867203000000075],[-98.486114999999927,67.863876000000118],[-98.49888599999997,67.863312000000008],[-98.514724999999942,67.865265000000136],[-98.540282999999988,67.872208000000114],[-98.65583799999996,67.916382000000056],[-98.665008999999998,67.920258000000103],[-98.696944999999914,67.936645999999996],[-98.719726999999921,67.948867999999948],[-98.724166999999852,67.953598],[-98.746947999999975,68.047760000000096],[-98.732772999999952,68.070267000000001],[-98.615554999999915,68.074706999999989],[-98.544998000000021,68.061371000000065],[-98.336945000000014,67.96026599999999],[-98.321121000000005,67.952208999999982],[-98.266952999999887,67.923309000000131],[-98.233321999999987,67.901932000000102],[-98.171111999999994,67.843323000000055],[-98.169158999999922,67.838593000000003],[-98.122771999999941,67.788040000000024],[-98.094451999999933,67.766098],[-97.956664999999873,67.727768000000083],[-97.799438000000009,67.68553200000008],[-97.66194200000001,67.643051000000071],[-97.650283999999999,67.639434999999992],[-97.637512000000015,67.6308140000001],[-97.626099000000011,67.618042000000059],[-97.613051999999982,67.609420999999998],[-97.603881999999999,67.605255000000056],[-97.592772999999852,67.601653999999996],[-97.576674999999966,67.598602000000085],[-97.561385999999914,67.596649000000127],[-97.547501000000011,67.596375000000023],[-97.509734999999921,67.599152000000117],[-97.48582499999992,67.602203000000145],[-97.415008999999998,67.613312000000064],[-97.392226999999991,67.618042000000059],[-97.381942999999978,67.621368000000132],[-97.353058000000033,67.634430000000123],[-97.33444199999991,67.643875000000037],[-97.316665999999941,67.654434000000037],[-97.295546999999942,67.661102000000028],[-97.283324999999991,67.662491000000045],[-97.167220999999927,67.675537000000134],[-97.138900999999919,67.674149000000057],[-97.116942999999878,67.777481000000023],[-97.115828999999962,67.78276100000005],[-97.119155999999919,67.792480000000069],[-97.127212999999983,67.801650999999993],[-97.240279999999984,67.926086000000055],[-97.254180999999903,67.929428000000144],[-97.263061999999934,67.924149],[-97.268889999999942,67.918319999999994],[-97.27305599999994,67.907761000000107],[-97.273620999999991,67.90248100000008],[-97.277221999999938,67.896942000000081],[-97.282776000000013,67.891098000000056],[-97.291107000000011,67.884995000000117],[-97.301392000000021,67.881652999999972],[-97.324447999999961,67.876648000000102],[-97.336670000000026,67.875259000000142],[-97.362503000000004,67.873871000000008],[-97.376388999999961,67.874146000000053],[-97.392226999999991,67.876373000000115],[-97.403335999999967,67.879974000000004],[-97.412216000000001,67.884155000000078],[-97.416397000000018,67.888596000000007],[-97.41972399999986,67.898331000000042],[-97.428054999999858,67.907761000000107],[-97.434433000000013,67.911926000000108],[-97.449996999999996,67.920258000000103],[-97.643616000000009,68.008330999999998],[-97.652495999999985,68.012207000000046],[-97.683060000000012,68.018599999999992],[-97.695267000000001,68.017212000000086],[-97.705001999999979,68.012772000000098],[-97.708344000000011,68.007217000000026],[-97.710555999999997,67.991653000000099],[-97.87777699999998,67.963608000000079],[-97.996657999999911,67.950271999999984],[-98.009734999999921,67.949707000000103],[-98.029998999999975,67.941924999999969],[-98.045837000000006,67.929428000000144],[-98.051391999999964,67.923598999999967],[-98.057495000000017,67.912490999999989],[-98.060271999999998,67.891663000000108],[-98.063888999999961,67.829162999999937],[-98.078613000000018,67.830276000000026],[-98.095276000000013,67.833327999999938],[-98.106658999999979,67.836928999999998],[-98.115828999999962,67.840820000000065],[-98.176392000000021,67.873871000000008],[-98.189437999999996,67.882476999999938],[-98.194716999999969,67.897217000000069],[-98.200835999999981,67.906647000000135],[-98.213622999999984,67.920532000000037],[-98.224716000000001,67.929428000000144],[-98.25140399999998,67.946365000000014],[-98.283324999999934,67.962768999999923],[-98.319732999999928,67.978591999999992],[-98.34056099999998,67.986099000000081],[-98.378051999999968,67.996368000000132],[-98.398620999999991,68.004165999999998],[-98.412216000000001,68.012497000000053],[-98.581115999999952,68.139984000000027],[-98.587509000000011,68.149429000000112],[-98.58444199999991,68.154984000000013],[-98.485275000000001,68.184417999999994],[-98.473891999999978,68.186920000000043],[-98.459732000000031,68.183594000000028],[-98.450561999999991,68.179703000000131],[-98.432495000000017,68.166656000000103],[-98.428054999999915,68.162201000000096],[-98.424437999999952,68.152205999999978],[-98.425551999999925,68.141936999999984],[-98.428329000000019,68.136383000000137],[-98.434158000000025,68.130538999999942],[-98.44027699999998,68.119431000000134],[-98.441100999999946,68.10914600000001],[-98.439437999999996,68.104155999999989],[-98.430556999999908,68.094986000000119],[-98.417220999999927,68.08638000000002],[-98.408051,68.082489000000123],[-98.393889999999999,68.079163000000108],[-98.379990000000021,68.079163000000108],[-98.367767000000015,68.080551000000014],[-98.358886999999982,68.085814999999968],[-98.350829999999917,68.092209000000025],[-98.339721999999938,68.103867000000037],[-98.321670999999981,68.136932000000115],[-98.317779999999971,68.14776599999999],[-98.317229999999938,68.153046000000018],[-98.317504999999983,68.162201000000096],[-98.326110999999969,68.171371000000136],[-98.333068999999966,68.17553700000002],[-98.342223999999931,68.179428000000087],[-98.377486999999917,68.190262000000018],[-98.40834000000001,68.196640000000116],[-98.439712999999927,68.200821000000019],[-98.469727000000034,68.203049000000021],[-98.485275000000001,68.204987000000131],[-98.501113999999973,68.208602999999982],[-98.531113000000005,68.22526600000009],[-98.537780999999995,68.229431000000091],[-98.542220999999927,68.234146000000123],[-98.561110999999983,68.27388000000002],[-98.607772999999952,68.293319999999994],[-98.704178000000013,68.352768000000026],[-98.710830999999985,68.356934000000081],[-98.715285999999992,68.361648999999943],[-98.717223999999931,68.366378999999995],[-98.71444699999995,68.372208000000001],[-98.704726999999934,68.376373000000001],[-98.680557000000022,68.380539000000113],[-98.667496000000028,68.381363000000079],[-98.637221999999952,68.379150000000095],[-98.606383999999991,68.372756999999979],[-98.594161999999983,68.36914100000007],[-98.580565999999919,68.360809000000074],[-98.571670999999981,68.351654000000053],[-98.548614999999984,68.339157000000057],[-98.532501000000025,68.331100000000106],[-98.521392999999932,68.328323000000012],[-98.511397999999929,68.329711999999972],[-98.470839999999953,68.348327999999981],[-98.462218999999948,68.353591999999992],[-98.461394999999982,68.358871000000136],[-98.471389999999985,68.373596000000077],[-98.491942999999935,68.38638300000008],[-98.503615999999965,68.38998400000014],[-98.49499499999996,68.409424000000115],[-98.319457999999997,68.358871000000136],[-98.30972300000002,68.354980000000069],[-98.298889000000031,68.346100000000035],[-98.294448999999929,68.34137000000004],[-98.292495999999971,68.336655000000007],[-98.288329999999974,68.331940000000145],[-98.281386999999995,68.327774000000034],[-98.225554999999929,68.304152999999985],[-98.213897999999915,68.300537000000134],[-98.199722000000008,68.300262000000089],[-98.187499999999943,68.301926000000094],[-98.096663999999976,68.317764000000125],[-98.073897999999986,68.334990999999945],[-97.905838000000017,68.384155000000135],[-97.894118999999932,68.386459000000002],[-97.86471599999993,68.384995000000004],[-97.849166999999909,68.383040999999992],[-97.777785999999878,68.366378999999995],[-97.761123999999995,68.363312000000064],[-97.748885999999914,68.364699999999971],[-97.743056999999908,68.370528999999976],[-97.75140399999998,68.379700000000128],[-97.764174999999909,68.393600000000049],[-97.768616000000009,68.398041000000148],[-97.781951999999933,68.406647000000021],[-97.79611199999988,68.409988000000055],[-97.81138599999997,68.411377000000073],[-97.869719999999973,68.414153999999996],[-97.885559000000001,68.416382000000112],[-97.899993999999936,68.419707999999957],[-97.906386999999995,68.423874000000069],[-98.009734999999921,68.498032000000023],[-98.011397999999929,68.503052000000082],[-98.010833999999988,68.508041000000048],[-97.999725000000012,68.535262999999986],[-97.994155999999919,68.541091999999992],[-97.852492999999981,68.542480000000069],[-97.836394999999925,68.540268000000026],[-97.723891999999921,68.523041000000035],[-97.692764000000011,68.516663000000051],[-97.665008999999941,68.504715000000033],[-97.658339999999896,68.500549000000092],[-97.654174999999896,68.496094000000085],[-97.650557999999933,68.486098999999967],[-97.653884999999946,68.480545000000006],[-97.655272999999966,68.470260999999994],[-97.650283999999999,68.455551000000014],[-97.646118000000001,68.450820999999962],[-97.639175000000023,68.446640000000059],[-97.611663999999962,68.434708000000114],[-97.537780999999995,68.418320000000051],[-97.523055999999997,68.416931000000091],[-97.511123999999938,68.419434000000024],[-97.502228000000002,68.424698000000035],[-97.49888599999997,68.430267000000015],[-97.500564999999995,68.434982000000048],[-97.509170999999981,68.444427000000132],[-97.520554000000004,68.448029000000076],[-97.535552999999993,68.449141999999995],[-97.547501000000011,68.446640000000059],[-97.573333999999932,68.444427000000132],[-97.589171999999962,68.446640000000059],[-97.603332999999964,68.449996999999996],[-97.615004999999996,68.453598000000056],[-97.619155999999919,68.458328000000108],[-97.617767000000015,68.462493999999992],[-97.597778000000005,68.483597000000088],[-97.578613000000018,68.493042000000003],[-97.567779999999971,68.496368000000018],[-97.544448999999986,68.501389000000131],[-97.531112999999948,68.501938000000109],[-97.516952999999944,68.501663000000065],[-97.385559000000001,68.495254999999929],[-97.353606999999954,68.491089000000045],[-97.282776000000013,68.474152000000061],[-97.259170999999867,68.466660000000104],[-97.160278000000005,68.389435000000049],[-97.053329000000019,68.353316999999947],[-97.058334000000002,68.302765000000079],[-97.070007000000032,68.300262000000089],[-97.075835999999924,68.294433999999967],[-97.091110000000015,68.268051000000014],[-97.089447000000007,68.263320999999962],[-97.080291999999929,68.259155000000078],[-96.939162999999951,68.239700000000084],[-96.925003000000004,68.239150999999993],[-96.912505999999951,68.240814000000057],[-96.817779999999914,68.258331000000112],[-96.806380999999931,68.260818000000029],[-96.799438000000009,68.265548999999965],[-96.767775999999969,68.270263999999997],[-96.693877999999927,68.280272999999966],[-96.680556999999965,68.280822999999998],[-96.669158999999979,68.276931999999931],[-96.625274999999874,68.251663000000121],[-96.553328999999962,68.273605000000032],[-96.533066000000019,68.281936999999971],[-96.47084000000001,68.305542000000003],[-96.448883000000023,68.312194999999974],[-96.437209999999993,68.314697000000024],[-96.42471299999994,68.316086000000041],[-96.410552999999993,68.315536000000009],[-96.404174999999952,68.311371000000008],[-96.496947999999975,68.207764000000054],[-96.508895999999993,68.196365000000128],[-96.525832999999977,68.184142999999949],[-96.623046999999985,68.115540000000067],[-96.690551999999968,68.079987000000074],[-96.702224999999999,68.077484000000084],[-96.730285999999921,68.078323000000069],[-96.743057000000022,68.07777400000009],[-96.75556899999998,68.076096000000007],[-96.778884999999946,68.071380999999974],[-96.797225999999966,68.06109600000002],[-96.808883999999978,68.04942299999999],[-96.812209999999936,68.043869000000029],[-96.813323999999909,68.038589000000115],[-96.811660999999901,68.033599999999979],[-96.801940999999999,68.025818000000015],[-96.789169000000015,68.017212000000086],[-96.77305599999994,68.013884999999959],[-96.722778000000005,68.009719999999959],[-96.708343999999954,68.008605999999986],[-96.676101999999958,68.018599999999992],[-96.556655999999975,68.033324999999934],[-96.540282999999931,68.030273000000022],[-96.52806099999998,68.03166200000004],[-96.466399999999965,68.038879000000122],[-96.450835999999981,68.053040000000124],[-96.479996000000028,68.090271000000087],[-96.49110399999995,68.094147000000135],[-96.505004999999926,68.094436999999971],[-96.516113000000018,68.091095000000053],[-96.53443900000002,68.080826000000002],[-96.546950999999979,68.079437000000041],[-96.548339999999996,68.084152000000074],[-96.547501000000011,68.089432000000102],[-96.535277999999892,68.101089000000059],[-96.510009999999966,68.119431000000134],[-96.482498000000021,68.134720000000016],[-96.463057999999933,68.144149999999911],[-96.432220000000029,68.156097000000045],[-96.31082200000003,68.192200000000128],[-96.288329999999974,68.197754000000089],[-96.171386999999925,68.221649000000127],[-96.136123999999938,68.228592000000106],[-95.980285999999978,68.254715000000033],[-95.968338000000017,68.230820000000051],[-96.043334999999956,68.179428000000087],[-96.069167999999991,68.16137700000013],[-96.075012000000015,68.155548000000124],[-96.078612999999962,68.149994000000106],[-96.077498999999989,68.144989000000066],[-96.073623999999995,68.140274000000034],[-96.045837000000006,68.133331000000055],[-96.03443900000002,68.129700000000014],[-96.02806099999998,68.125259000000085],[-96.020553999999947,68.116089000000045],[-96.01916499999993,68.111098999999967],[-96.020279000000016,68.106094000000098],[-96.083618000000001,68.00221300000004],[-96.144164999999987,67.923598999999967],[-96.211669999999913,67.829162999999937],[-96.215285999999878,67.823608000000036],[-96.217223999999987,67.813309000000061],[-96.221389999999985,67.697754000000032],[-96.220000999999911,67.693038999999999],[-96.212508999999955,67.683868000000075],[-96.206116000000009,67.67942800000003],[-96.195540999999992,67.682754999999986],[-96.186934999999949,67.688873000000115],[-96.179717999999923,67.692748999999992],[-96.168335000000013,67.694977000000108],[-96.166655999999989,67.690262000000075],[-96.174712999999997,67.643051000000071],[-96.185271999999941,67.626373000000001],[-96.191939999999988,67.62164300000012],[-96.203339000000028,67.61914100000007],[-96.216400000000021,67.618591000000038],[-96.230834999999956,67.619979999999998],[-96.246657999999968,67.623306000000071],[-96.257781999999963,67.626923000000033],[-96.266402999999968,67.631088000000034],[-96.329726999999991,67.610260000000096],[-96.437774999999931,67.541367000000037],[-96.461394999999925,67.508880999999917],[-96.464721999999881,67.503326000000015],[-96.469161999999983,67.492751999999996],[-96.464721999999881,67.478043000000127],[-96.461120999999991,67.473312000000021],[-96.451675000000023,67.471374999999966],[-96.441939999999931,67.475540000000137],[-96.363892000000021,67.478043000000127],[-96.294158999999979,67.444702000000007],[-96.222778000000005,67.421920999999941],[-96.210006999999962,67.419144000000074],[-96.196380999999917,67.418869000000029],[-96.185821999999973,67.422211000000004],[-96.158051,67.43664600000011],[-96.141388000000006,67.448868000000061],[-96.135559000000001,67.454712000000086],[-96.118880999999931,67.466660000000104],[-96.107498000000021,67.469147000000021],[-96.09722899999997,67.464706000000092],[-96.069457999999997,67.433593999999971],[-96.070281999999963,67.428314000000114],[-96.124161000000015,67.377196999999967],[-96.166655999999989,67.341660000000047],[-96.177215999999873,67.336929000000112],[-96.208618000000001,67.326935000000105],[-96.218613000000005,67.322768999999994],[-96.226944000000003,67.316666000000055],[-96.251113999999916,67.25277699999998],[-96.252228000000002,67.247482000000048],[-96.243606999999884,67.243317000000047],[-96.129990000000021,67.21665999999999],[-96.114440999999999,67.213318000000072],[-96.102492999999981,67.214705999999978],[-96.091384999999946,67.217209000000139],[-95.921111999999994,67.278595000000053],[-95.817504999999926,67.331940000000145],[-95.756393000000003,67.367477000000065],[-95.739990000000034,67.376648000000046],[-95.603057999999919,67.383330999999998],[-95.58944699999995,67.383040999999992],[-95.576949999999954,67.380264000000068],[-95.565825999999959,67.376648000000046],[-95.549163999999962,67.368316999999934],[-95.53472899999997,67.359984999999995],[-95.528610000000015,67.35554500000012],[-95.525008999999955,67.351089000000059],[-95.553328999999962,67.313309000000118],[-95.561660999999958,67.307205000000124],[-95.618056999999965,67.278320000000065],[-95.638061999999991,67.270828000000108],[-95.677489999999977,67.254166000000112],[-95.696654999999964,67.244979999999998],[-95.763061999999877,67.212769000000094],[-95.807495000000017,67.186096000000134],[-95.823897999999986,67.174149],[-95.829726999999991,67.168319999999937],[-95.833327999999938,67.162766000000147],[-95.821670999999924,67.161102000000142],[-95.796951000000035,67.16304000000008],[-95.774719000000005,67.167755000000113],[-95.74221799999998,67.176651000000049],[-95.712218999999948,67.188309000000061],[-95.651397999999915,67.198868000000118],[-95.568893000000003,67.210541000000148],[-95.544158999999922,67.212494000000106],[-95.515839000000028,67.209717000000012],[-95.501113999999973,67.20748900000001],[-95.435546999999929,67.193863000000079],[-95.379439999999931,67.154708999999968],[-95.326110999999969,67.027205999999978],[-95.328613000000018,67.016937000000098],[-95.337218999999948,66.99054000000001],[-95.34333799999996,66.974701000000096],[-95.350280999999882,66.963882000000069],[-95.357773000000009,66.959991000000002],[-95.416396999999961,66.951935000000105],[-95.53472899999997,66.941086000000041],[-95.597778000000005,66.948868000000004],[-95.614166000000012,66.970261000000107],[-95.721114999999998,66.964706000000035],[-95.743331999999953,66.959991000000002],[-95.839171999999962,66.94802900000002],[-95.876099000000011,66.945816000000036],[-95.902495999999985,66.946640000000002],[-95.928054999999972,66.952484000000027],[-95.93638599999997,66.956649999999968],[-95.990279999999984,67.004990000000134],[-95.993880999999931,67.009720000000016],[-95.990554999999915,67.014998999999989],[-95.978881999999999,67.026657],[-95.961120999999991,67.043869000000029],[-95.93638599999997,67.065262000000132],[-95.932219999999973,67.069716999999969],[-95.946945000000028,67.072220000000129],[-95.958344000000011,67.069716999999969],[-95.967772999999909,67.065536000000066],[-96.004456000000005,67.045821999999987],[-96.046111999999937,67.016387999999949],[-96.051665999999955,67.010818000000086],[-96.053878999999995,67.000275000000101],[-96.046660999999972,66.991088999999988],[-96.040558000000033,66.986648999999943],[-96.023620999999935,66.978591999999992],[-96.025008999999955,66.973312000000135],[-96.033066000000019,66.967484000000013],[-96.042770000000019,66.963043000000084],[-96.110549999999932,66.950821000000133],[-96.12332200000003,66.950271999999984],[-96.138610999999912,66.953598],[-96.240828999999962,66.983597000000032],[-96.262512000000015,66.991088999999988],[-96.279175000000009,66.999145999999939],[-96.285278000000005,67.003600999999946],[-96.286941999999954,67.008606000000043],[-96.285827999999981,67.013611000000083],[-96.274170000000026,67.025269000000094],[-96.265288999999996,67.030548000000067],[-96.261947999999961,67.035812000000078],[-96.261123999999995,67.041092000000106],[-96.263625999999988,67.051086000000112],[-96.268889999999885,67.06053200000008],[-96.288054999999929,67.068329000000062],[-96.37721299999987,67.084717000000126],[-96.392226999999991,67.086928999999998],[-96.403884999999946,67.085541000000092],[-96.452498999999989,67.068329000000062],[-96.460555999999883,67.062195000000031],[-96.456664999999987,67.057754999999986],[-96.403884999999946,67.008330999999998],[-96.273620999999991,66.950271999999984],[-96.146392999999989,66.894714000000135],[-96.128051999999968,66.881653000000028],[-96.11721799999998,66.867752000000053],[-96.115829000000019,66.862761999999975],[-96.11721799999998,66.857483000000002],[-96.116652999999985,66.847488000000055],[-96.115554999999972,66.842484000000127],[-96.114165999999898,66.837494000000049],[-96.108886999999982,66.832764000000054],[-96.100554999999929,66.828598000000113],[-96.006667999999934,66.794434000000081],[-95.980559999999912,66.787491000000102],[-95.956115999999952,66.782211000000075],[-95.912215999999944,66.775543000000084],[-95.883621000000005,66.768875000000094],[-95.862212999999997,66.761107999999979],[-95.848052999999993,66.752777000000037],[-95.841948999999943,66.74832200000003],[-95.784728999999913,66.674149000000057],[-95.777495999999985,66.654984000000127],[-95.777221999999881,66.644714000000022],[-95.780838000000017,66.629150000000095],[-95.741378999999938,66.638046000000031],[-95.656386999999995,66.6602630000001],[-95.646666999999979,66.664428999999984],[-95.629714999999976,66.675536999999963],[-95.627486999999974,66.68609600000002],[-95.648894999999982,66.724152000000004],[-95.652221999999995,66.728592000000049],[-95.660552999999993,66.732757999999933],[-95.674437999999896,66.734146000000067],[-95.784728999999913,66.737198000000149],[-95.993056999999965,66.84275800000006],[-96.087783999999999,66.907486000000119],[-96.091674999999896,66.911925999999994],[-96.092772999999966,66.916931000000034],[-96.091674999999896,66.922211000000061],[-96.08555599999994,66.926926000000094],[-96.066956000000005,66.936371000000008],[-96.047500999999954,66.944702000000063],[-96.037216000000001,66.94802900000002],[-96.026108000000022,66.950271999999984],[-96.000290000000007,66.950546000000088],[-95.902495999999985,66.946640000000002],[-95.814437999999996,66.941360000000145],[-95.785004000000015,66.93691999999993],[-95.772780999999952,66.932754999999929],[-95.766662999999994,66.928314],[-95.763061999999877,66.923874000000012],[-95.760559000000001,66.913879000000065],[-95.756957999999997,66.90914900000007],[-95.75111400000003,66.90498400000007],[-95.738051999999982,66.901382000000126],[-95.724715999999944,66.900817999999958],[-95.516662999999994,66.902206000000092],[-95.493057000000022,66.90498400000007],[-95.472228999999913,66.911652000000061],[-95.389175000000023,66.911102000000028],[-95.336669999999913,66.893051000000014],[-95.323623999999882,66.889434999999992],[-95.311385999999914,66.889984000000084],[-95.300827000000027,66.893326000000059],[-95.291672000000005,66.898331000000098],[-95.267501999999979,66.91415400000011],[-95.259170999999981,66.920257999999933],[-95.220839999999896,66.968322999999941],[-95.21945199999999,66.973602000000142],[-95.226394999999968,66.982758000000103],[-95.232223999999974,66.987198000000092],[-95.289443999999946,67.024994000000049],[-95.345000999999968,67.084427000000119],[-95.352218999999991,67.148331000000042],[-95.346389999999985,67.15387000000004],[-95.266112999999905,67.212769000000094],[-95.166107000000011,67.276931999999988],[-95.162216000000001,67.282211000000132],[-95.163329999999974,67.287200999999982],[-95.171936000000017,67.291367000000093],[-95.18249499999996,67.29525799999999],[-95.217223999999931,67.306366000000139],[-95.279723999999874,67.319442999999978],[-95.306380999999874,67.326660000000061],[-95.314712999999927,67.330550999999957],[-95.332779000000016,67.34387200000009],[-95.336394999999982,67.348328000000038],[-95.384170999999981,67.444138000000009],[-95.339995999999928,67.499709999999993],[-95.331679999999949,67.505829000000006],[-95.324172999999917,67.516663000000051],[-95.321670999999924,67.527206000000035],[-95.323058999999944,67.531936999999971],[-95.330001999999922,67.541367000000037],[-95.343613000000005,67.554977000000122],[-95.34973100000002,67.559417999999994],[-95.466400000000021,67.637207000000046],[-95.492492999999968,67.643326000000059],[-95.535003999999958,67.646652000000074],[-95.548339999999996,67.649994000000049],[-95.693054000000018,67.704436999999984],[-95.707779000000016,67.723038000000031],[-95.709166999999923,67.727768000000083],[-95.708053999999947,67.733047000000056],[-95.704453000000001,67.738586000000055],[-95.698333999999988,67.744431000000134],[-95.68110699999994,67.756378000000097],[-95.671936000000017,67.761657999999954],[-95.64973399999991,67.767211999999972],[-95.637511999999958,67.768600000000049],[-95.626388999999961,67.771927000000005],[-95.577498999999989,67.787491000000102],[-95.558883999999978,67.797759999999926],[-95.550277999999878,67.803863999999976],[-95.544158999999922,67.809708000000001],[-95.53443900000002,67.820830999999998],[-95.525833000000034,67.836928999999998],[-95.522231999999974,67.852767999999969],[-95.527221999999995,67.872208000000114],[-95.452224999999999,67.981094000000041],[-95.416945999999996,68.027771000000143],[-95.42721599999993,68.032486000000006],[-95.47193900000002,68.054977000000008],[-95.475280999999939,68.058319000000097],[-95.472777999999948,68.06053200000008],[-95.461394999999868,68.063873000000115],[-95.404175000000009,68.069443000000035],[-95.34973100000002,68.074432000000002],[-95.343063000000029,68.074432000000002],[-95.075561999999877,68.068877999999984],[-95.071120999999948,68.063599000000011],[-95.065276999999924,68.060257000000036],[-95.054992999999911,68.055251999999996],[-95.043883999999935,68.051376000000118],[-95.023620999999991,68.04582199999993],[-95.008895999999936,68.044434000000024],[-94.86721799999998,68.034149000000127],[-94.839721999999938,68.034149000000127],[-94.788054999999986,68.040543000000127],[-94.72222899999997,68.054977000000008],[-94.714172000000019,68.059418000000107],[-94.707503999999972,68.065811000000053],[-94.696654999999964,68.078598000000056],[-94.693877999999984,68.083328000000108],[-94.604995999999971,68.139708999999982],[-94.37249799999995,68.221375000000023],[-94.210555999999997,68.262772000000041],[-94.199157999999954,68.267761000000007],[-94.193603999999993,68.272217000000069],[-94.192214999999976,68.276382000000069],[-94.191665999999941,68.281372000000147],[-94.192489999999907,68.292206000000022],[-94.193603999999993,68.298325000000034],[-94.205275999999913,68.313309000000118],[-94.209166999999979,68.323607999999979],[-94.210280999999952,68.328049000000078],[-94.210830999999985,68.361374000000126],[-94.208054000000004,68.366088999999988],[-94.203888000000006,68.370255000000043],[-94.123046999999985,68.416931000000091],[-94.104720999999984,68.424149000000057],[-94.00028999999995,68.460815000000025],[-93.968063000000029,68.468596999999932],[-93.953613000000018,68.471924000000058],[-93.936661000000015,68.474700999999982],[-93.922774999999945,68.475540000000137],[-93.893615999999952,68.474700999999982],[-93.875823999999909,68.477203000000031],[-93.81138599999997,68.488037000000134],[-93.661391999999978,68.520828000000051],[-93.656661999999983,68.523315000000139],[-93.619155999999975,68.544144000000074],[-93.553329000000019,68.586380000000077],[-93.559722999999963,68.611649000000114],[-93.621933000000013,68.624419999999986],[-93.647507000000019,68.626923000000147],[-93.65306099999998,68.626373000000115],[-93.705276000000026,68.657211000000132],[-93.697220000000016,68.749145999999939],[-93.695267000000001,68.751938000000052],[-93.639450000000011,68.780548000000067],[-93.571670999999924,68.834152000000074],[-93.567504999999926,68.839706000000092],[-93.566100999999946,68.849425999999994],[-93.634444999999971,68.959152000000131],[-93.642226999999934,68.963882000000012],[-93.666945999999996,68.972214000000008],[-93.731383999999991,68.974991000000102],[-93.925551999999868,68.974701000000039],[-94.030838000000017,68.918594000000098],[-94.039169000000015,68.914154000000053],[-94.055832000000009,68.901932000000102],[-94.068893000000003,68.891098000000056],[-94.079726999999991,68.847488000000055],[-94.071120999999891,68.843596999999988],[-94.034164000000033,68.833328000000108],[-94.021118000000001,68.836105000000032],[-93.933884000000035,68.855255],[-93.852492999999981,68.879149999999981],[-93.838607999999965,68.885268999999994],[-93.837783999999999,68.886383000000023],[-93.824722000000008,68.891373000000044],[-93.813889000000017,68.893050999999957],[-93.80999799999995,68.890549000000078],[-93.813889000000017,68.88499500000006],[-93.829726999999934,68.876083000000051],[-93.934157999999968,68.824997000000053],[-94.085006999999962,68.761108000000092],[-94.095276000000013,68.758040999999992],[-94.108046999999999,68.755264000000068],[-94.15972899999997,68.747756999999979],[-94.385559000000001,68.729155999999932],[-94.490828999999962,68.728867000000037],[-94.625,68.761383000000137],[-94.608886999999925,68.819443000000035],[-94.588897999999915,68.841370000000097],[-94.583327999999938,68.845825000000104],[-94.570847000000015,68.850266000000033],[-94.561661000000015,68.855255],[-94.556106999999997,68.859985000000052],[-94.553054999999972,68.864425999999924],[-94.545273000000009,68.884720000000073],[-94.548049999999932,68.888885000000073],[-94.557495000000017,68.893050999999957],[-94.569457999999941,68.893600000000106],[-94.577224999999999,68.896652000000017],[-94.585555999999997,68.903046000000074],[-94.589995999999985,68.908325000000048],[-94.605835000000013,68.951096000000064],[-94.604172000000005,68.961929000000055],[-94.599166999999966,68.965546000000018],[-94.587219000000005,68.968872000000033],[-94.553329000000019,68.973877000000073],[-94.37388599999997,69.003052000000139],[-94.224166999999966,69.027771000000143],[-94.163054999999986,69.052200000000084],[-94.151397999999972,69.057205000000124],[-94.072784000000013,69.126648000000046],[-94.072509999999966,69.144989000000066],[-94.137511999999901,69.131927000000019],[-94.22084000000001,69.1202550000001],[-94.235001000000011,69.119431000000134],[-94.248336999999935,69.120529000000033],[-94.312209999999993,69.144989000000066],[-94.323058999999944,69.149994000000106],[-94.327498999999989,69.15525800000006],[-94.329177999999899,69.16137700000013],[-94.309433000000013,69.294144000000131],[-94.306655999999975,69.300262000000089],[-94.303328999999962,69.304977000000122],[-94.291672000000005,69.313873000000058],[-94.284163999999976,69.318878000000097],[-94.259170999999924,69.326660000000061],[-94.166655999999989,69.342483999999956],[-94.043335000000013,69.357483000000059],[-94.025009000000011,69.359711000000004],[-93.955276000000026,69.362762000000032],[-93.736664000000019,69.399994000000049],[-93.626937999999939,69.432479999999941],[-93.574721999999952,69.441650000000038],[-93.562774999999988,69.442748999999992],[-93.526397999999915,69.438309000000004],[-93.532501000000025,69.429977000000008],[-93.547774999999945,69.420532000000094],[-93.67971799999998,69.347762999999929],[-93.691665999999941,69.34275800000006],[-93.741378999999995,69.324432000000058],[-93.753066999999987,69.320540999999992],[-93.764174999999966,69.320540999999992],[-93.828612999999962,69.265549000000078],[-93.856110000000001,69.176926000000037],[-93.856658999999979,69.172211000000004],[-93.845001000000025,69.164992999999981],[-93.837218999999891,69.164429000000041],[-93.634734999999978,69.251663000000121],[-93.467498999999918,69.317490000000021],[-93.456664999999987,69.323043999999982],[-93.362777999999992,69.37164300000012],[-93.365279999999984,69.376082999999994],[-93.379439999999988,69.376373000000001],[-93.459166999999866,69.359711000000004],[-93.470001000000025,69.356644000000074],[-93.478057999999976,69.353317000000118],[-93.498046999999985,69.349152000000117],[-93.511947999999961,69.349426000000051],[-93.565001999999936,69.367752000000053],[-93.560546999999929,69.383881000000031],[-93.538054999999929,69.410538000000088],[-93.527221999999995,69.421646000000067],[-93.515839000000028,69.425537000000134],[-93.503066999999874,69.427475000000072],[-93.488892000000021,69.434982000000048],[-93.439437999999939,69.475265999999976],[-93.441375999999991,69.48054499999995],[-93.487777999999992,69.502777000000037],[-93.509734999999921,69.513046000000088],[-93.532501000000025,69.521103000000039],[-93.540833000000021,69.523315000000082],[-93.587219000000005,69.528046000000018],[-93.621933000000013,69.527205999999978],[-93.683883999999978,69.522217000000012],[-93.709732000000031,69.516098],[-93.808884000000035,69.488876000000062],[-93.869719999999973,69.451660000000118],[-94.045272999999952,69.439148000000102],[-94.279175000000009,69.440262000000075],[-94.299728000000016,69.443038999999999],[-94.313048999999978,69.446640000000059],[-94.343886999999938,69.459152000000074],[-94.451674999999966,69.518600000000049],[-94.502501999999993,69.556366000000025],[-94.591948999999943,69.637206999999989],[-94.629439999999988,69.683044000000052],[-94.670273000000009,69.677475000000072],[-94.712783999999999,69.67164600000001],[-94.749435000000005,69.663605000000132],[-94.755004999999926,69.661652000000004],[-94.764174999999966,69.65498400000007],[-94.766662999999937,69.651093000000003],[-94.762222000000008,69.644714000000135],[-94.742217999999923,69.628311000000053],[-94.724441999999954,69.61442599999998],[-94.725554999999929,69.608597000000145],[-94.730835000000013,69.602767999999969],[-94.740279999999984,69.597488000000055],[-94.769729999999981,69.583054000000061],[-94.801101999999901,69.572219999999959],[-94.820007000000032,69.56721500000009],[-94.831116000000009,69.56581100000011],[-94.846664000000033,69.565536000000122],[-94.862777999999878,69.566940000000102],[-94.951950000000011,69.584427000000119],[-95.010558999999944,69.603043000000127],[-95,69.618865999999969],[-95.009444999999971,69.621643000000063],[-95.021118000000001,69.621643000000063],[-95.078612999999962,69.616379000000109],[-95.168609999999887,69.630538999999999],[-95.396118000000001,69.678864000000033],[-95.40834000000001,69.681931000000134],[-95.423049999999932,69.686096000000134],[-95.544997999999964,69.726929000000041],[-95.648055999999997,69.780273000000022],[-95.71556099999998,69.791366999999923],[-95.724715999999944,69.789978000000133],[-95.728332999999907,69.789153999999996],[-95.738892000000021,69.786102000000028],[-95.757232999999928,69.777205999999921],[-95.758620999999948,69.772766000000104],[-95.86332699999997,69.772216999999955],[-95.960830999999985,69.778045999999961],[-95.975554999999929,69.781937000000028],[-96.020279000000016,69.80442800000003],[-96.035827999999924,69.813873000000115],[-96.074447999999961,69.841934000000037],[-96.087783999999999,69.869141000000127],[-96.082229999999925,69.873596000000134],[-96.085007000000019,69.91137700000013],[-96.097778000000005,69.946639999999945],[-96.116104000000007,69.953872999999987],[-96.177215999999873,69.964705999999921],[-96.195540999999992,69.965546000000018],[-96.198607999999979,69.964995999999985],[-96.209441999999967,69.961655000000121],[-96.217223999999987,69.958327999999995],[-96.220550999999944,69.95748900000001],[-96.235000999999954,69.95748900000001],[-96.246947999999918,69.958878000000027],[-96.257232999999928,69.963043000000027],[-96.272780999999952,69.971099999999979],[-96.38137799999987,70.02748100000008],[-96.402495999999871,70.039978000000076],[-96.459441999999967,70.075546000000088],[-96.500290000000007,70.101379000000009],[-96.509170999999924,70.108597000000032],[-96.525283999999942,70.122756999999979],[-96.531677000000002,70.131088000000034],[-96.55610699999994,70.191925000000083],[-96.568892999999946,70.224425999999994],[-96.571670999999867,70.234421000000054],[-96.570281999999963,70.251099000000124],[-96.568619000000012,70.268600000000106],[-96.562774999999931,70.300262000000032],[-96.558608999999933,70.3119200000001],[-96.555557000000022,70.317490000000134],[-96.548339999999996,70.328872999999987],[-96.535003999999958,70.344147000000078],[-96.294723999999974,70.522491000000116],[-96.232773000000009,70.562195000000031],[-96.078887999999893,70.587494000000049],[-96.069732999999928,70.587769000000037],[-96.045273000000009,70.584152000000074],[-96.041107000000011,70.576934999999992],[-96.033324999999934,70.572769000000108],[-95.995269999999948,70.559707999999944],[-95.93499799999995,70.547485000000108],[-95.92332499999992,70.545258000000047],[-95.806106999999997,70.528869999999984],[-95.797225999999966,70.529434000000094],[-95.789443999999946,70.536652000000117],[-95.791381999999999,70.542755000000056],[-95.799164000000019,70.549149000000114],[-95.855834999999956,70.553314000000114],[-95.914168999999902,70.559417999999937],[-95.931670999999938,70.562195000000031],[-95.96444699999995,70.568878000000041],[-96.000564999999995,70.579987000000074],[-96.049987999999928,70.600266000000033],[-96.058334000000002,70.605820000000051],[-96.061385999999857,70.617203000000018],[-96.055557000000022,70.643050999999957],[-96.048339999999996,70.646942000000024],[-95.952498999999989,70.679702999999961],[-95.848343,70.706940000000088],[-95.815551999999968,70.70915199999996],[-95.817779999999971,70.710265999999933],[-95.901947000000007,70.707764000000054],[-95.932770000000005,70.701096000000064],[-96.115554999999972,70.656097000000102],[-96.138061999999991,70.646378000000084],[-96.149993999999936,70.637206999999989],[-96.152785999999935,70.632477000000108],[-96.154723999999987,70.624694999999974],[-96.153885000000002,70.621643000000063],[-96.158051,70.617476999999951],[-96.160277999999948,70.616379000000052],[-96.16361999999998,70.615540000000124],[-96.202788999999996,70.621643000000063],[-96.376098999999954,70.673035000000027],[-96.385284000000013,70.677765000000022],[-96.394729999999981,70.683594000000028],[-96.401108000000022,70.690536000000122],[-96.410003999999958,70.702484000000027],[-96.415557999999976,70.71527100000003],[-96.422500999999954,70.726089000000002],[-96.43472300000002,70.737198000000035],[-96.446654999999964,70.741928000000087],[-96.53694200000001,70.763321000000019],[-96.580565999999976,70.777480999999909],[-96.603881999999942,70.788040000000137],[-96.611938000000009,70.794434000000024],[-96.61500499999994,70.80442800000003],[-96.61361699999992,70.8211060000001],[-96.601944000000003,70.849990999999989],[-96.591674999999952,70.866928000000144],[-96.578613000000018,70.878035999999952],[-96.571121000000005,70.883040999999992],[-96.545272999999895,70.904983999999956],[-96.53083799999996,70.921371000000136],[-96.52416999999997,70.931656000000032],[-96.513061999999991,70.949707000000046],[-96.510833999999932,70.955826000000059],[-96.503066999999987,70.99693300000007],[-96.495833999999888,71.040268000000083],[-96.481673999999884,71.043319999999994],[-96.450286999999946,71.044983000000116],[-96.414444000000003,71.053589000000045],[-96.406661999999926,71.058594000000085],[-96.369995000000017,71.089981000000023],[-96.371108999999933,71.093048000000124],[-96.375823999999966,71.098037999999974],[-96.40943900000002,71.119431000000077],[-96.417770000000019,71.113602000000071],[-96.420273000000009,71.107208000000014],[-96.412215999999944,71.095824999999991],[-96.410003999999958,71.089705999999978],[-96.413619999999923,71.084152000000017],[-96.421111999999994,71.0816650000001],[-96.440825999999959,71.079163000000051],[-96.461394999999925,71.080551000000128],[-96.476669000000015,71.08526599999999],[-96.50556899999998,71.097214000000008],[-96.538329999999974,71.11303700000002],[-96.552215999999987,71.119980000000055],[-96.560546999999985,71.126373000000001],[-96.559433000000013,71.1308140000001],[-96.553878999999995,71.136932000000058],[-96.548614999999927,71.140548999999965],[-96.467223999999931,71.165267999999969],[-96.457992999999988,71.195564000000047],[-96.462203999999986,71.255501000000038],[-96.504455999999891,71.276093000000117],[-96.503890999999953,71.277205999999978],[-96.488891999999964,71.286102000000085],[-96.278060999999923,71.326384999999959],[-96.24499499999996,71.353866999999923],[-96.21833799999996,71.375809000000004],[-96.193329000000006,71.389984000000084],[-96.168335000000013,71.399993999999992],[-96.134170999999981,71.409714000000065],[-96.046386999999982,71.418045000000006],[-96.027785999999935,71.417755],[-95.926392000000021,71.400542999999971],[-95.893889999999942,71.390823000000069],[-95.882766999999944,71.384155000000078],[-95.878875999999991,71.378586000000098],[-95.878052000000025,71.37303200000008],[-95.878875999999991,71.367203000000075],[-95.859160999999972,71.354980000000012],[-95.830001999999922,71.343048000000067],[-95.792220999999927,71.328049000000021],[-95.673049999999989,71.287491000000102],[-95.658889999999985,71.285537999999974],[-95.551102000000014,71.289978000000019],[-95.535278000000005,71.290816999999947],[-95.455276000000026,71.367751999999996],[-95.451401000000033,71.375809000000004],[-95.547775000000001,71.487762000000032],[-95.779998999999975,71.503875999999991],[-95.832779000000016,71.515823000000125],[-95.936660999999901,71.546646000000123],[-95.943054000000018,71.553589000000102],[-95.908339999999953,71.600540000000137],[-95.895003999999915,71.610535000000027],[-95.889998999999989,71.613312000000121],[-95.877212999999983,71.61831699999999],[-95.863892000000021,71.619430999999963],[-95.812209999999936,71.621918000000051],[-95.744719999999973,71.624145999999996],[-95.678878999999995,71.646378000000084],[-95.539718999999991,71.703597999999943],[-95.399733999999967,71.718597000000045],[-95.301620000000014,71.721099999999979],[-95.289443999999946,71.753601000000117],[-95.289443999999946,71.757491999999957],[-95.288054999999872,71.761932000000002],[-95.285827999999981,71.767212000000086],[-95.239440999999999,71.82249500000006],[-95.226944000000003,71.826660000000061],[-95.073059000000001,71.84137000000004],[-94.890288999999996,71.844711000000075],[-94.856383999999991,71.843322999999998],[-94.838897999999972,71.841094999999996],[-94.795272999999952,71.833328000000051],[-94.744155999999975,71.823044000000039],[-94.73443599999996,71.823317999999972],[-94.716399999999965,71.826096000000121],[-94.653884999999946,71.845261000000107],[-94.612503000000004,71.859711000000004],[-94.606658999999979,71.863312000000064],[-94.607772999999952,71.866378999999995],[-94.615279999999984,71.868866000000082],[-94.629715000000033,71.866928000000144],[-94.65583799999996,71.861923000000104],[-94.706115999999952,71.848038000000031],[-94.743056999999965,71.839432000000102],[-94.756957999999941,71.837493999999936],[-94.775283999999942,71.838882000000069],[-94.783066000000019,71.84137000000004],[-94.826110999999969,71.847487999999998],[-94.853607000000011,71.849426000000108],[-94.903885000000002,71.850266000000147],[-95.102492999999981,71.851089000000002],[-95.119155999999975,71.850266000000147],[-95.157227000000034,71.845825000000048],[-95.179992999999968,71.843048000000124],[-95.180557000000022,71.842208999999968],[-95.192489999999964,71.84137000000004],[-95.213333000000034,71.843048000000124],[-95.231110000000001,71.849152000000004],[-95.240829000000019,71.853867000000037],[-95.25167799999997,71.86053499999997],[-95.256667999999934,71.866928000000144],[-95.255004999999983,71.895537999999988],[-95.222778000000005,71.942200000000071],[-95.217498999999862,71.944976999999994],[-95.201400999999976,71.94720500000011],[-94.97193900000002,71.975814999999955],[-94.741104000000007,71.99192800000003],[-94.698043999999982,71.993590999999924],[-94.661666999999966,71.994980000000112],[-94.579726999999991,71.99693300000007],[-94.56361400000003,71.99693300000007],[-94.530288999999982,71.99443100000002],[-94.499435000000005,71.988037000000134],[-94.487212999999997,71.983322000000101],[-94.393615999999952,71.938309000000004],[-94.387222000000008,71.933868000000075],[-94.388610999999912,71.924149000000114],[-94.460555999999997,71.849426000000108],[-94.47222899999997,71.847214000000065],[-94.506667999999991,71.847762999999986],[-94.521118000000001,71.849990999999932],[-94.539444000000003,71.851379000000065],[-94.562499999999943,71.849990999999932],[-94.574448000000018,71.84693900000002],[-94.64416499999993,71.818329000000006],[-94.61860699999994,71.753326000000072],[-94.611937999999952,71.74971000000005],[-94.599730999999906,71.744704999999954],[-94.594161999999983,71.743317000000047],[-94.569457999999941,71.744979999999998],[-94.555831999999896,71.750000000000057],[-94.538604999999961,71.758331000000112],[-94.536391999999978,71.761108000000036],[-94.528609999999958,71.771378000000141],[-94.519729999999925,71.78915400000011],[-94.497498000000007,71.818329000000006],[-94.48832699999997,71.824158000000011],[-94.484726000000023,71.824706999999933],[-94.392226999999991,71.81442300000009],[-94.366104000000007,71.802475000000072],[-94.356658999999866,71.796371000000022],[-94.354720999999984,71.792479999999955],[-94.389998999999989,71.71775800000006],[-94.419448999999986,71.667205999999965],[-94.423889000000031,71.66137700000013],[-94.418335000000013,71.659987999999942],[-94.40695199999999,71.660812000000135],[-94.368880999999988,71.675262000000032],[-94.267226999999991,71.730820000000051],[-94.258895999999993,71.741928000000087],[-94.255843999999968,71.753876000000105],[-94.242766999999958,71.770828000000108],[-94.228058000000033,71.781661999999983],[-94.207229999999925,71.789428999999927],[-94.194442999999922,71.791931000000034],[-94.181670999999994,71.791931000000034],[-94.036941999999954,71.787200999999982],[-94.023620999999991,71.785812000000021],[-94.014724999999885,71.781096999999988],[-94.008347000000015,71.774993999999992],[-94.006393000000003,71.763321000000019],[-93.993880999999988,71.753052000000139],[-93.972503999999958,71.745818999999983],[-93.942490000000021,71.743590999999981],[-93.909728999999913,71.744979999999998],[-93.888061999999991,71.748322000000087],[-93.871383999999978,71.753052000000139],[-93.850280999999995,71.763321000000019],[-93.830841000000021,71.771652000000074],[-93.818892999999889,71.774703999999986],[-93.802215999999987,71.775542999999971],[-93.784164000000033,71.774155000000064],[-93.741942999999992,71.769150000000025],[-93.726669000000015,71.76638800000012],[-93.71166999999997,71.761383000000023],[-93.707229999999925,71.754990000000078],[-93.694153000000028,71.716095000000109],[-93.696655000000021,71.710815000000082],[-93.704452999999944,71.705261000000064],[-93.737777999999992,71.689423000000033],[-93.764724999999999,71.679703000000131],[-93.811110999999926,71.657486000000063],[-93.818618999999956,71.651932000000102],[-93.81138599999997,71.645538000000045],[-93.797226000000023,71.639435000000105],[-93.658339999999896,71.581940000000031],[-93.618057000000022,71.56860400000005],[-93.589447000000007,71.561371000000065],[-93.513061999999877,71.544707999999957],[-93.494994999999903,71.541656000000046],[-93.476944000000003,71.540267999999969],[-93.428328999999962,71.534149000000127],[-93.412216000000001,71.530823000000055],[-93.230835000000013,71.473602000000142],[-93.214171999999962,71.467209000000139],[-93.201401000000033,71.461380000000133],[-93.18638599999997,71.435806000000127],[-93.18638599999997,71.430267000000129],[-93.18998699999986,71.423874000000012],[-93.193877999999927,71.419433999999967],[-93.195540999999935,71.413605000000132],[-93.190551999999968,71.408035000000098],[-93.180556999999965,71.401093000000003],[-93.142501999999979,71.374985000000038],[-93.128875999999991,71.368866000000025],[-93.101944000000003,71.367477000000008],[-93.062774999999988,71.36943100000002],[-93.045272999999952,71.367751999999996],[-93.029175000000009,71.36442599999998],[-92.997222999999963,71.353866999999923],[-92.985824999999863,71.348877000000073],[-92.977218999999934,71.343872000000033],[-92.973891999999978,71.340820000000122],[-92.941939999999931,71.288879000000009],[-92.938599000000011,71.270538000000045],[-92.936110999999926,71.247481999999991],[-92.931945999999925,71.220535000000041],[-92.930831999999953,71.214432000000102],[-92.923889000000031,71.207763999999941],[-92.854445999999996,71.151382000000126],[-92.862777999999992,71.139434999999992],[-92.869155999999975,71.128036000000122],[-92.888610999999969,71.074707000000103],[-92.889998999999932,71.065810999999997],[-92.906951999999933,70.912491000000102],[-93.030838000000017,70.878860000000088],[-93.040833000000021,70.877762000000018],[-93.048339999999996,70.873870999999951],[-93.046111999999937,70.867203000000018],[-93.042769999999905,70.863876000000062],[-93.027495999999985,70.852768000000083],[-92.982498000000021,70.825546000000145],[-92.958618000000001,70.817490000000078],[-92.928328999999962,70.811371000000008],[-92.911391999999978,70.809982000000048],[-92.813048999999978,70.805817000000047],[-92.688598999999954,70.775542999999971],[-92.676666000000012,70.771652000000074],[-92.641112999999962,70.71527100000003],[-92.639449999999954,70.709991000000116],[-92.642501999999979,70.706375000000094],[-92.621933000000013,70.683594000000028],[-92.592772999999966,70.685806000000127],[-92.430557000000022,70.666091999999992],[-92.418059999999969,70.66304000000008],[-92.208053999999947,70.610260000000039],[-92.199158000000011,70.606644000000017],[-92.169158999999979,70.590271000000143],[-92.159163999999976,70.584152000000074],[-92.157501000000025,70.579163000000108],[-92.156661999999983,70.573044000000095],[-92.168335000000013,70.569992000000013],[-92.196105999999986,70.571105999999986],[-92.228607000000011,70.573608000000036],[-92.245543999999995,70.571380999999974],[-92.25,70.569716999999969],[-92.265014999999892,70.551926000000037],[-92.265014999999892,70.548035000000141],[-92.25,70.501389000000131],[-92.238051999999982,70.487198000000092],[-92.116652999999985,70.470825000000048],[-92.110000999999897,70.468322999999998],[-91.996947999999975,70.390823000000069],[-91.987777999999992,70.355820000000108],[-91.992492999999968,70.320540999999992],[-91.995269999999948,70.316665999999998],[-91.985549999999932,70.289703000000031],[-91.959732000000031,70.2586060000001],[-91.952224999999999,70.255264000000125],[-91.946945000000028,70.258041000000048],[-91.942214999999976,70.263610999999969],[-91.920273000000009,70.296370999999965],[-91.900283999999999,70.330826000000116],[-91.903610000000015,70.337204000000042],[-91.904449,70.343323000000112],[-91.89805599999994,70.349152000000117],[-91.890288999999996,70.354431000000091],[-91.878052000000025,70.358321999999987],[-91.867492999999968,70.360260000000096],[-91.853058000000033,70.361374000000069],[-91.73721299999994,70.358596999999975],[-91.729720999999984,70.356934000000081],[-91.703887999999949,70.34526100000005],[-91.698883000000023,70.342484000000127],[-91.69387799999987,70.336380000000077],[-91.636123999999938,70.231658999999979],[-91.565276999999924,70.200546000000145],[-91.524169999999913,70.179153000000042],[-91.513625999999931,70.167206000000078],[-91.511948000000018,70.158875000000023],[-91.511397999999986,70.152771000000143],[-91.516953000000001,70.146378000000027],[-91.529174999999952,70.142487000000131],[-91.542495999999915,70.140823000000125],[-91.578063999999927,70.13749700000011],[-91.916655999999989,70.119980000000055],[-91.953339000000028,70.118317000000104],[-91.972228999999913,70.118591000000038],[-92.003890999999953,70.121368000000132],[-92.021392999999989,70.123596000000077],[-92.036117999999931,70.126923000000033],[-92.049438000000009,70.132202000000007],[-92.05749499999996,70.136932000000058],[-92.234436000000017,70.212203999999986],[-92.268341000000021,70.208878000000141],[-92.393065999999976,70.150543000000027],[-92.450287000000003,70.0711060000001],[-92.432220000000029,70.075546000000088],[-92.285278000000005,70.089706000000035],[-92.268341000000021,70.090546000000074],[-92.177489999999977,70.088318000000072],[-92.129990000000021,70.084991000000002],[-92.087508999999898,70.079711999999972],[-92.026397999999972,70.066376000000048],[-91.993056999999965,70.058594000000085],[-91.985274999999945,70.053864000000033],[-91.939712999999983,70.020263999999997],[-91.946654999999907,70.015823000000069],[-92.114440999999999,69.956375000000037],[-92.148894999999925,69.946639999999945],[-92.203887999999949,69.92053199999998],[-92.369445999999982,69.847763000000043],[-92.543335000000013,69.780548000000067],[-92.658614999999998,69.761108000000092],[-92.778610000000015,69.722214000000008],[-92.775283999999999,69.706375000000094],[-92.565552000000025,69.71276899999998],[-92.551392000000021,69.712494000000106],[-92.535004000000015,69.709427000000005],[-92.535277999999948,69.705261000000121],[-92.709732000000031,69.673874000000012],[-92.728881999999999,69.67164600000001],[-92.743805000000009,69.671951000000035],[-92.777221999999938,69.676086000000055],[-92.858046999999999,69.6827550000001],[-92.871384000000035,69.682480000000112],[-92.908889999999985,69.680541999999946],[-92.922774999999888,69.679427999999973],[-92.923614999999927,69.678314],[-92.920273000000009,69.669708000000071],[-92.897506999999962,69.665543000000071],[-92.836120999999991,69.655822999999998],[-92.827498999999989,69.655822999999998],[-92.694442999999978,69.656372000000147],[-92.634726999999998,69.671088999999938],[-92.629378999999972,69.673592000000099],[-92.619056999999998,69.675758000000087],[-92.5625,69.687484999999981],[-92.523620999999935,69.692749000000106],[-92.506957999999941,69.693588000000091],[-92.340835999999967,69.694138000000123],[-92.305831999999896,69.665817000000004],[-92.205276000000026,69.645538000000101],[-92.091110000000015,69.624695000000031],[-92.088333000000034,69.62303200000008],[-92.088607999999965,69.618865999999969],[-92.090835999999911,69.616089000000102],[-92.110549999999932,69.613036999999963],[-92.122771999999998,69.612198000000035],[-92.134170999999981,69.612488000000042],[-92.243606999999884,69.630264000000011],[-92.28195199999999,69.639984000000084],[-92.291107000000011,69.641373000000101],[-92.300551999999925,69.641663000000108],[-92.297501000000011,69.636932000000002],[-92.124709999999936,69.554977000000065],[-92.084166999999979,69.544708000000014],[-91.938323999999909,69.517761000000121],[-91.803329000000019,69.498870999999951],[-91.804168999999888,69.504990000000021],[-91.798339999999939,69.513885000000016],[-91.497498000000007,69.658600000000092],[-91.485001000000011,69.663315000000125],[-91.475280999999939,69.664429000000098],[-91.450835999999981,69.65887499999991],[-91.418883999999935,69.65554800000001],[-91.314163000000008,69.652771000000087],[-91.221114999999998,69.653320000000008],[-91.202224999999942,69.655258000000003],[-91.188599000000011,69.65387000000004],[-91.097777999999948,69.638321000000133],[-91.094161999999983,69.636108000000036],[-91.091949,69.631652999999972],[-91.095275999999956,69.626647999999932],[-91.101943999999946,69.620819000000097],[-91.105835000000013,69.619141000000013],[-91.334441999999967,69.552765000000022],[-91.36082499999992,69.54553199999998],[-91.380554000000018,69.542480000000069],[-91.396118000000001,69.541091999999992],[-91.460555999999997,69.539703000000145],[-91.494720000000029,69.537201000000096],[-91.514450000000011,69.534148999999957],[-91.562774999999931,69.522491000000116],[-91.570281999999963,69.520264000000054],[-91.56639100000001,69.514708999999982],[-91.557770000000005,69.508041000000048],[-91.553878999999995,69.505554000000132],[-91.402221999999938,69.522217000000012],[-91.333618000000001,69.534988000000112],[-91.321670999999924,69.538879000000009],[-91.192215000000033,69.562759000000028],[-91.17971799999998,69.558868000000132],[-91.160277999999892,69.546097000000032],[-91.15055799999999,69.537201000000096],[-91.146666999999923,69.531662000000097],[-91.143616000000009,69.525268999999923],[-91.138610999999855,69.519150000000081],[-91.128326000000015,69.514160000000061],[-91.114166000000012,69.510817999999915],[-91.102782999999988,69.508881000000088],[-90.969727000000034,69.511383000000137],[-90.830001999999922,69.484984999999995],[-90.758620999999948,69.482758000000103],[-90.751953000000015,69.487198000000149],[-90.751403999999866,69.49275200000011],[-90.758057000000008,69.501389000000131],[-90.755843999999968,69.507217000000082],[-90.754181000000017,69.509155000000021],[-90.716109999999958,69.539429000000041],[-90.698607999999922,69.539429000000041],[-90.651108000000022,69.534424000000001],[-90.536666999999909,69.513885000000016],[-90.493332000000009,69.504166000000055],[-90.436661000000015,69.489700000000028],[-90.318619000000012,69.454437000000041],[-90.307769999999948,69.450272000000041],[-90.307769999999948,69.44720500000011],[-90.319457999999997,69.440536000000009],[-90.34445199999999,69.432205000000124],[-90.358046999999942,69.429703000000075],[-90.396392999999875,69.428589000000102],[-90.411391999999921,69.431365999999969],[-90.427489999999977,69.440811000000053],[-90.43360899999999,69.444976999999938],[-90.438323999999966,69.448029000000076],[-90.450561999999991,69.450272000000041],[-90.463332999999921,69.448593000000017],[-90.493332000000009,69.440811000000053],[-90.555556999999965,69.422485000000052],[-90.613891999999908,69.451096000000007],[-90.621932999999956,69.453323000000012],[-90.703612999999962,69.453598000000056],[-90.704453000000001,69.451385000000073],[-90.698607999999922,69.446091000000138],[-90.636948000000018,69.429703000000075],[-90.585830999999985,69.419144000000017],[-90.582229999999925,69.416931000000034],[-90.584732000000031,69.41415399999994],[-90.600829999999974,69.408599999999979],[-90.694991999999957,69.389709000000096],[-90.705275999999969,69.387772000000098],[-90.718613000000005,69.387772000000098],[-90.741378999999938,69.382750999999928],[-90.790282999999988,69.362762000000032],[-90.809432999999956,69.342209000000139],[-90.813048999999921,69.338318000000072],[-90.815826000000015,69.333327999999995],[-90.818619000000012,69.298598999999967],[-90.815001999999993,69.293319999999994],[-90.80860899999999,69.287490999999989],[-90.805557000000022,69.282761000000107],[-90.803878999999995,69.259720000000073],[-90.804717999999923,69.255829000000006],[-90.809432999999956,69.253326000000015],[-90.822234999999978,69.251663000000121],[-90.903885000000002,69.246368000000075],[-90.920837000000006,69.246368000000075],[-90.931380999999931,69.247482000000048],[-91.081115999999952,69.266936999999984],[-91.214721999999938,69.290268000000083],[-91.296386999999925,69.3119200000001],[-91.345276000000013,69.328049000000021],[-91.355834999999956,69.332214000000022],[-91.426391999999964,69.350540000000024],[-91.438599000000011,69.352768000000026],[-91.447220000000016,69.352768000000026],[-91.446655000000021,69.349716000000058],[-91.431945999999982,69.33859300000006],[-91.335281000000009,69.304428000000144],[-91.130553999999961,69.24192800000003],[-91.031386999999938,69.218323000000055],[-90.918883999999935,69.160812000000078],[-90.895003999999972,69.150818000000072],[-90.815001999999993,69.133606000000043],[-90.664718999999991,69.083328000000051],[-90.654998999999918,69.078049000000078],[-90.654174999999952,69.07609599999995],[-90.654449,69.070541000000048],[-90.660552999999993,69.059982000000048],[-90.669448999999929,69.049987999999985],[-90.583892999999989,68.928864000000033],[-90.544998000000021,68.911102000000142],[-90.528884999999946,68.908600000000092],[-90.47444200000001,68.890549000000078],[-90.436385999999914,68.874419999999986],[-90.419448999999986,68.840820000000065],[-90.446105999999986,68.779709000000139],[-90.449158000000011,68.77609300000006],[-90.454177999999956,68.773605000000089],[-90.464721999999995,68.770827999999995],[-90.478332999999964,68.768326000000116],[-90.492492999999968,68.767761000000064],[-90.497498000000007,68.768326000000116],[-90.501113999999973,68.770827999999995],[-90.513900999999976,68.759155000000135],[-90.526672000000019,68.744431000000134],[-90.527785999999992,68.736649],[-90.522507000000019,68.729980000000069],[-90.506957999999997,68.724990999999932],[-90.480285999999921,68.707764000000111],[-90.479172000000005,68.705826000000002],[-90.47444200000001,68.530822999999941],[-90.509734999999978,68.495254999999929],[-90.519454999999994,68.487487999999985],[-90.528335999999911,68.483322000000101],[-90.557770000000005,68.474700999999982],[-90.584732000000031,68.465546000000131],[-90.603881999999999,68.455826000000059],[-90.607772999999952,68.451096000000007],[-90.606658999999979,68.446091000000138],[-90.603881999999999,68.439697000000081],[-90.601395000000025,68.436371000000065],[-90.55999799999995,68.423599000000024],[-90.523894999999982,68.414428999999984],[-90.466948999999886,68.403869999999984],[-90.361938000000009,68.384155000000135],[-90.332779000000016,68.378036000000122],[-90.317504999999983,68.373306000000071],[-90.315001999999993,68.369980000000055],[-90.319167999999991,68.368317000000104],[-90.343886999999938,68.365265000000022],[-90.367492999999911,68.345261000000107],[-90.271392999999989,68.238876000000118],[-90.255004999999926,68.23275799999999],[-90.232772999999952,68.230270000000019],[-90.207229999999925,68.231093999999985],[-90.178604000000007,68.235809000000017],[-90.144454999999994,68.243866000000025],[-90.132216999999912,68.24859600000002],[-90.122771999999941,68.25360100000006],[-90.119720000000029,68.257216999999969],[-90.118057000000022,68.262206999999989],[-90.038604999999961,68.352202999999975],[-89.985275000000001,68.396102999999982],[-89.912216000000001,68.467209000000025],[-89.893065999999919,68.543319999999937],[-89.911666999999966,68.547484999999938],[-89.919998000000021,68.553588999999988],[-89.927779999999984,68.563599000000067],[-89.948607999999979,68.599426000000051],[-89.950561999999991,68.60386699999998],[-89.949721999999952,68.607758000000047],[-89.894729999999868,68.65248100000008],[-89.80972300000002,68.71026599999999],[-89.802489999999921,68.712203999999929],[-89.789168999999958,68.71026599999999],[-89.780563000000029,68.705826000000002],[-89.763335999999924,68.690536000000009],[-89.757507000000032,68.684708000000057],[-89.746947999999975,68.669708000000128],[-89.729172000000005,68.699142000000109],[-89.693328999999949,68.763885000000016],[-89.68472300000002,68.810257000000092],[-89.687499999999943,68.819716999999969],[-89.689986999999917,68.824707000000046],[-89.714721999999995,68.846939000000077],[-89.733886999999925,68.881653000000142],[-89.739166000000012,68.892761000000121],[-89.756957999999884,68.939972000000012],[-89.75556899999998,68.954162999999994],[-89.753066999999987,68.958327999999995],[-89.71665999999999,69.006104000000107],[-89.707229999999925,69.014709000000096],[-89.700561999999991,69.019150000000025],[-89.684433000000013,69.028870000000097],[-89.666107000000011,69.038315000000011],[-89.644164999999987,69.048325000000091],[-89.582779000000016,69.06860400000005],[-89.56082200000003,69.077209000000039],[-89.529357999999945,69.090606999999977],[-89.489990000000034,69.110535000000027],[-89.482497999999907,69.115540000000067],[-89.458618000000001,69.133606000000043],[-89.402221999999995,69.178863999999976],[-89.398620999999935,69.182479999999998],[-89.394454999999937,69.193039000000056],[-89.394454999999937,69.199141999999995],[-89.396956999999929,69.208602999999982],[-89.394454999999937,69.214431999999988],[-89.389998999999932,69.219147000000021],[-89.322234999999921,69.247208000000114],[-89.306655999999919,69.251389000000017],[-89.258621000000005,69.259995000000117],[-89.220551,69.266663000000051],[-89.174164000000019,69.273315000000139],[-89.134170999999981,69.275542999999914],[-89.114440999999886,69.27526899999998],[-89.09056099999998,69.271927000000062],[-89.049987999999985,69.264435000000105],[-89.038054999999872,69.261931999999945],[-88.999435000000005,69.251389000000017],[-88.968886999999938,69.24136400000009],[-88.942489999999964,69.229980000000012],[-88.938048999999978,69.226928999999984],[-88.935546999999985,69.222214000000122],[-88.93472300000002,69.219986000000006],[-88.9375,69.214156999999943],[-88.936660999999958,69.209152000000074],[-88.929992999999968,69.198029000000133],[-88.870269999999948,69.148605000000089],[-88.85943599999996,69.142211999999972],[-88.782501000000025,69.103043000000071],[-88.772507000000019,69.098876999999959],[-88.62388599999997,69.042755],[-88.480285999999978,68.998871000000065],[-88.457229999999925,68.992752000000053],[-88.406113000000005,68.982758000000047],[-88.270844000000011,68.934981999999934],[-88.208618000000001,68.911652000000004],[-88.197768999999994,68.906647000000135],[-88.115829000000019,68.860535000000084],[-88.082229999999981,68.841370000000097],[-88.052215999999987,68.823044000000095],[-88.038329999999974,68.814147999999989],[-87.971664000000033,68.766097999999943],[-87.96444699999995,68.760543999999982],[-87.947768999999994,68.731659000000093],[-87.921660999999915,68.673035000000027],[-87.916655999999989,68.656372000000147],[-87.917496000000028,68.647491000000059],[-87.925002999999947,68.632476999999994],[-87.93499799999995,68.61943100000002],[-87.942489999999907,68.610809000000017],[-87.947768999999994,68.605255000000056],[-87.933883999999978,68.576935000000049],[-87.924163999999905,68.559708000000001],[-87.883621000000005,68.494430999999963],[-87.881377999999984,68.491089000000045],[-87.841675000000009,68.432479999999998],[-87.835555999999997,68.42442299999999],[-87.817504999999926,68.417206000000078],[-87.798614999999984,68.40525800000006],[-87.791672000000005,68.398330999999985],[-87.789718999999934,68.391937000000098],[-87.789444000000003,68.386658000000125],[-87.792220999999927,68.334427000000005],[-87.800551999999925,68.3119200000001],[-87.845276000000013,68.247757000000092],[-87.848891999999864,68.244141000000013],[-87.929168999999945,68.197204999999997],[-87.93582200000003,68.195815999999979],[-87.946945000000028,68.198593000000074],[-88.106658999999866,68.242751999999996],[-88.22193900000002,68.36554000000001],[-88.384445000000028,68.291092000000049],[-88.392226999999991,68.287490999999989],[-88.395553999999947,68.285263000000043],[-88.401671999999962,68.280272999999966],[-88.403335999999911,68.275542999999971],[-88.402785999999878,68.270263999999997],[-88.398345999999947,68.260544000000095],[-88.380829000000006,68.24552900000009],[-88.361937999999952,68.233871000000079],[-88.342498999999975,68.223602000000028],[-88.334732000000031,68.217484000000127],[-88.330841000000021,68.213043000000027],[-88.279723999999931,68.118041999999946],[-88.277495999999985,68.111649],[-88.277785999999992,68.105545000000006],[-88.283065999999963,68.099990999999989],[-88.315551999999968,68.086104999999975],[-88.331680000000006,68.076385000000073],[-88.338332999999977,68.070541000000105],[-88.341109999999901,68.064987000000087],[-88.347777999999948,68.037201000000039],[-88.366942999999992,68.03166200000004],[-88.381103999999993,68.025269000000094],[-88.372771999999941,67.96887200000009],[-88.370834000000002,67.959152000000017],[-88.36860699999994,67.954436999999984],[-88.285278000000005,67.81721500000009],[-88.276397999999972,67.80304000000001],[-88.269164999999987,67.793594000000041],[-88.160552999999993,67.682479999999941],[-88.151107999999908,67.673309000000017],[-88.139449999999954,67.664428999999984],[-88.124999999999943,67.65554800000001],[-88.095839999999953,67.642487000000074],[-88.066100999999946,67.634720000000129],[-88.009170999999924,67.622757000000092],[-87.979996000000028,67.615814000000114],[-87.965285999999992,67.611649000000114],[-87.955841000000021,67.607483000000002],[-87.881377999999984,67.568054000000132],[-87.841385000000002,67.536102000000142],[-87.827224999999999,67.527206000000035],[-87.789169000000015,67.505263999999954],[-87.623046999999929,67.412491000000102],[-87.606383999999935,67.403869999999984],[-87.585007000000019,67.395264000000054],[-87.53694200000001,67.378860000000088],[-87.460830999999985,67.344147000000135],[-87.357773000000009,67.262207000000046],[-87.359160999999972,67.247482000000048],[-87.361938000000009,67.242203000000075],[-87.429168999999945,67.208603000000039],[-87.440551999999968,67.204987000000131],[-87.486664000000019,67.194138000000066],[-87.497771999999941,67.190536000000122],[-87.50556899999998,67.185256999999979],[-87.511397999999986,67.174988000000099],[-87.511948000000018,67.169983000000059],[-87.516953000000001,67.115540000000124],[-87.510284000000013,67.112198000000149],[-87.497498000000007,67.115265000000079],[-87.322784000000013,67.162766000000147],[-87.240828999999906,67.216094999999939],[-87.117766999999958,67.212769000000094],[-87.069732999999928,67.219437000000084],[-86.968612999999948,67.245255000000043],[-86.96305799999999,67.250548999999978],[-86.967498999999975,67.255264000000011],[-87.008895999999936,67.282211000000132],[-87.075561999999934,67.327209000000039],[-87.086670000000026,67.336379999999963],[-87.090560999999923,67.345825000000048],[-87.089995999999985,67.350815000000125],[-87.081389999999999,67.354430999999977],[-86.874435000000005,67.404984000000127],[-86.804169000000002,67.420821999999987],[-86.79222099999987,67.422485000000108],[-86.779175000000009,67.422211000000004],[-86.765288999999939,67.419144000000074],[-86.709731999999974,67.388046000000031],[-86.689163000000008,67.3744200000001],[-86.68472300000002,67.369980000000055],[-86.675551999999982,67.365540000000067],[-86.647232000000031,67.358322000000044],[-86.592498999999975,67.345261000000107],[-86.579726999999991,67.344986000000063],[-86.543883999999935,67.344986000000063],[-86.53195199999999,67.346649000000014],[-86.523620999999991,67.352203000000031],[-86.518065999999976,67.357208000000071],[-86.509170999999981,67.36775200000011],[-86.50306699999993,67.377762000000018],[-86.473891999999978,67.468596999999988],[-86.472777999999892,67.478592000000049],[-86.47444200000001,67.483322000000101],[-86.49499499999996,67.49693300000007],[-86.485001000000011,67.516936999999984],[-86.452224999999999,67.592484000000127],[-86.451401000000033,67.597488000000112],[-86.455840999999964,67.601929000000041],[-86.465285999999935,67.606369000000029],[-86.479720999999984,67.610535000000141],[-86.488892000000021,67.614699999999971],[-86.521392999999932,67.671921000000111],[-86.525283999999999,67.681366000000139],[-86.508056999999894,67.69720500000011],[-86.359160999999915,67.827773999999977],[-86.350554999999986,67.833327999999938],[-86.286941999999897,67.869979999999941],[-86.098052999999993,67.978043000000014],[-86.041381999999942,68.000549000000035],[-86.029723999999931,68.004990000000134],[-86.005004999999983,68.008330999999998],[-85.99221799999998,68.009155000000135],[-85.979995999999915,68.011658000000125],[-85.898346000000004,68.046097000000145],[-85.892501999999979,68.051376000000118],[-85.890838999999971,68.061371000000065],[-85.912506000000008,68.084717000000069],[-85.916396999999961,68.094147000000135],[-85.914443999999946,68.104155999999989],[-85.888061999999991,68.189697000000137],[-85.842772999999966,68.317214999999976],[-85.839172000000019,68.321381000000088],[-85.712783999999942,68.411652000000117],[-85.726943999999946,68.486374000000012],[-85.733321999999987,68.598602000000085],[-85.675277999999992,68.711104999999975],[-85.663619999999923,68.726929000000098],[-85.645843999999954,68.737488000000099],[-85.633895999999936,68.741928000000144],[-85.620269999999948,68.741653000000099],[-85.606383999999991,68.740265000000022],[-85.591675000000009,68.737198000000092],[-85.569457999999941,68.728317000000004],[-85.558043999999938,68.726089000000002],[-85.494445999999925,68.736923000000104],[-85.481948999999929,68.739426000000037],[-85.466171000000031,68.749992000000134],[-85.464164999999923,68.752991000000122],[-85.464721999999938,68.759720000000016],[-85.507781999999963,68.766662999999994],[-85.550827000000027,68.773315000000082],[-85.562774999999988,68.776657],[-85.55360399999995,68.781097000000045],[-85.540833000000021,68.78276100000005],[-85.514175000000023,68.783875000000023],[-85.458053999999947,68.777770999999973],[-85.415008999999998,68.770827999999995],[-85.371383999999978,68.762207000000103],[-85.361664000000019,68.757767000000058],[-85.368056999999965,68.752486999999974],[-85.379439999999988,68.747208000000001],[-85.388335999999981,68.741928000000144],[-85.384170999999981,68.737198000000092],[-85.328612999999962,68.724990999999932],[-85.314162999999951,68.722762999999986],[-85.228881999999999,68.71026599999999],[-85.215835999999967,68.710815000000139],[-85.209166999999979,68.714996000000042],[-85.210830999999985,68.719711000000075],[-85.21945199999999,68.729155999999932],[-85.226669000000015,68.733597000000032],[-85.148345999999947,68.750000000000114],[-85.067504999999926,68.749710000000107],[-84.912780999999939,68.746933000000013],[-84.898055999999997,68.742477000000065],[-84.883895999999993,68.740265000000022],[-84.801102000000014,68.73414600000001],[-84.787215999999944,68.733597000000032],[-84.775283999999999,68.737198000000092],[-84.767501999999922,68.747208000000001],[-84.760009999999909,68.757217000000026],[-84.752791999999999,68.767487000000131],[-84.754180999999903,68.772217000000012],[-84.761123999999995,68.776932000000045],[-84.834732000000031,68.820541000000105],[-84.846664000000033,68.82388300000008],[-84.860824999999977,68.825272000000041],[-84.899993999999936,68.820541000000105],[-84.912216000000001,68.818054000000018],[-84.976944000000003,68.809418000000107],[-85.003615999999909,68.808318999999983],[-85.031677000000002,68.810806000000014],[-85.131942999999922,68.826934999999992],[-85.143889999999942,68.830276000000026],[-85.163054999999929,68.839157000000114],[-85.17721599999993,68.848328000000095],[-85.184158000000025,68.853043000000127],[-85.192764000000011,68.862198000000149],[-85.194442999999865,68.867203000000018],[-85.190826000000015,68.872208000000057],[-85.177779999999984,68.87359600000002],[-85.15306099999998,68.873032000000023],[-85.125,68.870254999999986],[-85.053329000000019,68.858871000000022],[-85.039992999999981,68.859421000000054],[-85.005568999999923,68.877472000000068],[-85.001952999999958,68.882477000000108],[-84.99749799999995,68.925812000000064],[-85.007232999999871,68.930267000000129],[-85.021117999999944,68.931656000000089],[-85.046660999999972,68.926651000000049],[-85.059998000000007,68.925812000000064],[-85.08805799999999,68.928588999999988],[-85.116942999999935,68.93331900000004],[-85.129439999999931,68.937485000000095],[-85.136123999999995,68.942200000000128],[-85.140563999999927,68.946640000000002],[-85.136947999999961,68.951935000000049],[-85.127776999999924,68.956100000000049],[-85.115004999999996,68.958603000000039],[-85.087508999999955,68.958037999999988],[-84.973785000000021,68.946869000000106],[-84.914718999999991,68.938034000000073],[-84.818893000000003,68.927765000000022],[-84.805831999999953,68.929152999999928],[-84.796386999999982,68.933594000000028],[-84.791381999999942,68.94331399999993],[-84.793334999999956,68.948318000000086],[-84.799987999999871,68.952774000000034],[-84.809433000000013,68.957214000000022],[-84.821945000000028,68.961655000000121],[-84.837219000000005,68.965820000000122],[-84.851394999999968,68.968323000000112],[-84.865554999999915,68.969711000000018],[-84.906951999999933,68.971649000000127],[-84.921386999999982,68.973877000000073],[-84.936110999999926,68.977203000000145],[-84.986922999999933,68.999511999999982],[-84.981673999999941,69.007492000000013],[-84.957779000000016,69.017487000000074],[-84.944442999999978,69.018051000000014],[-84.836394999999925,69.012772000000041],[-84.720000999999968,69.006943000000035],[-84.591674999999952,68.994431000000077],[-84.578063999999983,68.993866000000025],[-84.565552000000025,68.997482000000105],[-84.541381999999999,69.007216999999969],[-84.532227000000034,69.012497000000053],[-84.528335999999967,69.017487000000074],[-84.535277999999948,69.022217000000126],[-84.563613999999973,69.025818000000015],[-84.745543999999995,69.039703000000088],[-84.953887999999949,69.085815000000139],[-85.108337000000006,69.113312000000121],[-85.020554000000004,69.160262999999929],[-85.006957999999941,69.160812000000078],[-84.994155999999919,69.163315000000068],[-84.987502999999947,69.168594000000041],[-84.994719999999973,69.173035000000141],[-85.008895999999993,69.174423000000047],[-85.064712999999927,69.176926000000037],[-85.143775999999946,69.167091000000028],[-85.151778999999976,69.166091999999935],[-85.159110999999996,69.164101000000073],[-85.163276999999994,69.161598000000083],[-85.155272999999966,69.153107000000091],[-85.176665999999898,69.143600000000049],[-85.197494999999947,69.132750999999985],[-85.210555999999997,69.130264000000125],[-85.223617999999988,69.128860000000088],[-85.236937999999952,69.128036000000122],[-85.25140399999998,69.130264000000125],[-85.266662999999994,69.133606000000043],[-85.308334000000002,69.143600000000049],[-85.315552000000025,69.148041000000148],[-85.317504999999983,69.15277100000003],[-85.308043999999995,69.158034999999984],[-85.29611199999988,69.162491000000102],[-85.283324999999877,69.165267999999969],[-85.235001000000011,69.174698000000035],[-85.227501000000018,69.176872000000003],[-85.226836999999989,69.179870999999991],[-85.231162999999981,69.182541000000072],[-85.240829000000019,69.192474000000004],[-85.254729999999995,69.192749000000049],[-85.337783999999999,69.193863000000022],[-85.383057000000008,69.205551000000071],[-85.392776000000026,69.209991000000059],[-85.473327999999924,69.271927000000062],[-85.477782999999874,69.276382000000069],[-85.50306699999993,69.31442300000009],[-85.508057000000008,69.395263999999997],[-85.506957999999997,69.400269000000037],[-85.503341999999975,69.405258000000003],[-85.494155999999919,69.410812000000021],[-85.481948999999929,69.415267999999969],[-85.467498999999918,69.417206000000078],[-85.453339000000028,69.416931000000034],[-85.424437999999952,69.413315000000011],[-85.396117999999944,69.411652000000061],[-85.383330999999941,69.415267999999969],[-85.339172000000019,69.438873000000115],[-85.343613000000005,69.443587999999977],[-85.353606999999954,69.448029000000076],[-85.378875999999934,69.456649999999968],[-85.39416499999993,69.460815000000139],[-85.422774999999945,69.462493999999992],[-85.436385999999914,69.460815000000139],[-85.445830999999998,69.45637499999998],[-85.465011999999945,69.440811000000053],[-85.477218999999991,69.436371000000008],[-85.491378999999995,69.436646000000053],[-85.500838999999985,69.439148000000102],[-85.510833999999988,69.443587999999977],[-85.525283999999999,69.45277400000009],[-85.538894999999968,69.466933999999981],[-85.542496000000028,69.476379000000065],[-85.547775000000001,69.647217000000069],[-85.546951000000035,69.652206000000035],[-85.514724999999999,69.768051000000071],[-85.450287000000003,69.784714000000122],[-85.423324999999977,69.788879000000122],[-85.409163999999976,69.788589000000115],[-85.393889999999999,69.7852630000001],[-85.389174999999966,69.780548000000067],[-85.389998999999932,69.775818000000015],[-85.39416499999993,69.770537999999988],[-85.406951999999933,69.760269000000108],[-85.410827999999981,69.755264000000068],[-85.406386999999995,69.750549000000035],[-85.391952999999944,69.750275000000101],[-85.379165999999941,69.753601000000117],[-85.366652999999985,69.758040999999992],[-85.342498999999975,69.768875000000037],[-85.333068999999966,69.774155000000121],[-85.331954999999994,69.77915999999999],[-85.34445199999999,69.813033999999959],[-85.349166999999909,69.817490000000078],[-85.361938000000009,69.821930000000066],[-85.377212999999927,69.824158000000068],[-85.433608999999933,69.823608000000036],[-85.461394999999982,69.822495000000117],[-85.489990000000034,69.823044000000095],[-85.518615999999952,69.823608000000036],[-85.56138599999997,69.824706999999989],[-85.586394999999982,69.826934999999935],[-85.582229999999981,69.845825000000104],[-85.578613000000018,69.850815000000125],[-85.571945000000028,69.856094000000098],[-85.561935000000005,69.859421000000054],[-85.548049999999932,69.859984999999995],[-85.377212999999927,69.851089000000059],[-85.361938000000009,69.848877000000016],[-85.315552000000025,69.838042999999971],[-85.274169999999913,69.825272000000041],[-85.222504000000015,69.80802900000009],[-85.212509000000011,69.803589000000102],[-85.199432000000002,69.799149000000057],[-85.170836999999949,69.790542999999957],[-85.093886999999995,69.773315000000025],[-85.079177999999956,69.771102999999982],[-85.064437999999996,69.76998900000001],[-84.871658000000025,69.816086000000098],[-84.86471599999993,69.821105999999929],[-84.854172000000005,69.83137499999998],[-84.574172999999917,69.857483000000116],[-84.546386999999868,69.859421000000054],[-84.476669000000015,69.862198000000149],[-84.433608999999933,69.861098999999967],[-84.375823999999966,69.857483000000116],[-84.346663999999976,69.854706000000022],[-84.331680000000006,69.852203000000031],[-84.169448999999986,69.822220000000129],[-84.125823999999909,69.809418000000107],[-84.118606999999997,69.804703000000075],[-84.114165999999955,69.799988000000042],[-84.112220999999977,69.793593999999985],[-84.104171999999949,69.785812000000021],[-84.091674999999952,69.781372000000033],[-83.971938999999963,69.74971000000005],[-83.941665999999998,69.743042000000116],[-83.748610999999926,69.708878000000084],[-83.733886999999982,69.706649999999911],[-83.705001999999922,69.703598],[-83.603881999999942,69.693588000000091],[-83.589447000000007,69.692200000000014],[-83.360549999999989,69.676376000000062],[-83.346389999999985,69.676086000000055],[-83.333069000000023,69.678314],[-83.306380999999931,69.693862999999908],[-83.293610000000001,69.699142000000109],[-83.280562999999916,69.702484000000027],[-83.253341999999975,69.705261000000121],[-83.238892000000021,69.704711999999972],[-83.180557000000022,69.694977000000108],[-83.122771999999998,69.689148000000046],[-83.021941999999967,69.679703000000018],[-83.008056999999951,69.679152999999985],[-82.826950000000011,69.688873000000058],[-82.696654999999964,69.695816000000036],[-82.541007999999977,69.674477000000138],[-82.539672999999937,69.671593000000087],[-82.536162999999874,69.668823000000032],[-82.527328000000011,69.666153000000122],[-82.509505999999874,69.661979999999971],[-82.500671000000011,69.660491999999977],[-82.483329999999967,69.657990000000098],[-82.457503999999972,69.655327],[-82.291672000000005,69.639984000000084],[-82.263335999999981,69.638046000000145],[-82.254729999999995,69.636383000000023],[-82.307495000000017,69.622208000000114],[-82.334731999999974,69.61943100000002],[-82.390288999999996,69.618865999999969],[-82.47066499999994,69.62303200000008],[-82.476333999999952,69.625870000000077],[-82.483664999999974,69.628539999999987],[-82.492500000000007,69.630043000000001],[-82.552337999999963,69.635376000000008],[-82.560836999999992,69.635704000000146],[-82.56899999999996,69.634872000000087],[-82.577002999999991,69.632874000000129],[-82.653885000000002,69.62303200000008],[-82.654723999999987,69.568604000000107],[-82.612503000000004,69.566940000000102],[-82.600280999999995,69.562485000000095],[-82.535278000000005,69.534988000000112],[-82.489989999999977,69.507217000000082],[-82.476668999999958,69.497756999999979],[-82.486937999999896,69.493591000000094],[-82.500564999999938,69.492203000000018],[-82.528884999999946,69.4952550000001],[-82.74221799999998,69.50999500000006],[-82.897507000000019,69.518875000000094],[-82.939712999999927,69.521378000000084],[-82.982223999999917,69.524154999999951],[-83.067779999999914,69.533051000000057],[-83.125548999999921,69.539978000000019],[-83.154175000000009,69.543869000000086],[-83.228057999999976,69.538589000000002],[-83.082503999999972,69.514160000000061],[-83.025283999999999,69.508041000000048],[-82.954726999999991,69.503601000000003],[-82.870270000000005,69.500274999999988],[-82.856658999999922,69.50082400000008],[-82.842498999999918,69.500274999999988],[-82.785277999999948,69.494141000000127],[-82.68472300000002,69.479706000000022],[-82.324172999999917,69.418868999999972],[-82.295272999999952,69.413879000000122],[-82.23721299999994,69.400818000000015],[-82.225280999999995,69.39637799999997],[-82.221389999999928,69.391662999999937],[-82.231673999999941,69.387497000000053],[-82.289718999999991,69.251663000000121],[-82.291381999999999,69.246643000000063],[-82.273055999999997,69.237488000000042],[-82.258620999999948,69.233871000000079],[-82.244995000000017,69.233322000000101],[-82.217223999999931,69.233047000000113],[-82.203612999999962,69.233597000000145],[-82.054442999999992,69.24136400000009],[-82.041107000000011,69.242751999999996],[-82.027785999999992,69.244979999999941],[-81.99129499999998,69.25470700000011],[-81.914718999999877,69.269440000000145],[-81.70777899999996,69.264709000000039],[-81.693877999999984,69.263046000000145],[-81.67971799999998,69.260544000000039],[-81.650283999999999,69.251663000000121],[-81.512222000000008,69.20138500000013],[-81.416396999999904,69.208038000000101],[-81.402221999999995,69.207214000000135],[-81.388335999999981,69.204712000000086],[-81.359725999999966,69.196640000000116],[-81.347778000000005,69.191925000000083],[-81.338897999999972,69.187485000000038],[-81.332503999999858,69.182479999999998],[-81.299438000000009,69.1202550000001],[-81.330841000000021,69.095261000000107],[-81.57028200000002,68.992477000000008],[-81.59584000000001,68.984146000000123],[-81.71665999999999,68.949142000000052],[-81.75556899999998,68.941360000000088],[-81.809433000000013,68.9327550000001],[-81.888061999999991,68.919144000000131],[-81.914169000000015,68.914429000000098],[-81.966110000000015,68.904433999999981],[-82.005004999999983,68.895538000000045],[-82.043059999999969,68.883881000000088],[-82.055556999999965,68.878586000000041],[-82.057219999999973,68.873871000000008],[-82.043335000000013,68.872208000000057],[-82.00306699999993,68.874146000000053],[-81.977218999999991,68.879700000000014],[-81.833068999999966,68.907211000000075],[-81.819457999999997,68.908600000000092],[-81.68638599999997,68.905258000000117],[-81.673049999999989,68.904433999999981],[-81.66194200000001,68.90277100000003],[-81.650283999999999,68.899155000000007],[-81.58805799999999,68.869705000000124],[-81.581954999999937,68.864990000000091],[-81.438323999999966,68.874984999999981],[-81.424712999999997,68.87553400000013],[-81.382767000000001,68.866652999999985],[-81.354171999999892,68.857483000000116],[-81.238051999999925,68.774704000000042],[-81.23443599999996,68.76998900000001],[-81.232772999999952,68.760268999999937],[-81.252227999999945,68.653046000000131],[-81.255843999999911,68.643051000000014],[-81.260558999999944,68.638046000000145],[-81.267501999999922,68.633041000000105],[-81.357773000000009,68.599152000000117],[-81.560271999999998,68.541656000000103],[-81.687209999999993,68.509430000000066],[-81.798889000000031,68.489700000000028],[-81.816390999999896,68.469711000000132],[-81.830291999999986,68.459717000000126],[-81.842498999999918,68.455551000000014],[-81.958053999999947,68.423309000000017],[-81.970839999999953,68.421097000000145],[-81.997771999999941,68.423035000000084],[-82.011947999999961,68.427765000000136],[-82.024444999999957,68.436919999999986],[-82.027785999999992,68.441650000000038],[-82.028884999999946,68.446640000000059],[-82.033324999999991,68.456099999999992],[-82.038054999999929,68.465820000000065],[-82.041671999999949,68.470535000000098],[-82.062209999999936,68.494430999999963],[-82.068618999999899,68.499145999999996],[-82.077498999999932,68.503601000000003],[-82.091675000000009,68.507217000000082],[-82.229445999999996,68.531662000000097],[-82.256393000000003,68.533600000000035],[-82.269454999999937,68.532486000000063],[-82.271117999999944,68.527481000000023],[-82.267226999999991,68.52276599999999],[-82.254729999999995,68.513321000000133],[-82.243056999999965,68.508881000000088],[-82.229171999999892,68.505264000000125],[-82.1875,68.495819000000097],[-82.175826999999913,68.491364000000033],[-82.17332499999992,68.485808999999961],[-82.175002999999947,68.481093999999928],[-82.179169000000002,68.476089000000059],[-82.183608999999933,68.471100000000092],[-82.190552000000025,68.466095000000053],[-82.202498999999989,68.460815000000025],[-82.215011999999888,68.457489000000123],[-82.228057999999976,68.455261000000007],[-82.25418099999996,68.454437000000041],[-82.382767000000001,68.466934000000037],[-82.393889999999999,68.468322999999998],[-82.448882999999967,68.478592000000049],[-82.476943999999946,68.485535000000027],[-82.500290000000007,68.494430999999963],[-82.532501000000025,68.508041000000048],[-82.545273000000009,68.517487000000017],[-82.549163999999905,68.522217000000069],[-82.557770000000005,68.526932000000102],[-82.571395999999993,68.526382000000069],[-82.583892999999875,68.524155000000007],[-82.608886999999925,68.517487000000017],[-82.62110899999999,68.512206999999933],[-82.634734999999978,68.502213000000097],[-82.638901000000033,68.497208000000057],[-82.635284000000013,68.492203000000018],[-82.491103999999893,68.453873000000101],[-82.490554999999915,68.402205999999921],[-82.363051999999982,68.35054000000008],[-82.356658999999922,68.345825000000048],[-82.353057999999976,68.341094999999996],[-82.351105000000018,68.331375000000094],[-82.352492999999924,68.326660000000061],[-82.356658999999922,68.321655000000021],[-82.369445999999925,68.318329000000006],[-82.381942999999922,68.316939999999988],[-82.39527899999996,68.316666000000055],[-82.422225999999966,68.318603999999993],[-82.448607999999979,68.320831000000055],[-82.475006000000008,68.321106000000043],[-82.500838999999985,68.317490000000021],[-82.507781999999963,68.313309000000118],[-82.50140399999998,68.308594000000085],[-82.483611999999937,68.299422999999933],[-82.426101999999958,68.276657000000114],[-82.400557999999933,68.26887499999998],[-82.386947999999961,68.266388000000063],[-82.37388599999997,68.265548999999965],[-82.36082499999992,68.266937000000041],[-82.311661000000015,68.283051],[-82.286941999999897,68.289703000000031],[-82.273330999999928,68.288879000000065],[-82.264724999999999,68.284424000000058],[-82.260009999999966,68.274993999999992],[-82.259170999999981,68.269989000000123],[-82.258620999999948,68.255554000000018],[-82.264449999999897,68.24552900000009],[-82.270279000000016,68.235535000000084],[-82.278610000000015,68.225540000000024],[-82.289443999999946,68.215545999999961],[-82.300551999999868,68.205551000000071],[-82.321121000000005,68.190262000000018],[-82.330291999999872,68.185256999999922],[-82.337218999999948,68.180267000000072],[-82.345550999999944,68.170258000000047],[-82.34722899999997,68.165268000000026],[-82.345839999999953,68.160537999999974],[-82.337218999999948,68.155823000000112],[-82.314437999999939,68.146652000000017],[-82.272506999999962,68.133331000000055],[-82.230835000000013,68.121918000000051],[-82.206115999999952,68.115814],[-82.192489999999964,68.112487999999985],[-82.179169000000002,68.111649],[-82.166397000000018,68.114151000000106],[-82.145781999999997,68.125488000000018],[-82.099166999999966,68.154984000000013],[-82.080565999999919,68.179703000000131],[-82.06361400000003,68.199707000000046],[-82.056945999999982,68.204712000000086],[-82.047500999999897,68.209716999999955],[-82.037505999999894,68.213881999999955],[-82.025009000000011,68.216095000000109],[-82.01167299999986,68.214705999999921],[-81.997771999999941,68.211105000000089],[-81.988892000000021,68.206650000000025],[-81.985549999999989,68.201660000000004],[-81.984726000000023,68.196929999999952],[-81.993057000000022,68.172485000000108],[-82.008895999999936,68.14776599999999],[-82.019164999999987,68.132751000000042],[-82.027221999999938,68.122756999999979],[-82.034164000000033,68.117751999999939],[-82.043610000000001,68.112762000000089],[-82.056106999999997,68.109421000000054],[-82.114502000000016,68.082870000000014],[-82.173889000000031,68.002486999999974],[-82.175551999999982,67.997482000000105],[-82.102782999999988,67.907211000000075],[-82.096663999999976,67.90248100000008],[-82.079452999999944,67.893326000000002],[-82.070557000000008,67.888596000000007],[-81.837783999999999,67.783875000000023],[-81.727218999999934,67.740814],[-81.707503999999972,67.731658999999922],[-81.690552000000025,67.722487999999998],[-81.678328999999906,67.713042999999914],[-81.666397000000018,67.703598000000056],[-81.65972899999997,67.694138000000009],[-81.653884999999946,67.689423000000147],[-81.636672999999917,67.679977000000008],[-81.592498999999975,67.661652000000061],[-81.538329999999974,67.643599999999992],[-81.498046999999985,67.631927000000132],[-81.457779000000016,67.620529000000147],[-81.433059999999955,67.611374000000069],[-81.416396999999904,67.601929000000041],[-81.248885999999914,67.479706000000078],[-81.243056999999908,67.474991000000045],[-81.239715999999873,67.470260999999994],[-81.237212999999997,67.455551000000014],[-81.237503000000004,67.441086000000098],[-81.239166000000012,67.436096000000077],[-81.245269999999948,67.426376000000005],[-81.256392999999946,67.416381999999942],[-81.293610000000001,67.396103000000039],[-81.300551999999982,67.391098],[-81.30471799999998,67.386108000000092],[-81.347778000000005,67.292755],[-81.366394000000014,67.238875999999948],[-81.373610999999983,67.204711999999972],[-81.376099000000011,67.189972000000012],[-81.375274999999988,67.185256999999979],[-81.380279999999914,67.170532000000037],[-81.413895000000025,67.091370000000097],[-81.432220000000029,67.066666000000112],[-81.496657999999911,67.004715000000147],[-81.50306699999993,66.999710000000107],[-81.512512000000015,66.99470500000001],[-81.524170000000026,66.99054000000001],[-81.536117999999988,66.988312000000064],[-81.699722000000008,66.970261000000107],[-81.711944999999957,66.969986000000063],[-81.750838999999928,66.978591999999992],[-81.763901000000033,66.983046999999999],[-81.772232000000031,66.987762000000032],[-81.783066000000019,66.992477000000065],[-81.796111999999937,66.996933000000013],[-81.809157999999968,66.998321999999973],[-81.833618000000001,66.997756999999979],[-81.929717999999923,66.978591999999992],[-81.952498999999932,66.968048000000124],[-81.988892000000021,66.949706999999933],[-82.026947000000007,66.926086000000055],[-82.179992999999968,66.768875000000094],[-82.183884000000035,66.764160000000061],[-82.369720000000029,66.725815000000125],[-82.481109999999944,66.669707999999957],[-82.556380999999988,66.623871000000122],[-82.562774999999874,66.618866000000082],[-82.566665999999941,66.613876000000005],[-82.571670999999981,66.60386699999998],[-82.577498999999989,66.584427000000005],[-82.576675000000023,66.579436999999984],[-82.579452999999944,66.569717000000082],[-82.585555999999997,66.564697000000024],[-82.596953999999982,66.560256999999979],[-82.694442999999978,66.558029000000033],[-82.78195199999999,66.566666000000055],[-82.86999499999996,66.567490000000021],[-83.018065999999976,66.539978000000076],[-83.012787000000003,66.515823000000069],[-83.015288999999996,66.50610400000005],[-83.019164999999873,66.501099000000011],[-83.025283999999999,66.495819000000097],[-83.049987999999928,66.475539999999967],[-83.058608999999933,66.470260999999994],[-83.357497999999964,66.353043000000071],[-83.368332000000009,66.348877000000016],[-83.402221999999938,66.347487999999998],[-83.450561999999991,66.346649000000014],[-83.515288999999882,66.353867000000037],[-83.567504999999983,66.367477000000122],[-83.652785999999935,66.40776100000005],[-83.654175000000009,66.412491000000102],[-83.639449999999954,66.437195000000088],[-83.630828999999949,66.442200000000128],[-83.618331999999896,66.44081100000011],[-83.607773000000009,66.436371000000122],[-83.597778000000005,66.426926000000037],[-83.601669000000015,66.412201000000096],[-83.597778000000005,66.407486000000063],[-83.545273000000009,66.381363000000079],[-83.53472899999997,66.378035999999952],[-83.579726999999934,66.431656000000089],[-83.672501000000011,66.520538000000101],[-83.68110699999994,66.524993999999992],[-83.70695499999988,66.530822999999998],[-83.732497999999964,66.534714000000065],[-83.795273000000009,66.541930999999977],[-83.82028200000002,66.542754999999943],[-83.832229999999981,66.542206000000022],[-83.857497999999964,66.544144000000131],[-83.968886999999881,66.577484000000027],[-83.977492999999981,66.582214000000079],[-83.985001000000011,66.591660000000047],[-84.011397999999986,66.663605000000018],[-84.014174999999966,66.673309000000017],[-84.015563999999983,66.687759000000142],[-84.014450000000011,66.692748999999992],[-84.006119000000012,66.698029000000076],[-83.994719999999973,66.70138500000013],[-83.982772999999952,66.70277400000009],[-83.945540999999992,66.702484000000084],[-83.891113000000018,66.804153000000099],[-83.886123999999995,66.813873000000001],[-83.883895999999936,66.82388300000008],[-83.884170999999924,66.833602999999982],[-83.890288999999996,66.85775799999999],[-83.901671999999905,66.871918000000107],[-83.907776000000013,66.876647999999989],[-83.916397000000018,66.881087999999977],[-83.928878999999995,66.86303700000002],[-83.938323999999909,66.823608000000092],[-83.945540999999992,66.813599000000067],[-84.104996000000028,66.708328000000108],[-84.116394000000014,66.704987000000074],[-84.140288999999996,66.701934999999935],[-84.152785999999992,66.702484000000084],[-84.165558000000033,66.703873000000101],[-84.260284000000013,66.716385000000059],[-84.27305599999994,66.718596999999932],[-84.286666999999909,66.723038000000031],[-84.295273000000009,66.727478000000076],[-84.43638599999997,66.818329000000119],[-84.427779999999927,66.961104999999975],[-84.415008999999998,66.960815000000139],[-84.390288999999882,66.961929000000112],[-84.378600999999946,66.964157000000057],[-84.367492999999968,66.968597000000102],[-84.370834000000002,66.97137500000008],[-84.436110999999926,66.981369000000086],[-84.488051999999925,66.988876000000005],[-84.618057000000022,67.006378000000041],[-84.694153000000028,67.009720000000016],[-84.733063000000016,67.014708999999982],[-84.837783999999999,67.029434000000094],[-84.850829999999974,67.03166200000004],[-84.87332200000003,67.039428999999984],[-84.881942999999978,67.043869000000029],[-84.886123999999938,67.048599000000081],[-84.892501999999922,67.053314000000114],[-84.901397999999858,67.057754999999986],[-84.915008999999998,67.060806000000014],[-84.926940999999943,67.059418000000107],[-84.936110999999926,67.056090999999981],[-84.880279999999971,66.989426000000037],[-84.871658000000025,66.984984999999938],[-84.857772999999952,66.981659000000093],[-84.84584000000001,66.982208000000071],[-84.833892999999932,66.984711000000004],[-84.811110999999926,66.991653000000099],[-84.789444000000003,67.002486999999974],[-84.778335999999911,67.006653000000085],[-84.765563999999983,67.006378000000041],[-84.699996999999939,66.99581900000004],[-84.645844000000011,66.981659000000093],[-84.639724999999885,66.978043000000071],[-84.651397999999972,66.97554000000008],[-84.712783999999942,66.972762999999986],[-84.885833999999932,66.966660000000047],[-84.960007000000019,66.964157000000057],[-85.010009999999966,66.964706000000035],[-85.048339999999996,66.963318000000072],[-85.059722999999963,66.959717000000069],[-85.142775999999969,66.930267000000129],[-85.228333000000021,66.878311000000053],[-85.228881999999999,66.873306000000014],[-85.222777999999948,66.868866000000025],[-85.196105999999986,66.855255000000056],[-85.184433000000013,66.851089000000115],[-85.146118000000001,66.839431999999988],[-85.133057000000008,66.836929000000055],[-85.11999499999996,66.835541000000148],[-84.948607999999979,66.858597000000145],[-84.94027699999998,66.863876000000118],[-84.904556000000014,66.897202000000107],[-84.901053999999988,66.900375000000111],[-84.904892000000018,66.903037999999981],[-84.912888000000009,66.905044999999973],[-84.920546999999999,66.905373000000111],[-84.935225999999886,66.904540999999995],[-84.943061999999941,66.905373000000111],[-84.951050000000009,66.907378999999992],[-84.95788600000003,66.909874000000002],[-84.961730999999986,66.912704000000019],[-84.956389999999942,66.915367000000117],[-84.86233500000003,66.939835000000073],[-84.855164000000002,66.940666000000078],[-84.767775999999969,66.952209000000039],[-84.755279999999971,66.951660000000061],[-84.602218999999991,66.935806000000127],[-84.562209999999993,66.901382000000126],[-84.573897999999986,66.89888000000002],[-84.61082499999992,66.89387499999998],[-84.62332200000003,66.893326000000059],[-84.650283999999999,66.900817999999958],[-84.675827000000027,66.902771000000087],[-84.688323999999909,66.903046000000131],[-84.746384000000035,66.897491000000059],[-84.706389999999999,66.888596000000007],[-84.58555599999994,66.858871000000079],[-84.558334000000002,66.850540000000024],[-84.523330999999985,66.836929000000055],[-84.505843999999968,66.827773999999977],[-84.504729999999995,66.823043999999982],[-84.516113000000018,66.820540999999992],[-84.541381999999999,66.821381000000031],[-84.580565999999976,66.828323000000125],[-84.634170999999981,66.84165999999999],[-84.660278000000005,66.846375000000023],[-84.672501000000011,66.845824999999991],[-84.684432999999956,66.844147000000021],[-84.690551999999968,66.839980999999966],[-84.684432999999956,66.835266000000104],[-84.675551999999925,66.830826000000116],[-84.664444000000003,66.82748400000014],[-84.651107999999965,66.824158000000125],[-84.466949,66.787766000000147],[-84.434433000000013,66.725540000000137],[-84.445266999999888,66.720260999999937],[-84.448607999999922,66.715271000000087],[-84.442489999999964,66.710814999999968],[-84.429442999999935,66.708328000000108],[-84.404174999999952,66.705551000000014],[-84.343063000000029,66.699416999999983],[-84.203887999999949,66.691360000000032],[-84.153060999999923,66.685806000000014],[-84.144454999999994,66.681366000000025],[-84.136672999999973,66.662201000000039],[-84.138061999999877,66.657210999999961],[-84.142501999999979,66.647216999999955],[-84.146117999999944,66.642212000000086],[-84.180556999999965,66.606644000000074],[-84.186385999999914,66.601379000000009],[-84.128325999999959,66.554703000000018],[-83.967223999999931,66.473877000000073],[-83.916397000000018,66.446640000000116],[-83.89805599999994,66.432755000000043],[-83.888061999999991,66.423599000000081],[-83.871108999999933,66.394989000000066],[-83.867492999999968,66.380539000000113],[-83.804717999999923,66.307205000000124],[-83.773620999999991,66.289703000000088],[-83.774719000000005,66.275269000000037],[-83.772231999999974,66.265548999999965],[-83.768615999999952,66.260818000000029],[-83.762787000000003,66.256104000000107],[-83.728881999999999,66.23803700000002],[-83.71833799999996,66.233597000000032],[-83.684722999999906,66.215546000000018],[-83.68110699999994,66.210815000000082],[-83.67860399999995,66.201096000000121],[-83.684432999999956,66.196091000000024],[-83.693053999999961,66.190810999999997],[-83.767898999999943,66.168639999999982],[-83.789718999999934,66.163315000000125],[-83.835830999999928,66.154709000000025],[-83.847777999999948,66.153320000000008],[-83.855559999999912,66.155822999999998],[-83.977782999999988,66.199417000000096],[-84.118057000000022,66.25471500000009],[-84.135283999999956,66.26388500000013],[-84.141112999999962,66.268326000000059],[-84.148620999999991,66.277771000000143],[-84.149993999999992,66.282760999999994],[-84.150283999999942,66.292480000000012],[-84.148894999999925,66.297485000000052],[-84.152495999999985,66.302200000000084],[-84.158614999999998,66.306641000000013],[-84.167220999999927,66.31109600000002],[-84.178329000000019,66.315536000000009],[-84.190826000000015,66.318054000000018],[-84.216400000000021,66.321655000000078],[-84.228332999999964,66.3211060000001],[-84.317229999999995,66.299712999999997],[-84.426940999999886,66.363037000000077],[-84.441939999999931,66.372208000000057],[-84.506393000000003,66.402205999999978],[-84.516952999999944,66.404709000000139],[-84.528885000000002,66.40415999999999],[-84.550551999999868,66.394440000000088],[-84.558884000000035,66.389160000000061],[-84.619155999999919,66.349715999999944],[-84.626937999999882,66.343597000000102],[-84.635559000000001,66.334991000000002],[-84.636123999999995,66.328873000000044],[-84.625,66.319152999999972],[-84.527221999999995,66.278595000000109],[-84.424438000000009,66.224701000000096],[-84.407500999999968,66.215546000000018],[-84.401397999999972,66.211105000000089],[-84.389998999999932,66.196930000000009],[-84.386397999999986,66.192199999999957],[-84.37777699999998,66.178040000000067],[-84.372498000000007,66.168319999999994],[-84.374709999999993,66.158600000000092],[-84.448607999999922,66.158600000000092],[-84.46055599999994,66.159149000000014],[-84.473327999999981,66.161377000000016],[-84.483886999999925,66.164703000000031],[-84.509445000000028,66.178314],[-84.641112999999962,66.216094999999996],[-84.869155999999975,66.266662999999937],[-84.881942999999978,66.268051000000071],[-84.90583799999996,66.266937000000098],[-84.927489999999977,66.258881000000031],[-84.943877999999984,66.248322000000144],[-84.954726999999934,66.243866000000025],[-84.96665999999999,66.244431000000077],[-84.979720999999984,66.24664300000012],[-85.00167799999997,66.255264000000068],[-85.131942999999922,66.291931000000034],[-85.178329000000019,66.262207000000046],[-85.190276999999867,66.260544000000095],[-85.202498999999932,66.260818000000029],[-85.214721999999995,66.262207000000046],[-85.227782999999988,66.264434999999992],[-85.252227999999945,66.273041000000092],[-85.269729999999981,66.281937000000028],[-85.301392000000021,66.304703000000075],[-85.306655999999919,66.314148000000102],[-85.339721999999938,66.399154999999951],[-85.345550999999887,66.447754000000089],[-85.346114999999998,66.45748900000001],[-85.341675000000009,66.482208000000128],[-85.343338000000017,66.48692299999999],[-85.351394999999968,66.496093999999971],[-85.457503999999915,66.573883000000137],[-85.466400000000021,66.578323000000012],[-85.479720999999984,66.581375000000094],[-85.491942999999878,66.581940000000145],[-85.55221599999993,66.577774000000034],[-85.575561999999991,66.574707000000103],[-85.598617999999931,66.569442999999978],[-85.710555999999997,66.536101999999971],[-85.845276000000013,66.499419999999986],[-85.857773000000009,66.499709999999993],[-85.868880999999931,66.504166000000112],[-85.875548999999978,66.5086060000001],[-85.888901000000033,66.511932000000002],[-85.995543999999995,66.508041000000105],[-86.007507000000032,66.507216999999969],[-86.078888000000006,66.49693300000007],[-86.103333000000021,66.496643000000063],[-86.128326000000015,66.49803200000008],[-86.141113000000018,66.499419999999986],[-86.256667999999934,66.513321000000133],[-86.283324999999934,66.518599999999935],[-86.578888000000006,66.530272999999966],[-86.580001999999979,66.520538000000101],[-86.587783999999942,66.51527400000009],[-86.599730999999963,66.511108000000036],[-86.611389000000031,66.508331000000112],[-86.622771999999998,66.506652999999972],[-86.635009999999966,66.50610400000005],[-86.65972899999997,66.506377999999984],[-86.672500999999954,66.507767000000001],[-86.685546999999985,66.509720000000073],[-86.698883000000023,66.513046000000145],[-86.726944000000003,66.521103000000096],[-86.738051999999982,66.525269000000037],[-86.75167799999997,66.528320000000008],[-86.764174999999966,66.528595000000053],[-86.775283999999942,66.526093000000003],[-86.780838000000017,66.520828000000108],[-86.781386999999995,66.515823000000069],[-86.777221999999995,66.511108000000036],[-86.743880999999931,66.488586000000112],[-86.701110999999969,66.466659999999933],[-86.662780999999939,66.449417000000039],[-86.639998999999932,66.441085999999927],[-86.633621000000005,66.436371000000122],[-86.641677999999956,66.431931000000077],[-86.678604000000007,66.432755000000043],[-86.730559999999969,66.436920000000043],[-86.756957999999941,66.441360000000088],[-86.783614999999941,66.447479000000101],[-86.796386999999925,66.448593000000074],[-86.807495000000017,66.446091000000024],[-86.811110999999983,66.441925000000083],[-86.809158000000025,66.437195000000088],[-86.804992999999968,66.432480000000055],[-86.651671999999962,66.324158000000011],[-86.638335999999924,66.315262000000075],[-86.612777999999992,66.311646000000053],[-86.49722300000002,66.29942299999999],[-86.396117999999944,66.289703000000088],[-86.30610699999994,66.276382000000126],[-86.142226999999991,66.239699999999971],[-86.076110999999912,66.22387700000013],[-85.927489999999977,66.186370999999951],[-85.913895000000025,66.182205000000067],[-85.901108000000022,66.173035000000027],[-85.897232000000031,66.168319999999994],[-85.977492999999924,66.077773999999977],[-85.975829999999917,66.073044000000095],[-85.973891999999978,66.038879000000009],[-85.974716000000001,66.033875000000023],[-85.979995999999915,66.028594999999996],[-85.990554999999972,66.024155000000121],[-86.077224999999999,65.99581900000004],[-86.121384000000035,65.984421000000054],[-86.217498999999975,65.957489000000123],[-86.22084000000001,65.952209000000039],[-86.231383999999935,65.941925000000026],[-86.239166000000012,65.936646000000053],[-86.249435000000005,65.93193100000002],[-86.326400999999976,65.90498400000007],[-86.348617999999874,65.899719000000005],[-86.360275000000001,65.899155000000064],[-86.420272999999952,65.892487000000074],[-86.472228999999857,65.839980999999966],[-86.496947999999975,65.808029000000033],[-86.49499499999996,65.803314],[-86.486389000000031,65.799149],[-86.464171999999962,65.790543000000071],[-86.455276000000026,65.786102000000142],[-86.453888000000006,65.78137200000009],[-86.451110999999855,65.747208000000057],[-86.454177999999956,65.742203000000018],[-86.530288999999868,65.695525999999916],[-86.716109999999958,65.617477000000065],[-86.819457999999997,65.560532000000023],[-86.829726999999991,65.55581699999999],[-86.84056099999998,65.553314000000057],[-86.852782999999931,65.55442800000003],[-86.865828999999962,65.557480000000112],[-86.878052000000025,65.557754999999929],[-86.888610999999969,65.555251999999996],[-86.953888000000006,65.53915400000011],[-86.972777999999948,65.520263999999997],[-87.017226999999991,65.486923000000047],[-87.024445000000014,65.481659000000036],[-87.035278000000005,65.479156000000046],[-87.05471799999998,65.486649000000114],[-87.067504999999983,65.488875999999948],[-87.077788999999996,65.484985000000052],[-87.087783999999999,65.479431000000091],[-87.095001000000025,65.474152000000117],[-87.110275000000001,65.458602999999982],[-87.118606999999997,65.4433140000001],[-87.119155999999975,65.438309000000061],[-87.11500499999994,65.433594000000028],[-87.101944000000003,65.429703000000131],[-87.111664000000019,65.390274000000034],[-87.351105000000018,65.327209000000096],[-87.361938000000009,65.324432000000002],[-87.372771999999941,65.322769000000051],[-87.395843999999897,65.321380999999974],[-87.430831999999953,65.320831000000112],[-87.833327999999938,65.323883000000023],[-87.869155999999975,65.325272000000041],[-87.893065999999976,65.326660000000118],[-87.941939999999875,65.330826000000059],[-87.96665999999999,65.333054000000004],[-88.004456000000005,65.339157000000114],[-88.030288999999925,65.345260999999994],[-88.070281999999963,65.356093999999928],[-88.09445199999999,65.363312000000121],[-88.212783999999886,65.40277100000003],[-88.221389999999985,65.407211000000075],[-88.234726000000023,65.416091999999992],[-88.243331999999953,65.425262000000032],[-88.245270000000005,65.429977000000065],[-88.25389100000001,65.439148000000046],[-88.31361400000003,65.479156000000046],[-88.333617999999944,65.492477000000008],[-88.548614999999984,65.582764000000111],[-88.55972300000002,65.586929000000112],[-88.573058999999944,65.589706000000035],[-88.58555599999994,65.590820000000008],[-88.633330999999998,65.591094999999996],[-88.645554000000004,65.592208999999968],[-88.658889999999928,65.594986000000063],[-88.68582200000003,65.601929000000098],[-88.829726999999878,65.641372999999987],[-88.828888000000006,65.644150000000081],[-88.756667999999991,65.642761000000064],[-88.62249799999995,65.637207000000103],[-88.49888599999997,65.626923000000033],[-88.513335999999981,65.644440000000088],[-88.779723999999987,65.676085999999941],[-88.949721999999895,65.68664600000011],[-88.962783999999999,65.688583000000108],[-89.000838999999985,65.698593000000017],[-89.09944200000001,65.725266000000033],[-89.124435000000005,65.733322000000101],[-89.133895999999936,65.737487999999985],[-89.140563999999927,65.74192800000003],[-89.14527899999996,65.746368000000018],[-89.147507000000019,65.751388999999961],[-89.147231999999974,65.761107999999979],[-89.149444999999957,65.765823000000012],[-89.156386999999938,65.770264000000111],[-89.174438000000009,65.778594999999996],[-89.379990000000021,65.846375000000023],[-89.525283999999999,65.886932000000002],[-89.597228999999857,65.910812000000021],[-89.664718999999934,65.934982000000048],[-89.671660999999915,65.939423000000147],[-89.70944199999991,65.942200000000014],[-89.967223999999987,65.948593000000017],[-89.991104000000007,65.947478999999987],[-90,65.944359000000134],[-89.964171999999962,65.936919999999986],[-89.939163000000008,65.93609600000002],[-89.926391999999908,65.934143000000063],[-89.89916999999997,65.928589000000045],[-89.87110899999999,65.921097000000145],[-89.834166999999979,65.910263000000043],[-89.799438000000009,65.898331000000098],[-89.740829000000019,65.873306000000071],[-89.731673999999998,65.86914100000007],[-89.726943999999946,65.839980999999966],[-89.729172000000005,65.834717000000012],[-89.736389000000031,65.829162999999994],[-89.746947999999975,65.826385000000016],[-89.76916499999993,65.822495000000004],[-89.793334999999956,65.822495000000004],[-89.818892999999889,65.825546000000031],[-89.832229999999925,65.828323000000125],[-89.843886999999938,65.832214000000022],[-89.89056399999987,65.853043000000014],[-89.902221999999995,65.857208000000014],[-90.048614999999984,65.888321000000019],[-90.073623999999938,65.890273999999977],[-90.085555999999997,65.889159999999947],[-90.119995000000017,65.883880999999974],[-90.162780999999995,65.872207999999944],[-90.207229999999925,65.864426000000037],[-90.241942999999992,65.861374000000069],[-90.265838999999971,65.860535000000141],[-90.315001999999993,65.862198000000035],[-90.404448999999943,65.871093999999971],[-90.418335000000013,65.87414600000011],[-90.427489999999977,65.878036000000066],[-90.432495000000017,65.882751000000098],[-90.425551999999925,65.888321000000019],[-90.393065999999919,65.896102999999982],[-90.357773000000009,65.898041000000092],[-90.333327999999995,65.897217000000126],[-90.272781000000009,65.897491000000059],[-90.225554999999929,65.900542999999971],[-90.215560999999923,65.904434000000037],[-90.213333000000034,65.909424000000115],[-90.213333000000034,65.914428999999984],[-90.220551,65.918868999999972],[-90.234725999999966,65.922485000000052],[-90.258895999999993,65.922485000000052],[-90.293335000000013,65.918593999999985],[-90.360275000000001,65.907760999999994],[-90.418883999999878,65.901093000000003],[-90.574172999999973,65.896652000000074],[-90.596114999999941,65.896652000000074],[-90.708618000000001,65.902480999999909],[-90.733886999999925,65.904160000000104],[-90.850280999999995,65.915267999999912],[-91.068344000000025,65.940262000000075],[-91.316390999999953,65.969986000000119],[-91.328613000000018,65.969986000000119],[-91.340285999999935,65.96887200000009],[-91.429168999999945,65.95109599999995],[-91.444442999999865,65.930817000000047],[-91.362777999999935,65.893599999999992],[-91.353332999999964,65.889434999999992],[-91.341385000000002,65.885818000000029],[-91.328063999999983,65.883880999999974],[-91.189437999999939,65.853043000000014],[-91.06082200000003,65.813309000000061],[-91.046660999999915,65.809417999999994],[-91.020553999999947,65.806091000000094],[-91.008621000000005,65.806091000000094],[-91.004180999999903,65.811371000000122],[-91.013900999999976,65.820540999999992],[-91.05471799999998,65.846649000000127],[-91.108337000000006,65.891373000000101],[-91.123046999999929,65.904709000000082],[-91.125823999999852,65.909714000000122],[-91.121384000000035,65.914993000000095],[-91.099730999999963,65.919982999999945],[-91.088057999999933,65.921097000000145],[-91.063889000000017,65.921097000000145],[-90.990279999999984,65.919982999999945],[-90.976943999999946,65.918045000000006],[-90.948607999999979,65.910812000000021],[-90.921386999999925,65.905258000000003],[-90.90834000000001,65.903595000000109],[-90.741942999999992,65.887772000000041],[-90.692489999999964,65.886108000000036],[-90.531676999999945,65.880539000000056],[-90.078063999999983,65.812485000000095],[-90.013900999999919,65.800262000000032],[-90,65.797400999999923],[-89.986938000000009,65.794708000000071],[-89.960006999999962,65.788879000000065],[-89.932220000000029,65.78137200000009],[-89.744995000000017,65.724700999999982],[-89.720275999999956,65.713042999999971],[-89.660278000000005,65.683318999999983],[-89.653335999999911,65.678863999999976],[-89.428328999999962,65.529434000000037],[-89.308883999999978,65.469437000000084],[-89.146118000000001,65.400543000000084],[-89.065551999999911,65.333054000000004],[-89.054442999999992,65.328873000000101],[-89.044448999999986,65.32777400000009],[-88.771118000000001,65.307754999999986],[-88.733886999999982,65.306090999999981],[-88.710281000000009,65.306090999999981],[-88.698607999999979,65.30693100000002],[-88.676940999999999,65.31053200000008],[-88.606948999999929,65.30693100000002],[-88.490279999999984,65.293320000000051],[-88.389174999999909,65.277205999999921],[-88.364715999999873,65.274994000000049],[-88.215012000000002,65.277205999999921],[-88.133330999999941,65.278320000000122],[-88.109725999999966,65.278046000000018],[-88.096664000000033,65.274994000000049],[-88.061660999999958,65.258881000000031],[-88.021117999999888,65.274704000000042],[-88.011123999999938,65.278320000000122],[-87.978058000000033,65.283599999999979],[-87.943603999999993,65.286102000000085],[-87.731383999999991,65.290267999999969],[-87.673049999999989,65.291366999999923],[-87.602218999999934,65.290542999999957],[-87.357773000000009,65.270827999999995],[-87.21055599999994,65.254165999999998],[-87.075012000000015,65.236648999999943],[-86.957779000000016,65.165817000000004],[-86.944992000000013,65.156936999999971],[-86.936935000000005,65.147766000000047],[-86.933318999999983,65.138046000000145],[-86.967498999999975,65.059417999999994],[-86.970275999999899,65.054428000000087],[-86.977492999999981,65.048874000000126],[-86.997771999999941,65.040816999999947],[-87.040557999999976,65.031097000000045],[-87.110001000000011,64.999145999999996],[-87.430283000000031,64.711928999999998],[-87.521666999999923,64.621094000000085],[-87.571944999999971,64.573607999999979],[-87.579178000000013,64.568054000000018],[-87.586120999999991,64.562759000000142],[-87.595550999999944,64.557205000000124],[-87.698043999999925,64.527206000000092],[-87.764419999999973,64.520904999999914],[-87.786391999999921,64.51998900000001],[-87.797225999999966,64.518051000000071],[-87.807219999999973,64.514434999999992],[-87.855270000000019,64.43942300000009],[-87.855835000000013,64.429428000000144],[-87.863616999999977,64.379700000000014],[-87.8663939999999,64.369705000000124],[-87.983886999999925,64.191086000000041],[-87.990829000000019,64.185805999999957],[-88.113327000000027,64.136108000000036],[-88.12332200000003,64.133605999999986],[-88.285552999999936,64.106369000000029],[-88.551666000000012,64.025543000000084],[-88.553878999999995,64.020538000000045],[-88.674437999999952,63.980269999999962],[-88.684432999999956,63.977486000000056],[-88.736663999999962,63.968323000000055],[-88.759444999999971,63.969437000000028],[-88.993880999999931,63.998604000000114],[-89.077788999999882,64.026093000000117],[-89.110000999999954,64.03804000000008],[-89.127212999999983,64.04664600000001],[-89.150833000000034,64.059417999999994],[-89.182770000000005,64.081375000000037],[-89.198043999999982,64.094711000000018],[-89.202224999999999,64.099426000000051],[-89.208617999999944,64.108871000000079],[-89.210555999999997,64.118317000000047],[-89.210555999999997,64.123306000000014],[-89.212783999999942,64.128036000000066],[-89.22084000000001,64.137207000000046],[-89.244720000000029,64.15498400000007],[-89.251113999999973,64.159424000000115],[-89.260833999999875,64.160538000000088],[-89.284164000000033,64.141937000000041],[-89.286391999999978,64.136658000000068],[-89.182495000000017,64.036652000000004],[-89.096664000000033,63.973877000000016],[-89.061661000000015,63.960823000000119],[-89.051101999999958,63.961936999999921],[-89.040833000000021,63.958602999999925],[-89.023620999999991,63.950272000000041],[-89.028609999999958,63.946098000000006],[-89.039443999999946,63.944991999999957],[-89.050551999999925,63.944991999999957],[-89.246657999999968,63.959717000000126],[-89.254729999999938,63.963051000000121],[-89.321395999999936,63.996658000000025],[-89.396117999999944,64.038589000000002],[-89.507232999999928,64.070540999999992],[-89.551101999999958,64.07748399999997],[-89.55860899999999,64.073883000000137],[-89.56082200000003,64.068878000000041],[-89.56527699999998,64.019149999999968],[-89.563323999999852,64.009430000000066],[-89.554442999999992,64.000274999999988],[-89.548049999999932,63.996101000000124],[-89.530838000000017,63.987770000000069],[-89.517775999999913,63.978874000000133],[-89.489990000000034,63.956657000000064],[-89.485549999999989,63.951934999999992],[-89.483321999999873,63.947211999999979],[-89.485549999999989,63.94221500000009],[-89.49722300000002,63.943046999999979],[-89.521117999999944,63.955826000000059],[-89.527495999999985,63.960274000000027],[-89.577224999999999,63.995544000000052],[-89.585555999999997,64.004439999999988],[-89.589995999999928,64.014160000000061],[-89.594161999999926,64.018600000000106],[-89.637787000000003,64.049423000000104],[-89.644164999999987,64.053864000000033],[-89.699722000000008,64.076385000000016],[-89.712219000000005,64.079437000000098],[-89.719161999999983,64.074707000000103],[-89.726943999999946,64.047484999999938],[-89.785552999999993,64.076935000000049],[-89.818068999999923,64.098602000000085],[-89.822509999999909,64.103317000000118],[-89.822783999999956,64.10803199999998],[-89.820557000000008,64.113312000000008],[-89.80972300000002,64.128860000000032],[-89.802215999999987,64.132476999999994],[-89.780563000000029,64.134430000000123],[-89.757507000000032,64.133605999999986],[-89.746947999999975,64.135544000000095],[-89.738051999999925,64.14027399999992],[-89.735824999999977,64.145263999999997],[-89.75111400000003,64.218048000000124],[-89.75556899999998,64.227478000000019],[-89.760009999999966,64.232208000000071],[-89.773055999999997,64.240814],[-89.784163999999919,64.244705000000067],[-89.794158999999922,64.241928000000144],[-89.801102000000014,64.237487999999928],[-89.805557000000022,64.227203000000031],[-89.803328999999962,64.222487999999998],[-89.803054999999972,64.20277400000009],[-89.81639100000001,64.148041000000092],[-89.823623999999995,64.144440000000031],[-89.845550999999944,64.142761000000007],[-89.879439999999988,64.142487000000074],[-89.892226999999991,64.145538000000101],[-89.909728999999913,64.158599999999922],[-89.922501000000011,64.161377000000016],[-89.967498999999918,64.161377000000016],[-89.986938000000009,64.159714000000122],[-90.124161000000015,64.128586000000098],[-90.118057000000022,64.125259000000142],[-90.104995999999971,64.121368000000075],[-90.05860899999999,64.109710999999947],[-89.950561999999991,64.086929000000055],[-89.946105999999986,64.057480000000055],[-89.904175000000009,64.015823000000012],[-89.866942999999992,63.98971599999993],[-89.841674999999896,63.983879000000002],[-89.831116000000009,63.979988000000105],[-89.824447999999961,63.97554800000006],[-89.820281999999963,63.971099999999922],[-89.813613999999973,63.946938000000046],[-89.813613999999973,63.93721000000005],[-89.815552000000025,63.931938000000116],[-89.821944999999971,63.926384000000098],[-89.828612999999962,63.921104000000014],[-89.838057999999933,63.917212999999947],[-89.938888999999961,63.909713999999951],[-89.951400999999976,63.912491000000045],[-89.989440999999999,63.92193600000013],[-89.998336999999992,63.926102000000014],[-89.995270000000005,63.929161000000022],[-89.974715999999944,63.933052000000089],[-89.964721999999995,63.935822000000087],[-89.955276000000026,63.939712999999983],[-89.948607999999979,63.945267000000001],[-89.946655000000021,63.950546000000145],[-89.946655000000021,63.960274000000027],[-89.946655000000021,63.965271000000087],[-89.94888299999991,63.969986000000119],[-89.955565999999976,63.9741590000001],[-89.968613000000005,63.978043000000127],[-90,63.984043000000042],[-90.18249499999996,64.0086060000001],[-90.194153000000028,64.009430000000066],[-90.249435000000005,64.007492000000127],[-90.271392999999989,64.006377999999927],[-90.279175000000009,64.00360100000006],[-90.275009000000011,63.999161000000015],[-90.262786999999889,63.997214999999926],[-90.227492999999981,63.994438000000059],[-90.214721999999881,63.990829000000019],[-90.196944999999914,63.982491000000095],[-90.113892000000021,63.930824000000086],[-89.975005999999951,63.825829000000056],[-89.966400000000021,63.816939999999988],[-89.964171999999962,63.811935000000119],[-89.964171999999962,63.80221599999993],[-89.966110000000015,63.79222100000004],[-89.96833799999996,63.782211000000132],[-89.972503999999958,63.776657000000114],[-89.981673999999998,63.773048000000131],[-90.057770000000005,63.744438000000059],[-90.089995999999928,63.698874999999987],[-90.148894999999982,63.629158000000075],[-90.156386999999938,63.626656000000025],[-90.205275999999913,63.61221299999994],[-90.236388999999917,63.607216000000051],[-90.258620999999891,63.607216000000051],[-90.429442999999992,63.615829000000019],[-90.461394999999982,63.640549000000078],[-90.468613000000005,63.652309000000002],[-90.488051999999982,63.672493000000088],[-90.501113999999973,63.676383999999985],[-90.611937999999952,63.70249200000012],[-90.623885999999914,63.704162999999994],[-90.634445000000028,63.703049000000021],[-90.64416499999993,63.700272000000098],[-90.701400999999976,63.662209000000075],[-90.699157999999954,63.657494000000042],[-90.686660999999958,63.654709000000139],[-90.677779999999927,63.654433999999981],[-90.655563000000029,63.654709000000139],[-90.623610999999983,63.657767999999976],[-90.613891999999908,63.660545000000013],[-90.60972599999991,63.665825000000098],[-90.610001000000011,63.675827000000083],[-90.602782999999988,63.679436000000067],[-90.590285999999992,63.676658999999972],[-90.55972300000002,63.659714000000008],[-90.555556999999965,63.65526600000004],[-90.553329000000019,63.650543000000084],[-90.541381999999942,63.617210000000057],[-90.541381999999942,63.61221299999994],[-90.545273000000009,63.606941000000006],[-90.551391999999964,63.601387000000045],[-90.56082200000003,63.597487999999998],[-90.571120999999948,63.595543000000021],[-90.733886999999925,63.573883000000023],[-90.828063999999983,63.561661000000072],[-90.84944200000001,63.559714999999983],[-90.930556999999965,63.564156000000082],[-90.942763999999954,63.566666000000112],[-90.978881999999999,63.576103000000046],[-90.989440999999943,63.579994000000113],[-91.035003999999958,63.5991590000001],[-91.137786999999889,63.630821000000026],[-91.158051,63.635551000000078],[-91.188599000000011,63.62943300000012],[-91.198883000000023,63.628601000000003],[-91.210281000000009,63.628326000000015],[-91.233321999999987,63.629990000000021],[-91.375823999999966,63.659157000000107],[-91.399733999999967,63.666664000000083],[-91.406386999999938,63.671104000000071],[-91.406661999999983,63.676102000000071],[-91.402785999999992,63.681381000000044],[-91.393616000000009,63.685265000000072],[-91.371384000000035,63.685546999999985],[-91.34973100000002,63.677772999999945],[-91.336945000000014,63.675270000000012],[-91.329453000000001,63.677772999999945],[-91.333892999999989,63.682495000000017],[-91.34056099999998,63.686652999999978],[-91.34944200000001,63.690826000000129],[-91.362503000000004,63.694435000000112],[-91.411666999999909,63.707214000000022],[-91.529174999999952,63.729987999999992],[-91.540558000000033,63.730820000000051],[-91.551392000000021,63.729713000000118],[-91.560821999999916,63.726653999999996],[-91.569457999999997,63.721930999999984],[-91.575561999999934,63.716385000000116],[-91.584166999999979,63.711380000000077],[-91.595550999999887,63.711380000000077],[-91.910552999999936,63.740546999999992],[-92.06639100000001,63.74193600000001],[-92.136123999999938,63.745544000000109],[-92.148620999999991,63.748047000000099],[-92.175003000000004,63.755271999999991],[-92.186110999999983,63.758888000000013],[-92.434433000000013,63.804993000000024],[-92.482772999999952,63.811935000000119],[-92.471664000000033,63.80832700000002],[-92.437774999999931,63.79222100000004],[-92.428328999999962,63.783051],[-92.425551999999982,63.778603000000032],[-92.422500999999954,63.748878000000104],[-92.415832999999964,63.744713000000104],[-92.406661999999926,63.740546999999992],[-92.395553999999947,63.736938000000009],[-92.382766999999944,63.734161000000086],[-92.348891999999921,63.733879000000059],[-92.306380999999931,63.738602000000014],[-92.263061999999934,63.741379000000109],[-92.251113999999973,63.740546999999992],[-92.148055999999997,63.716934000000094],[-92.103881999999942,63.701660000000004],[-92.101669000000015,63.696938000000102],[-92.105559999999969,63.691658000000018],[-92.204177999999956,63.638046000000088],[-92.252501999999993,63.623878000000047],[-92.262512000000015,63.62193300000007],[-92.385009999999909,63.592491000000109],[-92.48971599999993,63.567215000000033],[-92.493056999999965,63.540832999999964],[-92.480835000000013,63.527214000000072],[-92.429168999999945,63.546944000000053],[-92.336394999999868,63.556938000000059],[-92.279998999999975,63.556099000000131],[-92.20666499999993,63.606102000000078],[-92.202788999999882,63.611381999999935],[-92.193877999999927,63.615273000000002],[-92.165282999999988,63.624435000000119],[-91.971114999999998,63.679993000000138],[-91.830291999999929,63.712212000000022],[-91.820006999999976,63.714157],[-91.809432999999956,63.715271000000143],[-91.776107999999965,63.715828000000045],[-91.763335999999981,63.713325999999995],[-91.695266999999944,63.690544000000045],[-91.670837000000006,63.678047000000049],[-91.617492999999911,63.648880000000133],[-91.613051999999925,63.644440000000145],[-91.611388999999974,63.639160000000061],[-91.61250299999989,63.629158000000075],[-91.618056999999965,63.613608999999997],[-91.617217999999923,63.603882000000056],[-91.607498000000021,63.584991000000002],[-91.600829999999974,63.580551000000014],[-91.39805599999994,63.524994000000049],[-91.274170000000026,63.502495000000124],[-91.133056999999951,63.478043000000014],[-90.945540999999935,63.440269000000114],[-90.854720999999984,63.408600000000092],[-90.915557999999919,63.41054500000007],[-90.932770000000005,63.418602000000078],[-90.945540999999935,63.422493000000145],[-90.956954999999937,63.423325000000034],[-90.96833799999996,63.423050000000046],[-90.975006000000008,63.419441000000006],[-90.972777999999948,63.414711000000011],[-90.957503999999972,63.401382000000069],[-90.942214999999976,63.393051000000014],[-90.931380999999931,63.389160000000118],[-90.918883999999935,63.386383000000023],[-90.816665999999998,63.369156000000032],[-90.741942999999992,63.360825000000091],[-90.690825999999959,63.228324999999984],[-90.627486999999974,63.059433000000013],[-90.649169999999913,63.036385000000109],[-90.739990000000034,62.962212000000136],[-90.775832999999977,62.941933000000006],[-90.785004000000015,62.938041999999939],[-90.794998000000021,62.936104],[-90.825835999999924,62.933052000000089],[-90.847778000000005,62.932770000000005],[-90.870270000000005,62.934433000000126],[-90.929442999999992,62.944435000000112],[-90.940551999999968,62.945267000000001],[-91.017226999999934,62.946380999999974],[-91.038329999999917,62.944153000000028],[-91.048049999999989,62.94221500000009],[-91.173049999999989,62.908600000000035],[-91.18249499999996,62.905823000000112],[-91.190825999999959,62.900825999999995],[-91.196654999999964,62.895271000000093],[-91.200561999999934,62.88999200000012],[-91.199721999999895,62.870270000000062],[-91.207229999999981,62.8597180000001],[-91.213333000000034,62.854164000000083],[-91.356383999999991,62.788605000000018],[-91.366652999999928,62.787498000000085],[-91.440276999999867,62.782768000000033],[-91.46166999999997,62.782494000000099],[-91.579178000000013,62.799995000000081],[-91.840285999999935,62.826385000000073],[-91.990279999999984,62.84693900000002],[-92.087508999999898,62.818886000000077],[-92.214721999999995,62.824715000000083],[-92.223052999999993,62.828880000000083],[-92.236114999999927,62.832214000000079],[-92.339995999999985,62.843605000000025],[-92.361937999999952,62.844154000000003],[-92.382766999999944,62.841660000000047],[-92.392501999999922,62.839713999999958],[-92.402221999999995,62.837493999999992],[-92.420836999999949,62.831383000000073],[-92.438323999999966,62.823607999999979],[-92.455275999999969,62.814712999999983],[-92.459441999999967,62.810272000000055],[-92.458618000000001,62.800270000000069],[-92.455841000000021,62.79583000000008],[-92.451400999999919,62.791107000000068],[-92.333617999999944,62.709991000000116],[-92.232773000000009,62.673049999999989],[-92.188598999999954,62.659156999999993],[-92.178329000000019,62.65638000000007],[-92.067779999999971,62.651657000000057],[-92.034728999999857,62.65026899999998],[-91.971389999999928,62.653320000000008],[-91.948883000000023,62.651932000000102],[-91.925827000000027,62.644440000000145],[-91.908614999999998,62.636383000000023],[-91.882766999999944,62.624161000000015],[-91.880554000000018,62.619438000000059],[-91.883330999999998,62.604438999999957],[-91.885009999999909,62.5991590000001],[-91.890288999999996,62.588600000000042],[-91.941375999999991,62.534996000000035],[-91.948043999999982,62.531380000000013],[-92.053328999999962,62.526657],[-92.153060999999923,62.598045000000127],[-92.163329999999974,62.600829999999974],[-92.186110999999983,62.603324999999984],[-92.196655000000021,62.603049999999996],[-92.266112999999962,62.595268000000033],[-92.275009000000011,62.591377000000136],[-92.271399999999971,62.578049000000135],[-92.275557999999933,62.560272000000111],[-92.325561999999991,62.540833000000021],[-92.365004999999996,62.533332999999914],[-92.384734999999978,62.529990999999995],[-92.396118000000001,62.530823000000112],[-92.430831999999953,62.535827999999981],[-92.468062999999972,62.54444100000012],[-92.539169000000015,62.532493999999986],[-92.606110000000001,62.464996000000042],[-92.617767000000015,62.466660000000047],[-92.710006999999962,62.465827999999931],[-92.726105000000018,62.444153000000142],[-92.729720999999984,62.438599000000124],[-92.731109999999944,62.433601000000124],[-92.730834999999956,62.428604000000064],[-92.724716000000001,62.358604000000014],[-92.714721999999995,62.343880000000013],[-92.665833000000021,62.332771000000093],[-92.628052000000025,62.322220000000016],[-92.606658999999922,62.31471300000004],[-92.598052999999936,62.310821999999973],[-92.585006999999905,62.302216000000044],[-92.584441999999967,62.297493000000088],[-92.585830999999871,62.292220999999984],[-92.601668999999958,62.265549000000078],[-92.610275000000001,62.261382999999967],[-92.603995999999938,62.236324000000138],[-92.573058999999944,62.196098000000006],[-92.568619000000012,62.191657999999961],[-92.561934999999949,62.187492000000077],[-92.536666999999966,62.175551999999982],[-92.486388999999974,62.161377000000073],[-92.478057999999919,62.157493999999986],[-92.47001599999993,62.146614],[-92.477782999999988,62.143883000000017],[-92.48721299999994,62.144157000000121],[-92.592223999999987,62.154990999999995],[-92.603881999999942,62.156379999999956],[-92.625823999999909,62.191657999999961],[-92.64044199999995,62.209098999999924],[-92.638435000000015,62.212273000000039],[-92.638275000000021,62.215103000000056],[-92.639938000000029,62.217770000000087],[-92.700561999999991,62.265549000000078],[-92.741103999999893,62.28694200000001],[-92.747498000000007,62.289993000000038],[-92.845551,62.309433000000013],[-93.075561999999991,62.332214000000022],[-93.12222300000002,62.334991000000116],[-92.904174999999952,62.262215000000083],[-92.892226999999991,62.259720000000073],[-92.866393999999957,62.263054000000068],[-92.839995999999985,62.260276999999974],[-92.828612999999905,62.257217000000082],[-92.780288999999868,62.236938000000123],[-92.765288999999996,62.224434000000088],[-92.764724999999942,62.219437000000028],[-92.790282999999988,62.177489999999921],[-92.795836999999949,62.172768000000019],[-92.800963999999965,62.172905000000014],[-92.840285999999992,62.174438000000009],[-92.851943999999946,62.175827000000027],[-92.862503000000004,62.17943600000001],[-92.954453000000001,62.192764000000011],[-93.06806899999998,62.174995000000081],[-93.076674999999909,62.17193600000013],[-93.110000999999954,62.156654000000117],[-93.114440999999999,62.15415999999999],[-93.119720000000029,62.148330999999985],[-93.126937999999882,62.132492000000013],[-93.124160999999958,62.128044000000045],[-93.119445999999925,62.123604000000057],[-93.081389999999942,62.10443900000007],[-93.069167999999877,62.103607000000011],[-93.059722999999906,62.105826999999977],[-93.037506000000008,62.121658000000139],[-93.028885000000002,62.12471000000005],[-93.019164999999987,62.126099000000067],[-93.008057000000008,62.125549000000035],[-92.940552000000025,62.115547000000049],[-92.933060000000012,62.11360900000011],[-92.930557000000022,62.109160999999972],[-92.931380999999988,62.104164000000083],[-92.936935000000005,62.099159000000043],[-92.968338000000017,62.077217000000132],[-92.991104000000007,62.067772000000105],[-93.140839000000028,62.009720000000129],[-93.237212999999997,62.02693899999997],[-93.246384000000035,62.033333000000027],[-93.277495999999871,62.042770000000132],[-93.302779999999927,62.049438000000123],[-93.325286999999946,62.051384000000041],[-93.411391999999978,62.03138000000007],[-93.413054999999986,62.025551000000064],[-93.39416499999993,62.013610999999969],[-93.385559000000001,62.009995000000117],[-93.373610999999983,62.007500000000107],[-93.361937999999952,62.00610400000005],[-93.342223999999931,62.004997000000117],[-93.318893000000003,61.998047000000099],[-93.244445999999982,61.969437000000028],[-93.235549999999989,61.965545999999961],[-93.222228999999913,61.957496999999989],[-93.218338000000017,61.95249200000012],[-93.217223999999987,61.947769000000108],[-93.281951999999876,61.891380000000083],[-93.299728000000016,61.885826000000066],[-93.309157999999911,61.883606000000043],[-93.330565999999919,61.886383000000137],[-93.442489999999964,61.915268000000026],[-93.461670000000026,61.922493000000088],[-93.616104000000007,61.939986999999974],[-93.600280999999939,61.879158000000075],[-93.61721799999998,61.861938000000123],[-93.556945999999982,61.847771000000137],[-93.435821999999973,61.808883999999978],[-93.282776000000013,61.788887000000102],[-93.248610999999983,61.78472099999999],[-93.237777999999935,61.777214000000072],[-93.242492999999968,61.767493999999999],[-93.25556899999998,61.742493000000138],[-93.356948999999986,61.707214000000022],[-93.449431999999945,61.682213000000047],[-93.542769999999962,61.663321999999994],[-93.594161999999926,61.648048000000074],[-93.654998999999862,61.629158000000132],[-93.856658999999979,61.549164000000133],[-93.984726000000023,61.456100000000106],[-93.985275000000001,61.454163000000051],[-93.968613000000005,61.396660000000054],[-93.932495000000017,61.387214999999969],[-93.921935999999903,61.385269000000108],[-93.911666999999966,61.385826000000009],[-93.906386999999995,61.387497000000053],[-93.895003999999972,61.389160000000004],[-93.884734999999864,61.389717000000076],[-93.868056999999965,61.389160000000004],[-93.857498000000021,61.385551000000135],[-93.820281999999963,61.355826999999977],[-93.817504999999983,61.351386999999932],[-93.819167999999991,61.347214000000008],[-93.839447000000007,61.319443000000092],[-93.84445199999999,61.316101000000003],[-93.858046999999942,61.312767000000008],[-93.932220000000029,61.296661000000029],[-93.940552000000025,61.294998000000078],[-94.057219999999973,61.178329000000076],[-94.14805599999994,61.043610000000058],[-94.226943999999946,60.942764000000068],[-94.349166999999909,60.858603999999957],[-94.353333000000021,60.853607000000068],[-94.391112999999905,60.798882000000049],[-94.415282999999988,60.762215000000026],[-94.415008999999998,60.756660000000124],[-94.451674999999966,60.671104000000128],[-94.505004999999983,60.549995000000138],[-94.509444999999971,60.544159000000093],[-94.563048999999978,60.522217000000012],[-94.575835999999981,60.52027099999998],[-94.611389000000031,60.52777100000003],[-94.67332499999992,60.522490999999945],[-94.671660999999915,60.466103000000032],[-94.629439999999988,60.41832700000009],[-94.626388999999961,60.413605000000018],[-94.614715999999873,60.38999200000012],[-94.613891999999908,60.380547000000035],[-94.615004999999996,60.375266999999951],[-94.620834000000002,60.363883999999985],[-94.681945999999925,60.224158999999929],[-94.673614999999927,60.191101000000117],[-94.704726999999934,60.091933999999981],[-94.707503999999972,60.083603000000096],[-94.711394999999925,60.078330999999991],[-94.714721999999938,60.075272000000041],[-94.728333000000021,60.071380999999974],[-94.746658000000025,60.069992000000127],[-94.752791999999943,60.06860400000005],[-94.766402999999912,60.061378000000104],[-94.771117999999944,60.055549999999982],[-94.803878999999995,60.008330999999998],[-94.803878999999995,60.003609000000097],[-94.800430000000006,59.999565000000132],[-94.819167999999991,59.964714000000129],[-94.821670999999924,59.959160000000111],[-94.822509999999909,59.954162999999994],[-94.820556999999951,59.944434999999999],[-94.803329000000019,59.877768999999944],[-94.803329000000019,59.711104999999975],[-94.819167999999991,59.63638300000008],[-94.788605000000018,59.51527400000009],[-94.735275000000001,59.426384000000098],[-94.680557000000022,59.357215999999994],[-94.715285999999992,59.323326000000066],[-94.770003999999972,59.29833200000013],[-94.775009000000011,59.29332700000009],[-94.781386999999995,59.263611000000026],[-94.782227000000034,59.258331000000112],[-94.789718999999991,59.092216000000064],[-94.681670999999994,58.975822000000107],[-94.679992999999968,58.97137500000008],[-94.676392000000021,58.93443300000007],[-94.597777999999948,58.878326000000072],[-94.586394999999868,58.874992000000077],[-94.486938000000009,58.815269000000058],[-94.482223999999974,58.811104000000057],[-94.477782999999931,58.806656000000089],[-94.474716000000001,58.802216000000044],[-94.457503999999915,58.774162000000047],[-94.453338999999914,58.765274000000034],[-94.452788999999882,58.759720000000016],[-94.453338999999914,58.750549000000092],[-94.448607999999979,58.736382000000106],[-94.446105999999986,58.731658999999979],[-94.43720999999988,58.72304500000007],[-94.421660999999972,58.716385000000059],[-94.410552999999993,58.714157000000114],[-94.361388999999974,58.712769000000037],[-94.343613000000005,58.715546000000074],[-94.326950000000011,58.721656999999993],[-94.291107000000011,58.743606999999997],[-94.279175000000009,58.771103000000039],[-94.228881999999999,58.784996000000092],[-94.234725999999966,58.714714000000015],[-94.252228000000002,58.649994000000049],[-94.285277999999892,58.512496999999996],[-94.287216000000001,58.438041999999996],[-94.289168999999958,58.427773000000116],[-94.291672000000005,58.422218000000044],[-94.296660999999972,58.415825000000098],[-94.326400999999976,58.349159000000043],[-94.348617999999988,58.2866590000001],[-94.351668999999902,58.276656999999943],[-94.363892000000021,58.22387700000013],[-94.363327000000027,58.218880000000013],[-94.360275000000001,58.220543000000134],[-94.3558349999999,58.226097000000095],[-94.259445000000028,58.351386999999988],[-94.231110000000001,58.390549000000021],[-94.228606999999954,58.396103000000039],[-94.226943999999946,58.406380000000013],[-94.231110000000001,58.430824000000143],[-94.238891999999964,58.494155999999975],[-94.24610899999999,58.576385000000016],[-94.24610899999999,58.586654999999951],[-94.245269999999948,58.59165999999999],[-94.242766999999958,58.597214000000008],[-94.143889999999942,58.763610999999912],[-94.113892000000021,58.762215000000083],[-93.995833999999945,58.760826000000066],[-93.949158000000011,58.76249700000011],[-93.843886999999938,58.767769000000044],[-93.798614999999927,58.773604999999918],[-93.728058000000033,58.783882000000119],[-93.709732000000031,58.785827999999981],[-93.673049999999932,58.780823000000112],[-93.575561999999991,58.763885000000016],[-93.475554999999986,58.732491000000039],[-93.350554999999929,58.74582700000002],[-93.343886999999881,58.750832000000059],[-93.327788999999996,58.757217000000082],[-93.319167999999991,58.758606000000043],[-93.236664000000019,58.766936999999984],[-93.216659999999933,58.764160000000061],[-93.196380999999974,58.758331000000055],[-93.155562999999972,58.740273000000002],[-93.152221999999938,58.737770000000012],[-93.141112999999962,58.691933000000006],[-93.139724999999885,58.653876999999966],[-93.126937999999882,58.532494000000042],[-93.126099000000011,58.527771000000087],[-93.118057000000022,58.508888000000013],[-93.095276000000013,58.467209000000082],[-93.035277999999948,58.37082700000002],[-92.964721999999938,58.261108000000036],[-92.93110699999994,58.21166199999999],[-92.868880999999931,58.143050999999957],[-92.811660999999901,58.071663000000058],[-92.803329000000019,58.057213000000104],[-92.799987999999985,58.042221000000097],[-92.805557000000022,58.011940000000038],[-92.805557000000022,58.00638600000002],[-92.80471799999998,57.997490000000084],[-92.795273000000009,57.96888000000007],[-92.753615999999965,57.85083000000003],[-92.724716000000001,57.801383999999985],[-92.672501000000011,57.733047000000056],[-92.621108999999876,57.670547000000113],[-92.450835999999981,57.442490000000134],[-92.446380999999974,57.433051999999918],[-92.418883999999991,57.337493999999992],[-92.418334999999956,57.332497000000103],[-92.418883999999991,57.323326000000122],[-92.427215999999987,57.263053999999954],[-92.430283000000031,57.252220000000079],[-92.441101000000003,57.23054500000012],[-92.549437999999896,57.08554799999996],[-92.563889000000017,57.068885999999964],[-92.576400999999976,57.056938000000116],[-92.695267000000001,56.961662000000047],[-92.708617999999888,56.951660000000118],[-92.715835999999967,56.947487000000137],[-92.723327999999924,56.944435000000055],[-92.73832699999997,56.94110100000006],[-92.771392999999932,56.93804200000011],[-92.837219000000005,56.924438000000009],[-92.868056999999965,56.91415399999994],[-92.877212999999927,56.90915700000005],[-92.876098999999954,56.907494000000099],[-92.868332000000009,56.90665400000006],[-92.850554999999929,56.907211000000132],[-92.831680000000006,56.908599999999979],[-92.790557999999976,56.913879000000122],[-92.756957999999997,56.918602000000135],[-92.731383999999991,56.922492999999974],[-92.691101000000003,56.93360100000001],[-92.660277999999948,56.945266999999944],[-92.652221999999881,56.949158000000011],[-92.61721799999998,56.96888000000007],[-92.610000999999954,56.974709000000075],[-92.589171999999905,56.986382000000106],[-92.552779999999984,57.004714999999976],[-92.514450000000011,57.023604999999918],[-92.492217999999923,57.032493999999986],[-92.475280999999995,57.037498000000141],[-92.443054000000018,57.044715999999994],[-92.40055799999999,57.052216000000044],[-92.376098999999954,57.056381000000044],[-92.253615999999965,57.065544000000045],[-92.235549999999989,57.066101000000117],[-92.226105000000018,57.065544000000045],[-92.217223999999987,57.063049000000035],[-92.212218999999948,57.058043999999995],[-92.218932999999993,57.052779999999984],[-92.337509000000011,56.981377000000066],[-92.344727000000034,56.977485999999999],[-92.352218999999991,56.974159000000043],[-92.368332000000009,56.969711000000075],[-92.385558999999944,56.967209000000025],[-92.394454999999994,56.966933999999981],[-92.418610000000001,56.961937000000091],[-92.432220000000029,56.955826000000002],[-92.46945199999999,56.934989999999971],[-92.466399999999965,56.932495000000131],[-92.375,56.949714999999912],[-92.303054999999972,56.967491000000109],[-92.287215999999944,56.974434000000088],[-92.281113000000005,56.978874000000076],[-92.268616000000009,56.990829000000019],[-92.261947999999961,56.99582700000002],[-92.235275000000001,57.012771999999984],[-92.220276000000013,57.018883000000017],[-92.204453000000001,57.02416199999999],[-92.180282999999974,57.030823000000112],[-92.155272999999909,57.036658999999986],[-92.146666999999979,57.037772999999959],[-92.129165999999941,57.03943600000008],[-92.093062999999972,57.040833000000021],[-92.057769999999891,57.043884000000048],[-92.031677000000002,57.046660999999972],[-91.987503000000004,57.052489999999977],[-91.952224999999999,57.05721299999999],[-91.828888000000006,57.087211999999965],[-91.779998999999975,57.100273000000129],[-91.241104000000007,57.222214000000008],[-91.15583799999996,57.239989999999977],[-91.08944699999995,57.251106000000107],[-91.05471799999998,57.256104000000107],[-91.036391999999978,57.258049000000085],[-91.001677999999913,57.26138300000008],[-90.992767000000015,57.26138300000008],[-90.834166999999923,57.257217000000026],[-90.81527699999998,57.255829000000119],[-90.795546999999999,57.24971800000003],[-90.779175000000009,57.243324000000143],[-90.758895999999993,57.237769999999955],[-90.738051999999925,57.232490999999982],[-90.71945199999999,57.228043000000014],[-90.709441999999967,57.226379000000009],[-90.563323999999909,57.212212000000079],[-90.451110999999969,57.193878000000097],[-90.408614999999998,57.181664000000069],[-90.391678000000013,57.176102000000128],[-90.387786999999946,57.171378999999945],[-90.310821999999973,57.134995000000117],[-90.225554999999929,57.104439000000013],[-90.025009000000011,57.031380000000013],[-90.005004999999983,57.01915699999995],[-90,57.016369000000054],[-89.990554999999972,57.011107999999922],[-89.970276000000013,57.004166000000055],[-89.833068999999966,56.978324999999984],[-89.715285999999992,56.957214000000079],[-89.521392999999932,56.92943600000001],[-89.439163000000008,56.923881999999992],[-89.132941999999957,56.864852999999982],[-89.06806899999998,56.852219000000048],[-89.015288999999939,56.84777100000008],[-88.950287000000003,56.843048000000124],[-88.94261199999994,56.844269000000054],[-88.815001999999993,56.824440000000038],[-88.742767000000015,56.764442000000145],[-88.67193599999996,56.709435000000042],[-88.654723999999931,56.696380999999974],[-88.639998999999989,56.688599000000067],[-88.631377999999984,56.68471500000004],[-88.584166999999923,56.670546999999999],[-88.440552000000025,56.603607000000011],[-88.415008999999998,56.58638000000002],[-88.365829000000019,56.561661000000015],[-88.324172999999973,56.542770000000019],[-88.218886999999995,56.504440000000045],[-88.149444999999957,56.486938000000009],[-88.103057999999976,56.476097000000095],[-88.069732999999928,56.468880000000013],[-88.048889000000031,56.465546000000018],[-88.028885000000002,56.459991000000116],[-88.018616000000009,56.456100000000049],[-87.982772999999952,56.441658000000075],[-87.975554999999929,56.437491999999963],[-87.841110000000015,56.315269000000001],[-87.723891999999978,56.203880000000083],[-87.719161999999926,56.198875000000044],[-87.715011999999945,56.189987000000031],[-87.71556099999998,56.169716000000051],[-87.713897999999972,56.164993000000095],[-87.708053999999947,56.156096999999988],[-87.702788999999996,56.151931999999988],[-87.548614999999927,56.049995000000138],[-87.478881999999999,56.029160000000047],[-87.368880999999988,56.000832000000059],[-87.351943999999889,55.992767000000129],[-87.345276000000013,55.988602000000128],[-87.343613000000005,55.983879000000002],[-87.348343,55.973320000000115],[-87.355270000000019,55.962769000000037],[-87.198333999999988,55.940269000000001],[-87.110001000000011,55.92943600000001],[-87.091675000000009,55.927489999999921],[-87.057220000000029,55.926940999999999],[-87.031676999999945,55.929718000000094],[-86.996947999999975,55.931663999999955],[-86.979445999999939,55.931663999999955],[-86.970000999999968,55.929718000000094],[-86.881942999999922,55.907211000000018],[-86.837783999999999,55.891380000000026],[-86.616942999999992,55.838882000000012],[-86.572783999999956,55.83027600000014],[-86.544448999999986,55.824440000000038],[-86.486663999999962,55.811378000000047],[-86.477782999999931,55.808884000000091],[-86.448607999999979,55.799995000000024],[-86.398620999999991,55.784164000000033],[-86.372771999999998,55.774993999999992],[-86.346114999999998,55.763054000000068],[-86.332779000000016,55.754715000000033],[-86.321944999999971,55.745544000000109],[-86.31527699999998,55.741104000000064],[-86.277221999999995,55.728873999999962],[-86.267776000000026,55.726936000000023],[-85.86721799999998,55.657493999999986],[-85.740829000000019,55.638046000000088],[-85.731673999999998,55.636940000000038],[-85.71444699999995,55.631660000000011],[-85.569457999999941,55.55860100000001],[-85.556655999999975,55.550270000000069],[-85.532227000000034,55.528045999999961],[-85.525833000000034,55.51888299999996],[-85.516662999999994,55.500000000000057],[-85.515015000000005,55.495270000000062],[-85.515288999999996,55.490273000000116],[-85.509170999999981,55.481102000000021],[-85.499435000000005,55.472214000000008],[-85.474166999999909,55.454711999999972],[-85.393340999999964,55.408881999999949],[-85.383620999999948,55.404991000000109],[-85.272232000000031,55.374709999999993],[-85.234726000000023,55.364715999999987],[-85.224716000000001,55.364159000000086],[-85.208617999999944,55.365273000000059],[-85.182219999999973,55.365273000000059],[-85.164444000000003,55.361664000000076],[-85.146118000000001,55.354996000000085],[-85.128875999999991,55.346382000000006],[-85.123885999999857,55.341934000000037],[-85.121933000000013,55.337769000000037],[-85.116652999999928,55.323050999999964],[-85.116394000000014,55.313606000000107],[-85.118331999999953,55.308601000000067],[-85.121933000000013,55.303322000000094],[-85.129165999999998,55.297775000000115],[-85.144164999999987,55.290276000000119],[-85.215285999999935,55.268600000000049],[-85.275283999999999,55.216660000000047],[-85.398055999999997,55.10083000000003],[-85.399993999999936,55.095824999999991],[-85.397506999999962,55.090546000000018],[-85.383620999999948,55.06749700000006],[-85.398055999999997,55.0472180000001],[-85.419448999999986,55.010826000000122],[-85.425003000000004,55.000274999999988],[-85.425003000000004,54.995544000000052],[-85.423889000000031,54.990546999999992],[-85.414443999999946,54.991104000000064],[-85.407500999999968,54.993324000000086],[-85.400283999999942,54.997772000000055],[-85.386123999999938,55.008049000000028],[-85.370543999999938,55.024437000000091],[-85.366942999999992,55.029716000000064],[-85.36250299999989,55.04055000000011],[-85.347778000000005,55.080826000000116],[-85.33555599999994,55.101661999999976],[-85.318344000000025,55.127486999999974],[-85.313048999999978,55.132767000000001],[-85.220275999999956,55.224434000000088],[-85.194153000000028,55.244155999999919],[-85.17971799999998,55.253608999999926],[-85.156113000000005,55.264160000000061],[-85.139998999999989,55.270270999999923],[-85.116652999999928,55.276657000000057],[-85.06806899999998,55.287498000000141],[-85.043883999999878,55.292770000000075],[-85.001952999999958,55.296660999999972],[-84.974715999999944,55.295830000000137],[-84.869445999999982,55.279716000000008],[-84.75140399999998,55.256103999999993],[-84.723617999999931,55.249718000000087],[-84.712783999999942,55.247771999999998],[-84.688048999999921,55.245270000000119],[-84.635559000000001,55.24221799999998],[-84.599166999999909,55.241661000000079],[-84.566390999999953,55.244155999999919],[-84.541381999999999,55.247490000000084],[-84.444716999999855,55.267769000000044],[-84.428878999999995,55.273048000000017],[-84.388610999999969,55.282493999999986],[-84.322783999999956,55.289992999999981],[-84.206954999999937,55.295546999999999],[-84.198607999999979,55.295273000000066],[-84.189437999999996,55.294159000000093],[-84.170837000000006,55.283051000000057],[-84.159438999999963,55.278328000000101],[-84.149170000000026,55.275551000000007],[-84.12222300000002,55.272217000000012],[-84.113892000000021,55.271934999999928],[-84.092223999999987,55.271660000000111],[-84.076110999999969,55.276099999999929],[-84.049987999999928,55.286110000000065],[-84.006393000000003,55.301383999999928],[-83.968886999999881,55.313881000000094],[-83.951675000000023,55.317497000000003],[-83.93249499999996,55.319443000000035],[-83.920273000000009,55.319160000000068],[-83.897506999999905,55.316940000000102],[-83.658386000000007,55.237324000000058],[-83.65439600000002,55.235493000000076],[-83.651732999999922,55.232985999999983],[-83.570281999999963,55.18804200000011],[-83.567229999999938,55.183052000000032],[-83.570007000000032,55.177773000000059],[-83.58555599999994,55.166100000000029],[-83.591674999999896,55.154434000000037],[-83.589721999999938,55.149719000000005],[-83.574447999999961,55.138045999999974],[-83.561935000000005,55.130820999999969],[-83.556655999999919,55.134163000000058],[-83.556655999999919,55.17943600000001],[-83.558608999999933,55.184989999999971],[-83.579505999999867,55.221157000000005],[-83.588057999999933,55.233330000000024],[-83.593886999999938,55.236938000000123],[-83.60082999999986,55.239990000000034],[-83.620833999999945,55.242767000000129],[-83.643889999999999,55.242767000000129],[-83.654448999999943,55.243881000000101],[-83.670837000000006,55.248604000000057],[-83.684432999999956,55.254439999999988],[-83.696105999999986,55.261664999999994],[-83.706116000000009,55.269714000000022],[-83.708892999999989,55.274437000000034],[-83.706116000000009,55.279990999999995],[-83.698607999999979,55.283051000000057],[-83.688888999999961,55.281937000000084],[-83.57417299999986,55.262215000000026],[-83.533324999999934,55.250549000000092],[-83.519454999999937,55.243881000000101],[-83.498885999999914,55.235549999999989],[-83.489440999999943,55.233879000000115],[-83.179717999999866,55.197211999999979],[-83.168609999999944,55.197487000000137],[-83.150283999999942,55.200271999999984],[-83.128051999999968,55.207497000000046],[-83.120270000000005,55.210823000000119],[-83.089721999999938,55.226654000000053],[-83.074447999999961,55.231658999999922],[-83.037505999999951,55.238327000000083],[-83.029174999999952,55.238883999999985],[-83.006392999999946,55.238602000000128],[-82.985001000000011,55.236382000000106],[-82.964721999999995,55.233604000000128],[-82.948607999999865,55.228874000000076],[-82.941665999999941,55.225821999999994],[-82.930556999999965,55.218322999999998],[-82.91332999999986,55.201385000000073],[-82.906113000000005,55.191932999999949],[-82.896956999999986,55.177215999999987],[-82.874435000000005,55.154434000000037],[-82.838333000000034,55.146660000000054],[-82.809998000000007,55.142220000000009],[-82.786117999999988,55.141106000000036],[-82.775283999999942,55.14137999999997],[-82.76556399999987,55.142493999999942],[-82.73971599999993,55.147491000000059],[-82.708618000000001,55.156380000000127],[-82.700835999999981,55.159714000000122],[-82.669723999999974,55.168052999999986],[-82.661117999999931,55.169716000000108],[-82.650283999999886,55.169716000000108],[-82.508346999999901,55.152771000000143],[-82.449432000000002,55.133049000000085],[-82.412506000000008,55.112770000000125],[-82.40972899999997,55.108046999999999],[-82.400833000000034,55.082771000000093],[-82.33555599999994,55.071014000000048],[-82.307495000000017,55.115829000000133],[-82.308043999999995,55.121933000000126],[-82.309432999999899,55.127486999999974],[-82.3125,55.132492000000013],[-82.323623999999995,55.139992000000063],[-82.337218999999948,55.146102999999982],[-82.345276000000013,55.148331000000098],[-82.355559999999969,55.162491000000045],[-82.349990999999875,55.166382000000112],[-82.34056099999998,55.164711000000011],[-82.333618000000001,55.1616590000001],[-82.307769999999948,55.148880000000077],[-82.25418099999996,55.111382000000049],[-82.245833999999945,55.102776000000119],[-82.244995000000017,55.09027100000003],[-82.246947999999861,55.084160000000111],[-82.253341999999975,55.073608000000092],[-82.25778200000002,55.06888600000002],[-82.273620999999935,55.05721299999999],[-82.282227000000034,55.048049999999989],[-82.285277999999948,55.042770000000132],[-82.287216000000001,55.036659000000043],[-82.287216000000001,55.030273000000136],[-82.270844000000011,54.931381000000044],[-82.267226999999991,54.920273000000009],[-82.255279999999914,54.894157000000121],[-82.246947999999861,54.879433000000063],[-82.241378999999938,54.874991999999963],[-82.231948999999986,54.873877999999991],[-82.221114999999998,54.787498000000085],[-82.320846999999958,54.571380999999974],[-82.403885000000002,54.410820000000115],[-82.419158999999979,54.384163000000058],[-82.431670999999938,54.370270000000005],[-82.436935000000005,54.366385999999977],[-82.441101000000003,54.361664000000076],[-82.441665999999941,54.330826000000116],[-82.434158000000025,54.209435000000042],[-82.421660999999972,54.197211999999979],[-82.389998999999989,54.16832700000009],[-82.362777999999878,54.143607999999972],[-82.301392000000021,54.103050000000053],[-82.283889999999985,54.092491000000052],[-82.253341999999975,54.076102999999989],[-82.248046999999929,54.072220000000016],[-82.243880999999931,54.068054000000132],[-82.238327000000027,54.057495000000074],[-82.160278000000005,53.898880000000133],[-82.131942999999978,53.817772000000105],[-82.130553999999961,53.793052999999986],[-82.129715000000033,53.774436999999978],[-82.130553999999961,53.767493999999999],[-82.136672999999917,53.749161000000129],[-82.148894999999982,53.727768000000026],[-82.189986999999917,53.674164000000019],[-82.194152999999915,53.669441000000006],[-82.203063999999927,53.653320000000008],[-82.208344000000011,53.641936999999984],[-82.212783999999999,53.622765000000015],[-82.21665999999999,53.603882000000112],[-82.211944999999957,53.536110000000065],[-82.208618000000001,53.524994000000106],[-82.198883000000023,53.504714999999976],[-82.190552000000025,53.489716000000101],[-82.172500999999954,53.460548000000074],[-82.165558000000033,53.451385000000073],[-82.158614999999998,53.442215000000033],[-82.147781000000009,53.421661000000086],[-82.138061999999991,53.38888500000013],[-82.125823999999966,53.344154000000117],[-82.119445999999982,53.315826000000129],[-82.115829000000019,53.298332000000073],[-82.113891999999908,53.286659000000043],[-82.113891999999908,53.280273000000136],[-82.114715999999873,53.273604999999975],[-82.117766999999958,53.268050999999957],[-82.121932999999956,53.263610999999969],[-82.141387999999949,53.254715000000033],[-82.21055599999994,53.220268000000033],[-82.248336999999935,53.193877999999984],[-82.269454999999937,53.163879000000009],[-82.27555799999999,53.153320000000122],[-82.279448999999943,53.141106000000093],[-82.300277999999935,53.060271999999998],[-82.301392000000021,53.05332199999998],[-82.301666000000012,53.041663999999969],[-82.296660999999972,53.018599999999992],[-82.273894999999982,52.956383000000017],[-82.261397999999986,52.937210000000107],[-82.257506999999976,52.932770000000062],[-82.235824999999977,52.924164000000133],[-82.196380999999974,52.913321999999937],[-82.136123999999995,52.894714000000079],[-82.120543999999995,52.889717000000132],[-82.101669000000015,52.879990000000021],[-82.050551999999982,52.84304800000001],[-82.025833000000034,52.823883000000023],[-82.001113999999973,52.804710000000114],[-81.977782999999931,52.784996000000035],[-81.973617999999931,52.780548000000067],[-81.951401000000033,52.736938000000066],[-81.733611999999994,52.549995000000138],[-81.719161999999983,52.538330000000087],[-81.714172000000019,52.534721000000047],[-81.697494999999947,52.524162000000047],[-81.639175000000023,52.490547000000106],[-81.621384000000035,52.480819999999994],[-81.607497999999964,52.475265999999976],[-81.577224999999999,52.465271000000087],[-81.569457999999941,52.462212000000136],[-81.558043999999938,52.456099999999935],[-81.554168999999888,52.451660000000118],[-81.551391999999964,52.446655000000078],[-81.549987999999985,52.44110100000006],[-81.542496000000028,52.338882000000012],[-81.56138599999997,52.316383000000087],[-81.663054999999986,52.292220999999984],[-81.822509999999909,52.254440000000045],[-81.850829999999917,52.244995000000131],[-81.863051999999982,52.238884000000041],[-81.865829000000019,52.23333000000008],[-81.883620999999948,52.187492000000134],[-81.874160999999901,52.188324000000023],[-81.841949,52.194992000000013],[-81.826950000000011,52.19887499999993],[-81.805557000000022,52.206099999999992],[-81.795546999999999,52.213882000000126],[-81.792495999999971,52.21915400000006],[-81.788605000000018,52.223877000000073],[-81.779448999999943,52.232208000000128],[-81.765015000000005,52.237770000000069],[-81.758346999999958,52.23943300000002],[-81.74888599999997,52.240273000000059],[-81.718886999999881,52.240829000000076],[-81.554992999999854,52.237495000000081],[-81.521392999999932,52.235825000000091],[-81.50167799999997,52.23333000000008],[-81.478881999999942,52.225822000000051],[-81.472778000000005,52.221930999999984],[-81.460006999999962,52.210274000000027],[-81.443603999999937,52.192764000000068],[-81.440552000000025,52.188599000000067],[-81.434432999999956,52.179161000000022],[-81.431670999999994,52.174164000000133],[-81.430557000000022,52.168053000000043],[-81.418335000000013,52.149437000000034],[-81.414443999999946,52.144996999999989],[-81.405838000000017,52.136940000000038],[-81.365279999999984,52.107216000000051],[-81.352782999999988,52.101105000000132],[-81.337783999999999,52.096100000000092],[-81.310546999999985,52.091102999999976],[-81.290832999999964,52.088599999999985],[-81.264724999999999,52.08277099999998],[-81.212509000000011,52.065543999999989],[-81.186110999999869,52.053604000000064],[-81.167496000000028,52.044158999999979],[-81.118057000000022,52.045547000000113],[-80.994445999999925,52.01138300000008],[-80.988327000000027,52.008049000000085],[-80.978333000000021,52.000832000000003],[-80.97444200000001,51.996384000000035],[-80.973052999999936,51.990829000000133],[-80.972778000000005,51.978325000000098],[-80.929992999999968,51.924163999999962],[-80.918609999999944,51.910271000000137],[-80.899993999999936,51.89527099999998],[-80.894729999999981,51.891663000000051],[-80.80972300000002,51.857498000000135],[-80.698607999999979,51.794715999999937],[-80.615279999999927,51.730270000000132],[-80.610275000000001,51.726379000000065],[-80.589171999999962,51.699715000000083],[-80.589171999999962,51.693321000000026],[-80.590285999999878,51.686653000000092],[-80.589995999999928,51.674164000000019],[-80.586120999999878,51.663605000000018],[-80.578887999999949,51.648605000000032],[-80.571395999999993,51.633605999999986],[-80.515015000000005,51.524437000000034],[-80.507506999999976,51.515830999999935],[-80.497771999999998,51.508331000000055],[-80.462218999999891,51.488601999999958],[-80.457229999999925,51.484993000000145],[-80.442489999999964,51.473602000000028],[-80.438889000000017,51.46915400000006],[-80.436385999999857,51.464157000000114],[-80.434998000000007,51.458602999999925],[-80.424438000000009,51.36360899999994],[-80.426392000000021,51.358887000000038],[-80.430557000000022,51.354164000000083],[-80.442489999999964,51.34804500000007],[-80.471664000000033,51.339714000000129],[-80.502791999999943,51.331940000000145],[-80.540558000000033,51.323326000000066],[-80.568619000000012,51.314156000000025],[-80.652495999999985,51.278327999999988],[-80.691939999999988,51.247490000000028],[-80.706954999999937,51.235550000000103],[-80.831680000000006,51.155822999999941],[-80.952498999999989,51.079720000000009],[-80.959441999999967,51.077492000000063],[-80.965285999999992,51.074440000000095],[-80.981110000000001,51.06360600000005],[-80.994994999999903,51.051384000000098],[-81.004181000000017,51.043052999999986],[-81.012222000000008,51.033882000000062],[-81.015015000000005,51.028328000000045],[-81.005279999999914,51.028603000000089],[-80.928054999999915,51.04583000000008],[-80.888335999999924,51.082771000000037],[-80.875274999999988,51.103324999999984],[-80.862212999999883,51.116104000000007],[-80.850280999999995,51.122489999999971],[-80.835280999999952,51.126938000000109],[-80.820557000000008,51.130272000000105],[-80.793610000000001,51.132767000000115],[-80.765014999999948,51.133606000000043],[-80.748046999999985,51.136658000000011],[-80.740829000000019,51.138885000000073],[-80.694442999999978,51.156097000000045],[-80.688599000000011,51.159157000000107],[-80.610000999999954,51.214157],[-80.567779999999971,51.258331000000112],[-80.562774999999988,51.262214999999969],[-80.541381999999999,51.276657000000114],[-80.530563000000029,51.283606999999961],[-80.512512000000015,51.292769999999962],[-80.480285999999865,51.307213000000047],[-80.414444000000003,51.332497000000046],[-80.400283999999886,51.337212000000079],[-80.392226999999991,51.338599999999985],[-80.371658000000025,51.336655000000007],[-80.330291999999986,51.326385000000073],[-80.219727000000034,51.301659000000029],[-80.190551999999968,51.297493000000145],[-80.129989999999907,51.297775000000001],[-80.120270000000005,51.296387000000095],[-80.016952999999944,51.263054000000125],[-79.996383999999921,51.25471500000009],[-79.800277999999992,51.156097000000045],[-79.788054999999929,51.149719000000118],[-79.741104000000007,51.123604000000114],[-79.736389000000031,51.119713000000047],[-79.729171999999949,51.110825000000034],[-79.716515000000015,51.081715000000031],[-79.685103999999967,51.045361000000014],[-79.612777999999992,51.008049000000085],[-79.537612999999908,50.958397000000048],[-79.519729999999981,50.929993000000024],[-79.516113000000018,50.926384000000041],[-79.466109999999958,50.889434999999935],[-79.450561999999877,50.87860100000006],[-79.438599000000011,50.872214999999983],[-79.415008999999941,50.846939000000134],[-79.411391999999978,50.842490999999995],[-79.352782999999931,50.748329000000069],[-79.350280999999939,50.736938000000123],[-79.348052999999993,50.731934000000138],[-79.343612999999891,50.728324999999984],[-79.337509000000011,50.724990999999989],[-79.332229999999981,50.723877000000016],[-79.330001999999922,50.758331000000055],[-79.330001999999922,50.764442000000088],[-79.332229999999981,50.775826000000052],[-79.420836999999949,50.879715000000033],[-79.439986999999917,50.894997000000103],[-79.464721999999995,50.913321999999994],[-79.515015000000005,50.95665699999995],[-79.537353999999993,50.983765000000062],[-79.571121000000005,51.00277699999998],[-79.660004000000015,51.045273000000009],[-79.673049999999876,51.050827000000027],[-79.678054999999915,51.054710000000114],[-79.698333999999932,51.075554000000068],[-79.705276000000026,51.084435000000042],[-79.749435000000005,51.168326999999977],[-79.751952999999958,51.178878999999995],[-79.752227999999889,51.184433000000013],[-79.751113999999973,51.197487000000081],[-79.745543999999995,51.208885000000066],[-79.742492999999968,51.214157],[-79.720551,51.243607000000054],[-79.703887999999949,51.261665000000107],[-79.699431999999945,51.266937000000041],[-79.688888999999961,51.281937000000028],[-79.682495000000017,51.292496000000028],[-79.680556999999908,51.298050000000046],[-79.679442999999992,51.304710000000057],[-79.668609999999944,51.398605000000089],[-79.593886999999938,51.449158000000068],[-79.581679999999949,51.455268999999987],[-79.574721999999895,51.457497000000103],[-79.547103999999877,51.460129000000109],[-79.533614999999941,51.50499700000006],[-79.474166999999966,51.579162999999994],[-79.376389000000017,51.642494000000113],[-79.353881999999999,51.656096999999988],[-79.331680000000006,51.661933999999917],[-79.322234999999978,51.662766000000033],[-79.239715999999987,51.634994999999947],[-79.236114999999927,51.630820999999912],[-79.235000999999954,51.624992000000077],[-79.23721299999994,51.619156000000032],[-79.251952999999958,51.60694100000012],[-79.275283999999999,51.577773999999977],[-79.285277999999948,51.562492000000134],[-79.285277999999948,51.556381000000101],[-79.274719000000005,51.530548000000124],[-79.271118000000001,51.525551000000064],[-79.267226999999934,51.521659999999997],[-79.202498999999989,51.518883000000073],[-79.183318999999983,51.519714000000079],[-79.175277999999935,51.521103000000096],[-79.161117999999931,51.525551000000064],[-79.154998999999975,51.528602999999976],[-79.144454999999937,51.536110000000065],[-79.137512000000015,51.538330000000087],[-79.12748699999986,51.538048000000003],[-79.120270000000005,51.535552999999993],[-79.024445000000014,51.476379000000122],[-79.020553999999947,51.473320000000115],[-79.012221999999952,51.464996000000099],[-79.005004999999926,51.449997000000053],[-78.963332999999977,51.353325000000098],[-78.950286999999946,51.29222100000004],[-78.955276000000026,51.256660000000068],[-78.95944199999991,51.252220000000023],[-78.962783999999942,51.246941000000049],[-78.962783999999942,51.240546999999992],[-78.958344000000011,51.230545000000063],[-78.951401000000033,51.215546000000018],[-78.937209999999936,51.197769000000108],[-78.928878999999938,51.18971300000004],[-78.924164000000019,51.185822000000144],[-78.912215999999944,51.179436000000067],[-78.906113000000005,51.176658999999972],[-78.853332999999964,51.165543000000014],[-78.914718999999934,51.22165700000005],[-78.918335000000013,51.226097000000095],[-78.920546999999942,51.231102000000135],[-78.921660999999915,51.237495000000081],[-78.920273000000009,51.249718000000144],[-78.890563999999927,51.390549000000021],[-78.888335999999981,51.396660000000111],[-78.883057000000008,51.401100000000099],[-78.832229999999981,51.438599000000011],[-78.779175000000009,51.474990999999989],[-78.82028200000002,51.513054000000068],[-78.823897999999986,51.517494000000056],[-78.826110999999969,51.522491000000002],[-78.824448000000018,51.541664000000083],[-78.820846999999958,51.554436000000067],[-78.80860899999999,51.576385000000016],[-78.791672000000005,51.603881999999942],[-78.796386999999925,51.608604000000014],[-78.859160999999972,51.634163000000058],[-78.944153000000028,51.670547000000056],[-79.03472899999997,51.764717000000132],[-79.035552999999993,51.770271000000093],[-79.033324999999877,51.776382000000012],[-79.029174999999952,51.781380000000013],[-79.008346999999958,51.795830000000137],[-78.995834000000002,51.801658999999972],[-78.985824999999977,51.801658999999972],[-78.976104999999905,51.799720999999977],[-78.961394999999868,51.794998000000021],[-78.944442999999865,51.790833000000021],[-78.918059999999969,51.79444100000012],[-78.910827999999981,51.796660999999972],[-78.903609999999958,51.799438000000009],[-78.879989999999964,51.811378000000104],[-78.851944000000003,51.828606000000036],[-78.846389999999985,51.832497000000103],[-78.836945000000014,51.841377000000136],[-78.833618000000001,51.845825000000104],[-78.832229999999981,51.852776000000063],[-78.834441999999967,51.857772999999952],[-78.841674999999952,51.866661000000136],[-78.846389999999985,51.870269999999948],[-78.858611999999937,51.876938000000109],[-78.86361699999992,51.880821000000083],[-78.89555399999989,51.926659000000029],[-78.896392999999932,51.932495000000074],[-78.894164999999987,51.93832400000008],[-78.881942999999922,51.944434999999999],[-78.860274999999888,51.951102999999932],[-78.851944000000003,51.95249200000012],[-78.810546999999929,51.958885000000066],[-78.769454999999994,51.966103000000089],[-78.747771999999998,51.973320000000001],[-78.736664000000019,51.979431000000091],[-78.695830999999998,52.008049000000085],[-78.579452999999944,52.111382000000106],[-78.537505999999951,52.180824000000143],[-78.501113999999973,52.255829000000006],[-78.524445000000014,52.311104000000114],[-78.516953000000001,52.367767000000072],[-78.507232999999985,52.454437000000041],[-78.506957999999997,52.460548000000074],[-78.545273000000009,52.514717000000132],[-78.564712999999983,52.530273000000079],[-78.577224999999999,52.536658999999986],[-78.585555999999997,52.538605000000075],[-78.59584000000001,52.538886999999988],[-78.654448999999943,52.54694400000011],[-78.684433000000013,52.551383999999985],[-78.763335999999981,52.564438000000052],[-78.761123999999938,52.570549000000085],[-78.755568999999923,52.574164999999994],[-78.721114999999998,52.586655000000121],[-78.691939999999931,52.596099999999979],[-78.713333000000034,52.628876000000105],[-78.753066999999874,52.683875999999941],[-78.790833000000021,52.737495000000138],[-78.796950999999979,52.773880000000077],[-78.765015000000005,52.777489000000116],[-78.731948999999986,52.783333000000084],[-78.724715999999944,52.785553000000107],[-78.722503999999901,52.791664000000026],[-78.725554999999986,52.819443000000035],[-78.738327000000027,52.872215000000097],[-78.794448999999986,52.861381999999935],[-78.856109999999887,52.877769000000114],[-78.880829000000006,52.896942000000024],[-78.881942999999922,52.90277100000003],[-78.87860099999989,52.908043000000134],[-78.864715999999987,52.963608000000079],[-78.915833000000021,53.000000000000057],[-78.923049999999932,53.068886000000077],[-78.888061999999934,53.224709000000132],[-78.894454999999994,53.259720000000073],[-78.895844000000011,53.26527400000009],[-78.942490000000021,53.384994999999947],[-78.949722000000008,53.399994000000049],[-78.991721999999925,53.434048000000018],[-78.994720000000029,53.436378000000047],[-79.004554999999925,53.439216999999928],[-79.009551999999928,53.438213000000019],[-79.044723999999974,53.439430000000016],[-79.053054999999972,53.438042000000053],[-79.063323999999966,53.439430000000016],[-79.068068999999923,53.443321000000083],[-79.090285999999992,53.470543000000021],[-79.093062999999972,53.474709000000075],[-79.107773000000009,53.497215000000097],[-79.110275000000001,53.502495000000124],[-79.103606999999954,53.513054000000011],[-79.084166999999979,53.522491000000116],[-79.054442999999935,53.531380000000013],[-79.035552999999993,53.53276800000009],[-79.012787000000003,53.531104999999968],[-79.031386999999995,53.529716000000008],[-79.038054999999986,53.526657],[-79.043334999999956,53.523048000000017],[-79.042495999999915,53.511108000000092],[-79.041381999999999,53.505554000000132],[-79.036391999999978,53.501663000000065],[-79.014838999999938,53.498940000000005],[-79.011002000000019,53.496937000000003],[-79.005675999999937,53.49577000000005],[-79.000678999999934,53.496609000000035],[-78.962783999999942,53.508888000000127],[-78.919158999999979,53.555267000000072],[-78.915833000000021,53.560547000000099],[-78.918335000000013,53.565544000000045],[-78.92193599999996,53.569992000000013],[-78.950561999999991,53.599716000000001],[-79.003341999999918,53.641663000000051],[-79.089721999999938,53.691658000000075],[-79.145003999999972,53.701660000000061],[-79.151397999999915,53.704994000000056],[-79.152221999999995,53.710548000000017],[-79.052490000000034,53.831939999999975],[-79.046951000000035,53.835548000000074],[-79.039444000000003,53.83776899999998],[-79.029723999999987,53.839157000000114],[-79.011123999999995,53.839989000000003],[-78.988891999999908,53.838882000000069],[-78.979995999999971,53.836104999999975],[-78.966109999999901,53.83027600000014],[-78.948333999999932,53.820831000000112],[-78.932770000000005,53.815543999999989],[-78.910827999999981,53.814437999999939],[-78.901397999999972,53.815268999999944],[-78.902221999999938,53.821380999999974],[-78.906386999999938,53.825272000000041],[-78.917769999999962,53.832214000000079],[-78.924164000000019,53.835548000000074],[-78.969727000000034,53.851387000000045],[-78.988891999999908,53.854713000000061],[-79.011948000000018,53.856658999999979],[-79.056655999999919,53.873046999999985],[-79.101104999999961,53.901657000000057],[-79.106110000000001,53.905548000000124],[-79.072509999999852,53.999161000000072],[-79.066956000000005,54.002777000000094],[-79.051102000000014,54.006660000000068],[-79.041381999999999,54.00777400000004],[-79.031676999999945,54.00777400000004],[-79.021392999999989,54.006386000000134],[-79.001098999999954,53.999992000000077],[-78.964950999999928,53.99716200000006],[-78.961623999999972,53.999992000000077],[-78.960280999999952,54.001389000000017],[-78.962783999999942,54.006386000000134],[-78.966659999999933,54.010826000000122],[-78.976669000000015,54.018326000000002],[-78.984160999999972,54.021659999999997],[-79.119445999999982,54.078605999999979],[-79.116393999999957,54.103050000000053],[-79.106383999999935,54.111382000000049],[-79.046386999999982,54.178329000000076],[-79.048889000000031,54.183327000000077],[-79.060546999999985,54.184158000000082],[-79.173324999999977,54.174995000000081],[-79.191665999999998,54.172768000000019],[-79.198043999999868,54.169716000000108],[-79.196944999999971,54.163605000000018],[-79.198333999999988,54.157210999999961],[-79.205840999999907,54.154990999999995],[-79.238051999999982,54.158882000000062],[-79.276397999999915,54.166939000000013],[-79.345276000000013,54.199432000000002],[-79.419998000000021,54.274437000000034],[-79.430557000000022,54.290275999999949],[-79.476669000000015,54.368599000000131],[-79.505004999999926,54.42582700000014],[-79.488051999999925,54.452217000000132],[-79.488051999999925,54.458603000000039],[-79.521392999999989,54.587212000000136],[-79.525283999999886,54.591377000000136],[-79.531677000000002,54.594711000000132],[-79.565552000000025,54.609993000000145],[-79.618880999999931,54.623878000000047],[-79.675551999999925,54.625824000000136],[-79.686110999999983,54.627212999999927],[-79.760833999999988,54.648048000000074],[-79.764449999999954,54.652214000000129],[-79.761123999999995,54.658325000000048],[-79.631667999999934,54.702773999999977],[-79.494155999999975,54.744713000000104],[-79.463622999999984,54.75360900000004],[-79.457229999999925,54.750275000000045],[-79.447494999999947,54.75110600000005],[-79.337783999999942,54.772491000000059],[-79.315826000000015,54.779991000000109],[-79.101104999999961,54.827216999999962],[-78.976669000000015,54.843048000000124],[-78.968886999999995,54.845267999999976],[-78.956664999999987,54.851936000000137],[-78.945540999999935,54.859436000000017],[-78.912505999999894,54.884163000000115],[-78.838608000000022,54.91443600000008],[-78.732773000000009,54.931107000000111],[-78.561110999999926,54.977767999999912],[-78.37388599999997,55.030273000000136],[-78.256118999999899,55.082214000000022],[-78.207672000000002,55.111655999999982],[-78.182220000000029,55.125267000000122],[-78.119445999999982,55.149994000000049],[-77.972778000000005,55.204994000000113],[-77.87249799999995,55.243606999999997],[-77.748610999999983,55.300827000000027],[-77.62222300000002,55.382766999999944],[-77.416655999999989,55.486107000000061],[-77.225829999999974,55.588326000000109],[-77.214721999999995,55.595267999999976],[-77.137221999999895,55.654160000000047],[-77.115279999999927,55.674164000000133],[-77.104720999999984,55.683876000000055],[-77.088332999999921,55.699432000000058],[-77.086120999999935,55.705551000000071],[-77.085555999999997,55.708046000000081],[-77.087783999999942,55.709716999999955],[-77.068343999999968,55.754715000000033],[-77.013061999999877,55.803046999999935],[-76.81138599999997,55.971100000000092],[-76.751953000000015,55.997771999999998],[-76.737503000000004,56.001663000000065],[-76.718886999999995,56.008048999999971],[-76.702498999999932,56.017494000000056],[-76.689162999999894,56.027489000000003],[-76.681945999999982,56.033882000000119],[-76.67721599999993,56.038605000000075],[-76.670836999999892,56.045830000000137],[-76.658050999999944,56.060821999999973],[-76.650833000000034,56.071938000000102],[-76.626662999999951,56.118049999999982],[-76.538329999999974,56.297775000000115],[-76.532227000000034,56.315269000000001],[-76.531112999999948,56.322220000000129],[-76.518889999999999,56.406097000000102],[-76.517501999999979,56.423325000000034],[-76.517501999999979,56.43582200000003],[-76.519164999999987,56.464714000000072],[-76.525832999999977,56.492767000000072],[-76.527221999999995,56.503052000000139],[-76.526397999999915,56.605827000000033],[-76.506957999999941,56.710823000000005],[-76.505004999999983,56.733879000000002],[-76.504455999999948,56.771934999999985],[-76.505568999999923,56.784995999999921],[-76.505279999999914,56.791382000000056],[-76.505568999999923,56.803047000000106],[-76.509445000000028,56.819717000000026],[-76.530838000000017,56.90665400000006],[-76.554442999999992,57.005828999999949],[-76.554717999999923,57.010826000000066],[-76.555832000000009,57.034996000000092],[-76.553329000000019,57.053322000000094],[-76.549164000000019,57.06221000000005],[-76.545272999999952,57.068885999999964],[-76.535552999999993,57.077773999999977],[-76.531112999999948,57.087211999999965],[-76.529175000000009,57.09665700000005],[-76.529723999999874,57.10582700000009],[-76.564437999999996,57.207214000000079],[-76.591384999999946,57.274436999999978],[-76.599990999999932,57.293610000000058],[-76.604445999999882,57.302773000000059],[-76.653060999999923,57.401382000000012],[-76.65834000000001,57.406653999999946],[-76.688048999999978,57.430550000000039],[-76.732223999999917,57.490273000000059],[-76.740829000000019,57.503326000000072],[-76.81138599999997,57.624710000000107],[-76.809433000000013,57.634720000000016],[-76.807770000000005,57.641662999999994],[-76.805557000000022,57.647774000000084],[-76.861937999999952,57.71915400000006],[-76.923049999999989,57.786110000000065],[-77.147231999999974,58.022765999999933],[-77.246658000000025,58.07388300000008],[-77.279723999999987,58.084435000000042],[-77.317504999999983,58.091934000000037],[-77.34944200000001,58.101936000000023],[-77.444442999999978,58.152489000000003],[-77.451110999999969,58.171379000000115],[-77.446655000000021,58.173882000000106],[-77.441100999999946,58.182770000000062],[-77.444152999999972,58.187767000000008],[-77.454453000000001,58.196381000000031],[-77.467223999999987,58.203323000000125],[-77.487777999999935,58.212769000000094],[-77.571670999999981,58.248047000000099],[-77.645843999999954,58.278603000000032],[-77.81527699999998,58.327217000000019],[-77.851944000000003,58.334991000000002],[-77.883895999999993,58.339989000000003],[-77.914443999999946,58.345543000000021],[-77.939163000000008,58.35305000000011],[-77.955276000000026,58.358604000000128],[-78.012512000000015,58.378601000000003],[-78.024445000000014,58.384163000000115],[-78.02806099999998,58.386940000000038],[-78.031386999999938,58.391380000000026],[-78.062682999999993,58.417309000000103],[-78.130553999999961,58.462769000000037],[-78.355559999999969,58.601661999999976],[-78.397231999999917,58.620827000000133],[-78.419998000000021,58.62721300000004],[-78.425277999999992,58.626099000000067],[-78.428329000000019,58.623604000000057],[-78.427779999999984,58.611107000000061],[-78.426101999999958,58.606102000000021],[-78.347778000000005,58.536659000000043],[-78.389724999999885,58.544716000000051],[-78.549163999999905,58.603881999999999],[-78.563889000000017,58.609993000000088],[-78.568618999999956,58.614441000000056],[-78.573897999999929,58.630547000000035],[-78.574722000000008,58.635269000000108],[-78.570006999999976,58.673050000000103],[-78.563889000000017,58.676940999999999],[-78.555831999999953,58.677773000000059],[-78.543883999999991,58.678046999999992],[-78.514724999999942,58.67943600000001],[-78.469727000000034,58.695541000000105],[-78.467223999999987,58.701660000000118],[-78.48832699999997,58.786385000000053],[-78.50556899999998,58.835266000000104],[-78.511672999999917,58.839157],[-78.516402999999968,58.843323000000055],[-78.538605000000018,58.886940000000095],[-78.571395999999879,58.957214000000079],[-78.570557000000008,58.961380000000133],[-78.561935000000005,58.965828000000101],[-78.552215999999987,58.968048000000124],[-78.396392999999932,58.964714000000129],[-78.361663999999962,58.958603000000039],[-78.352492999999924,58.956657000000007],[-78.346389999999985,58.953605999999979],[-78.344451999999876,58.949432000000115],[-78.344726999999978,58.946655000000021],[-78.345276000000013,58.944710000000043],[-78.348342999999943,58.942214999999976],[-78.366394000000014,58.920273000000122],[-78.363892000000021,58.912490999999989],[-78.357773000000009,58.910270999999966],[-78.345839999999953,58.909714000000065],[-78.338333000000034,58.912766000000033],[-78.310821999999973,58.927216000000101],[-78.304717999999923,58.931106999999997],[-78.205565999999976,59.050545000000113],[-78.127486999999974,59.108330000000024],[-78.08666999999997,59.156654000000003],[-78.093886999999995,59.193047000000035],[-78.098617999999988,59.196655000000135],[-78.101943999999946,59.200828999999999],[-78.103881999999999,59.205826000000116],[-78.092772999999909,59.214995999999985],[-77.961120999999935,59.258331000000112],[-77.949721999999952,59.261939999999925],[-77.930283000000031,59.26527399999992],[-77.884445000000028,59.271935000000042],[-77.860000999999954,59.272217000000126],[-77.843613000000005,59.275551000000121],[-77.828887999999949,59.281105000000082],[-77.824448000000018,59.283606999999961],[-77.68499799999995,59.393326000000116],[-77.677215999999987,59.399994000000106],[-77.678328999999962,59.401932000000045],[-77.779175000000009,59.426102000000014],[-77.787216000000001,59.426658999999916],[-77.798049999999989,59.426384000000098],[-77.831389999999942,59.414711000000068],[-77.880279999999914,59.39916199999999],[-77.887512000000015,59.397491000000116],[-77.896956999999986,59.397217000000012],[-77.902221999999995,59.398880000000077],[-77.905838000000017,59.401100000000099],[-77.910277999999948,59.405548000000067],[-77.912506000000008,59.415267999999969],[-77.910552999999879,59.425551999999982],[-77.872771999999998,59.491935999999953],[-77.867492999999911,59.5],[-77.86111499999987,59.503883000000087],[-77.84056099999998,59.513054000000068],[-77.798889000000031,59.524993999999992],[-77.779175000000009,59.52887700000008],[-77.769454999999937,59.529160000000047],[-77.749999999999886,59.532211000000075],[-77.721389999999928,59.539719000000105],[-77.724716000000001,59.593880000000013],[-77.755004999999926,59.628326000000072],[-77.762786999999889,59.631378000000041],[-77.767501999999922,59.634994999999947],[-77.797774999999945,59.670272999999952],[-77.801102000000014,59.675270000000069],[-77.798614999999927,59.679993000000081],[-77.773894999999982,59.709717000000069],[-77.761672999999973,59.709991000000002],[-77.731948999999986,59.70777099999998],[-77.710555999999883,59.704712000000029],[-77.585228000000029,59.66921200000013],[-77.53988599999991,59.653381000000138],[-77.535392999999942,59.651379000000077],[-77.524390999999923,59.644714000000135],[-77.518889999999885,59.639381000000128],[-77.513229000000024,59.630546999999979],[-77.513725000000022,59.620215999999971],[-77.514893000000029,59.614044000000035],[-77.464721999999995,59.587212000000022],[-77.460006999999962,59.582771000000093],[-77.454177999999956,59.579162999999994],[-77.444992000000013,59.576385000000016],[-77.426940999999943,59.571381000000031],[-77.353607000000011,59.563605999999936],[-77.322509999999909,59.562767000000008],[-77.313889000000017,59.564995000000124],[-77.311935000000005,59.566939999999931],[-77.316956000000005,59.56999200000007],[-77.344161999999983,59.576942000000088],[-77.427994000000012,59.619049000000075],[-77.433334000000002,59.620543999999938],[-77.441665999999998,59.624717999999973],[-77.502335000000016,59.678215000000023],[-77.542496000000028,59.747490000000084],[-77.541945999999996,59.750274999999931],[-77.533065999999963,59.754714999999976],[-77.432769999999948,59.784163999999976],[-77.412780999999939,59.787773000000129],[-77.389449999999954,59.788886999999932],[-77.333618000000001,59.78527100000008],[-77.311660999999958,59.785552999999936],[-77.30471799999998,59.787216000000058],[-77.298889000000031,59.789719000000048],[-77.293609999999887,59.793610000000115],[-77.296111999999937,59.801933000000076],[-77.301392000000021,59.811104],[-77.363616999999863,59.890830999999991],[-77.368056999999965,59.894714000000079],[-77.378051999999968,59.901382000000069],[-77.385559000000001,59.904433999999981],[-77.427489999999977,59.914710999999954],[-77.206954999999994,60.042770000000019],[-77.070006999999919,60.064156000000082],[-76.848052999999936,60.099159000000043],[-76.775833000000034,60.131659999999954],[-76.770843999999954,60.136383000000137],[-76.758895999999993,60.159157000000107],[-76.808608999999933,60.159714000000008],[-76.828339000000028,60.157493999999986],[-76.846114999999998,60.152214000000129],[-76.852492999999981,60.148330999999985],[-76.857772999999952,60.143883000000017],[-76.860549999999932,60.137771999999984],[-76.857498000000021,60.132767000000115],[-76.854172000000005,60.121658000000025],[-76.85943599999996,60.116936000000123],[-76.866942999999992,60.113883999999985],[-76.889724999999999,60.112495000000024],[-76.924437999999896,60.111664000000019],[-76.950561999999934,60.112213000000111],[-76.962783999999999,60.113608999999997],[-77.00389100000001,60.121933000000013],[-77.031386999999881,60.129714999999976],[-77.055556999999965,60.138602999999989],[-77.074172999999973,60.142769000000044],[-77.111938000000009,60.146942000000024],[-77.173888999999974,60.150268999999923],[-77.187499999999943,60.150826000000052],[-77.199996999999939,60.150826000000052],[-77.199722000000008,60.145270999999923],[-77.194716999999969,60.129158000000075],[-77.232498000000021,60.053879000000109],[-77.272781000000009,60.039993000000095],[-77.315825999999959,60.030548000000067],[-77.519164999999987,60.044159000000036],[-77.540282999999988,60.048050000000103],[-77.557219999999973,60.052773000000059],[-77.592223999999987,60.064156000000082],[-77.600280999999939,60.108604000000128],[-77.595275999999899,60.112495000000024],[-77.581680000000006,60.118881000000101],[-77.558043999999938,60.126656000000025],[-77.549164000000019,60.129158000000075],[-77.496947999999918,60.156097000000045],[-77.470276000000013,60.213325999999995],[-77.473617999999931,60.216934000000094],[-77.602782999999931,60.329994000000056],[-77.639724999999942,60.362213000000054],[-77.647506999999905,60.365273000000116],[-77.658339999999953,60.368050000000039],[-77.683060000000012,60.367767000000072],[-77.692489999999964,60.369438000000116],[-77.708344000000011,60.375824000000023],[-77.743606999999997,60.393326000000059],[-77.747222999999963,60.396942000000138],[-77.747756999999922,60.408134000000132],[-77.740829000000019,60.423607000000004],[-77.736937999999952,60.428879000000109],[-77.71945199999999,60.447211999999979],[-77.691939999999931,60.466660000000104],[-77.567504999999926,60.529716000000008],[-77.479995999999915,60.54055000000011],[-77.430832000000009,60.540275999999949],[-77.419723999999917,60.541107000000011],[-77.413329999999974,60.544159000000093],[-77.436385999999914,60.554436000000067],[-77.464447000000007,60.561935000000062],[-77.486114999999927,60.56638300000003],[-77.521666999999979,60.570274000000097],[-77.549438000000009,60.571381000000031],[-77.573623999999938,60.570549000000085],[-77.598617999999931,60.563606000000107],[-77.631942999999978,60.551933000000076],[-77.640563999999983,60.550270000000012],[-77.65055799999999,60.548882000000049],[-77.670273000000009,60.549721000000034],[-77.680831999999953,60.552216000000044],[-77.704453000000001,60.561661000000129],[-77.787216000000001,60.59665700000005],[-77.829453000000001,60.633605999999929],[-77.833892999999932,60.639434999999992],[-77.831679999999949,60.644714000000135],[-77.821670999999867,60.651931999999931],[-77.775832999999977,60.671104000000128],[-77.722504000000015,60.69193300000012],[-77.716399999999965,60.694434999999999],[-77.610001000000011,60.755554000000075],[-77.515839000000028,60.830551000000014],[-77.512512000000015,60.833602999999925],[-77.511672999999973,60.83638000000002],[-77.53195199999999,60.835266000000047],[-77.571670999999981,60.828330999999991],[-77.708054000000004,60.795547000000113],[-77.856383999999935,60.764442000000088],[-77.920546999999999,60.791382000000112],[-77.903885000000002,60.812492000000077],[-77.889998999999989,60.818886000000134],[-77.883330999999941,60.823325999999952],[-77.887222000000008,60.825829000000113],[-77.896392999999875,60.828049000000135],[-77.909163999999976,60.82888000000014],[-77.975280999999939,60.822769000000051],[-78.078612999999905,60.806099000000131],[-78.116942999999992,60.798050000000103],[-78.125823999999966,60.795547000000113],[-78.172500999999954,60.787216000000058],[-78.17971799999998,60.786942000000124],[-78.18638599999997,60.788047999999947],[-78.190552000000025,60.788887000000102],[-78.192764000000011,60.790833000000021],[-78.171660999999915,60.854713000000061],[-78.15943900000002,60.867210000000057],[-77.954726999999991,61.000831999999946],[-77.925551999999925,61.01888300000013],[-77.889175000000023,61.038048000000117],[-77.873610999999926,61.045547000000056],[-77.858046999999942,61.051101999999958],[-77.853881999999942,61.052215999999987],[-77.846664000000033,61.052490000000091],[-77.701675000000023,61.217491000000109],[-77.724441999999954,61.254439999999988],[-77.739990000000034,61.298607000000061],[-77.746658000000025,61.337494000000106],[-77.761123999999938,61.410271000000023],[-77.678878999999995,61.461104999999975],[-77.620834000000002,61.462493999999992],[-77.56361400000003,61.466660000000047],[-77.560546999999929,61.468047999999953],[-77.542496000000028,61.479430999999977],[-77.543335000000013,61.483047000000056],[-77.548339999999939,61.486107000000118],[-77.613892000000021,61.504166000000055],[-77.596114999999941,61.555824000000143],[-77.572784000000013,61.549995000000138],[-77.517226999999934,61.539719000000048],[-77.478607000000011,61.536385000000053],[-77.475005999999951,61.539161999999976],[-77.474715999999944,61.541664000000026],[-77.480285999999921,61.548882000000049],[-77.581389999999999,61.600548000000117],[-77.589171999999962,61.604439000000013],[-77.616500999999971,61.606327000000078],[-77.627997999999991,61.605995000000121],[-77.667496000000028,61.603049999999996],[-77.690825999999959,61.602218999999991],[-77.702498999999989,61.602776000000063],[-77.710555999999883,61.60582700000009],[-77.744155999999975,61.64027400000009],[-77.816665999999998,61.684989999999914],[-77.884445000000028,61.68582200000003],[-77.898894999999925,61.686378000000047],[-77.931380999999931,61.69193300000012],[-77.975829999999974,61.702774000000034],[-77.982223999999974,61.70665699999995],[-77.992492999999968,61.714714000000129],[-78.00306699999993,61.728325000000098],[-78.006119000000012,61.733046999999999],[-78.011947999999961,61.748604000000057],[-78.074447999999904,61.917213000000004],[-78.077498999999989,61.940544000000045],[-78.081389999999999,61.951103000000103],[-78.091675000000009,61.965271000000143],[-78.110001000000011,61.984161000000086],[-78.120269999999948,61.99193600000001],[-78.137787000000003,62.009163000000001],[-78.141387999999949,62.020546000000024],[-78.143616000000009,62.03138000000007],[-78.15943900000002,62.149994000000049],[-78.161666999999966,62.169159000000036],[-78.157776000000013,62.267494000000056],[-78.15583799999996,62.278328000000101],[-78.149733999999967,62.287216000000114],[-78.103058000000033,62.337494000000049],[-78.085007000000019,62.353325000000041],[-78.023894999999982,62.393326000000059],[-78.016402999999968,62.39388300000013],[-78.008056999999894,62.390549000000135],[-77.996657999999968,62.388046000000145],[-77.983063000000016,62.388329000000113],[-77.96305799999999,62.392768999999987],[-77.711394999999925,62.468048000000124],[-77.687209999999993,62.476654000000053],[-77.555556999999965,62.536110000000008],[-77.535278000000005,62.54694400000011],[-77.508347000000015,62.561661000000072],[-77.354996000000028,62.558044000000109],[-77.073623999999938,62.534163999999976],[-76.92582699999997,62.526382000000012],[-76.756957999999997,62.506943000000092],[-76.746947999999975,62.504997000000003],[-76.655562999999972,62.469986000000063],[-76.498610999999869,62.44110100000006],[-76.401947000000007,62.427490000000091],[-76.317779999999914,62.412209000000132],[-76.143065999999919,62.379158000000018],[-75.709732000000031,62.296387000000038],[-75.719214999999963,62.242493000000024],[-75.739562999999919,62.236160000000041],[-75.819884999999999,62.205657999999971],[-75.878875999999991,62.168602000000135],[-75.891113000000018,62.161933999999974],[-75.895003999999915,62.158599999999979],[-75.890839000000028,62.156937000000084],[-75.835830999999985,62.158043000000077],[-75.826949999999954,62.158882000000062],[-75.772399999999948,62.177215999999987],[-75.770720999999924,62.180049999999994],[-75.765052999999909,62.184718999999973],[-75.760887000000025,62.187050000000113],[-75.756057999999882,62.188713000000007],[-75.705062999999996,62.203216999999995],[-75.656882999999993,62.216544999999996],[-75.579177999999899,62.242218000000037],[-75.573897999999929,62.244155999999975],[-75.556945999999925,62.252777000000037],[-75.552779999999927,62.256660000000011],[-75.550277999999935,62.260826000000066],[-75.539443999999889,62.268326000000002],[-75.493606999999997,62.293326999999977],[-75.486937999999952,62.296387000000038],[-75.478881999999999,62.298607000000061],[-75.472777999999948,62.299438000000066],[-75.402221999999938,62.306381000000044],[-75.356383999999991,62.310546999999985],[-75.321945000000028,62.311104000000057],[-75.307495000000017,62.310271999999941],[-75.184432999999956,62.292220999999984],[-75.015563999999983,62.264999000000046],[-75,62.262245000000064],[-74.938323999999909,62.250274999999988],[-74.918610000000001,62.245544000000052],[-74.89805599999994,62.240273000000002],[-74.889998999999989,62.237495000000024],[-74.882216999999912,62.233604000000128],[-74.873885999999857,62.226097000000038],[-74.767226999999878,62.161102000000085],[-74.700835999999867,62.131104000000107],[-74.693054000000018,62.127769000000058],[-74.668883999999991,62.119156000000089],[-74.620833999999888,62.107215999999994],[-74.598052999999936,62.104164000000083],[-74.571670999999981,62.10305000000011],[-74.556380999999988,62.104713000000004],[-74.553054999999972,62.106102000000021],[-74.553878999999995,62.108046999999999],[-74.558608999999876,62.111938000000066],[-74.618880999999931,62.132492000000013],[-74.662216000000001,62.146660000000054],[-74.686110999999983,62.155823000000055],[-74.700287000000003,62.16276600000009],[-74.75111400000003,62.19110100000006],[-74.758895999999993,62.199158000000068],[-74.759734999999921,62.20138500000013],[-74.759734999999921,62.20638300000013],[-74.756393000000003,62.212212000000136],[-74.725829999999917,62.244995000000131],[-74.717498999999918,62.247771999999998],[-74.700287000000003,62.250832000000059],[-74.678328999999962,62.253608999999983],[-74.645844000000011,62.253608999999983],[-74.579453000000001,62.251938000000109],[-74.525833000000034,62.246940999999993],[-74.473617999999931,62.24332400000003],[-74.461394999999982,62.243880999999931],[-74.428878999999938,62.247771999999998],[-74.410004000000015,62.251389000000131],[-74.383895999999936,62.2586060000001],[-74.141677999999956,62.326660000000004],[-73.981383999999991,62.377769000000001],[-73.97444200000001,62.386108000000036],[-73.969727000000034,62.390830999999991],[-73.94027699999998,62.412209000000132],[-73.888901000000033,62.440543999999932],[-73.83805799999999,62.457497000000046],[-73.688048999999978,62.479988000000048],[-73.678878999999995,62.479988000000048],[-73.65972899999997,62.475265999999976],[-73.648345999999947,62.468322999999998],[-73.642501999999922,62.463608000000136],[-73.502791999999999,62.386658000000068],[-73.369995000000017,62.363609000000054],[-73.227218999999877,62.318054000000075],[-73.211394999999925,62.312767000000008],[-73.206664999999987,62.308884000000035],[-73.204178000000013,62.303878999999995],[-73.202788999999996,62.298882000000106],[-73.207229999999925,62.285828000000038],[-73.210280999999952,62.281936999999971],[-73.210830999999985,62.275826000000052],[-73.209732000000031,62.270828000000051],[-73.204178000000013,62.261382999999967],[-73.191939999999875,62.253608999999983],[-73.178054999999972,62.246101000000124],[-73.131942999999978,62.225266000000033],[-73.070006999999976,62.197487000000024],[-72.899445000000014,62.138328999999999],[-72.723891999999921,62.142220000000066],[-72.626663000000008,62.115547000000049],[-72.61721799999998,62.108604000000071],[-72.596114999999884,62.049164000000019],[-72.618713000000014,61.974212999999963],[-72.619888000000003,61.970878999999968],[-72.665717999999913,61.928382999999997],[-72.689986999999917,61.891936999999984],[-72.748610999999983,61.856384000000105],[-72.724716000000001,61.845267999999976],[-72.612503000000004,61.804993000000081],[-72.602782999999931,61.804160999999965],[-72.596114999999884,61.805549999999982],[-72.591674999999952,61.809989999999971],[-72.587783999999886,61.82027400000004],[-72.622771999999941,61.861382000000106],[-72.628875999999991,61.873047000000042],[-72.609557999999993,61.88771400000013],[-72.610893000000033,61.893714999999986],[-72.611397000000011,61.900047000000086],[-72.610222000000022,61.905380000000093],[-72.607551999999998,61.910049000000015],[-72.597548999999958,61.920211999999992],[-72.593886999999995,61.92321400000003],[-72.587226999999984,61.924376999999993],[-72.581222999999966,61.923378000000127],[-72.519729999999925,61.920546999999999],[-72.448607999999979,61.901382000000012],[-72.396666999999923,61.889435000000049],[-72.386948000000018,61.887771999999984],[-72.345551,61.884437999999989],[-72.321945000000028,61.883881000000088],[-72.256957999999997,61.876938000000109],[-72.235001000000011,61.872215000000097],[-72.205840999999964,61.86332700000014],[-72.200835999999924,61.860275000000001],[-72.041381999999999,61.722488000000112],[-72.01005600000002,61.675270000000012],[-72.038054999999986,61.624709999999993],[-72.080565999999976,61.601936000000023],[-72.087783999999999,61.598877000000073],[-72.095839999999953,61.596099999999979],[-72.113892000000021,61.595543000000077],[-72.12388599999997,61.596382000000006],[-72.160004000000015,61.605270000000019],[-72.194153000000028,61.615829000000076],[-72.227492999999981,61.619987000000037],[-72.236663999999962,61.619438000000059],[-72.254456000000005,61.615546999999992],[-72.271118000000001,61.609161000000086],[-72.303328999999906,61.570830999999998],[-72.303878999999938,61.568885999999964],[-72.303328999999906,61.56721500000009],[-72.083618000000001,61.582496999999933],[-72.057220000000029,61.586655000000064],[-71.980285999999978,61.599998000000085],[-71.978333000000021,61.601387000000102],[-71.967772999999966,61.609436000000073],[-71.940825999999959,61.648331000000042],[-71.936660999999958,61.65554800000001],[-71.933608999999933,61.663605000000132],[-71.933060000000012,61.668602000000078],[-71.933884000000035,61.674164000000019],[-71.936660999999958,61.677773000000002],[-71.941375999999991,61.681106999999997],[-71.946884000000011,61.688380999999993],[-71.950385999999867,61.688713000000121],[-71.953888000000006,61.690716000000123],[-71.956557999999916,61.693047000000092],[-71.956885999999884,61.694213999999988],[-71.956054999999935,61.698883000000137],[-71.950546000000031,61.701218000000097],[-71.948883000000023,61.701549999999997],[-71.945221000000004,61.701714000000095],[-71.928878999999995,61.705826000000116],[-71.819457999999941,61.688599000000124],[-71.795273000000009,61.682213000000047],[-71.644729999999925,61.639435000000105],[-71.575011999999901,61.608604000000014],[-71.571670999999867,61.605552999999986],[-71.545546999999999,61.571938000000102],[-71.546111999999937,61.566940000000102],[-71.549437999999896,61.558884000000035],[-71.560271999999941,61.557212999999933],[-71.629714999999976,61.548607000000061],[-71.635009999999966,61.545830000000137],[-71.652221999999995,61.543053000000043],[-71.663054999999929,61.54193900000007],[-71.751113999999973,61.538048000000003],[-71.789444000000003,61.521934999999928],[-71.746384000000035,61.47137500000008],[-71.746947999999975,61.465827999999988],[-71.802779999999984,61.446938000000046],[-71.817504999999983,61.442764000000011],[-71.875548999999921,61.436103999999943],[-71.885558999999944,61.432769999999948],[-71.887787000000003,61.430824000000086],[-71.887511999999958,61.428046999999992],[-71.879439999999988,61.422492999999974],[-71.873046999999929,61.419716000000108],[-71.853333000000021,61.414436000000023],[-71.700561999999991,61.405823000000055],[-71.684722999999963,61.404990999999939],[-71.676101999999958,61.37221500000004],[-71.67193599999996,61.330551000000128],[-71.598891999999978,61.254166000000055],[-71.53083799999996,61.213608000000022],[-71.389998999999989,61.137772000000098],[-71.295836999999892,61.148605000000089],[-71.286666999999909,61.149719000000061],[-71.279175000000009,61.151100000000099],[-71.174712999999997,61.13999200000012],[-71.011397999999986,61.121657999999968],[-70.966948999999943,61.113883999999985],[-70.945830999999941,61.108887000000095],[-70.928329000000019,61.102493000000038],[-70.921936000000017,61.09693900000002],[-70.921386999999982,61.09137700000008],[-70.773330999999985,61.08166499999993],[-70.656386999999995,61.050545000000056],[-70.553054999999972,61.024994000000049],[-70.539718999999991,61.055824000000086],[-70.535278000000005,61.05943300000007],[-70.419998000000021,61.08526599999999],[-70.41361999999998,61.086655000000007],[-70.315551999999911,61.094994000000042],[-70.165008999999998,61.088043000000084],[-70.146117999999888,61.084717000000069],[-70.141387999999949,61.08277099999998],[-70.107223999999917,61.064438000000109],[-70.085830999999985,60.954993999999999],[-70.088057999999876,60.89777400000014],[-69.927490000000034,60.807770000000005],[-69.914444000000003,60.80860100000001],[-69.901107999999965,60.81221000000005],[-69.888061999999934,60.819160000000068],[-69.856383999999991,60.838326000000109],[-69.850554999999986,60.841934000000037],[-69.84973100000002,60.846656999999993],[-69.851395000000025,60.849716000000001],[-69.858886999999982,60.851936000000023],[-69.869445999999925,60.850829999999974],[-69.883620999999948,60.845268000000033],[-69.894729999999925,60.855552999999929],[-69.833327999999995,60.889992000000007],[-69.826110999999969,60.893326000000002],[-69.778885000000002,60.91137700000013],[-69.756957999999941,60.918884000000105],[-69.750838999999928,60.919715999999994],[-69.741104000000007,60.9180530000001],[-69.738051999999925,60.915543000000071],[-69.743332000000009,60.906936999999971],[-69.75140399999998,60.898879999999963],[-69.750564999999995,60.894440000000145],[-69.74610899999999,60.884720000000073],[-69.740554999999972,60.881377999999927],[-69.71055599999994,60.873878000000047],[-69.688599000000011,60.871658000000025],[-69.677215999999987,60.871101000000124],[-69.658614999999998,60.876938000000109],[-69.649993999999879,60.8836060000001],[-69.645843999999954,60.893051000000128],[-69.643889999999942,60.903320000000008],[-69.649169999999913,60.913879000000065],[-69.655563000000029,60.9222180000001],[-69.671660999999915,60.934433000000013],[-69.680831999999953,60.943047000000035],[-69.688599000000011,60.951660000000004],[-69.689437999999882,60.956100000000049],[-69.689712999999983,60.96166199999999],[-69.680557000000022,61.014159999999947],[-69.679442999999935,61.019440000000031],[-69.676665999999955,61.025551000000121],[-69.656661999999926,61.053604000000064],[-69.653884999999946,61.056938000000059],[-69.613051999999925,61.079163000000051],[-69.599990999999989,61.081940000000145],[-69.554168999999945,61.080550999999957],[-69.528609999999958,61.076385000000073],[-69.519729999999925,61.073326000000122],[-69.514450000000011,61.069442999999978],[-69.511397999999929,61.06610100000006],[-69.508347000000015,61.060822000000087],[-69.492767000000015,61.031937000000028],[-69.468886999999995,60.994995000000017],[-69.465285999999935,60.990273000000116],[-69.453613000000018,60.974991000000045],[-69.368057000000022,60.903046000000074],[-69.368606999999997,60.811104],[-69.371933000000013,60.80443600000001],[-69.380554000000018,60.794716000000108],[-69.386672999999973,60.790550000000053],[-69.404448999999943,60.783332999999914],[-69.421386999999925,60.778046000000018],[-69.438598999999954,60.774994000000049],[-69.496657999999968,60.764442000000088],[-69.533065999999963,60.757217000000026],[-69.591675000000009,60.739158999999972],[-69.615829000000019,60.730270000000075],[-69.708618000000001,60.686935000000119],[-69.716109999999958,60.682770000000119],[-69.71055599999994,60.675270000000069],[-69.705001999999979,60.671936000000073],[-69.695830999999998,60.663879000000065],[-69.656386999999995,60.595543000000077],[-69.654174999999952,60.584991000000116],[-69.654174999999952,60.581383000000017],[-69.656951999999933,60.574715000000026],[-69.6875,60.551383999999985],[-69.693603999999937,60.54694400000011],[-69.702224999999885,60.544440999999949],[-69.748610999999983,60.539719000000048],[-69.797774999999945,60.53443900000002],[-69.813888999999904,60.530548000000124],[-69.822234999999978,60.52777100000003],[-69.826110999999969,60.525551000000007],[-69.824448000000018,60.522490999999945],[-69.787506000000008,60.480545000000006],[-69.78443900000002,60.478043000000071],[-69.778335999999967,60.475266000000033],[-69.762222000000008,60.470268000000033],[-69.74888599999997,60.461662000000103],[-69.721664000000033,60.368881000000044],[-69.722504000000015,60.364158999999972],[-69.727782999999988,60.35193600000008],[-69.744445999999982,60.340546000000018],[-69.751953000000015,60.336380000000133],[-69.756667999999934,60.331940000000145],[-69.764724999999999,60.323607999999979],[-69.766952999999944,60.318328999999949],[-69.768065999999862,60.312210000000107],[-69.764724999999999,60.307495000000074],[-69.758895999999993,60.304710000000057],[-69.696380999999974,60.278877000000136],[-69.606383999999991,60.232765000000029],[-69.605269999999905,60.2227630000001],[-69.605835000000013,60.218596999999988],[-69.610001000000011,60.208327999999995],[-69.614166000000012,60.202492000000063],[-69.636977999999999,60.179047000000025],[-69.601943999999946,60.183052000000089],[-69.594161999999983,60.180824000000143],[-69.593886999999995,60.175827000000027],[-69.603606999999954,60.10305000000011],[-69.624709999999993,60.067497000000117],[-69.636948000000018,60.065268999999944],[-69.706664999999987,60.057495000000131],[-69.837218999999948,60.019713999999965],[-69.892226999999934,59.99971800000003],[-70.217223999999931,60.007216999999969],[-70.296393999999907,60.011196000000041],[-70.336120999999935,60.004440000000102],[-70.488051999999868,59.993607000000111],[-70.505004999999926,59.992493000000138],[-70.53472899999997,59.991936000000067],[-70.556945999999925,59.992767000000072],[-70.579726999999934,59.994712999999933],[-70.593062999999972,59.996658000000139],[-70.770844000000011,60.028046000000131],[-70.945830999999941,60.063048999999978],[-70.900283999999999,60.040276000000063],[-70.631103999999993,59.985824999999977],[-70.610549999999932,59.980820000000108],[-70.585007000000019,59.971931000000041],[-70.566955999999948,59.968597000000045],[-70.507232999999985,59.96665999999999],[-70.475829999999974,59.968323000000112],[-70.33805799999999,59.976379000000009],[-70.236938000000009,59.986938000000066],[-70.227218999999934,59.986655999999982],[-70.218613000000005,59.984160999999972],[-70.197495000000004,59.974158999999986],[-70.164718999999991,59.962494000000106],[-70.112503000000004,59.949715000000026],[-70.086120999999991,59.946381000000088],[-70.06138599999997,59.94499200000007],[-70.049987999999871,59.945267000000058],[-70.030837999999903,59.948043999999982],[-69.947768999999994,59.958885000000123],[-69.758895999999993,59.96776600000004],[-69.726944000000003,59.963608000000079],[-69.718886999999938,59.959717000000012],[-69.600554999999872,59.833054000000004],[-69.605559999999912,59.777214000000129],[-69.610001000000011,59.728600000000142],[-69.540833000000021,59.671104000000014],[-69.604995999999971,59.588325999999995],[-69.61332699999997,59.588325999999995],[-69.62777699999998,59.583878000000027],[-69.658889999999985,59.572495000000004],[-69.679442999999935,59.563605999999936],[-69.698043999999982,59.553047000000106],[-69.718613000000005,59.537773000000016],[-69.729720999999927,59.52777100000003],[-69.748336999999935,59.50999500000006],[-69.759445000000028,59.493880999999988],[-69.761123999999938,59.484161000000086],[-69.759445000000028,59.481102000000078],[-69.756393000000003,59.478600000000029],[-69.728333000000021,59.479713000000118],[-69.703888000000006,59.481934000000024],[-69.698607999999922,59.481377000000123],[-69.697495000000004,59.480545000000006],[-69.669448999999929,59.455551000000014],[-69.665832999999964,59.451659999999947],[-69.649445000000014,59.428879000000109],[-69.645279000000016,59.419159000000036],[-69.631667999999877,59.377769000000058],[-69.631377999999927,59.374992000000134],[-69.639998999999875,59.361107000000061],[-69.646392999999989,59.358887000000038],[-69.677779999999927,59.356941000000006],[-69.736664000000019,59.345267999999976],[-69.744155999999975,59.343322999999998],[-69.75778200000002,59.330826000000002],[-69.758347000000015,59.320273999999984],[-69.75111400000003,59.311104000000114],[-69.746947999999861,59.307770000000119],[-69.738601999999958,59.305266999999958],[-69.645003999999915,59.29833200000013],[-69.631103999999993,59.298881999999992],[-69.626663000000008,59.29972100000009],[-69.616393999999957,59.304436000000123],[-69.550277999999992,59.329720000000123],[-69.445830999999998,59.35443900000007],[-69.43582200000003,59.3555530000001],[-69.412506000000008,59.354995999999971],[-69.259445000000028,59.326660000000061],[-69.249724999999955,59.323607999999979],[-69.238327000000027,59.259720000000129],[-69.235001000000011,59.23943300000002],[-69.234725999999966,59.233879000000059],[-69.238051999999925,59.229431000000091],[-69.244445999999982,59.224433999999974],[-69.285827999999924,59.208327999999995],[-69.366394000000014,59.190826000000129],[-69.37388599999997,59.189430000000073],[-69.404998999999975,59.190269000000058],[-69.419158999999979,59.192490000000134],[-69.420272999999952,59.196098000000063],[-69.417496000000028,59.202217000000076],[-69.414443999999946,59.212494000000049],[-69.416655999999989,59.219711000000018],[-69.420837000000006,59.223045000000013],[-69.429717999999923,59.224709000000018],[-69.439437999999996,59.224433999999974],[-69.448607999999979,59.2227630000001],[-69.470276000000013,59.213882000000012],[-69.512222000000008,59.192764000000068],[-69.530562999999972,59.18221299999999],[-69.537505999999894,59.172493000000088],[-69.540282999999988,59.166381999999999],[-69.541107000000011,59.161659000000043],[-69.537215999999944,59.123047000000042],[-69.533065999999963,59.110825000000034],[-69.527785999999992,59.106658999999979],[-69.52055399999989,59.104439000000127],[-69.511397999999929,59.103324999999984],[-69.505568999999923,59.104163999999969],[-69.49499499999996,59.109993000000145],[-69.484436000000017,59.121375999999998],[-69.474716000000001,59.128043999999932],[-69.46305799999999,59.12943300000012],[-69.453887999999949,59.128326000000015],[-69.384170999999981,59.118880999999931],[-69.367492999999911,59.116386000000091],[-69.359725999999966,59.112770000000069],[-69.349166999999909,59.104996000000028],[-69.345276000000013,59.095543000000021],[-69.344161999999983,59.091103000000032],[-69.352782999999988,59.080826000000059],[-69.431945999999982,59.025269000000094],[-69.466110000000015,59.044159000000036],[-69.493331999999953,59.037498000000085],[-69.475280999999939,58.971931000000041],[-69.457503999999915,58.915824999999984],[-69.454726999999991,58.90638000000007],[-69.453887999999949,58.895828000000108],[-69.454177999999956,58.892220000000009],[-69.456389999999999,58.884163000000001],[-69.460006999999962,58.878876000000105],[-69.547500999999897,58.808043999999995],[-69.557495000000017,58.80360399999995],[-69.587783999999942,58.796660999999972],[-69.611114999999984,58.792220999999984],[-69.656386999999995,58.787773000000016],[-69.670836999999949,58.792220999999984],[-69.680831999999953,58.800269999999955],[-69.711944999999957,58.848877000000073],[-69.714721999999938,58.85833000000008],[-69.716109999999958,58.864715999999987],[-69.702788999999996,58.876381000000094],[-69.672226000000023,58.89138000000014],[-69.668610000000001,58.899437000000091],[-69.668334999999956,58.902771000000087],[-69.668334999999956,58.92582700000014],[-69.671660999999915,58.930550000000096],[-69.709441999999967,58.972762999999986],[-69.848342999999943,59.047217999999987],[-69.865279999999927,59.052773000000059],[-69.869155999999919,59.053046999999992],[-69.872771999999998,59.050827000000027],[-69.87388599999997,59.041107000000125],[-69.874160999999958,59.034163999999919],[-69.87388599999997,59.02915999999999],[-69.865554999999972,58.977768000000026],[-69.832779000000016,58.951660000000061],[-69.815826000000015,58.82388300000008],[-69.972777999999892,58.808601000000067],[-70.153610000000015,58.777488999999946],[-70.158889999999985,58.761107999999979],[-70.049728000000016,58.743606999999997],[-69.974716000000001,58.755554000000132],[-69.931106999999997,58.733047000000056],[-69.910552999999936,58.68804200000011],[-69.864440999999999,58.617493000000138],[-69.861663999999962,58.614998000000128],[-69.818892999999946,58.588599999999985],[-69.813048999999921,58.589157000000057],[-69.799437999999952,58.59887700000013],[-69.793335000000013,58.603881999999999],[-69.724441999999954,58.668883999999991],[-69.625,58.743881000000101],[-69.608046999999999,58.754714999999976],[-69.581680000000006,58.765831000000105],[-69.570847000000015,58.769440000000145],[-69.544723999999974,58.773323000000062],[-69.507507000000032,58.774712000000079],[-69.498885999999857,58.778602999999919],[-69.445540999999878,58.808327000000133],[-69.418883999999878,58.825553999999954],[-69.411666999999966,58.830276000000026],[-69.410277999999948,58.83998900000006],[-69.405838000000017,58.850273000000129],[-69.394729999999925,58.856659000000036],[-69.381942999999922,58.861381999999992],[-69.348891999999978,58.871658000000082],[-69.279175000000009,58.888046000000145],[-69.153884999999946,58.899993999999992],[-69.129989999999964,58.901657000000114],[-69.098343,58.899162000000103],[-69.031676999999888,58.893326000000002],[-68.99221799999998,58.883880999999974],[-68.841675000000009,58.891106000000036],[-68.756957999999997,58.912490999999989],[-68.656386999999938,58.900269000000037],[-68.637512000000015,58.896659999999997],[-68.601668999999958,58.885826000000122],[-68.396392999999989,58.816101000000117],[-68.390686000000017,58.811707000000013],[-68.360549999999932,58.781936999999914],[-68.355835000000013,58.774437000000034],[-68.357772999999952,58.764717000000132],[-68.360275000000001,58.759437999999989],[-68.366393999999957,58.687492000000077],[-68.34584000000001,58.626937999999996],[-68.323059000000001,58.58526599999999],[-68.290832999999907,58.541107000000011],[-68.216659999999933,58.490829000000076],[-68.209732000000031,58.462494000000049],[-68.204726999999991,58.453323000000069],[-68.203063999999983,58.441658000000018],[-68.204178000000013,58.436935000000062],[-68.226943999999946,58.376380999999981],[-68.244720000000029,58.33776899999998],[-68.256667999999991,58.323607999999979],[-68.285827999999924,58.294998000000135],[-68.289992999999924,58.28916200000009],[-68.309157999999911,58.253326000000072],[-68.322509999999966,58.22693600000008],[-68.34584000000001,58.169991000000039],[-68.348052999999936,58.159714000000065],[-68.347777999999948,58.15387700000008],[-68.344161999999983,58.141663000000051],[-68.341385000000002,58.133331000000055],[-68.344161999999983,58.127487000000087],[-68.350554999999929,58.12193300000007],[-68.46665999999999,58.045546999999942],[-68.477218999999934,58.039992999999981],[-68.503615999999909,58.031380000000013],[-68.528609999999958,58.029434000000094],[-68.729889000000014,57.99971800000003],[-68.874161000000015,57.969154000000003],[-69.127212999999983,57.899436999999921],[-69.135009999999909,57.896942000000081],[-69.181380999999988,57.878044000000045],[-69.202498999999989,57.868599000000131],[-69.221389999999928,57.858886999999982],[-69.262511999999958,57.833603000000039],[-69.357773000000009,57.774162000000047],[-69.369048999999961,57.765251000000092],[-69.363892000000021,57.765830999999935],[-69.339721999999938,57.773323000000062],[-69.304992999999968,57.786659000000043],[-69.298339999999996,57.789436000000137],[-69.210280999999952,57.829437000000098],[-69.190825999999959,57.840546000000018],[-69.172775000000001,57.851661999999976],[-69.111937999999896,57.885825999999952],[-68.965285999999878,57.933875999999998],[-68.904175000000009,57.949715000000083],[-68.695723999999984,57.987713000000099],[-68.678894000000014,57.989716000000101],[-68.667388999999957,57.990383000000008],[-68.634720000000016,57.988879999999995],[-68.62239099999988,57.989379999999983],[-68.545272999999952,58.000549000000035],[-68.495833999999945,58.013328999999999],[-68.416945999999939,58.034439000000134],[-68.404175000000009,58.039719000000048],[-68.31361400000003,58.103049999999996],[-68.308883999999978,58.108047000000113],[-68.304992999999911,58.113884000000041],[-68.302490000000034,58.119155999999975],[-68.299987999999928,58.127487000000087],[-68.300277999999878,58.132492000000127],[-68.30471799999998,58.146384999999952],[-68.305557000000022,58.149993999999992],[-68.307220000000029,58.164436000000137],[-68.306106999999997,58.181106999999997],[-68.305267000000015,58.186104000000057],[-68.301102000000014,58.198043999999982],[-68.295273000000009,58.209991000000116],[-68.284164000000033,58.219986000000063],[-68.230835000000013,58.26888300000013],[-68.18582200000003,58.360549999999989],[-68.168335000000013,58.414711000000125],[-68.166655999999989,58.424438000000066],[-68.166945999999996,58.435822000000144],[-68.169998000000021,58.446655000000135],[-68.172775000000001,58.454993999999999],[-68.178054999999972,58.469711000000132],[-68.178329000000019,58.480270000000019],[-68.171386999999925,58.489990000000091],[-68.139175000000023,58.521103000000096],[-68.135009999999852,58.524162000000047],[-68.013061999999991,58.573607999999922],[-68.003341999999975,58.576385000000016],[-67.983321999999987,58.573051000000021],[-67.969161999999983,58.565826000000015],[-67.959166999999979,58.558044000000052],[-67.896118000000001,58.500548999999978],[-67.893889999999999,58.496658000000082],[-67.892226999999991,58.491379000000109],[-67.891953000000001,58.483604000000014],[-67.895003999999915,58.476936000000023],[-67.901108000000022,58.467209000000082],[-67.908051,58.458046000000081],[-67.914444000000003,58.453323000000069],[-67.919448999999929,58.445540999999935],[-67.920837000000006,58.439430000000073],[-67.924163999999962,58.41276600000009],[-67.92332499999992,58.403046000000018],[-67.908339999999953,58.360825000000034],[-67.906113000000005,58.356941000000006],[-67.903610000000015,58.353607000000011],[-67.893340999999964,58.346656999999993],[-67.868056999999965,58.332214000000079],[-67.864166000000012,58.328880000000083],[-67.857498000000021,58.320273999999984],[-67.894500999999934,58.287163000000078],[-67.896659999999883,58.281158000000062],[-67.90449499999994,58.26766200000003],[-67.913329999999917,58.25616100000002],[-67.919341999999972,58.250159999999994],[-67.926330999999948,58.245491000000015],[-67.934829999999977,58.241161000000034],[-67.946999000000005,58.235992000000124],[-67.974990999999989,58.220993000000021],[-68.047501000000011,58.170547000000056],[-68.065826000000015,58.159431000000097],[-68.095839999999953,58.138602999999989],[-68.101105000000018,58.133049000000028],[-68.127486999999917,58.084717000000126],[-68.129989999999964,58.07888000000014],[-68.128325999999959,58.073608000000036],[-68.125548999999978,58.071105999999986],[-68.115828999999962,58.071938000000046],[-68.101105000000018,58.077773999999977],[-68.006667999999934,58.131935000000055],[-67.991668999999945,58.146103000000096],[-67.978333000000021,58.163605000000132],[-67.876944999999978,58.243050000000039],[-67.801392000000021,58.296661000000086],[-67.815551999999968,58.308883999999978],[-67.823897999999872,58.317215000000033],[-67.829178000000013,58.326385000000073],[-67.830565999999919,58.331383000000073],[-67.828888000000006,58.349716000000114],[-67.819732999999871,58.393608000000029],[-67.817229999999995,58.40526600000004],[-67.813323999999909,58.416100000000085],[-67.787505999999951,58.464439000000027],[-67.783066000000019,58.468048000000067],[-67.775008999999898,58.471099999999979],[-67.764450000000011,58.470543000000077],[-67.723891999999978,58.458885000000066],[-67.669448999999986,58.431938000000116],[-67.667496000000028,58.427489999999977],[-67.669998000000021,58.42193599999996],[-67.679992999999968,58.41276600000009],[-67.691939999999988,58.404433999999924],[-67.696945000000028,58.399437000000034],[-67.704726999999991,58.389160000000061],[-67.737212999999997,58.326942000000145],[-67.738892000000021,58.320831000000112],[-67.737212999999997,58.315543999999989],[-67.732497999999964,58.311661000000015],[-67.698043999999925,58.284995999999978],[-67.660827999999981,58.264442000000031],[-67.646117999999944,58.253326000000072],[-67.642775999999913,58.248604],[-67.652495999999985,58.214714000000129],[-67.654175000000009,58.210548000000017],[-67.728607000000011,57.976654000000053],[-67.713897999999858,57.923050000000046],[-67.710281000000009,57.97554800000006],[-67.708343999999954,57.982491000000039],[-67.659438999999963,58.110275000000058],[-67.653609999999958,58.122765000000015],[-67.64527899999996,58.134437999999989],[-67.591949,58.200828999999999],[-67.578339000000028,58.21527100000003],[-67.566100999999946,58.223602000000085],[-67.481383999999935,58.273880000000077],[-67.46665999999999,58.279716000000121],[-67.332779000000016,58.31610100000006],[-67.17222599999991,58.376380999999981],[-67.168609999999944,58.378044000000102],[-67.15194699999995,58.376656000000025],[-67.137512000000015,58.373046999999985],[-67.116652999999985,58.363327000000083],[-67.106948999999986,58.3555530000001],[-67.095550999999944,58.348877000000016],[-67.09056099999998,58.35054800000006],[-66.995834000000002,58.439430000000073],[-66.991669000000002,58.445267000000001],[-66.989989999999977,58.45138500000013],[-66.986664000000019,58.458046000000081],[-66.978881999999999,58.468323000000055],[-66.951401000000033,58.498603999999943],[-66.944153000000028,58.501937999999939],[-66.928054999999972,58.501663000000121],[-66.887221999999952,58.485550000000103],[-66.876937999999939,58.479156000000046],[-66.875548999999864,58.473877000000073],[-66.878052000000025,58.468596999999988],[-66.801101999999958,58.473602000000028],[-66.629714999999976,58.50360900000004],[-66.651671999999962,58.542770000000132],[-66.551940999999999,58.71138000000002],[-66.469727000000034,58.81638300000003],[-66.465012000000002,58.819992000000013],[-66.388610999999969,58.850548000000117],[-66.366652999999928,58.848044999999956],[-66.357773000000009,58.846099999999979],[-66.349990999999932,58.843048000000067],[-66.350280999999939,58.837212000000022],[-66.348891999999978,58.831940000000088],[-66.344161999999926,58.827773999999977],[-66.11471599999993,58.699714999999969],[-66.106110000000001,58.684989999999971],[-66.077224999999999,58.654434000000094],[-66.072234999999921,58.650825999999995],[-66.067779999999914,58.648880000000077],[-66.054168999999945,58.646102999999982],[-65.945540999999935,58.616936000000067],[-65.938888999999961,58.613883999999928],[-65.93582200000003,58.609718000000044],[-65.93582200000003,58.604713000000004],[-65.938598999999954,58.594437000000084],[-65.941939999999988,58.582770999999923],[-66.021941999999967,58.486938000000009],[-66.08944699999995,58.365273000000002],[-66.091385000000002,58.358887000000095],[-66.091385000000002,58.354164000000083],[-66.073059000000001,58.327217000000019],[-66.065552000000025,58.320273999999984],[-66.058883999999978,58.320273999999984],[-66.052779999999927,58.34693900000002],[-66.051392000000021,58.352493000000038],[-66.045546999999942,58.363052000000096],[-66.041671999999949,58.368050000000096],[-66.030562999999972,58.376380999999981],[-66.02305599999994,58.379714999999976],[-66.015014999999948,58.381934999999999],[-65.988051999999982,58.384437999999989],[-65.979172000000005,58.386107999999922],[-65.972777999999948,58.388046000000088],[-65.965012000000002,58.391936999999928],[-65.960280999999895,58.396103000000039],[-65.920272999999952,58.44582400000013],[-65.920837000000006,58.449432000000002],[-65.926666000000012,58.456099999999992],[-65.932219999999973,58.458885000000066],[-65.94027699999998,58.461661999999933],[-65.96166999999997,58.464714000000072],[-65.980559999999912,58.470268000000033],[-65.982497999999964,58.4741590000001],[-65.981948999999929,58.480545000000006],[-65.980559999999912,58.483047000000113],[-65.887512000000015,58.577774000000034],[-65.884170999999981,58.580826000000116],[-65.876937999999882,58.581940000000088],[-65.879989999999964,58.62721300000004],[-65.945540999999935,58.665267999999969],[-66.032226999999978,58.710548000000074],[-66.101394999999968,58.771103000000039],[-66.103881999999999,58.773604999999918],[-66.081954999999994,58.80971500000004],[-66.037215999999944,58.85166200000009],[-65.990111999999954,58.852661000000012],[-65.984954999999957,58.851494000000059],[-65.952277999999865,58.836822999999981],[-65.845839999999953,58.826660000000004],[-65.839721999999995,58.827217000000076],[-65.797501000000011,58.847488000000055],[-65.792770000000019,58.853325000000041],[-65.790282999999988,58.857773000000009],[-65.789443999999946,58.861938000000009],[-65.791381999999999,58.865829000000076],[-65.794998000000021,58.86693600000001],[-65.80610699999994,58.866660999999965],[-65.833327999999995,58.864715999999987],[-65.861938000000009,58.863327000000027],[-65.880279999999914,58.864440999999999],[-65.940445000000011,58.879105000000038],[-65.952606000000003,58.88126799999992],[-65.958115000000021,58.882935000000032],[-65.964775000000031,58.887440000000083],[-65.968276999999887,58.893440000000055],[-65.988602000000014,58.903603000000032],[-65.885559000000001,59.001938000000052],[-65.777495999999985,59.029990999999995],[-65.695266999999888,59.043610000000058],[-65.673049999999989,59.046104000000014],[-65.660278000000005,59.044159000000036],[-65.654174999999952,59.042496000000085],[-65.634673999999904,59.033217999999977],[-65.632492000000013,59.031216000000086],[-65.614166000000012,59.019440000000088],[-65.565001999999936,58.993607000000111],[-65.514450000000011,58.984718000000044],[-65.5,58.983330000000137],[-65.49499499999996,58.984718000000044],[-65.493332000000009,58.987495000000138],[-65.49499499999996,58.991936000000067],[-65.509444999999971,59.008330999999998],[-65.516402999999968,59.010826000000009],[-65.533614999999998,59.014717000000076],[-65.543059999999969,59.015549000000021],[-65.553054999999972,59.017493999999999],[-65.56082200000003,59.020827999999995],[-65.571388000000013,59.039108000000112],[-65.572891000000027,59.044106000000113],[-65.570221000000004,59.045772999999997],[-65.568054000000018,59.046776000000023],[-65.532776000000013,59.063881000000094],[-65.518616000000009,59.066666000000112],[-65.510284000000013,59.066940000000045],[-65.506392999999946,59.066382999999973],[-65.492492999999968,59.061378000000104],[-65.454726999999991,59.042221000000097],[-65.340285999999992,59.03833000000003],[-65.330565999999976,59.038048000000117],[-65.324721999999952,59.038887000000102],[-65.317504999999983,59.041382000000112],[-65.319732999999985,59.047217999999987],[-65.333618000000001,59.059990000000028],[-65.344726999999978,59.064712999999983],[-65.354171999999949,59.067497000000117],[-65.533553999999924,59.077663000000143],[-65.53687999999994,59.074665000000095],[-65.546721999999988,59.071831000000088],[-65.564383999999961,59.070163999999977],[-65.577056999999968,59.069996000000117],[-65.58406100000002,59.070999000000143],[-65.586563000000012,59.072159000000056],[-65.651947000000007,59.079163000000108],[-65.715011999999945,59.148331000000042],[-65.718062999999972,59.153046000000074],[-65.740829000000019,59.214714000000072],[-65.742492999999911,59.219437000000084],[-65.743056999999965,59.228043000000014],[-65.744995000000017,59.259720000000129],[-65.744719999999973,59.263054000000125],[-65.743056999999965,59.265830999999991],[-65.731948999999986,59.269066000000009],[-65.706664999999987,59.268326000000059],[-65.685271999999884,59.264442000000031],[-65.676102000000014,59.261108000000036],[-65.646118000000001,59.244713000000104],[-65.587509000000011,59.20249200000012],[-65.612503000000004,59.237495000000081],[-65.614715999999873,59.243607000000054],[-65.614166000000012,59.246941000000049],[-65.581680000000006,59.37721300000004],[-65.572509999999966,59.378601000000003],[-65.570006999999976,59.378326000000129],[-65.551940999999999,59.372765000000072],[-65.499160999999958,59.352219000000105],[-65.48332199999993,59.345542999999964],[-65.476105000000018,59.338882000000069],[-65.471114999999941,59.327492000000007],[-65.453338999999971,59.316939999999988],[-65.383895999999993,59.281661999999983],[-65.372771999999998,59.276657000000114],[-65.366652999999872,59.274993999999992],[-65.36111499999987,59.274712000000136],[-65.357223999999974,59.277214000000015],[-65.356658999999922,59.282768000000033],[-65.437774999999988,59.393883000000017],[-65.495269999999891,59.433876000000055],[-65.559433000000013,59.481658999999979],[-65.56138599999997,59.486107000000118],[-65.557495000000017,59.487770000000069],[-65.549438000000009,59.48943300000002],[-65.542220999999984,59.489990000000091],[-65.360000999999954,59.481658999999979],[-65.347778000000005,59.480820000000051],[-65.260559000000001,59.466385000000116],[-65.19766199999998,59.450493000000051],[-65.195830999999998,59.447659000000044],[-65.176940999999999,59.440269000000001],[-65.170273000000009,59.434433000000126],[-65.141953000000001,59.415825000000041],[-65.126663000000008,59.40776800000009],[-65.119995000000017,59.40526600000004],[-65.060271999999998,59.384438000000102],[-65.041381999999942,59.378601000000003],[-65.017775999999969,59.373046999999985],[-65.005844000000025,59.371933000000013],[-64.995543999999995,59.372490000000084],[-64.98332199999993,59.376380999999981],[-65.031386999999938,59.392769000000044],[-65.075835999999981,59.408043000000077],[-65.111114999999984,59.420546999999942],[-65.118880999999988,59.423882000000049],[-65.141113000000018,59.434433000000126],[-65.147231999999974,59.43804200000011],[-65.151397999999972,59.443046999999979],[-65.156386999999938,59.451659999999947],[-65.158996999999886,59.460827000000108],[-65.16194200000001,59.466660000000104],[-65.168059999999969,59.470543000000021],[-65.22084000000001,59.48832700000014],[-65.290832999999964,59.506660000000011],[-65.308608999999933,59.50999500000006],[-65.330001999999865,59.509437999999989],[-65.388901000000033,59.50750000000005],[-65.411666999999966,59.509437999999989],[-65.419998000000021,59.516936999999984],[-65.462783999999886,59.578049000000021],[-65.494155999999975,59.626937999999996],[-65.501677999999913,59.63888500000013],[-65.527785999999992,59.716933999999981],[-65.501952999999958,59.747215000000097],[-65.433318999999983,59.798049999999932],[-65.374999999999943,59.828049000000135],[-65.33555599999994,59.84665700000005],[-65.333892999999932,59.847214000000122],[-65.323623999999995,59.845543000000077],[-65.236114999999984,59.819381999999962],[-65.21945199999999,59.814377000000093],[-65.205947999999978,59.808548000000087],[-65.203444999999931,59.806881000000033],[-65.198775999999953,59.802879000000019],[-65.195281999999963,59.797218000000044],[-65.158614999999998,59.782211000000018],[-65.152785999999992,59.779990999999995],[-65.136123999999995,59.776657],[-65.053054999999972,59.763611000000083],[-65.033065999999963,59.761383000000137],[-65.006667999999991,59.760277000000087],[-64.988602000000014,59.761940000000038],[-64.983886999999982,59.762771999999927],[-64.983063000000016,59.764160000000061],[-64.989165999999955,59.765831000000105],[-65.055556999999965,59.778328000000101],[-65.132766999999944,59.79694400000011],[-65.161391999999978,59.817490000000134],[-65.199393999999927,59.835659000000078],[-65.202713000000017,59.837326000000019],[-65.206054999999992,59.840492000000097],[-65.230835000000013,59.880546999999979],[-65.231948999999986,59.885826000000122],[-65.226104999999961,59.888603000000046],[-65.206389999999999,59.888603000000046],[-65.143340999999907,59.94999700000011],[-65.126098999999954,60.011108000000036],[-65.110001000000011,60.043052999999986],[-65.029723999999931,60.077217000000019],[-64.921111999999937,60.194992000000013],[-64.834166999999979,60.323051000000078],[-64.832229999999925,60.328605999999979],[-64.834441999999967,60.334434999999985],[-64.846389999999928,60.345543000000134],[-64.858336999999949,60.352492999999981],[-64.857223999999974,60.359436000000017],[-64.854445999999996,60.361107000000061],[-64.846114999999998,60.362769999999955],[-64.83555599999994,60.363327000000083],[-64.65306099999998,60.34693900000002],[-64.641677999999899,60.344711000000018],[-64.610274999999945,60.336380000000133],[-64.576674999999966,60.322768999999994],[-64.533249000000012,60.302498000000014],[-64.475600999999983,60.281609000000003],[-64.466919000000019,60.278602999999976],[-64.431090999999981,60.258105999999941],[-64.432593999999995,60.255608000000052],[-64.43460099999993,60.255108000000064],[-64.446091000000024,60.254771999999946],[-64.453093999999908,60.256271000000027],[-64.462424999999939,60.259273999999948],[-64.477591999999959,60.265609999999981],[-64.477218999999991,60.260551000000135],[-64.557495000000017,60.281105000000082],[-64.580291999999929,60.286110000000122],[-64.613051999999982,60.289436000000137],[-64.643065999999976,60.287498000000028],[-64.721114999999941,60.261108000000036],[-64.725829999999974,60.258331000000112],[-64.758056999999951,60.235825000000091],[-64.759445000000028,60.231102000000135],[-64.752501999999879,60.228600000000029],[-64.745269999999948,60.228325000000041],[-64.736937999999952,60.230545000000063],[-64.685546999999985,60.250832000000116],[-64.646118000000001,60.265830999999991],[-64.634170999999981,60.268883000000073],[-64.596389999999985,60.266937000000041],[-64.574448000000018,60.264999000000103],[-64.554169000000002,60.262772000000041],[-64.536391999999921,60.2586060000001],[-64.421676999999988,60.215656000000024],[-64.419501999999966,60.213661000000002],[-64.376937999999996,60.160545000000013],[-64.465011999999945,60.084991000000002],[-64.469161999999869,60.08277099999998],[-64.476944000000003,60.079720000000009],[-64.491378999999938,60.074714999999912],[-64.504455999999948,60.072495000000117],[-64.515015000000005,60.071938000000046],[-64.654998999999918,60.053604000000064],[-64.80471799999998,60.007216999999969],[-64.8125,60.004165999999998],[-64.823333999999988,59.997772000000111],[-64.826675000000023,59.994712999999933],[-64.827498999999989,59.986382000000049],[-64.820007000000032,59.979431000000091],[-64.811935000000005,59.978325000000098],[-64.796660999999972,59.980270000000075],[-64.735274999999945,60.001106000000107],[-64.490828999999906,60.05943300000007],[-64.410277999999948,60.111107000000118],[-64.396392999999989,60.121933000000013],[-64.392226999999991,60.124161000000015],[-64.385833999999932,60.125267000000008],[-64.379990000000021,60.125267000000008],[-64.37388599999997,60.123604000000114],[-64.367766999999958,60.119713000000047],[-64.366104000000007,60.117493000000024],[-64.36500499999994,60.109993000000145],[-64.374611000000016,60.033829000000082],[-64.375281999999856,60.028324000000055],[-64.394729999999981,59.941658000000075],[-64.396956999999929,59.937767000000008],[-64.408889999999985,59.932495000000074],[-64.450561999999934,59.925270000000012],[-64.462218999999948,59.922493000000088],[-64.491942999999992,59.913605000000132],[-64.506957999999997,59.907211000000075],[-64.514724999999999,59.901932000000102],[-64.513901000000033,59.896103000000096],[-64.506393000000003,59.891936999999984],[-64.499435000000005,59.891663000000051],[-64.481948999999872,59.894714000000079],[-64.376098999999954,59.9180530000001],[-64.367766999999958,59.920273000000122],[-64.363327000000027,59.922493000000088],[-64.360549999999932,59.924995000000024],[-64.320281999999963,60.004107999999974],[-64.322112999999945,60.006439000000114],[-64.324119999999994,60.011604000000091],[-64.32428699999997,60.014107000000024],[-64.322112999999945,60.024605000000008],[-64.320449999999937,60.027270999999985],[-64.317443999999909,60.028103000000044],[-64.265014999999948,60.048050000000103],[-64.216659999999933,60.039993000000095],[-64.173614999999984,60.028328000000045],[-64.166945999999996,60.024994000000049],[-64.160827999999981,60.01638800000012],[-64.150283999999999,59.985268000000076],[-64.150283999999999,59.982208000000014],[-64.165833000000021,59.850548000000117],[-64.17721599999993,59.785552999999936],[-64.180831999999896,59.781662000000097],[-64.193053999999961,59.775825999999995],[-64.202498999999932,59.77416199999999],[-64.220000999999968,59.77416199999999],[-64.236664000000019,59.779716000000008],[-64.244720000000029,59.784996000000035],[-64.25140399999998,59.787498000000141],[-64.257507000000032,59.78943600000008],[-64.261948000000018,59.789161999999976],[-64.264450000000011,59.787498000000141],[-64.266662999999994,59.77915999999999],[-64.261123999999995,59.764717000000132],[-64.255004999999926,59.756660000000124],[-64.21305799999999,59.717766000000097],[-64.197768999999994,59.705269000000101],[-64.173888999999974,59.688598999999954],[-64.163894999999968,59.684158000000082],[-64.151672000000019,59.680824000000086],[-64.129989999999964,59.676659000000086],[-64.057769999999948,59.625267000000122],[-64.116942999999935,59.517494000000056],[-64.047501000000011,59.549721000000034],[-64.040833000000021,59.553604000000007],[-64.033324999999991,59.563880999999981],[-64.034438999999907,59.573608000000092],[-64.034438999999907,59.582771000000093],[-64.029723999999874,59.599433999999974],[-64.024719000000005,59.609993000000031],[-64.019454999999937,59.618599000000131],[-64.011123999999938,59.624992000000077],[-64.004729999999995,59.626381000000094],[-63.99722300000002,59.626656000000139],[-63.90055099999995,59.619987000000037],[-63.885559000000001,59.618881000000044],[-63.876105999999993,59.615829000000076],[-63.865554999999915,59.609993000000031],[-63.731666999999959,59.526099999999985],[-63.724166999999966,59.517769000000101],[-63.722495999999978,59.513885000000073],[-63.723884999999996,59.506660000000011],[-63.785278000000005,59.426102000000014],[-63.807837999999947,59.420437000000106],[-63.810172999999963,59.41944100000012],[-63.814502999999945,59.418101999999976],[-63.866393999999957,59.421104000000014],[-63.90694400000001,59.421660999999915],[-63.947776999999974,59.419716000000108],[-64.000564999999995,59.41443600000008],[-64.018341000000021,59.410545000000013],[-64.033324999999991,59.406654000000117],[-64.050277999999992,59.399994000000106],[-64.061110999999983,59.393883000000017],[-64.065826000000015,59.388046000000031],[-64.062209999999993,59.38249200000007],[-64.052779999999984,59.379433000000063],[-63.805167999999924,59.368164000000093],[-63.790145999999993,59.370293000000004],[-63.786652000000004,59.371792000000084],[-63.78264999999999,59.374126000000103],[-63.751395999999943,59.37582400000008],[-63.748111999999935,59.333878000000084],[-63.75644699999998,59.30838],[-63.768280000000004,59.28788000000003],[-63.77044699999999,59.284381999999994],[-63.773444999999981,59.282215000000122],[-63.780944999999974,59.278213999999991],[-63.814162999999951,59.249435000000005],[-63.824722000000008,59.24610100000001],[-63.825499999999977,59.244377000000043],[-63.82527899999991,59.243324000000086],[-63.813889000000017,59.240829000000076],[-63.777942999999993,59.263938999999993],[-63.76677699999999,59.264275000000055],[-63.760940999999946,59.265434000000027],[-63.755942999999945,59.266773000000001],[-63.739112999999975,59.273605000000032],[-63.730441999999925,59.280769000000021],[-63.723777999999925,59.287436999999954],[-63.718776999999932,59.293941000000075],[-63.716113999999891,59.300934000000098],[-63.71527900000001,59.303768000000105],[-63.71527900000001,59.306438000000071],[-63.71594199999987,59.309437000000059],[-63.713775999999996,59.315605000000005],[-63.710608999999863,59.318107999999995],[-63.658332999999971,59.358046999999999],[-63.649993999999992,59.362494999999967],[-63.543059999999912,59.34804500000007],[-63.535277999999948,59.344436999999971],[-63.393332999999927,59.264999000000103],[-63.357506000000001,59.208046000000081],[-63.356392000000028,59.204993999999999],[-63.358054999999922,59.198043999999982],[-63.366661000000022,59.186377999999991],[-63.412773000000016,59.135826000000066],[-63.425560000000019,59.126381000000038],[-63.441108999999926,59.119438000000002],[-63.476944000000003,59.104439000000127],[-63.563613999999973,59.073326000000122],[-63.580001999999922,59.067497000000117],[-63.589721999999938,59.065543999999989],[-63.731392000000028,59.056270999999981],[-63.741055000000017,59.055770999999993],[-63.74872199999993,59.056934000000126],[-63.753890999999896,59.058266000000003],[-63.760222999999939,59.062767000000122],[-63.812217999999973,59.065826000000072],[-63.934440999999936,59.081108000000086],[-63.948333999999988,59.07888000000014],[-63.966110000000015,59.074714999999969],[-63.98833499999995,59.068329000000062],[-64.045546999999999,59.02416199999999],[-64.04722599999991,59.019440000000088],[-64.043883999999991,59.015273999999977],[-64.039443999999946,59.013885000000016],[-63.912216000000001,59.000549000000035],[-63.801719999999989,59.013992000000144],[-63.798388999999986,59.011329999999987],[-63.766395999999986,59.012772000000098],[-63.759444999999971,59.012497000000053],[-63.734443999999939,59.014998999999989],[-63.508057000000008,59.052773000000059],[-63.381667999999877,59.098045000000127],[-63.372771999999941,59.101104999999961],[-63.365554999999915,59.101104999999961],[-63.309440999999993,59.09415400000006],[-63.293335000000013,59.091377000000136],[-63.134170999999981,59.058327000000077],[-63.124999999999943,59.055267000000015],[-63.121940999999993,59.051384000000098],[-63.122771999999998,59.045547000000113],[-63.126944999999921,59.041382000000112],[-63.133330999999941,59.038048000000117],[-63.159438999999907,59.029990999999995],[-63.175277999999992,59.026939000000084],[-63.185271999999998,59.026381999999955],[-63.216942000000017,59.027489000000116],[-63.238892000000021,59.030548000000067],[-63.323333999999932,59.027771000000143],[-63.336112999999955,59.024994000000049],[-63.335555999999997,59.021935000000099],[-63.264450000000011,58.985549999999989],[-63.213889999999992,58.977211000000125],[-63.195273999999984,58.979713000000004],[-63.185271999999998,58.980270000000075],[-63.173057999999912,58.979713000000004],[-63.167503000000011,58.970825000000048],[-63.160552999999993,58.926384000000041],[-63.163054999999929,58.920273000000122],[-63.236389000000031,58.876937999999996],[-63.313331999999946,58.861107000000004],[-63.325004999999976,58.85582700000009],[-63.312774999999988,58.853049999999996],[-63.294723999999974,58.85083000000003],[-63.19027699999998,58.854996000000085],[-63.112777999999992,58.878043999999989],[-63.033332999999971,58.873878000000104],[-62.924170999999944,58.821381000000031],[-62.918334999999956,58.817497000000003],[-62.90694400000001,58.80471],[-62.904167000000029,58.799995000000138],[-62.847495999999978,58.690543999999989],[-62.845276000000013,58.684989999999971],[-62.842223999999987,58.669991000000095],[-62.843612999999948,58.659430999999984],[-62.847777999999948,58.653045999999961],[-62.915832999999907,58.600272999999959],[-62.974998000000028,58.576660000000061],[-63.169167000000016,58.503052000000139],[-63.334109999999896,58.455768999999975],[-63.334609999999941,58.45227100000011],[-63.337108999999941,58.448437000000126],[-63.373444000000006,58.417435000000069],[-63.38528100000002,58.41027100000008],[-63.39910900000001,58.405273000000079],[-63.486388999999974,58.37082700000002],[-63.522498999999982,58.361107000000118],[-63.537506000000008,58.354164000000083],[-63.583060999999987,58.311378000000047],[-63.587776000000019,58.305549999999982],[-63.58943899999997,58.30082700000014],[-63.584998999999925,58.298881999999992],[-63.579726999999991,58.298606999999947],[-63.571670999999924,58.299995000000081],[-63.555274999999938,58.305267000000015],[-63.533057999999983,58.314438000000109],[-63.428223000000003,58.369049000000132],[-63.392386999999928,58.388381999999979],[-63.378558999999939,58.399044000000004],[-63.364219999999932,58.410049000000015],[-63.351555000000019,58.418716000000018],[-63.286391999999978,58.456657000000064],[-63.28082999999998,58.459160000000054],[-63.264724999999942,58.463051000000121],[-63.241669000000002,58.466385000000116],[-63.213615000000004,58.469437000000028],[-63.148612999999955,58.476379000000122],[-63.13277399999987,58.477211000000068],[-63.124442999999872,58.475266000000033],[-63.096947,58.461936999999978],[-63.089721999999938,58.458327999999938],[-63.086113000000012,58.454993999999999],[-63.037506000000008,58.453048999999965],[-62.763335999999981,58.480820000000051],[-62.636664999999937,58.501389000000017],[-62.620551999999975,58.504997000000117],[-62.610001000000011,58.503882999999973],[-62.58943899999997,58.499718000000144],[-62.573615999999959,58.493880999999988],[-62.566108999999926,58.490546999999992],[-62.56138599999997,58.487495000000081],[-62.557502999999997,58.482491000000095],[-62.556389000000024,58.478043000000127],[-62.619719999999973,58.376938000000052],[-62.619445999999982,58.310272000000055],[-62.623054999999965,58.30443600000001],[-62.634170999999981,58.297775000000058],[-62.708611000000019,58.276100000000042],[-62.77666499999998,58.268599999999992],[-62.828056000000004,58.252220000000079],[-62.661666999999966,58.26998900000001],[-62.658607000000018,58.270271000000037],[-62.654442000000017,58.270271000000037],[-62.609725999999966,58.256660000000068],[-62.597778000000005,58.251663000000008],[-62.592772999999966,58.248604],[-62.582503999999858,58.23443600000013],[-62.581116000000009,58.221931000000041],[-62.58277899999996,58.216934000000094],[-62.584441999999967,58.214439000000084],[-62.631942999999865,58.185265000000129],[-62.638054000000011,58.181938000000002],[-62.653053,58.175270000000012],[-62.661384999999996,58.173049999999989],[-62.689163000000008,58.169991000000039],[-62.719718999999941,58.169715999999994],[-62.740279999999927,58.171936000000017],[-62.773887999999886,58.176941000000056],[-62.783889999999928,58.176659000000029],[-62.822226999999998,58.174713000000111],[-62.841666999999973,58.1722180000001],[-62.965004000000022,58.15387700000008],[-63.012221999999952,58.135551000000078],[-63.016662999999937,58.126098999999954],[-63.023887999999999,58.118880999999988],[-63.045279999999934,58.108886999999982],[-63.126944999999921,58.086936999999978],[-63.205558999999994,58.065826000000072],[-63.21166999999997,58.062492000000077],[-63.211387999999999,58.060272000000111],[-63.208892999999989,58.057770000000005],[-63.19027699999998,58.053047000000049],[-63.140838999999971,58.048882000000049],[-63.146998999999994,58.036831000000006],[-63.15582999999998,58.026939000000084],[-63.167777999999942,58.021103000000039],[-63.193329000000006,58.014717000000132],[-63.267220000000009,58.007217000000026],[-63.275275999999963,58.005554000000132],[-63.30471799999998,57.996940999999936],[-63.341666999999973,57.981102000000021],[-63.340835999999967,57.979988000000048],[-63.329726999999991,57.980270000000132],[-63.15166499999998,57.993606999999997],[-63.128882999999973,57.997771999999998],[-63.107779999999991,58.007774000000097],[-63.101944000000003,58.01249700000011],[-63.098884999999939,58.017769000000044],[-63.097778000000005,58.019714000000022],[-63.09833500000002,58.026939000000084],[-63.099998000000028,58.033051000000057],[-63.101944000000003,58.036942000000124],[-63.101668999999902,58.044159000000036],[-63.097778000000005,58.052216000000044],[-63.094718999999941,58.057495000000017],[-63.089164999999866,58.06221000000005],[-62.946662999999944,58.124161000000015],[-62.940276999999924,58.125824000000136],[-62.886390999999946,58.137496999999996],[-62.838051000000007,58.144997000000046],[-62.832222000000002,58.14527099999998],[-62.829445000000021,58.143326000000002],[-62.77277399999997,58.129158000000132],[-62.652221999999995,58.118599000000074],[-62.646111000000019,58.119155999999975],[-62.643058999999994,58.119986999999981],[-62.612502999999947,58.137771999999984],[-62.59944200000001,58.145546000000024],[-62.560828999999956,58.156654000000003],[-62.515838999999914,58.169158999999922],[-62.491942999999992,58.174163999999962],[-62.46665999999999,58.175552000000096],[-62.452781999999956,58.175270000000012],[-62.448051000000021,58.1722180000001],[-62.446388000000013,58.168327000000033],[-62.447776999999917,58.164154000000053],[-62.463000999999963,58.151047000000062],[-62.469666000000018,58.145718000000045],[-62.478333000000021,58.141212000000053],[-62.486168000000021,58.136547000000064],[-62.503890999999953,58.123604000000114],[-62.519447000000014,58.111937999999952],[-62.529166999999916,58.102776000000063],[-62.531386999999995,58.095268000000033],[-62.514450000000011,58.057495000000017],[-62.506392999999946,58.055267000000072],[-62.498054999999908,58.057213000000104],[-62.49138599999992,58.061378000000104],[-62.486664000000019,58.066940000000045],[-62.484443999999939,58.072220000000129],[-62.485557999999912,58.081107999999915],[-62.488051999999925,58.086105000000032],[-62.488891999999908,58.091103000000032],[-62.488051999999925,58.09665700000005],[-62.482772999999952,58.100273000000072],[-62.444827999999916,58.106720000000053],[-62.413054999999929,58.110825000000091],[-62.375,58.112770000000069],[-62.368889000000024,58.111664000000019],[-62.363892000000021,58.108604000000014],[-62.317779999999971,58.052489999999977],[-62.307502999999883,58.039161999999976],[-62.306945999999982,58.031104999999968],[-62.309722999999963,58.028603000000089],[-62.38144699999998,58.008327000000065],[-62.394112000000007,58.003658000000087],[-62.406280999999979,58.002827000000082],[-62.41311300000001,58.003658000000087],[-62.437613999999883,58.010159000000101],[-62.450443000000007,58.011993000000132],[-62.500838999999928,58.008049000000142],[-62.51916499999993,58.006943000000092],[-62.528335999999967,58.005554000000132],[-62.545279999999934,58.000549000000035],[-62.648055999999997,57.958328000000051],[-62.655273000000022,57.953605999999979],[-62.65972099999999,57.94860100000011],[-62.672774999999945,57.929993000000024],[-62.664443999999946,57.928604000000064],[-62.655273000000022,57.929993000000024],[-62.640838999999971,57.935264999999958],[-62.636116000000015,57.938598999999954],[-62.620833999999945,57.947487000000137],[-62.611670999999944,57.951660000000061],[-62.577498999999989,57.962212000000079],[-62.537780999999882,57.971100000000092],[-62.512504999999919,57.972487999999998],[-62.455165999999963,57.968212000000051],[-62.448001999999974,57.967708999999957],[-62.325004999999919,57.956100000000106],[-62.268332999999984,57.948875000000044],[-62.200278999999966,57.935822000000087],[-62.148887999999999,57.974990999999932],[-62.145279000000016,57.974159000000043],[-62.12749500000001,57.968048000000124],[-62.116111999999987,57.962493999999992],[-62.083610999999962,57.944992000000127],[-62.079726999999934,57.942763999999954],[-62.072226999999998,57.931107000000054],[-62.05972300000002,57.897774000000027],[-62.060828999999956,57.889992000000063],[-62.062774999999931,57.886658000000068],[-62.115279999999984,57.854164000000026],[-62.131942999999978,57.84276600000004],[-62.138053999999954,57.835823000000005],[-62.139167999999927,57.831940000000088],[-62.125274999999988,57.806938000000002],[-62.120833999999888,57.800827000000083],[-62.119995000000017,57.799994999999967],[-62.107779999999991,57.789719000000105],[-62.08916499999998,57.780548000000124],[-62.085830999999985,57.779433999999981],[-62.079169999999976,57.779433999999981],[-62.061110999999926,57.781936999999971],[-62.046394000000021,57.785828000000038],[-62.033332999999914,57.787216000000114],[-62.018058999999937,57.783607000000131],[-61.996666000000005,57.772217000000069],[-61.99138599999992,57.767769000000101],[-61.889998999999989,57.666382000000112],[-61.883330999999998,57.645546000000081],[-61.883057000000008,57.63749700000011],[-61.884444999999971,57.626938000000052],[-61.888610999999969,57.622490000000084],[-61.89805599999994,57.616386000000034],[-62.071670999999981,57.563605999999993],[-62.192222999999899,57.535828000000095],[-62.30860899999999,57.490546999999992],[-62.421386999999982,57.482207999999957],[-62.431945999999868,57.484717999999987],[-62.531113000000005,57.506943000000035],[-62.541388999999981,57.507500000000107],[-62.544723999999974,57.504440000000045],[-62.545279999999934,57.50110600000005],[-62.533332999999914,57.492218000000094],[-62.520553999999947,57.484993000000031],[-62.46444699999995,57.454437000000098],[-62.457222000000002,57.451103000000103],[-62.377220000000023,57.421936000000017],[-62.365279999999927,57.419715999999994],[-62.353888999999981,57.418326999999977],[-62.335830999999928,57.419440999999949],[-62.230552999999986,57.443604000000107],[-62.173331999999959,57.463608000000022],[-62.167220999999984,57.464439000000084],[-62.060828999999956,57.456383000000017],[-62.039725999999973,57.453323000000125],[-61.891388000000006,57.411934000000031],[-61.816948000000025,57.376938000000109],[-61.803054999999915,57.369155999999975],[-61.801391999999908,57.363052000000096],[-61.803054999999915,57.358887000000095],[-61.863892000000021,57.285553000000107],[-61.894164999999987,57.269440000000088],[-61.937499999999943,57.252220000000079],[-61.944999999999936,57.250832000000003],[-61.953888000000006,57.249435000000062],[-61.997779999999977,57.25638600000002],[-62.017219999999952,57.256943000000092],[-62.026389999999992,57.255829000000119],[-62.023613000000012,57.251663000000008],[-62.015839000000028,57.243050000000039],[-62.005004999999869,57.236655999999982],[-61.858894000000021,57.167770000000132],[-61.852500999999961,57.165268000000083],[-61.664444000000003,57.143883000000073],[-61.65555599999999,57.143051000000014],[-61.565551999999968,57.149719000000005],[-61.515555999999947,57.15638000000007],[-61.490836999999999,57.159431000000097],[-61.478881999999999,57.159431000000097],[-61.458892999999989,57.154709000000025],[-61.441665999999884,57.148604999999975],[-61.39305899999988,57.124709999999993],[-61.380279999999914,57.117210000000114],[-61.363892000000021,57.097214000000122],[-61.358336999999949,57.087494000000049],[-61.355559999999969,57.016388000000006],[-61.370833999999945,56.978600000000142],[-61.378052000000025,56.982208000000071],[-61.393332999999984,56.983047000000056],[-61.479720999999984,56.983604000000128],[-61.487777999999935,56.981658999999979],[-61.495551999999861,56.979430999999977],[-61.516395999999929,56.970267999999976],[-61.535560999999973,56.961104999999975],[-61.546668999999952,56.954437000000041],[-61.639998999999932,56.883881000000031],[-61.645003999999915,56.878326000000129],[-61.648337999999967,56.873046999999929],[-61.650832999999921,56.866936000000067],[-61.65277900000001,56.855826999999977],[-61.65277900000001,56.845543000000134],[-61.65055099999995,56.840828000000101],[-61.646111000000019,56.826942000000088],[-61.646111000000019,56.821106000000043],[-61.650276000000019,56.816666000000055],[-61.661384999999996,56.809433000000013],[-61.676392000000021,56.802773000000002],[-61.782391000000018,56.794441000000006],[-61.799224999999922,56.792937999999992],[-61.816886999999952,56.793610000000001],[-61.823558999999989,56.794441000000006],[-61.834556999999961,56.796108000000117],[-61.844559000000004,56.798943000000008],[-61.892226999999934,56.798607000000118],[-61.906386999999938,56.795273000000122],[-61.908606999999961,56.789162000000033],[-61.902221999999938,56.714156999999943],[-61.899993999999992,56.707214000000135],[-61.897223999999937,56.703049000000135],[-61.889998999999989,56.698044000000095],[-61.886115999999959,56.698044000000095],[-61.877776999999924,56.713051000000121],[-61.87027699999993,56.726936000000023],[-61.833667999999932,56.741993000000093],[-61.830832999999927,56.745327000000088],[-61.824996999999996,56.746826000000112],[-61.811504000000014,56.746826000000112],[-61.793335000000013,56.746826000000112],[-61.780498999999963,56.745658999999989],[-61.772834999999986,56.744160000000136],[-61.76266899999996,56.741325000000074],[-61.716392999999925,56.738045000000113],[-61.702498999999989,56.730820000000051],[-61.696944999999971,56.724709000000132],[-61.701667999999984,56.713325999999938],[-61.71055599999994,56.705551000000071],[-61.721106999999961,56.701103000000103],[-61.734443999999996,56.697212000000036],[-61.75417299999998,56.697487000000024],[-61.765006999999969,56.6988750000001],[-61.773055999999997,56.701103000000103],[-61.798339999999996,56.710823000000005],[-61.808334000000002,56.712212000000136],[-61.821670999999924,56.709717000000126],[-61.825004999999919,56.706657000000064],[-61.821670999999924,56.701660000000004],[-61.799171000000001,56.682770000000005],[-61.792503000000011,56.680824000000143],[-61.732215999999937,56.663322000000107],[-61.681670999999994,56.653603000000089],[-61.674445999999932,56.653046000000018],[-61.658889999999985,56.647774000000084],[-61.649726999999984,56.641662999999994],[-61.649993999999936,56.635268999999994],[-61.658607000000018,56.627487000000031],[-61.672500999999954,56.619986999999924],[-61.680557000000022,56.618050000000096],[-61.688889000000017,56.617210000000057],[-61.699164999999994,56.617767000000129],[-61.835555999999997,56.631660000000124],[-61.911667000000023,56.642769000000044],[-61.992774999999938,56.66027100000008],[-62.010001999999872,56.664153999999996],[-62.066947999999911,56.678604000000121],[-62.311110999999983,56.735550000000046],[-62.479995999999971,56.77388000000002],[-62.498885999999914,56.779716000000064],[-62.504448000000025,56.783607000000131],[-62.505004999999926,56.788886999999988],[-62.501944999999978,56.791939000000127],[-62.486114999999984,56.796104000000128],[-62.468886999999995,56.798607000000118],[-62.326392999999996,56.812767000000008],[-62.227492999999868,56.816666000000055],[-62.18999500000001,56.81332400000008],[-62.138335999999924,56.81082200000003],[-62.068335999999988,56.817214999999976],[-62.059440999999879,56.818603999999993],[-62.051665999999955,56.820549000000142],[-62.042502999999954,56.826942000000088],[-62.043334999999956,56.829994000000056],[-62.049445999999875,56.832496999999989],[-62.066947999999911,56.834434999999928],[-62.234726000000023,56.836937000000034],[-62.381667999999991,56.830276000000083],[-62.478606999999954,56.846657000000107],[-62.488891999999908,56.849434000000031],[-62.498885999999914,56.850548000000003],[-62.508338999999921,56.849998000000141],[-62.517219999999952,56.848045000000013],[-62.53194400000001,56.843605000000025],[-62.543892000000028,56.837212000000022],[-62.546950999999922,56.834717000000012],[-62.570281999999963,56.798607000000118],[-62.57389099999989,56.792770000000132],[-62.538337999999953,56.775551000000064],[-62.503058999999951,56.762214999999912],[-62.356109999999887,56.722214000000122],[-62.162773000000016,56.672768000000076],[-62.02277399999997,56.627487000000031],[-62.005279999999971,56.616936000000123],[-62.117500000000007,56.623046999999985],[-62.175003000000004,56.623877999999991],[-62.235557999999969,56.623604000000057],[-62.241111999999873,56.62332200000003],[-62.239722999999969,56.617210000000057],[-62.224715999999944,56.609161000000029],[-62.192222999999899,56.602493000000038],[-62.105003000000011,56.59693900000002],[-62.046394000000021,56.595825000000048],[-62.036117999999874,56.595267999999976],[-61.901389999999935,56.58776899999998],[-61.729439000000013,56.574440000000095],[-61.715004000000022,56.572220000000073],[-61.70805399999989,56.568886000000077],[-61.701110999999969,56.560822000000087],[-61.690833999999995,56.548050000000046],[-61.666663999999969,56.540549999999996],[-61.658332999999971,56.537498000000085],[-61.655273000000022,56.533882000000006],[-61.653327999999931,56.53054800000001],[-61.652221999999995,56.526100000000042],[-61.653327999999931,56.520546000000081],[-61.656661999999926,56.510826000000009],[-61.662216000000001,56.506104000000107],[-61.680282999999974,56.496658000000139],[-61.689163000000008,56.494713000000104],[-61.754723000000013,56.484993000000031],[-61.773055999999997,56.484718000000044],[-61.80388599999992,56.487770000000125],[-61.878052000000025,56.497772000000111],[-61.951942000000031,56.505554000000075],[-62.038612000000001,56.505271999999991],[-62.046950999999922,56.50471500000009],[-62.05471799999998,56.502495000000067],[-62.061667999999997,56.499435000000005],[-62.075561999999934,56.49193600000001],[-62.08306099999993,56.486938000000009],[-62.085273999999913,56.483046999999942],[-62.082222000000002,56.481659000000036],[-62.076667999999984,56.479987999999992],[-62.070838999999978,56.481102000000135],[-62.024170000000026,56.48443600000013],[-61.976386999999988,56.483330000000137],[-61.965278999999896,56.481934000000081],[-61.952224999999999,56.475822000000107],[-61.946945000000028,56.471100000000035],[-61.956164999999942,56.464050000000043],[-61.958831999999973,56.461048000000005],[-61.961333999999965,56.459717000000012],[-61.966003000000001,56.458549000000005],[-61.979835999999978,56.455551000000071],[-61.999724999999955,56.44999700000011],[-62.010284000000013,56.44999700000011],[-62.019996999999989,56.451102999999932],[-62.048888999999974,56.457214000000022],[-62.05972300000002,56.458603000000039],[-62.069999999999993,56.459160000000111],[-62.124999999999886,56.457214000000022],[-62.139998999999932,56.452217000000132],[-62.143058999999994,56.449158000000125],[-62.139167999999927,56.444709999999986],[-62.124999999999886,56.43832400000008],[-62.117500000000007,56.435546999999985],[-62.083327999999995,56.423325000000034],[-62.073059000000001,56.420546999999999],[-61.984726000000023,56.415268000000026],[-61.963717999999972,56.415657000000067],[-61.956889999999987,56.417823999999939],[-61.909720999999934,56.413879000000065],[-61.798057999999912,56.39527099999998],[-61.790840000000003,56.392494000000056],[-61.661384999999996,56.270271000000093],[-61.678332999999952,56.269161000000111],[-61.679169000000002,56.267993999999987],[-61.686835999999971,56.266994000000011],[-61.702834999999993,56.265327000000127],[-61.749999999999943,56.261329999999987],[-61.760665999999958,56.261662000000115],[-61.772166999999968,56.263493000000096],[-61.777167999999961,56.265327000000127],[-61.779671000000008,56.267493999999999],[-61.778335999999967,56.268661000000122],[-61.775001999999972,56.268826000000104],[-61.765166999999963,56.268162000000018],[-61.756667999999934,56.266994000000011],[-61.746001999999919,56.267493999999999],[-61.741000999999926,56.269161000000111],[-61.753616000000022,56.273048000000017],[-61.753059000000007,56.277770999999973],[-61.769996999999933,56.284163999999976],[-61.800835000000006,56.28943600000008],[-61.878608999999926,56.298607000000004],[-61.888610999999969,56.299164000000076],[-62.029723999999987,56.305267000000015],[-62.074447999999961,56.296386999999982],[-62.080001999999979,56.293610000000115],[-62.080832999999984,56.292496000000142],[-62.076110999999912,56.284996000000035],[-62.016395999999986,56.238883999999985],[-62.011672999999917,56.235825000000034],[-62.003890999999953,56.233604000000071],[-61.956947000000014,56.220825000000048],[-61.938331999999946,56.215827999999931],[-61.919448999999986,56.212212000000079],[-61.910278000000005,56.212493999999936],[-61.802054999999939,56.216381000000069],[-61.769889999999975,56.218048000000124],[-61.575004999999976,56.216933999999981],[-61.575561999999991,56.211937000000034],[-61.578612999999905,56.206940000000145],[-61.579726999999991,56.199158000000011],[-61.575279000000023,56.19609800000012],[-61.560279999999921,56.194434999999999],[-61.53583500000002,56.196381000000088],[-61.450553999999954,56.204994000000056],[-61.411941999999954,56.214714000000129],[-61.40444199999996,56.217491000000052],[-61.380279999999914,56.22304500000007],[-61.361670999999944,56.223602000000142],[-61.350837999999953,56.222214000000065],[-61.345550999999944,56.218322999999998],[-61.33083299999987,56.181938000000059],[-61.330284000000006,56.176659000000029],[-61.33555599999994,56.172767999999962],[-61.343329999999924,56.170547000000056],[-61.377220000000023,56.168602000000078],[-61.383613999999909,56.164711000000011],[-61.397223999999881,56.155823000000055],[-61.406104999999911,56.146102999999925],[-61.452498999999932,56.062767000000008],[-61.452224999999999,56.056937999999946],[-61.448607999999979,56.052772999999945],[-61.413886999999932,56.037773000000016],[-61.411384999999882,56.037497999999971],[-61.397498999999982,56.041107000000011],[-61.382773999999927,56.047493000000088],[-61.356391999999971,56.058327000000133],[-61.346663999999919,56.061377999999991],[-61.34027900000001,56.063049000000035],[-61.324721999999952,56.065269000000058],[-61.315552000000025,56.065544000000045],[-61.24361399999998,56.047493000000088],[-61.239722999999969,56.045273000000066],[-61.23750299999989,56.042770000000075],[-61.240554999999972,56.040276000000006],[-61.265838999999971,56.02276599999999],[-61.273613000000012,56.020828000000051],[-61.282500999999968,56.019714000000079],[-61.310279999999977,56.018600000000106],[-61.357223999999974,56.018600000000106],[-61.388610999999912,56.021934999999985],[-61.419167000000016,56.027214000000129],[-61.438605999999993,56.027489000000003],[-61.489997999999957,56.02027099999998],[-61.501395999999943,56.014442000000145],[-61.503890999999896,56.010551000000078],[-61.503615999999965,56.006942999999978],[-61.421943999999996,55.963882000000126],[-61.415001000000018,55.960274000000027],[-61.399170000000026,55.958602999999925],[-61.389998999999989,55.958885000000009],[-61.38138600000002,55.960274000000027],[-61.328055999999947,55.964157000000114],[-61.254722999999956,55.967491000000109],[-61.154442000000017,55.971375000000137],[-61.143616000000009,55.970543000000021],[-61.125556999999958,55.968596999999932],[-61.117774999999938,55.966103000000032],[-61.113616999999977,55.962493999999992],[-61.074448000000018,55.928329000000076],[-61.073891000000003,55.923050000000103],[-61.076667999999984,55.906937000000084],[-61.094111999999939,55.895606999999984],[-61.156386999999995,55.891937000000098],[-61.165276000000006,55.892220000000066],[-61.181670999999994,55.89916199999999],[-61.194999999999993,55.892220000000066],[-61.201667999999984,55.884163000000115],[-61.198607999999922,55.876380999999981],[-61.192771999999934,55.869437999999946],[-61.104445999999939,55.845543000000134],[-61.095275999999899,55.843880000000013],[-61.085274000000027,55.843322999999941],[-61.077224999999999,55.843880000000013],[-61.068061999999998,55.845543000000134],[-61.039665000000014,55.850937000000044],[-61.035999000000004,55.853271000000063],[-61.027168000000017,55.857273000000077],[-60.946105999999986,55.865829000000133],[-60.917220999999927,55.864441000000056],[-60.782500999999968,55.854164000000083],[-60.762221999999952,55.851386999999988],[-60.755561999999998,55.849434000000031],[-60.741669000000002,55.843048000000124],[-60.729720999999927,55.829436999999984],[-60.729163999999969,55.824440000000038],[-60.730826999999977,55.808044000000052],[-60.734443999999996,55.801212000000021],[-60.736941999999999,55.797382000000027],[-60.74222599999996,55.790549999999939],[-60.774719000000005,55.772491000000002],[-60.80777699999993,55.755271999999934],[-60.880554000000018,55.749161000000072],[-60.879439999999988,55.732765000000029],[-60.765006999999969,55.728042999999957],[-60.756393000000003,55.729431000000091],[-60.746947999999975,55.731659000000036],[-60.740279999999984,55.734161000000086],[-60.727218999999877,55.739990000000091],[-60.721663999999976,55.744713000000104],[-60.7016109999999,55.763443000000109],[-60.668891999999971,55.795830000000024],[-60.656386999999938,55.812767000000008],[-60.647223999999937,55.822768999999994],[-60.639998999999989,55.825554000000011],[-60.631667999999991,55.826660000000061],[-60.623885999999914,55.824996999999939],[-60.615279999999927,55.821937999999989],[-60.601943999999946,55.814713000000097],[-60.597777999999892,55.80943300000007],[-60.598052999999993,55.804436000000123],[-60.605835000000013,55.733879000000059],[-60.615836999999999,55.686935000000062],[-60.629722999999899,55.638329000000056],[-60.668059999999969,55.589432000000102],[-60.655555999999933,55.584435000000042],[-60.606109999999944,55.622489999999914],[-60.60222599999986,55.626656000000025],[-60.59027900000001,55.644714000000079],[-60.544167000000016,55.726936000000023],[-60.527221999999881,55.760551000000135],[-60.527495999999985,55.765830999999991],[-60.525557999999933,55.77693899999997],[-60.519446999999957,55.78804800000006],[-60.514449999999954,55.793610000000001],[-60.503059000000007,55.803046999999935],[-60.487777999999878,55.808601000000124],[-60.483611999999994,55.809158000000025],[-60.339995999999985,55.786384999999939],[-60.334998999999982,55.784439000000077],[-60.328888000000006,55.781661999999983],[-60.327224999999885,55.772766000000047],[-60.329444999999964,55.761383000000023],[-60.337775999999963,55.748604],[-60.380553999999961,55.691933000000063],[-60.406386999999995,55.674713000000054],[-60.463218999999924,55.666046000000108],[-60.472720999999979,55.663212000000101],[-60.493889000000024,55.658043000000134],[-60.499999999999943,55.654160000000047],[-60.50389100000001,55.648330999999985],[-60.525001999999972,55.610550000000046],[-60.531112999999948,55.597214000000065],[-60.532218999999884,55.591660000000104],[-60.531859999999938,55.588195999999982],[-60.515006999999969,55.599715999999944],[-60.506110999999919,55.611664000000019],[-60.495002999999997,55.621101000000124],[-60.481383999999991,55.627769000000114],[-60.440334000000007,55.620216000000084],[-60.426167000000021,55.618217000000072],[-60.420334000000025,55.616379000000052],[-60.415501000000006,55.61454800000007],[-60.322776999999917,55.578330999999991],[-60.31639100000001,55.573883000000023],[-60.31639100000001,55.57027400000004],[-60.319449999999961,55.530823000000055],[-60.321670999999981,55.509995000000004],[-60.426318999999978,55.448204000000089],[-60.442210999999986,55.427696000000026],[-60.437774999999988,55.399437000000091],[-60.478332999999907,55.347488000000055],[-60.472771000000023,55.347771000000023],[-60.451392999999939,55.357216000000108],[-60.42610899999994,55.376656000000082],[-60.420837000000006,55.382210000000043],[-60.418335000000013,55.386107999999979],[-60.415275999999949,55.394714000000079],[-60.417777999999942,55.402771000000087],[-60.422501000000011,55.407211000000075],[-60.425003000000004,55.411377000000016],[-60.423614999999984,55.421378999999945],[-60.418335000000013,55.427490000000034],[-60.413054999999986,55.431664000000069],[-60.349167000000023,55.475822000000107],[-60.331673000000023,55.486655999999982],[-60.319449999999961,55.491378999999995],[-60.268607999999972,55.502495000000124],[-60.253890999999953,55.503052000000025],[-60.213889999999992,55.489433000000076],[-60.203613000000018,55.483604000000071],[-60.201667999999984,55.478600000000085],[-60.195548999999971,55.431381000000101],[-60.265839000000028,55.409156999999993],[-60.274169999999913,55.408043000000021],[-60.284171999999955,55.408600000000092],[-60.295279999999934,55.411102000000142],[-60.305274999999881,55.411659000000043],[-60.313332000000003,55.411102000000142],[-60.354720999999927,55.394997000000046],[-60.468886999999938,55.285827999999981],[-60.49888599999997,55.253325999999959],[-60.538054999999929,55.200546000000145],[-60.499999999999943,55.218047999999953],[-60.488892000000021,55.227210999999954],[-60.482215999999994,55.231658999999922],[-60.476386999999988,55.2347180000001],[-60.468329999999924,55.237495000000024],[-60.37388599999997,55.260551000000021],[-60.365836999999942,55.260826000000066],[-60.355277999999998,55.259437999999989],[-60.348610000000008,55.255829000000119],[-60.348052999999936,55.250549000000092],[-60.353057999999976,55.244995000000074],[-60.512222000000008,55.120543999999938],[-60.587776000000019,55.088599999999929],[-60.616660999999965,55.077217000000132],[-60.636116000000015,55.066665999999998],[-60.670554999999979,55.044715999999994],[-60.681113999999923,55.004715000000033],[-60.683326999999906,54.994995000000131],[-60.592773000000022,55.058884000000091],[-60.475273000000016,55.124435000000005],[-60.266395999999986,55.240547000000106],[-60.259170999999924,55.244155999999919],[-60.252501999999993,55.246384000000091],[-60.176108999999997,55.270827999999995],[-60.079781000000025,55.249602999999979],[-60.073776000000009,55.247940000000028],[-60.072776999999974,55.245106000000021],[-60.110778999999923,55.199268000000075],[-60.123610999999926,55.156380000000127],[-60.146392999999932,55.137214999999969],[-60.157218999999941,55.128601000000117],[-60.187217999999973,55.108046999999999],[-60.204445000000021,55.107498000000021],[-60.212776000000019,55.108604000000071],[-60.220551,55.106384000000048],[-60.282776000000013,55.057770000000062],[-60.288337999999953,55.053321999999923],[-60.295006000000001,55.041382000000056],[-60.296950999999922,55.03443900000002],[-60.296668999999952,55.024993999999992],[-60.293892000000028,55.019440000000145],[-60.284171999999955,55.024437000000091],[-60.152495999999985,55.102776000000119],[-60.124442999999928,55.120270000000005],[-60.09944200000001,55.136658000000068],[-60.088332999999921,55.145827999999938],[-60.083884999999952,55.152214000000072],[-60.051223999999934,55.182381000000134],[-60.04571900000002,55.193046999999979],[-60.044723999999917,55.196711999999991],[-60.042721000000029,55.199883],[-60.039718999999877,55.203213000000005],[-60.036057000000028,55.206383000000073],[-60.021888999999987,55.218547999999942],[-60.015223999999989,55.221546000000046],[-60.009224000000017,55.221214000000089],[-59.964721999999938,55.235549999999989],[-59.939437999999939,55.233047000000056],[-59.922774999999945,55.233047000000056],[-59.916945999999939,55.233879000000115],[-59.912497999999971,55.238883999999985],[-59.890838999999971,55.265549000000021],[-59.868332000000009,55.291381999999999],[-59.863891999999964,55.296104000000071],[-59.851394999999968,55.303047000000049],[-59.80750299999994,55.324164999999937],[-59.795279999999991,55.327492000000063],[-59.779167000000029,55.329720000000066],[-59.776108000000022,55.329162999999937],[-59.715003999999965,55.276099999999929],[-59.711945000000014,55.269714000000022],[-59.713332999999977,55.256103999999993],[-59.729439000000013,55.205269000000101],[-59.732497999999964,55.197211999999979],[-59.735832000000016,55.194153000000142],[-59.742774999999938,55.191376000000048],[-59.831389999999999,55.162491000000045],[-59.847495999999978,55.158043000000077],[-59.863891999999964,55.154160000000104],[-59.897781000000009,55.151382000000126],[-59.918334999999956,55.155265999999983],[-59.94027699999998,55.162766000000033],[-59.950553999999897,55.164436000000023],[-59.962775999999963,55.161102000000028],[-59.967215999999951,55.158599999999979],[-59.970832999999914,55.15554800000001],[-59.973327999999867,55.147491000000059],[-59.968055999999933,55.119156000000032],[-59.963615000000004,55.110275000000115],[-59.80083499999995,55.108887000000038],[-59.795279999999991,55.109160999999972],[-59.615836999999999,55.13638300000008],[-59.57028200000002,55.159988000000055],[-59.531386999999995,55.181380999999988],[-59.487777999999992,55.181380999999988],[-59.430557000000022,55.151931999999988],[-59.428336999999999,55.149719000000005],[-59.427223000000026,55.139992000000063],[-59.427779999999927,55.135826000000009],[-59.431945999999925,55.129433000000006],[-59.438605999999936,55.123604],[-59.49610899999999,55.078331000000105],[-59.539169000000015,55.049163999999962],[-59.593886999999995,55.020828000000051],[-59.610831999999959,55.012771999999984],[-59.716659999999933,54.955826000000059],[-59.802165999999943,54.887268000000006],[-59.823996999999963,54.851105000000132],[-59.939163000000008,54.758888000000013],[-59.944160000000011,54.755554000000018],[-59.945549000000028,54.753052000000139],[-59.944160000000011,54.749718000000144],[-59.938605999999936,54.746383999999978],[-59.919166999999959,54.741379000000109],[-59.90943900000002,54.740829000000076],[-59.888610999999855,54.743324000000143],[-59.882499999999936,54.744995000000017],[-59.797500999999954,54.781661999999983],[-59.791114999999991,54.78555300000005],[-59.788612000000001,54.789436000000023],[-59.790282999999874,54.794158999999979],[-59.79099999999994,54.822658999999987],[-59.794166999999959,54.828159000000142],[-59.79466599999995,54.830994000000032],[-59.793830999999898,54.839992999999993],[-59.79099999999994,54.846825000000024],[-59.784339999999929,54.857658000000015],[-59.772002999999927,54.869492000000037],[-59.754722999999899,54.897491000000116],[-59.729995999999971,54.907493999999986],[-59.703888000000006,54.910545000000013],[-59.688888999999961,54.913605000000075],[-59.674445999999989,54.919990999999982],[-59.618331999999953,54.948600999999996],[-59.411110000000008,55.056381000000101],[-59.293891999999971,55.169716000000108],[-59.165275999999949,55.234993000000088],[-59.161384999999996,55.236938000000123],[-59.154716000000008,55.235549999999989],[-59.144164999999987,55.228043000000071],[-59.139442000000031,55.223877000000016],[-59.131110999999919,55.215546000000074],[-59.127494999999954,55.205826000000002],[-59.124999999999943,55.196380999999917],[-59.124442999999872,55.186103999999943],[-59.149440999999911,55.16182699999996],[-59.15060799999992,55.158992999999953],[-59.155276999999955,55.152156999999931],[-59.161277999999982,55.146823999999924],[-59.168609999999944,55.141827000000035],[-59.176608999999985,55.137989000000061],[-59.205276000000026,55.13116100000002],[-59.20911000000001,55.129822000000047],[-59.240279999999927,55.111382000000049],[-59.25278499999996,55.102492999999981],[-59.363335000000006,55.015830999999991],[-59.37471800000003,55.006386000000077],[-59.383056999999951,54.998047000000042],[-59.386390999999946,54.993049999999982],[-59.391113000000018,54.982208000000128],[-59.391387999999949,54.980270000000019],[-59.388610999999969,54.97665400000011],[-59.384170999999924,54.973319999999944],[-59.37471800000003,54.972763000000043],[-59.369164000000012,54.975266000000033],[-59.275001999999915,55.021659999999997],[-59.262504999999862,55.028327999999988],[-59.250838999999985,55.035828000000038],[-59.237220999999977,55.048332000000073],[-59.242500000000007,55.061104000000057],[-59.243057000000022,55.06638300000003],[-59.240836999999999,55.071106000000043],[-59.236663999999962,55.07749200000012],[-59.133330999999941,55.120491000000015],[-59.051666000000012,55.153320000000065],[-59.035277999999892,55.156937000000028],[-59.023613000000012,55.15665400000006],[-58.960555999999883,55.134995000000004],[-58.956107999999915,55.130271999999991],[-58.955832999999984,55.126381000000094],[-58.955832999999984,55.10083000000003],[-58.958336000000031,55.09165999999999],[-58.961670000000026,55.085265999999933],[-58.971106999999961,55.071106000000043],[-58.980277999999998,55.059990000000084],[-59.005561999999998,55.032767999999976],[-59.001944999999978,55.017769000000101],[-58.972495999999978,54.995544000000052],[-58.947220000000016,54.985550000000046],[-58.907218999999941,54.963882000000126],[-58.896950000000004,54.95638300000013],[-58.894164999999873,54.952773999999977],[-58.895279000000016,54.947769000000108],[-58.90055099999995,54.943878000000041],[-58.90694400000001,54.940269000000001],[-58.964721999999881,54.917496000000142],[-59.013061999999991,54.896103000000039],[-59.015556000000004,54.892220000000066],[-59.013618000000008,54.889717000000132],[-58.904167000000029,54.844711000000075],[-58.838332999999977,54.832497000000046],[-58.832503999999972,54.831940000000145],[-58.824172999999973,54.834434999999985],[-58.694442999999978,54.820549000000028],[-58.685271999999941,54.815543999999989],[-58.560828999999956,54.776100000000042],[-58.443610999999919,54.77388000000002],[-58.398887999999943,54.78472099999999],[-58.391944999999964,54.787498000000085],[-58.379997000000003,54.789993000000095],[-58.328056000000004,54.792496000000085],[-58.243331999999953,54.794716000000051],[-58.196663000000001,54.795272999999952],[-58.191108999999983,54.794158999999979],[-58.188332000000003,54.792496000000085],[-58.18721800000003,54.788605000000018],[-58.188605999999936,54.783051],[-58.19388600000002,54.777771000000087],[-58.196944999999971,54.773322999999948],[-58.198607999999979,54.767768999999987],[-58.184166000000005,54.751662999999951],[-58.173332000000016,54.745544000000109],[-58.145554000000004,54.739716000000044],[-58.110001000000011,54.737213000000054],[-58.001395999999943,54.73333000000008],[-57.945548999999971,54.739989999999977],[-57.935554999999965,54.741104000000121],[-57.910552999999936,54.74193600000001],[-57.855002999999954,54.737495000000081],[-57.847495999999921,54.735550000000103],[-57.842498999999918,54.731377000000009],[-57.831947000000014,54.71776600000004],[-57.789725999999916,54.68221299999999],[-57.78556100000003,54.679161000000079],[-57.713057999999933,54.643051000000128],[-57.700835999999981,54.637215000000083],[-57.693610999999976,54.634720000000073],[-57.676392000000021,54.630272000000105],[-57.660278000000005,54.628043999999932],[-57.642226999999991,54.628043999999932],[-57.626388999999961,54.629990000000021],[-57.577781999999956,54.638885000000073],[-57.574172999999973,54.640274000000034],[-57.569725000000005,54.644440000000145],[-57.567223000000013,54.648331000000042],[-57.559165999999948,54.655822999999998],[-57.545836999999949,54.661659000000043],[-57.539168999999902,54.662209000000075],[-57.456389999999999,54.650826000000052],[-57.450553999999954,54.649993999999936],[-57.444716999999969,54.647217000000069],[-57.355834999999956,54.590271000000087],[-57.352782999999874,54.587493999999992],[-57.347495999999921,54.579437000000041],[-57.346947,54.574714999999969],[-57.348610000000008,54.566940000000045],[-57.380828999999949,54.507499999999993],[-57.385276999999917,54.503326000000129],[-57.396949999999947,54.495827000000133],[-57.427222999999969,54.487770000000012],[-57.484726000000023,54.482491000000039],[-57.493057000000022,54.483330000000137],[-57.519447000000014,54.483879000000115],[-57.590836000000024,54.484160999999972],[-57.618056999999965,54.483604000000071],[-57.672774999999888,54.479988000000048],[-57.694999999999993,54.475548000000003],[-57.702224999999942,54.47304500000007],[-57.704169999999976,54.470543000000134],[-57.705275999999969,54.466933999999981],[-57.700554000000011,54.45915999999994],[-57.686942999999928,54.458885000000123],[-57.658332999999971,54.463051000000007],[-57.587775999999963,54.467208999999968],[-57.487777999999935,54.47304500000007],[-57.47222099999999,54.473602000000142],[-57.449996999999939,54.467491000000052],[-57.442497000000003,54.464996000000042],[-57.425277999999992,54.45915999999994],[-57.421111999999994,54.455826000000002],[-57.421669000000009,54.453605999999979],[-57.523330999999985,54.417213000000061],[-57.621666000000005,54.383605999999929],[-57.629439999999988,54.381660000000068],[-57.660827999999924,54.376937999999996],[-57.678336999999999,54.375267000000122],[-57.695273999999927,54.374992000000077],[-57.715552999999943,54.376937999999996],[-57.743056999999965,54.380821000000083],[-57.783332999999971,54.388329000000113],[-57.797226000000023,54.38888500000013],[-57.876105999999936,54.386658000000068],[-57.910278000000005,54.385269000000051],[-58.050277999999878,54.377487000000087],[-58.146392999999989,54.365273000000059],[-58.154166999999973,54.363327000000027],[-58.172501000000011,54.357498000000021],[-58.185271999999941,54.351661999999919],[-58.248055000000022,54.320274000000097],[-58.259726999999998,54.312766999999951],[-58.261947999999961,54.311104000000057],[-58.259170999999981,54.30971500000004],[-58.253333999999995,54.308884000000035],[-58.221107000000018,54.311661000000129],[-58.197495000000004,54.31638300000003],[-58.108337000000006,54.328049000000021],[-58.098609999999951,54.327217000000076],[-58.095832999999971,54.325828999999999],[-58.233886999999982,54.254166000000055],[-58.24722300000002,54.252777000000037],[-58.344161999999926,54.244438000000002],[-58.383056999999894,54.241104000000007],[-58.410278000000005,54.241661000000136],[-58.417220999999984,54.242493000000024],[-58.431388999999967,54.242218000000037],[-58.453888000000006,54.23721299999994],[-58.566108999999926,54.204163000000108],[-58.579169999999976,54.199996999999996],[-58.601394999999968,54.186104],[-58.611945999999989,54.178329000000076],[-58.628882999999973,54.169716000000108],[-58.6444469999999,54.165267999999969],[-58.692771999999991,54.151657],[-58.724715999999944,54.145271000000093],[-58.756949999999961,54.141106000000093],[-58.771110999999962,54.13999200000012],[-58.797782999999981,54.139717000000076],[-58.833611000000019,54.145827999999995],[-58.842773000000022,54.145827999999995],[-58.860001000000011,54.144714000000022],[-58.915276000000006,54.138603000000103],[-58.928336999999942,54.13638300000008],[-59.114165999999955,54.103881999999999],[-59.190551999999968,54.087212000000079],[-59.248336999999992,54.071937999999989],[-59.27944199999996,54.064438000000109],[-59.376105999999993,54.046943999999996],[-59.434440999999936,54.0472180000001],[-59.470275999999956,54.051659000000029],[-59.510001999999929,54.059433000000013],[-59.534446999999943,54.05832700000002],[-59.561385999999914,54.05332199999998],[-59.575561999999991,54.049438000000123],[-59.582221999999945,54.046387000000095],[-59.586945000000014,54.0430530000001],[-59.588608000000022,54.040549999999939],[-59.584723999999994,54.035271000000137],[-59.517220000000009,53.997214999999983],[-59.509726999999998,53.995544000000109],[-59.494445999999982,53.996383999999978],[-59.265839000000028,54.023048000000074],[-59.049445999999932,54.057495000000074],[-58.877220000000023,54.094993999999986],[-58.703055999999947,54.124161000000129],[-58.431113999999923,54.217209000000025],[-58.426392000000021,54.221931000000097],[-58.417502999999954,54.228043000000071],[-58.406386999999938,54.229713000000061],[-58.379439999999931,54.229988000000105],[-58.371940999999936,54.228043000000071],[-58.374442999999928,54.224434000000088],[-58.449722000000008,54.154434000000094],[-58.605003000000011,54.044158999999979],[-58.610282999999981,54.041663999999912],[-58.632499999999936,54.035271000000137],[-58.654998999999975,54.031661999999983],[-58.678054999999915,54.029160000000104],[-58.704445000000021,54.027214000000015],[-58.721663999999919,54.027489000000003],[-58.749167999999997,54.031105000000082],[-58.759170999999981,54.032767999999976],[-58.768058999999937,54.034995999999978],[-58.779723999999931,54.037773000000072],[-58.80750299999994,54.043327000000033],[-58.835830999999928,54.0472180000001],[-58.879997000000003,54.044998000000078],[-58.937499999999943,54.041663999999912],[-59.002501999999936,54.032494000000042],[-59.038611999999944,54.02693899999997],[-59.041388999999981,54.026100000000042],[-59.042777999999942,54.022766000000047],[-59.040557999999862,54.021751000000052],[-59.006950000000018,54.018051000000014],[-58.951942000000031,54.014717000000019],[-58.944159999999954,54.01527400000009],[-58.92583499999995,54.014717000000019],[-58.922500999999954,54.013885000000073],[-58.919448999999929,54.010826000000122],[-58.923057999999969,54.007216999999969],[-58.954169999999976,53.983879000000002],[-58.963057999999933,53.977767999999969],[-58.980826999999977,53.966385000000116],[-59.008338999999921,53.955268999999987],[-59.015838999999971,53.953323000000125],[-59.047782999999981,53.948326000000009],[-59.072226999999941,53.947487000000024],[-59.115279999999871,53.946381000000031],[-59.12222300000002,53.945267000000058],[-59.172774999999945,53.934990000000028],[-59.201392999999996,53.927489999999977],[-59.331946999999957,53.888329000000056],[-59.345551,53.883049000000142],[-59.363891999999908,53.872215000000097],[-59.369445999999982,53.867493000000024],[-59.393616000000009,53.8555530000001],[-59.43638599999997,53.837493999999992],[-59.463332999999977,53.830551000000014],[-59.480277999999998,53.82777400000009],[-59.527221999999995,53.822495000000117],[-59.543892000000028,53.8211060000001],[-59.596107000000018,53.819160000000011],[-59.62388599999997,53.82027400000004],[-59.635833999999988,53.820831000000112],[-59.698607999999979,53.829437000000041],[-59.716659999999933,53.831939999999975],[-59.728049999999996,53.835266000000047],[-59.755561999999941,53.838600000000042],[-59.798339999999939,53.843322999999998],[-59.807776999999874,53.84388000000007],[-59.825835999999981,53.842766000000097],[-59.852782999999988,53.839432000000102],[-59.872498000000007,53.833603000000096],[-59.877219999999966,53.83027600000014],[-59.880553999999961,53.825272000000041],[-59.989165999999955,53.779716000000121],[-60.082779000000016,53.762497000000053],[-60.121108999999933,53.625267000000065],[-60.11999499999996,53.611381999999992],[-60.11361699999992,53.602493000000095],[-60.110000999999954,53.598877000000073],[-60.105002999999954,53.594711000000132],[-60.087501999999915,53.583602999999982],[-60.068061999999998,53.573326000000009],[-60.064444999999978,53.569716999999969],[-60.063332000000003,53.565826000000072],[-60.064444999999978,53.560272000000111],[-60.069724999999949,53.555550000000039],[-60.075004999999919,53.553047000000049],[-60.133888000000013,53.528328000000101],[-60.138335999999981,53.528603000000089],[-60.347495999999978,53.626938000000109],[-60.358611999999994,53.634438000000046],[-60.361670999999944,53.639717000000019],[-60.364448999999979,53.648331000000042],[-60.368056999999965,53.652771000000087],[-60.382499999999936,53.662490999999989],[-60.390556000000004,53.665543000000071],[-60.503059000000007,53.705826000000116],[-60.511115999999959,53.708327999999995],[-60.560279999999977,53.718323000000112],[-60.648613000000012,53.737376999999981],[-60.670612000000006,53.740047000000061],[-60.705115999999975,53.744881000000021],[-60.75894900000003,53.761718999999971],[-60.769943000000012,53.765381000000104],[-60.856948999999986,53.792770000000019],[-60.887222000000008,53.751389000000074],[-60.880279999999914,53.713051000000007],[-60.834723999999937,53.721375000000023],[-60.757724999999994,53.713768000000016],[-60.747222999999963,53.71276499999999],[-60.654891999999961,53.698768999999913],[-60.644225999999946,53.696937999999989],[-60.537223999999924,53.678329000000019],[-60.511947999999961,53.669716000000051],[-60.446563999999967,53.644852000000128],[-60.431670999999994,53.639160000000118],[-60.360282999999981,53.606658999999979],[-60.354445999999996,53.603882000000112],[-60.342223999999931,53.596099999999979],[-60.334166999999979,53.589156999999943],[-60.323333999999988,53.581665000000044],[-60.298614999999927,53.568054000000075],[-60.278884999999946,53.558601000000067],[-60.253616000000022,53.549995000000138],[-60.103614999999934,53.500549000000092],[-60.106392000000028,53.457497000000046],[-60.123328999999956,53.456100000000106],[-60.138054000000011,53.453605999999979],[-60.202224999999999,53.433600999999953],[-60.40582999999998,53.364158999999972],[-60.413329999999974,53.357773000000009],[-60.412216000000001,53.349716000000058],[-60.404998999999975,53.334160000000111],[-60.395835999999974,53.331383000000017],[-60.391113000000018,53.331107999999972],[-60.301392000000021,53.336380000000133],[-60.230826999999977,53.343323000000112],[-60.216109999999901,53.345824999999991],[-60.203888000000006,53.349716000000058],[-60.198607999999865,53.350548000000003],[-60.188605999999993,53.350548000000003],[-60.18332700000002,53.349433999999974],[-60.176665999999898,53.346382000000062],[-60.175002999999947,53.343048000000067],[-60.174720999999977,53.338043000000027],[-60.180831999999896,53.329993999999999],[-60.190833999999938,53.321937999999932],[-60.202224999999999,53.313605999999936],[-60.208892999999989,53.310546999999985],[-60.283332999999914,53.289436000000137],[-60.295836999999949,53.286659000000043],[-60.333885000000009,53.280548000000124],[-60.367217999999923,53.27777100000003],[-60.389724999999999,53.27693899999997],[-60.418335000000013,53.269440000000145],[-60.416663999999969,53.268326000000002],[-60.398055999999997,53.265549000000078],[-60.316108999999926,53.264160000000061],[-60.289444000000003,53.263885000000073],[-60.133613999999966,53.283607000000131],[-60.024719000000005,53.354996000000142],[-59.953887999999949,53.406937000000028],[-59.931945999999925,53.42582700000014],[-59.84194199999996,53.476379000000065],[-59.821670999999981,53.471656999999993],[-59.806106999999997,53.471100000000092],[-59.798057999999969,53.472214000000065],[-59.789168999999958,53.474434000000088],[-59.785003999999958,53.477210999999954],[-59.783614999999998,53.481102000000021],[-59.78472899999997,53.485268000000133],[-59.799170999999944,53.491378999999995],[-59.823615999999959,53.49332400000003],[-59.858611999999994,53.496101000000124],[-59.89916999999997,53.516936999999928],[-59.901108000000022,53.519714000000022],[-59.898337999999967,53.52416199999999],[-59.893058999999994,53.528603000000089],[-59.875556999999958,53.534996000000035],[-59.855835000000013,53.536942000000124],[-59.847495999999978,53.536658999999986],[-59.80999799999995,53.529716000000008],[-59.773613000000012,53.517769000000044],[-59.763061999999934,53.515274000000034],[-59.755561999999941,53.514998999999989],[-59.740279999999984,53.515831000000105],[-59.621108999999933,53.527214000000129],[-59.605834999999956,53.529716000000008],[-59.560829000000012,53.540550000000053],[-59.53082999999998,53.548882000000049],[-59.517501999999979,53.553878999999938],[-59.478333000000021,53.572769000000108],[-59.329726999999991,53.65387700000008],[-59.162216000000001,53.671379000000115],[-59.079726999999934,53.680550000000096],[-59.074172999999917,53.683051999999975],[-59.023887999999999,53.713882000000012],[-59.01916499999993,53.719154000000117],[-59.010833999999932,53.744438000000116],[-59.010559000000001,53.746658000000139],[-59.018889999999999,53.749161000000129],[-59.035003999999958,53.74721500000004],[-59.041388999999981,53.748604],[-59.046111999999937,53.75277699999998],[-59.06527699999998,53.791107000000068],[-59.066390999999896,53.794998000000135],[-59.058334000000002,53.803322000000037],[-59.049445999999932,53.810822000000087],[-59.042777999999942,53.81499500000001],[-58.870276999999987,53.904709000000139],[-58.550277999999935,54.009163000000001],[-58.326110999999969,54.046271999999988],[-58.216942000000017,54.071770000000129],[-58.204612999999995,54.074604000000136],[-58.19377499999996,54.075939000000062],[-58.180446999999958,54.075436000000025],[-58.156780000000026,54.071434000000011],[-58.15060799999992,54.069438999999988],[-58.028610000000015,54.079720000000123],[-57.951942000000031,54.070831000000055],[-57.938605999999993,54.070273999999984],[-57.815552000000025,54.066101000000003],[-57.797501000000011,54.066101000000003],[-57.789443999999946,54.068603999999993],[-57.786391999999921,54.071662999999944],[-57.786117999999988,54.075271999999984],[-57.789443999999946,54.079720000000123],[-57.805556999999908,54.086654999999951],[-57.851668999999958,54.100273000000016],[-57.869720000000029,54.103050000000053],[-58.07650000000001,54.124489000000096],[-58.152495999999928,54.129158000000018],[-58.167163999999957,54.127827000000025],[-58.181503000000021,54.124660000000006],[-58.195830999999998,54.120159000000115],[-58.210834999999918,54.113995000000102],[-58.214668000000017,54.111828000000003],[-58.216994999999997,54.110493000000076],[-58.223000000000013,54.103992000000062],[-58.226832999999942,54.101826000000074],[-58.229831999999931,54.100822000000107],[-58.236834999999928,54.099327000000073],[-58.245166999999981,54.099158999999986],[-58.254332999999974,54.101322000000096],[-58.415276000000006,54.135269000000108],[-58.4183349999999,54.139717000000076],[-58.417220999999984,54.143051000000071],[-58.383613999999966,54.189712999999983],[-58.379439999999931,54.193877999999984],[-58.373885999999914,54.198326000000122],[-58.367500000000007,54.201934999999935],[-58.355559999999912,54.20638300000013],[-58.203613000000018,54.234161000000029],[-58.177779999999984,54.236938000000123],[-58.030829999999924,54.235550000000046],[-58.003058999999951,54.233879000000002],[-57.99361399999998,54.230819999999994],[-57.973609999999951,54.221656999999993],[-57.961112999999898,54.217766000000097],[-57.935271999999998,54.211662000000103],[-57.866660999999965,54.197769000000051],[-57.856392000000028,54.196098000000006],[-57.659163999999919,54.199432000000002],[-57.468329999999924,54.193877999999984],[-57.428336999999885,54.18249499999996],[-57.384170999999981,54.150543000000027],[-57.385559000000001,54.145827999999995],[-57.389998999999989,54.141106000000093],[-57.383613999999966,54.128875999999991],[-57.370833999999945,54.106384000000048],[-57.367774999999995,54.10193600000008],[-57.323333999999988,54.039719000000105],[-57.221106999999961,53.918326999999977],[-57.115279999999984,53.838600000000042],[-57.092773000000022,53.831664999999987],[-57.083611000000019,53.828605999999979],[-57.079726999999991,53.826660000000118],[-57.076392999999996,53.823051000000078],[-57.077498999999932,53.819442999999978],[-57.151389999999992,53.735824999999977],[-57.302498000000014,53.679161000000079],[-57.314720000000023,53.676383999999985],[-57.387504999999976,53.658325000000048],[-57.429169000000002,53.647491000000002],[-57.484169000000009,53.631660000000011],[-57.49111199999993,53.628876000000048],[-57.52305599999994,53.612495000000081],[-57.538894999999968,53.602218999999991],[-57.544448999999986,53.597771000000023],[-57.549995000000024,53.591934000000037],[-57.550551999999982,53.587494000000049],[-57.545279999999991,53.584717000000126],[-57.541114999999991,53.585266000000104],[-57.533332999999914,53.587494000000049],[-57.52777900000001,53.591377000000136],[-57.49361399999998,53.609436000000073],[-57.479720999999984,53.61332700000014],[-57.458054000000004,53.617493000000081],[-57.444716999999969,53.618599000000074],[-57.373610999999926,53.606658999999979],[-57.316665999999998,53.579720000000009],[-57.313613999999973,53.573608000000036],[-57.303054999999915,53.530823000000112],[-57.302498000000014,53.526382000000012],[-57.303329000000019,53.509437999999932],[-57.305557000000022,53.49971800000003],[-57.306664000000012,53.496384000000091],[-57.317779999999971,53.47554800000006],[-57.328887999999949,53.461937000000091],[-57.332503999999915,53.458328000000051],[-57.345832999999914,53.450546000000088],[-57.336945000000014,53.440269000000114],[-57.316390999999953,53.435822000000087],[-57.303329000000019,53.43332700000002],[-57.297501000000011,53.433052000000032],[-57.289169000000015,53.433875999999998],[-57.283332999999971,53.438598999999954],[-57.293616999999983,53.467766000000097],[-57.285277999999948,53.477485999999999],[-57.281386999999995,53.479430999999977],[-57.248610999999983,53.494156000000089],[-57.23750299999989,53.498604000000057],[-57.130279999999971,53.593880000000127],[-57.111389000000031,53.621658000000082],[-57.06138599999997,53.671379000000115],[-57.014724999999942,53.711380000000133],[-56.973610000000008,53.724434000000031],[-56.959442000000024,53.728325000000098],[-56.926391999999964,53.730270000000075],[-56.916663999999969,53.728600000000085],[-56.860832000000016,53.722488000000112],[-56.797226000000023,53.719986000000063],[-56.660827999999924,53.720543000000134],[-56.62222300000002,53.733604000000071],[-56.628608999999983,53.741936000000067],[-56.628333999999995,53.744156000000032],[-56.626105999999936,53.745827000000133],[-56.603332999999964,53.759163000000058],[-56.483611999999994,53.782494000000099],[-56.464691000000016,53.782272000000034],[-56.448333999999988,53.777771000000143],[-56.431670999999994,53.764442000000031],[-56.426948999999979,53.757216999999969],[-56.413886999999988,53.727768000000026],[-56.414443999999946,53.721931000000041],[-56.415275999999949,53.720543000000134],[-56.421669000000009,53.716933999999924],[-56.429169000000002,53.71527100000003],[-56.438048999999921,53.71527100000003],[-56.446944999999971,53.716933999999924],[-56.482773000000009,53.718048000000124],[-56.506393000000003,53.716933999999924],[-56.521666999999979,53.714714000000129],[-56.544448999999986,53.709717000000012],[-56.662215999999944,53.679993000000024],[-56.680283000000031,53.672768000000133],[-56.627220000000023,53.650826000000052],[-56.618057000000022,53.647491000000002],[-56.340552999999943,53.588325999999938],[-56.320281999999963,53.585266000000104],[-56.225554999999872,53.577217000000076],[-56.21665999999999,53.577217000000076],[-56.205832999999984,53.581665000000044],[-56.15582999999998,53.591660000000104],[-56.078613000000018,53.58387799999997],[-56.069167999999934,53.582771000000037],[-56.031386999999995,53.57638500000013],[-56.027221999999995,53.575272000000041],[-55.991385999999977,53.552216000000044],[-55.978881999999942,53.542221000000097],[-55.990836999999942,53.510277000000087],[-55.996947999999918,53.505272000000048],[-56.008780999999942,53.503666000000067],[-56.01294699999994,53.503993999999977],[-56.017444999999952,53.505996999999979],[-56.018611999999962,53.508495000000096],[-56.021110999999962,53.513054000000011],[-56.022498999999982,53.516388000000006],[-56.047501000000011,53.533607000000075],[-56.063332000000003,53.540833000000021],[-56.145836000000031,53.553047000000049],[-56.208892999999989,53.559433000000126],[-56.242500000000007,53.559990000000028],[-56.258338999999921,53.559158000000139],[-56.264724999999999,53.555550000000039],[-56.266113000000018,53.549995000000138],[-56.263335999999924,53.540276000000119],[-56.259170999999924,53.537773000000129],[-56.145553999999947,53.500000000000114],[-56.115279999999927,53.491936000000123],[-56.077498999999932,53.483330000000024],[-56.037780999999995,53.461655000000007],[-56.027442999999948,53.454326999999978],[-55.965552999999943,53.40915700000005],[-55.965836000000024,53.40554800000001],[-55.96944400000001,53.400542999999971],[-56.00417299999998,53.388045999999974],[-56.025275999999963,53.37971500000009],[-56.03167000000002,53.376099000000011],[-56.03833800000001,53.367493000000138],[-56.029998999999975,53.365273000000116],[-56.020835999999974,53.364158999999972],[-56.013061999999991,53.364440999999999],[-56.001396,53.366661000000022],[-55.988051999999982,53.369713000000104],[-55.981383999999935,53.373047000000099],[-55.969497999999874,53.380775000000028],[-55.959723999999937,53.390273999999977],[-55.953132999999923,53.392441000000019],[-55.938605999999936,53.395271000000037],[-55.925116999999943,53.396133000000134],[-55.912216000000001,53.394997000000103],[-55.893616000000009,53.389717000000076],[-55.881385999999964,53.382767000000001],[-55.808051999999975,53.340546000000018],[-55.807456999999943,53.284966000000111],[-55.745834000000002,53.249435000000119],[-55.747498000000007,53.143607999999972],[-55.749442999999985,53.139717000000076],[-55.754172999999923,53.134995000000004],[-55.833312999999919,53.097931000000017],[-55.879856000000018,53.073795000000018],[-55.91194200000001,53.028327999999988],[-55.926666000000012,53.023323000000119],[-55.934440999999936,53.021660000000054],[-55.943329000000006,53.021102999999925],[-55.964447000000007,53.021660000000054],[-55.990836999999942,53.024162000000103],[-56.008338999999978,53.02748900000006],[-56.025001999999972,53.033606999999961],[-56.034172000000012,53.036110000000122],[-56.056106999999997,53.038329999999974],[-56.160278000000005,53.033606999999961],[-56.165833000000021,53.032768000000033],[-56.166945999999996,53.029434000000037],[-56.165276000000006,53.024993999999992],[-56.040840000000003,53.005829000000062],[-55.958611000000019,52.99610100000001],[-55.949439999999981,52.994995000000017],[-55.889442000000031,52.969154000000117],[-55.885276999999974,52.966384999999946],[-55.834166999999979,52.921936000000017],[-55.80471799999998,52.877213000000097],[-55.803328999999962,52.839431999999931],[-55.803885999999977,52.831940000000031],[-55.808051999999975,52.82638500000013],[-55.841109999999958,52.827217000000019],[-55.879165999999941,52.824165000000107],[-55.973610000000008,52.810547000000099],[-55.987777999999992,52.806099000000131],[-56.060829000000012,52.766106000000093],[-55.964721999999938,52.681664000000069],[-55.96055599999994,52.679161000000136],[-55.950553999999897,52.677216000000101],[-55.933608999999933,52.675552000000096],[-55.918335000000013,52.677490000000034],[-55.874717999999973,52.68332700000002],[-55.786948999999993,52.683601000000124],[-55.779167000000029,52.682495000000074],[-55.77305599999994,52.679161000000136],[-55.768889999999942,52.674995000000024],[-55.740836999999999,52.646385000000009],[-55.73860899999994,52.64276899999993],[-55.739998000000014,52.639434999999935],[-55.757506999999919,52.614440999999999],[-55.769447000000014,52.608047000000113],[-55.792777999999998,52.60166200000009],[-55.888892999999996,52.608047000000113],[-55.898613000000012,52.609993000000031],[-55.939940999999976,52.628268999999989],[-55.958777999999995,52.635604999999941],[-56.032775999999956,52.654709000000025],[-56.048889000000031,52.656096999999932],[-56.075004999999919,52.655822999999998],[-56.108611999999937,52.655266000000097],[-56.122771999999941,52.651100000000042],[-56.123885999999857,52.647491000000002],[-56.119720000000029,52.643326000000002],[-56.112007000000006,52.641036999999983],[-56.099060000000009,52.641006000000118],[-56.071945000000028,52.644714000000135],[-56.06361400000003,52.644714000000135],[-56.054442999999992,52.643608000000086],[-55.982773000000009,52.622490000000028],[-55.974998000000028,52.619713000000104],[-55.970832999999914,52.615546999999992],[-55.972770999999966,52.610825000000091],[-55.985275000000001,52.602218999999991],[-56.039169000000015,52.584991000000059],[-56.155777,52.557438000000104],[-56.172611000000018,52.553608000000111],[-56.186110999999983,52.550938000000031],[-56.200779000000011,52.550938000000031],[-56.253058999999951,52.543884000000048],[-56.297500999999954,52.563606000000107],[-56.315552000000025,52.572219999999959],[-56.322501999999986,52.574715000000026],[-56.333327999999995,52.576942000000088],[-56.356391999999971,52.580276000000026],[-56.456389999999942,52.592765999999983],[-56.478607000000011,52.594437000000028],[-56.496871999999939,52.594147000000021],[-56.452782000000013,52.56888600000002],[-56.444160000000011,52.565826000000129],[-56.28055599999999,52.534996000000092],[-56.262221999999952,52.531662000000097],[-56.19755600000002,52.525105000000053],[-56.153556999999921,52.526103999999918],[-55.988892000000021,52.506386000000077],[-55.829726999999934,52.51249700000011],[-55.761390999999946,52.498878000000047],[-55.751395999999943,52.496101000000124],[-55.746947999999975,52.493881000000101],[-55.743057000000022,52.490829000000019],[-55.735001000000011,52.478599999999972],[-55.734169000000009,52.474709000000075],[-55.735832000000016,52.469154000000003],[-55.764450000000011,52.45388000000014],[-55.767501999999922,52.451103000000046],[-55.766395999999986,52.447769000000051],[-55.732772999999952,52.442215000000033],[-55.706107999999915,52.441658000000132],[-55.676666000000012,52.441658000000132],[-55.656661999999983,52.441933000000006],[-55.648612999999955,52.439712999999983],[-55.645554000000004,52.437492000000077],[-55.642775999999969,52.432770000000005],[-55.642775999999969,52.427773000000059],[-55.641669999999976,52.368881000000044],[-55.641944999999964,52.363883999999928],[-55.643332999999984,52.358330000000137],[-55.647780999999952,52.354164000000026],[-55.65444199999996,52.351661999999976],[-55.782501000000025,52.334160000000111],[-55.825004999999976,52.343048000000124],[-55.92861199999993,52.369438000000116],[-56.068335999999931,52.407210999999961],[-56.173614999999984,52.438881000000038],[-56.180556999999965,52.440826000000072],[-56.194442999999922,52.442215000000033],[-56.196945000000028,52.439987000000087],[-56.195273999999984,52.435822000000087],[-56.191382999999973,52.431107000000054],[-56.181388999999967,52.423050000000103],[-56.169448999999986,52.416100000000029],[-55.956664999999987,52.350272999999959],[-55.857779999999991,52.325271999999984],[-55.707222000000002,52.248329000000126],[-55.677222999999969,52.208327999999938],[-55.68638599999997,52.109436000000017],[-55.696945000000028,52.088326000000052],[-55.701667999999927,52.082214000000079],[-55.896666999999923,51.950828999999999],[-56.023330999999985,51.901932000000102],[-56.203330999999935,51.793326999999977],[-56.209723999999994,51.789719000000048],[-56.235832000000016,51.783607000000075],[-56.346663999999976,51.759720000000016],[-56.468886999999995,51.709434999999985],[-56.689720000000023,51.592216000000008],[-56.764450000000011,51.548607000000061],[-56.804169000000002,51.507773999999984],[-56.805832000000009,51.502219999999966],[-56.808891000000017,51.496384000000091],[-56.813613999999973,51.491661000000136],[-56.942771999999991,51.427489999999921],[-56.949721999999952,51.424713000000054],[-56.956947000000014,51.423050000000103],[-57.005561999999941,51.41944100000012],[-57.078056000000004,51.41443600000008],[-57.104239999999947,51.412674000000095],[-57.142226999999991,51.424164000000076],[-57.232215999999937,51.498604000000114],[-57.237777999999992,51.502219999999966],[-57.247222999999963,51.504166000000055],[-57.255561999999998,51.504439999999988],[-57.263617999999894,51.503608999999983],[-57.421386999999925,51.480545000000006],[-57.437774999999988,51.461105000000032],[-57.43638599999997,51.45638300000013],[-57.440833999999938,51.449997000000053],[-57.447495000000004,51.447487000000024],[-57.454720000000009,51.445541000000105],[-57.58666199999999,51.429718000000094],[-57.602225999999916,51.428047000000049],[-57.676665999999955,51.429993000000081],[-57.685828999999956,51.430824000000086],[-57.688605999999936,51.435547000000099],[-57.692497000000003,51.455268999999987],[-57.691939999999931,51.461105000000032],[-57.689437999999939,51.466385000000059],[-57.705275999999969,51.469437000000028],[-57.730826999999863,51.471099999999922],[-57.748054999999965,51.472214000000122],[-57.883888000000013,51.392493999999999],[-57.889998999999989,51.388885000000016],[-57.942771999999991,51.356102000000021],[-57.954720000000009,51.34804500000007],[-57.966110000000015,51.338599999999985],[-57.975554999999986,51.328330999999935],[-57.986664000000019,51.319442999999978],[-58.006950000000018,51.31249200000002],[-58.021384999999952,51.308884000000091],[-58.211387999999943,51.271659999999997],[-58.297225999999966,51.268599999999992],[-58.305556999999965,51.268599999999992],[-58.324448000000018,51.272217000000126],[-58.407776000000013,51.295547000000056],[-58.620551999999975,51.277214000000015],[-58.628051999999968,51.275551000000064],[-58.675003000000004,51.255271999999991],[-58.680000000000007,51.250000000000057],[-58.680556999999908,51.244156000000032],[-58.680000000000007,51.234161000000086],[-58.678336999999999,51.229431000000091],[-58.675559999999905,51.224991000000045],[-58.671111999999937,51.220824999999991],[-58.665549999999996,51.216934000000094],[-58.635833999999932,51.197769000000108],[-58.621383999999978,51.191100999999946],[-58.592223999999931,51.18471500000004],[-58.61333499999995,51.157494000000042],[-58.618606999999997,51.153046000000074],[-58.630554000000018,51.145828000000051],[-58.713615000000004,51.106102000000078],[-58.726944000000003,51.099998000000028],[-58.733329999999967,51.09804500000007],[-58.785278000000005,51.088042999999971],[-58.914718999999991,51.052490000000091],[-58.928054999999972,51.048607000000004],[-58.990836999999885,51.021935000000099],[-59.003333999999938,51.015549000000021],[-59.006110999999976,51.009719999999959],[-59.003616000000022,51.004440000000102],[-58.99888599999997,51.001106000000107],[-58.990279999999984,50.998046999999985],[-58.981383999999935,50.99721500000004],[-58.975272999999959,51.000832000000003],[-58.96832999999998,51.002495000000124],[-58.959441999999967,51.001663000000008],[-58.954720000000009,50.996658000000139],[-58.952498999999989,50.992493000000138],[-58.946662999999944,50.833878000000027],[-58.948051000000021,50.828331000000048],[-59.010559000000001,50.754166000000055],[-59.015282000000013,50.748604000000114],[-59.041672000000005,50.751389000000131],[-59.061385999999914,50.755554000000132],[-59.068335999999988,50.759163000000115],[-59.087218999999948,50.775268999999923],[-59.093055999999933,50.78943600000008],[-59.09444400000001,50.799438000000066],[-59.094718999999941,50.815269000000058],[-59.118889000000024,50.803604000000121],[-59.15582999999998,50.771103000000039],[-59.186385999999914,50.74221799999998],[-59.228881999999999,50.738327000000083],[-59.397223999999994,50.657211000000132],[-59.454444999999964,50.621933000000126],[-59.459723999999937,50.61721],[-59.51916499999993,50.552773000000002],[-59.570556999999951,50.493607000000054],[-59.580001999999922,50.482765000000029],[-59.585274000000027,50.478043000000127],[-59.591667000000029,50.475266000000033],[-59.598610000000008,50.473602000000028],[-59.733611999999937,50.444992000000013],[-59.778336000000024,50.438881000000094],[-59.803885999999977,50.438881000000094],[-59.810555000000022,50.437492000000134],[-59.816108999999926,50.433876000000055],[-59.821670999999981,50.429436000000067],[-59.872222999999963,50.381103999999993],[-59.881667999999934,50.371658000000025],[-59.881667999999934,50.366386000000091],[-59.858893999999964,50.329436999999984],[-59.853888999999924,50.326102999999989],[-59.844718999999998,50.324440000000095],[-59.837775999999963,50.326102999999989],[-59.834723999999881,50.338043000000084],[-59.834998999999982,50.343322999999998],[-59.830832999999984,50.349434000000088],[-59.824722000000008,50.351662000000033],[-59.815001999999993,50.349159000000043],[-59.813331999999946,50.344154000000003],[-59.817223000000013,50.33277099999998],[-59.827498999999989,50.323607999999979],[-59.833885000000009,50.319160000000011],[-59.860282999999981,50.310547000000042],[-59.905273000000022,50.291107000000068],[-60.005004999999983,50.248878000000104],[-60.114448999999922,50.233046999999942],[-60.147781000000009,50.274162000000103],[-60.184440999999993,50.279716000000121],[-60.236945999999989,50.268051000000014],[-60.291671999999949,50.245270000000005],[-60.298614999999927,50.243324000000143],[-60.324447999999961,50.244713000000104],[-60.360001000000011,50.250831999999946],[-60.404442000000017,50.251389000000074],[-60.458892999999989,50.251106000000107],[-60.48332999999991,50.250831999999946],[-60.491668999999945,50.250548999999978],[-60.498610999999926,50.248604],[-60.511672999999973,50.242493000000138],[-60.522223999999881,50.234718000000044],[-60.52694699999995,50.229156000000103],[-60.583611000000019,50.208327999999995],[-60.591666999999973,50.208046000000138],[-60.674445999999989,50.219986000000006],[-60.710555999999997,50.2227630000001],[-60.838607999999965,50.214995999999985],[-61.052222999999969,50.215546000000018],[-61.289443999999946,50.199158000000125],[-61.427779999999984,50.171379000000115],[-61.505561999999941,50.152489000000003],[-61.583610999999905,50.132492000000127],[-61.650832999999921,50.109993000000145],[-61.720832999999914,50.091934000000037],[-61.731612999999982,50.101936000000023],[-61.742106999999976,50.105270000000019],[-61.746277000000021,50.107269000000031],[-61.748280000000022,50.109940000000051],[-61.712104999999951,50.12226899999996],[-61.703780999999992,50.124771000000067],[-61.699443999999971,50.125435000000095],[-61.694442999999922,50.125435000000095],[-61.671386999999982,50.136940000000095],[-61.620551999999918,50.147491000000002],[-61.593055999999876,50.155266000000097],[-61.579726999999991,50.160820000000058],[-61.574447999999904,50.165543000000071],[-61.571945000000028,50.171661000000029],[-61.573891000000003,50.181664000000069],[-61.577224999999999,50.186104000000057],[-61.58916499999998,50.188880999999981],[-61.593612999999948,50.185546999999985],[-61.602225999999916,50.174438000000066],[-61.607779999999991,50.170829999999967],[-61.622222999999963,50.166100000000142],[-61.731833999999935,50.144268000000125],[-61.746997999999905,50.144431999999995],[-61.757503999999983,50.14527099999998],[-61.761832999999967,50.147269999999992],[-61.763663999999949,50.149768999999992],[-61.762999999999977,50.153271000000018],[-61.760665999999958,50.157097000000078],[-61.794448999999986,50.159431000000097],[-61.795279999999991,50.169991000000039],[-61.796950999999979,50.174713000000111],[-61.804442999999992,50.183326999999963],[-61.848884999999996,50.222488000000112],[-61.864723000000026,50.228600000000085],[-61.898338000000024,50.233604000000071],[-61.907218999999941,50.234160999999972],[-61.963332999999977,50.236107000000004],[-61.977218999999991,50.231934000000081],[-61.989723000000026,50.226379000000009],[-61.996666000000005,50.224158999999986],[-62.004172999999923,50.223045000000013],[-62.202498999999989,50.23443600000013],[-62.268889999999999,50.259720000000129],[-62.317779999999971,50.281380000000127],[-62.328056000000004,50.283882000000006],[-62.397498999999982,50.294441000000063],[-62.404167000000029,50.29222100000004],[-62.415549999999939,50.28472099999999],[-62.425560000000019,50.275269000000037],[-62.42999999999995,50.269714000000135],[-62.439994999999954,50.260551000000135],[-62.446105999999986,50.257500000000107],[-62.572226999999941,50.274712000000136],[-62.746947999999918,50.28472099999999],[-63.112502999999947,50.291382000000112],[-63.158332999999971,50.260277000000031],[-63.159163999999976,50.25471500000009],[-63.228607000000011,50.234718000000044],[-63.236663999999962,50.23443600000013],[-63.371940999999993,50.236655999999982],[-63.469443999999953,50.257216999999969],[-63.565552000000025,50.264159999999947],[-63.616660999999908,50.266663000000108],[-63.649726999999928,50.272766000000047],[-63.687499999999886,50.282494000000099],[-63.693885999999964,50.291939000000013],[-63.698607999999979,50.295272999999952],[-63.707503999999972,50.297775000000058],[-63.803328999999906,50.311661000000015],[-63.821388000000013,50.312209999999993],[-63.976104999999961,50.305549999999982],[-64.067229999999995,50.29222100000004],[-64.127776999999924,50.271935000000042],[-64.140563999999927,50.266937000000041],[-64.154175000000009,50.262497000000053],[-64.162215999999944,50.262214999999969],[-64.215285999999935,50.264999000000103],[-64.234726000000023,50.266937000000041],[-64.262787000000003,50.271660000000054],[-64.365279999999984,50.29222100000004],[-64.37388599999997,50.294998000000135],[-64.402221999999995,50.307495000000131],[-64.417770000000019,50.313048999999921],[-64.436661000000015,50.317772000000105],[-64.446105999999986,50.319160000000011],[-64.455001999999922,50.319442999999978],[-64.46305799999999,50.319160000000011],[-64.470839999999953,50.317772000000105],[-64.510009999999966,50.303046999999992],[-64.611938000000009,50.281380000000127],[-64.628052000000025,50.279160000000104],[-64.659438999999963,50.277214000000015],[-64.725006000000008,50.274436999999978],[-64.899993999999936,50.270828000000108],[-65.180557000000022,50.28555300000005],[-65.189986999999917,50.2866590000001],[-65.222777999999948,50.297775000000058],[-65.237503000000004,50.303879000000052],[-65.242492999999854,50.307769999999948],[-65.275009000000011,50.308044000000052],[-65.464447000000007,50.299437999999952],[-65.486663999999962,50.295272999999952],[-65.521666999999979,50.285828000000095],[-65.589995999999985,50.275269000000037],[-65.690552000000025,50.261108000000036],[-65.747771999999998,50.256943000000035],[-65.829453000000001,50.253326000000072],[-65.845839999999953,50.258888000000013],[-65.864440999999999,50.26888300000013],[-65.876389000000017,50.276382000000126],[-65.898055999999883,50.284995999999978],[-65.918059999999969,50.288329999999974],[-65.952498999999932,50.288887000000045],[-65.974166999999966,50.283882000000006],[-65.986937999999896,50.278328000000045],[-65.993057000000022,50.275269000000037],[-66.004180999999903,50.268326000000059],[-66.024718999999948,50.251389000000074],[-66.043334999999956,50.222214000000008],[-66.083327999999995,50.193603999999937],[-66.089721999999881,50.191375999999991],[-66.163329999999974,50.197212000000036],[-66.314163000000008,50.209717000000012],[-66.406386999999938,50.239989999999977],[-66.40695199999999,50.245270000000005],[-66.412215999999944,50.260551000000135],[-66.416945999999996,50.264442000000031],[-66.423049999999932,50.267768999999987],[-66.433318999999983,50.269714000000135],[-66.441665999999941,50.269157000000064],[-66.456389999999999,50.26638800000012],[-66.469727000000034,50.261939999999981],[-66.494720000000029,50.249435000000005],[-66.511948000000018,50.239158999999972],[-66.700835999999924,50.102493000000095],[-66.723327999999924,50.078331000000048],[-66.861937999999896,50.022491000000116],[-66.882492000000013,50.016662999999994],[-66.896118000000001,50.011940000000038],[-66.920273000000009,50.000275000000101],[-66.942489999999907,49.985825000000034],[-66.958617999999944,49.974709000000075],[-66.963622999999984,49.969154000000003],[-66.966399999999965,49.963326000000052],[-66.975280999999995,49.943603999999993],[-66.975829999999974,49.937767000000065],[-66.965560999999923,49.919441000000063],[-66.963332999999977,49.914711000000011],[-67.016402999999855,49.854712999999947],[-67.061385999999857,49.841377000000023],[-67.065276999999924,49.845543000000077],[-67.073897999999929,49.848045000000013],[-67.095839999999896,49.843605000000139],[-67.115829000000019,49.836655000000121],[-67.121658000000025,49.833327999999995],[-67.137222000000008,49.821381000000031],[-67.146666999999979,49.812492000000134],[-67.151397999999915,49.806937999999946],[-67.162216000000001,49.79055000000011],[-67.174164000000019,49.764717000000132],[-67.238892000000021,49.590546000000074],[-67.240828999999962,49.578880000000083],[-67.241378999999995,49.56749700000006],[-67.240828999999962,49.556655999999975],[-67.239990000000034,49.551659000000029],[-67.235000999999954,49.53555300000005],[-67.228881999999999,49.510277000000031],[-67.229171999999949,49.483047000000113],[-67.230834999999956,49.476936000000023],[-67.233886999999982,49.47026800000009],[-67.369155999999975,49.332771000000037],[-67.375,49.327217000000019],[-67.386123999999995,49.322220000000073],[-67.402785999999878,49.3211060000001],[-67.420273000000009,49.321663000000001],[-67.438599000000011,49.324440000000095],[-67.473617999999988,49.326660000000118],[-67.569732999999985,49.329994000000113],[-67.577498999999989,49.329163000000108],[-67.706389999999999,49.312767000000065],[-67.939163000000008,49.287773000000129],[-67.975280999999995,49.284996000000035],[-68.119720000000029,49.271660000000054],[-68.127212999999983,49.269440000000031],[-68.131942999999922,49.266106000000093],[-68.136397999999929,49.260550999999964],[-68.138900999999919,49.25471500000009],[-68.140563999999927,49.248604000000057],[-68.143889999999885,49.23054500000012],[-68.180832000000009,49.12193300000007],[-68.184997999999894,49.116104000000064],[-68.189712999999927,49.112212999999997],[-68.194992000000013,49.10833000000008],[-68.201110999999912,49.105552999999986],[-68.221663999999976,49.100273000000072],[-68.369445999999982,49.069443000000035],[-68.442489999999964,49.095543000000077],[-68.571395999999993,49.061104],[-68.59056099999998,49.054161000000022],[-68.606948999999929,49.042496000000142],[-68.626099000000011,49.023880000000133],[-68.696380999999974,48.939987000000087],[-68.876937999999996,48.85193600000008],[-69.047775000000001,48.773048000000074],[-69.06082200000003,48.767494000000056],[-69.064437999999996,48.762496999999996],[-69.084732000000031,48.72165700000005],[-69.089446999999893,48.709435000000042],[-69.093612999999948,48.691933000000006],[-69.096114999999941,48.674995000000138],[-69.099441999999897,48.663322000000107],[-69.106109999999944,48.644996999999989],[-69.111937999999896,48.63249200000007],[-69.123885999999914,48.614716000000101],[-69.142501999999922,48.594994000000042],[-69.14805599999994,48.591102999999976],[-69.15972899999997,48.58526599999999],[-69.166397000000018,48.583328000000051],[-69.184158000000025,48.584717000000069],[-69.201675000000023,48.588599999999985],[-69.218612999999948,48.589713999999958],[-69.226669000000015,48.588882000000069],[-69.231383999999935,48.585548000000074],[-69.236388999999917,48.581108000000029],[-69.265288999999939,48.541663999999969],[-69.279448999999943,48.515831000000048],[-69.282776000000013,48.504166000000112],[-69.283324999999934,48.493049999999982],[-69.282500999999968,48.482490999999982],[-69.292770000000019,48.457771000000093],[-69.301102000000014,48.446655000000135],[-69.432769999999948,48.307770000000005],[-69.437774999999988,48.303047000000049],[-69.454726999999991,48.291939000000013],[-69.597777999999948,48.207497000000046],[-69.672775000000001,48.14388300000013],[-69.683884000000035,48.137772000000041],[-69.691375999999991,48.137496999999996],[-69.80082699999997,48.153603000000032],[-69.810271999999941,48.155822999999998],[-69.734725999999966,48.113609000000054],[-69.730285999999978,48.10943600000013],[-69.732498000000021,48.103607000000125],[-69.786391999999864,47.994713000000047],[-69.839447000000007,47.907210999999961],[-69.925827000000027,47.773048000000074],[-69.93582200000003,47.764441999999974],[-70.002227999999945,47.711936999999978],[-70.015563999999983,47.702773999999977],[-70.071945000000028,47.674713000000054],[-70.077498999999989,47.672493000000088],[-70.091109999999958,47.669159000000093],[-70.132767000000001,47.644996999999989],[-70.179992999999968,47.608330000000024],[-70.190276999999924,47.599159000000043],[-70.202498999999989,47.583053999999947],[-70.206116000000009,47.576660000000118],[-70.208343999999897,47.570549000000028],[-70.209441999999967,47.553879000000109],[-70.207503999999915,47.533051],[-70.208618000000001,47.527214000000072],[-70.217223999999931,47.508330999999998],[-70.225554999999929,47.496384000000035],[-70.2308349999999,47.492493000000138],[-70.299727999999959,47.466933999999924],[-70.341674999999952,47.460548000000017],[-70.461944999999901,47.429993000000024],[-70.502501999999993,47.390830999999991],[-70.555831999999953,47.322769000000108],[-70.56639100000001,47.304161000000022],[-70.568618999999956,47.298049999999932],[-70.571120999999948,47.281104999999968],[-70.574172999999973,47.274437000000034],[-70.586120999999991,47.257773999999927],[-70.699431999999945,47.126099000000011],[-70.721664000000033,47.101387000000102],[-70.733063000000016,47.095543000000134],[-70.792496000000028,47.068329000000119],[-70.817504999999926,47.058884000000035],[-70.823623999999938,47.056938000000002],[-70.866942999999935,47.051383999999985],[-70.893341000000021,47.045273000000066],[-70.923049999999932,47.032211000000075],[-70.973617999999988,47.003326000000015],[-71.113616999999863,46.912491000000045],[-71.182495000000017,46.864158999999972],[-71.197495000000004,46.852493000000038],[-71.198607999999979,46.846382000000119],[-71.299164000000019,46.742218000000094],[-71.291945999999996,46.744156000000032],[-71.279723999999931,46.749161000000072],[-71.209441999999967,46.782494000000099],[-71.19888299999991,46.788887000000045],[-71.188888999999961,46.796661000000029],[-71.184432999999956,46.802773000000059],[-71.178329000000019,46.815269000000114],[-71.166396999999904,46.831108000000029],[-71.156112999999948,46.838882000000069],[-71.149993999999936,46.842491000000052],[-71.143615999999952,46.844711000000075],[-71.130554000000018,46.847487999999998],[-71.115279999999984,46.84887700000013],[-71.100280999999995,46.84887700000013],[-71.083327999999995,46.847487999999998],[-70.986937999999952,46.854164000000083],[-70.772232000000031,46.915825000000041],[-70.766402999999912,46.918884000000048],[-70.755004999999983,46.936652999999978],[-70.744445999999925,46.943320999999912],[-70.737502999999947,46.946098000000006],[-70.638061999999991,46.981658999999979],[-70.618880999999931,46.988045000000056],[-70.604996000000028,46.990273000000059],[-70.575012000000015,46.993324000000086],[-70.553328999999962,46.998047000000042],[-70.541381999999942,47.00249500000001],[-70.530288999999925,47.007773999999984],[-70.506957999999997,47.02027099999998],[-70.486389000000031,47.033607000000131],[-70.461120999999935,47.053604000000007],[-70.334166999999923,47.15554800000001],[-70.310271999999941,47.176659000000086],[-70.273055999999997,47.213608000000136],[-70.111114999999984,47.340546000000131],[-70.078888000000006,47.361106999999947],[-70.048888999999974,47.386107999999979],[-70.044158999999922,47.390830999999991],[-70.040833000000021,47.397217000000069],[-70.039992999999868,47.402771000000087],[-69.967498999999975,47.505829000000062],[-69.90194699999995,47.537216000000001],[-69.896392999999932,47.541107000000068],[-69.805832000000009,47.613052000000096],[-69.65943900000002,47.744713000000104],[-69.639998999999875,47.762772000000041],[-69.593063000000029,47.808884000000091],[-69.556655999999862,47.856384000000048],[-69.556380999999931,47.866661000000022],[-69.544158999999979,47.883605999999986],[-69.526672000000019,47.90415999999999],[-69.508057000000008,47.924438000000009],[-69.498885999999857,47.933875999999998],[-69.469727000000034,47.961937000000091],[-69.450561999999991,47.979155999999989],[-69.429169000000002,47.995270000000119],[-69.418335000000013,48.001389000000131],[-69.411666999999966,48.003326000000015],[-69.275283999999942,48.067772000000048],[-69.11610399999995,48.178604000000064],[-69.101943999999946,48.192764000000125],[-69.08666999999997,48.204994000000056],[-69.054168999999888,48.228600000000142],[-69.016402999999968,48.254165999999998],[-68.968613000000005,48.279990999999995],[-68.940552000000025,48.294998000000021],[-68.831679999999892,48.344711000000132],[-68.695267000000001,48.396385000000123],[-68.541381999999999,48.451385000000016],[-68.529448999999943,48.457214000000022],[-68.519164999999987,48.464157],[-68.513061999999877,48.469437000000084],[-68.496947999999918,48.490273000000116],[-68.473891999999978,48.515549000000135],[-68.469161999999869,48.520271000000037],[-68.453613000000018,48.532494000000099],[-68.434433000000013,48.541663999999969],[-68.422501000000011,48.545272999999952],[-68.407776000000013,48.548050000000046],[-68.375823999999852,48.546386999999925],[-68.368606999999997,48.547493000000145],[-68.354445999999996,48.551384000000041],[-68.348342999999886,48.554161000000136],[-68.336670000000026,48.561661000000015],[-68.283324999999991,48.600273000000016],[-68.236937999999952,48.625549000000035],[-68.211120999999935,48.636658000000125],[-68.193328999999892,48.643051000000071],[-68.179168999999945,48.646660000000111],[-68.15695199999999,48.64916199999999],[-68.125548999999978,48.648330999999985],[-68.111938000000009,48.651382000000012],[-67.973617999999988,48.695541000000105],[-67.709441999999854,48.793884000000105],[-67.531386999999995,48.859160999999972],[-67.209732000000031,48.935822000000087],[-67.087783999999999,48.960823000000119],[-67.067504999999983,48.966933999999981],[-67.015838999999971,48.986938000000123],[-66.991669000000002,48.999160999999958],[-66.960830999999985,49.011940000000038],[-66.922775000000001,49.026657000000057],[-66.916397000000018,49.028877000000023],[-66.722503999999958,49.08998900000006],[-66.421660999999915,49.162765999999976],[-66.306106999999997,49.186935000000119],[-66.225005999999951,49.200829000000056],[-66.089172000000019,49.218597000000045],[-66.074172999999973,49.219711000000018],[-65.832503999999915,49.231377000000009],[-65.678328999999962,49.245543999999995],[-65.496947999999975,49.261664999999994],[-65.447219999999959,49.262215000000026],[-65.394454999999994,49.259719999999959],[-65.359726000000023,49.256660000000124],[-64.996947999999918,49.220267999999919],[-64.916655999999989,49.20665699999995],[-64.825561999999934,49.187767000000008],[-64.805831999999953,49.18332700000002],[-64.795273000000009,49.176102000000128],[-64.791945999999939,49.171661000000029],[-64.774718999999948,49.159987999999998],[-64.763335999999924,49.154160000000047],[-64.748885999999914,49.148048000000074],[-64.731948999999986,49.142220000000009],[-64.660827999999867,49.123047000000042],[-64.641112999999962,49.118880999999988],[-64.606658999999922,49.117210000000114],[-64.58805799999999,49.112212999999997],[-64.376388999999961,48.997771999999998],[-64.235549999999989,48.910271000000023],[-64.221663999999976,48.898331000000098],[-64.21444699999995,48.889434999999992],[-64.208892999999989,48.880547000000035],[-64.152221999999938,48.764999000000046],[-64.152495999999985,48.759995000000117],[-64.158050999999944,48.75610400000005],[-64.167769999999962,48.758331000000055],[-64.208892999999989,48.782767999999976],[-64.213332999999977,48.786659000000043],[-64.229995999999971,48.797493000000088],[-64.244155999999975,48.803604000000007],[-64.290282999999931,48.821106000000043],[-64.298889000000031,48.823883000000137],[-64.315552000000025,48.828880000000026],[-64.377212999999927,48.846382000000062],[-64.395844000000011,48.851105000000075],[-64.512222000000008,48.87471000000005],[-64.530562999999916,48.87721300000004],[-64.548888999999917,48.878326000000072],[-64.543335000000013,48.873604],[-64.532775999999956,48.866936000000067],[-64.464447000000007,48.824440000000038],[-64.374161000000015,48.787773000000016],[-64.266662999999994,48.713326000000109],[-64.256957999999997,48.706099999999992],[-64.173049999999932,48.639435000000049],[-64.16194200000001,48.627487000000031],[-64.160004000000015,48.622765000000129],[-64.166945999999996,48.621376000000112],[-64.193053999999961,48.623604000000057],[-64.24110399999995,48.622215000000097],[-64.255004999999926,48.618599000000017],[-64.260833999999875,48.615828999999962],[-64.265288999999996,48.610825000000034],[-64.269729999999981,48.604713000000061],[-64.274718999999948,48.592766000000097],[-64.280563000000029,48.575271999999984],[-64.282500999999911,48.569160000000011],[-64.283324999999877,48.563605999999993],[-64.279174999999952,48.554161000000136],[-64.273330999999928,48.550545000000056],[-64.264174999999909,48.549164000000019],[-64.245834000000002,48.546661000000086],[-64.219161999999983,48.528327999999988],[-64.246384000000035,48.488044999999943],[-64.322509999999852,48.437210000000107],[-64.426392000000021,48.404160000000047],[-64.493057000000022,48.394440000000145],[-64.506667999999991,48.391663000000051],[-64.586945000000014,48.36832400000003],[-64.68638599999997,48.338326000000109],[-64.731383999999878,48.274712000000022],[-64.750290000000007,48.245827000000133],[-64.753890999999953,48.239989999999977],[-64.760559000000001,48.227211000000125],[-64.768065999999976,48.202774000000034],[-64.771392999999989,48.196381000000088],[-64.778610000000015,48.19499200000007],[-64.87332200000003,48.180550000000096],[-64.931670999999994,48.171661000000029],[-64.972503999999958,48.135269000000051],[-65.15306099999998,48.052216000000044],[-65.196654999999964,48.033607000000075],[-65.202788999999996,48.031380000000013],[-65.270003999999972,48.012771999999984],[-65.305832000000009,48.005554000000132],[-65.326950000000011,48.002220000000136],[-65.455565999999976,48.000274999999988],[-65.463897999999972,48.002777000000037],[-65.472778000000005,48.011383000000137],[-65.478607000000011,48.019714000000079],[-65.484726000000023,48.033882000000119],[-65.491104000000007,48.042496000000142],[-65.504181000000017,48.048882000000049],[-65.689162999999951,48.093879999999956],[-65.764449999999897,48.109993000000031],[-65.888900999999919,48.199158000000011],[-65.904175000000009,48.205826000000002],[-65.949996999999939,48.191101000000003],[-65.956389999999999,48.188881000000038],[-66.006957999999997,48.159156999999993],[-66.024718999999948,48.139160000000118],[-66.129714999999919,48.107216000000108],[-66.242767000000015,48.109161000000086],[-66.396392999999932,48.114998000000071],[-66.406386999999938,48.116385999999977],[-66.432495000000017,48.118599000000131],[-66.47084000000001,48.119438000000059],[-66.477782999999988,48.118049999999982],[-66.484160999999972,48.115546999999992],[-66.495543999999995,48.10943600000013],[-66.506392999999946,48.102218999999991],[-66.52555799999999,48.085548000000017],[-66.529998999999918,48.080551000000071],[-66.667220999999984,48.028328000000101],[-66.673614999999984,48.026099999999985],[-66.763717999999983,48.00622599999997],[-66.843703999999946,47.996650999999986],[-66.842498999999975,47.992218000000037],[-66.83666999999997,47.988884000000041],[-66.828888000000006,47.98721299999994],[-66.749999999999943,47.979988000000105],[-66.728881999999942,47.984436000000073],[-66.610824999999977,48.011107999999979],[-66.584731999999974,48.019440000000145],[-66.573333999999988,48.025826000000052],[-66.540558000000033,48.036385000000109],[-66.434433000000013,48.067497000000003],[-66.420273000000009,48.070549000000085],[-66.364165999999955,48.073326000000009],[-66.356658999999922,48.073326000000009],[-66.350829999999917,48.069717000000026],[-66.349990999999932,48.06471300000004],[-66.259170999999981,47.999435000000119],[-66.042220999999984,47.935822000000087],[-65.988892000000021,47.923881999999992],[-65.970276000000013,47.92083000000008],[-65.936935000000005,47.92083000000008],[-65.922225999999966,47.922768000000019],[-65.90695199999999,47.923325000000091],[-65.880279999999914,47.920547000000113],[-65.843886999999995,47.911377000000073],[-65.818619000000012,47.903877000000023],[-65.811385999999914,47.900825999999995],[-65.793609999999944,47.890831000000048],[-65.772780999999952,47.876380999999924],[-65.757506999999976,47.865273000000116],[-65.746383999999978,47.852775999999949],[-65.725005999999894,47.82749199999995],[-65.718613000000005,47.818886000000077],[-65.714447000000007,47.809433000000013],[-65.713622999999984,47.804161000000079],[-65.696944999999971,47.733047000000113],[-65.671936000000017,47.645828000000051],[-65.667770000000019,47.641380000000083],[-65.634734999999978,47.62082700000002],[-65.628326000000015,47.623046999999985],[-65.389998999999989,47.736107000000004],[-65.332779000000016,47.766937000000041],[-65.253890999999953,47.801659000000029],[-65.240829000000019,47.806655999999975],[-65.202788999999996,47.818603999999993],[-65.167496000000028,47.825271999999984],[-65.044723999999974,47.844436999999914],[-65.020844000000011,47.844993999999986],[-64.985000999999954,47.84137700000008],[-64.815552000000025,47.811104000000114],[-64.805557000000022,47.808884000000091],[-64.797226000000023,47.806381000000101],[-64.719161999999983,47.764441999999974],[-64.713332999999977,47.761108000000036],[-64.676665999999955,47.735550000000103],[-64.670273000000009,47.726936000000023],[-64.67332499999992,47.720268000000033],[-64.679442999999992,47.716659999999933],[-64.703612999999905,47.706940000000031],[-64.803328999999962,47.630547000000092],[-64.859725999999966,47.576660000000118],[-64.870093999999995,47.536293000000057],[-64.87110899999999,47.515831000000048],[-64.870270000000005,47.510826000000009],[-64.875548999999978,47.460823000000062],[-64.880828999999949,47.432495000000074],[-64.886397999999986,47.414154000000053],[-64.910004000000015,47.353049999999996],[-65.138061999999991,47.192215000000033],[-65.226944000000003,47.140831000000048],[-65.238327000000027,47.134720000000129],[-65.263335999999924,47.124435000000005],[-65.339721999999938,47.099433999999974],[-65.364165999999955,47.089714000000072],[-65.369994999999903,47.086655000000121],[-65.365279999999871,47.082771000000093],[-65.218886999999881,47.053604000000007],[-65.101105000000018,47.076942000000088],[-65.017226999999934,47.091377000000023],[-64.805557000000022,47.083054000000061],[-64.798614999999927,47.079993999999999],[-64.802779999999927,46.993049999999926],[-64.803328999999962,46.987495000000024],[-64.807220000000029,46.981658999999979],[-64.812209999999993,46.977768000000083],[-64.818068999999923,46.9741590000001],[-64.835830999999985,46.965827999999988],[-64.857223999999974,46.95277399999992],[-64.871933000000013,46.939430000000016],[-64.880279999999914,46.930549999999982],[-64.892226999999991,46.91443600000008],[-64.896117999999944,46.908882000000062],[-64.89916999999997,46.902489000000116],[-64.904998999999975,46.883606000000043],[-64.906386999999995,46.872490000000084],[-64.904998999999975,46.851105000000132],[-64.903609999999901,46.840827999999931],[-64.877212999999983,46.791107000000068],[-64.863891999999964,46.774436999999921],[-64.818068999999923,46.72165700000005],[-64.748610999999983,46.702773999999977],[-64.740279999999984,46.70249200000012],[-64.726394999999911,46.696381000000031],[-64.72084000000001,46.693047000000035],[-64.713332999999977,46.684158000000139],[-64.711120999999991,46.679993000000138],[-64.708617999999944,46.669991000000039],[-64.705001999999979,46.638329000000056],[-64.67332499999992,46.500832000000003],[-64.66194200000001,46.468048000000124],[-64.650833000000034,46.460548000000074],[-64.621933000000013,46.427216000000101],[-64.613616999999977,46.414435999999966],[-64.611938000000009,46.409714000000065],[-64.615004999999996,46.392494000000113],[-64.613051999999982,46.366104000000064],[-64.504181000000017,46.240273000000002],[-64.402221999999995,46.233047000000056],[-64.237503000000004,46.229155999999989],[-64.116942999999935,46.181938000000059],[-64.035552999999993,46.182213000000104],[-63.970832999999914,46.180549999999982],[-63.954444999999964,46.178046999999992],[-63.830283999999949,46.146385000000066],[-63.822226999999998,46.14388299999996],[-63.776389999999935,46.121101000000067],[-63.77305599999994,46.117493000000138],[-63.771111000000019,46.112769999999955],[-63.772498999999868,46.108046999999999],[-63.776947000000007,46.103325000000098],[-63.783057999999983,46.099716000000058],[-63.799445999999989,46.091377000000023],[-63.805557000000022,46.089157000000057],[-63.886391000000003,46.06082200000003],[-63.892501999999922,46.058884000000091],[-63.919448999999929,46.053047000000106],[-63.926948999999922,46.052490000000034],[-63.988608999999997,46.051933000000133],[-64.023330999999985,46.057495000000074],[-64.06806899999998,46.059433000000013],[-64.072509999999966,46.054710000000057],[-64.093886999999995,46.021659999999997],[-64.065001999999879,46.004715000000033],[-64.042785999999978,45.991898000000049],[-64.012512000000015,46.005829000000006],[-64.005279999999914,46.005554000000018],[-63.913054999999986,45.979987999999935],[-63.864166000000012,45.961105000000032],[-63.859443999999996,45.951934999999992],[-63.861389000000031,45.94582400000013],[-63.846106999999961,45.930824000000143],[-63.714721999999995,45.840546000000074],[-63.669998000000021,45.818054000000018],[-63.664161999999976,45.815268999999944],[-63.645836000000031,45.833328000000051],[-63.631667999999991,45.859436000000017],[-63.600280999999995,45.869986999999924],[-63.580558999999937,45.874435000000119],[-63.482498000000021,45.877213000000097],[-63.474441999999954,45.876938000000052],[-63.457221999999888,45.874160999999958],[-63.420279999999934,45.864997999999957],[-63.406661999999926,45.858887000000095],[-63.403884999999946,45.854439000000127],[-63.42861199999993,45.823607999999979],[-63.434440999999936,45.820831000000112],[-63.441108999999926,45.819442999999978],[-63.456107999999972,45.818886000000077],[-63.488051999999925,45.820831000000112],[-63.513335999999981,45.82416500000005],[-63.520835999999974,45.823883000000023],[-63.525832999999977,45.819992000000127],[-63.52666499999998,45.814438000000109],[-63.523612999999898,45.809989999999971],[-63.515556000000004,45.807213000000047],[-63.506950000000018,45.805824000000086],[-63.433608999999933,45.799438000000009],[-63.425560000000019,45.799164000000076],[-63.34332999999998,45.797492999999974],[-63.328338999999971,45.79833200000013],[-63.287223999999981,45.805549999999982],[-63.281113000000005,45.807769999999948],[-63.274170000000026,45.808883999999978],[-63.251113999999973,45.809714999999983],[-63.235000999999954,45.80860100000001],[-63.229439000000013,45.804993000000081],[-63.233329999999967,45.799438000000009],[-63.238892000000021,45.796386999999982],[-63.313889000000017,45.769440000000031],[-63.319725000000005,45.768051000000071],[-63.355835000000013,45.764442000000031],[-63.372222999999906,45.76638800000012],[-63.379997000000003,45.766106000000036],[-63.381942999999978,45.759995000000004],[-63.376663000000008,45.755829000000062],[-63.361114999999984,45.745543999999938],[-63.354445999999939,45.742493000000138],[-63.31361400000003,45.736938000000066],[-63.282501000000025,45.733330000000137],[-63.189719999999966,45.73443600000013],[-63.120833999999945,45.759438000000102],[-63.090552999999943,45.790276000000063],[-63.082779000000016,45.80332199999998],[-62.993888999999967,45.796386999999982],[-62.985275000000001,45.794998000000135],[-62.958336000000031,45.788887000000045],[-62.723610000000008,45.764160000000004],[-62.677779999999984,45.764160000000004],[-62.557220000000029,45.674713000000111],[-62.503890999999953,45.627487000000087],[-62.461944999999957,45.612495000000081],[-62.250281999999913,45.708327999999995],[-62.092772999999966,45.781105000000139],[-62.035003999999958,45.820831000000112],[-62.015006999999912,45.836655000000007],[-61.973327999999981,45.867210000000057],[-61.931388999999967,45.884720000000016],[-61.925559999999962,45.886107999999922],[-61.917503000000011,45.885551000000021],[-61.903052999999886,45.87943300000012],[-61.89805599999994,45.875267000000008],[-61.896110999999962,45.871101000000124],[-61.89805599999994,45.865273000000002],[-61.903327999999988,45.861382000000106],[-61.914718999999934,45.8555530000001],[-61.919448999999986,45.851105000000132],[-61.923332000000016,45.845543000000021],[-61.925559999999962,45.839432000000102],[-61.925277999999992,45.834434999999985],[-61.889998999999989,45.701385000000016],[-61.885558999999887,45.690544000000102],[-61.88138600000002,45.686653000000035],[-61.792228999999907,45.639160000000118],[-61.783332999999971,45.636658000000011],[-61.735000999999897,45.623322000000087],[-61.724998000000028,45.62082700000002],[-61.618056999999965,45.610550000000046],[-61.603888999999924,45.635269000000051],[-61.569999999999936,45.669991000000039],[-61.565001999999936,45.673882000000106],[-61.559165999999948,45.676659000000029],[-61.546111999999994,45.681106999999997],[-61.526107999999965,45.685265000000129],[-61.504447999999968,45.686935000000062],[-61.488892000000021,45.686935000000062],[-61.471382000000006,45.682495000000074],[-61.466110000000015,45.678878999999995],[-61.396392999999932,45.626656000000082],[-61.386947999999961,45.618880999999988],[-61.353427999999951,45.56971400000009],[-61.316146999999944,45.533173000000033],[-61.260001999999929,45.510277000000087],[-61.232356999999979,45.46119299999998],[-61.294167000000016,45.434714999999926],[-61.36500499999994,45.404160000000104],[-61.368057000000022,45.413879000000122],[-61.374717999999973,45.416938999999957],[-61.388610999999912,45.41415400000011],[-61.400832999999977,45.410820000000115],[-61.413329999999974,45.406937000000028],[-61.462219000000005,45.384438000000046],[-61.477492999999924,45.373047000000099],[-61.481666999999959,45.367767000000015],[-61.478881999999999,45.363327000000027],[-61.463889999999992,45.346939000000134],[-61.457222000000002,45.343605000000139],[-61.226386999999932,45.344154000000117],[-61.153327999999874,45.348327999999981],[-61.139441999999974,45.348877000000073],[-61.131667999999991,45.348327999999981],[-61.047225999999966,45.335548000000017],[-60.996391000000017,45.32749200000012],[-60.980552999999986,45.324440000000038],[-60.970551,45.321663000000115],[-60.966110000000015,45.318329000000119],[-60.964721999999995,45.313049000000035],[-60.96527900000001,45.295546999999999],[-60.970276000000013,45.269714000000079],[-61.050834999999893,45.231102000000078],[-61.0777819999999,45.219437000000028],[-61.090278999999953,45.215546000000131],[-61.109726000000023,45.210823000000119],[-61.123329000000012,45.208602999999925],[-61.139724999999942,45.210823000000119],[-61.142226999999991,45.215271000000087],[-61.222220999999934,45.23832700000014],[-61.267501999999979,45.246384000000091],[-61.313056999999901,45.242766999999958],[-61.323890999999946,45.236107000000118],[-61.360000999999954,45.209991000000059],[-61.373610999999926,45.196380999999974],[-61.373328999999956,45.191101000000117],[-61.365554999999972,45.188324000000023],[-61.349723999999981,45.186935000000005],[-61.340836000000024,45.184433000000126],[-61.344161999999869,45.178047000000049],[-61.34944200000001,45.174438000000009],[-61.355002999999954,45.171660999999915],[-61.384445000000028,45.15915700000005],[-61.397498999999982,45.156097000000045],[-61.450835999999924,45.145546000000081],[-61.458611000000019,45.144714000000022],[-61.543891999999971,45.141662999999994],[-61.638053999999954,45.120270000000062],[-61.724715999999944,45.091660000000047],[-61.898338000000024,45.024993999999992],[-62.026664999999923,44.984717999999987],[-62.087775999999963,44.97026800000009],[-62.286391999999921,44.928047000000049],[-62.391944999999964,44.908325000000048],[-62.476386999999875,44.895546000000138],[-62.521942000000024,44.850829999999974],[-62.546111999999937,44.821663000000001],[-62.641388000000006,44.809158000000082],[-62.795005999999887,44.780548000000067],[-62.801108999999997,44.778603000000089],[-62.813888999999961,44.750832000000003],[-62.809998000000007,44.734718000000044],[-62.851111999999944,44.718323000000112],[-62.928611999999873,44.733879000000115],[-63.012779000000023,44.773323000000005],[-63.020554000000004,44.773880000000077],[-63.055557000000022,44.772766000000104],[-63.0625,44.771378000000027],[-63.061942999999928,44.76638800000012],[-63.060279999999977,44.761664999999994],[-63.057502999999997,44.757217000000026],[-63.043616999999927,44.739989999999977],[-63.017776000000026,44.722488000000112],[-63.012504999999919,44.713326000000052],[-63.011948000000018,44.708046000000138],[-63.013618000000008,44.702774000000034],[-63.018332999999927,44.697487000000081],[-63.048339999999996,44.676102000000128],[-63.05471799999998,44.673325000000034],[-63.104445999999996,44.746658000000139],[-63.115279999999871,44.731377000000009],[-63.118331999999953,44.724991000000102],[-63.138335999999981,44.693047000000092],[-63.142776000000026,44.688599000000124],[-63.283057999999926,44.627212999999983],[-63.439994999999954,44.590828000000045],[-63.448883000000023,44.593048000000067],[-63.49500299999994,44.614715999999987],[-63.526336999999955,44.63610099999994],[-63.535167999999999,44.642769000000101],[-63.545334000000025,44.652107000000058],[-63.556999000000019,44.66160600000012],[-63.615836999999942,44.70249199999995],[-63.635001999999986,44.711380000000133],[-63.642775999999913,44.714157000000057],[-63.651107999999965,44.715546000000018],[-63.658332999999971,44.714995999999985],[-63.660552999999936,44.708328000000051],[-63.649444999999957,44.686104000000114],[-63.640556000000004,44.673050000000046],[-63.635559000000001,44.668884000000105],[-63.627776999999924,44.666382000000056],[-63.606110000000001,44.668884000000105],[-63.598610000000008,44.667770000000132],[-63.591942000000017,44.664711000000011],[-63.583611000000019,44.656936999999971],[-63.564223999999911,44.620769999999993],[-63.558220000000006,44.613266000000124],[-63.555388999999934,44.607769000000019],[-63.546059000000014,44.588604000000032],[-63.520835999999974,44.512771999999984],[-63.520279000000016,44.507773999999984],[-63.525276000000019,44.495270000000119],[-63.533332999999971,44.484993000000145],[-63.542777999999942,44.476379000000065],[-63.553054999999915,44.469711000000075],[-63.570838999999921,44.461937000000091],[-63.631110999999919,44.435822000000087],[-63.638610999999912,44.436935000000005],[-63.90694400000001,44.495270000000119],[-63.913611999999887,44.498604000000114],[-63.924171000000001,44.506103999999993],[-63.932502999999997,44.513329000000056],[-63.935555000000022,44.517494000000056],[-63.94388600000002,44.536110000000065],[-63.938605999999936,44.616104000000064],[-63.937774999999931,44.621658000000082],[-63.928054999999858,44.642220000000009],[-63.919166999999959,44.651657000000114],[-63.914443999999889,44.65554800000001],[-63.908607000000018,44.678047000000106],[-64.008347000000015,44.647491000000002],[-64.045272999999952,44.635826000000122],[-64.055266999999958,44.619438000000059],[-64.065551999999911,44.595268000000033],[-64.063888999999961,44.590545999999961],[-64.059158000000025,44.581665000000044],[-64.054992999999968,44.577773999999977],[-64.039443999999946,44.572495000000004],[-64.033614999999941,44.563049000000035],[-64.009170999999981,44.513329000000056],[-64.010009999999966,44.507773999999984],[-64.083069000000023,44.466660000000047],[-64.091949,44.46888000000007],[-64.110549999999989,44.478324999999984],[-64.121657999999968,44.485268000000133],[-64.125548999999978,44.510551000000021],[-64.123610999999926,44.527489000000116],[-64.119720000000029,44.53943600000008],[-64.121657999999968,44.544159000000093],[-64.127486999999917,44.552773000000116],[-64.135833999999988,44.560546999999929],[-64.146118000000001,44.568329000000062],[-64.170273000000009,44.586105000000032],[-64.200835999999981,44.576384999999959],[-64.305267000000015,44.533332999999971],[-64.337509000000011,44.411933999999974],[-64.346664000000033,44.362495000000138],[-64.346114999999998,44.357215999999994],[-64.329726999999934,44.328880000000026],[-64.311110999999926,44.319159999999954],[-64.303328999999962,44.316666000000055],[-64.295273000000009,44.316101000000003],[-64.290557999999976,44.31999200000007],[-64.292220999999984,44.324715000000026],[-64.299987999999928,44.32749200000012],[-64.305557000000022,44.330826000000116],[-64.309433000000013,44.335548000000017],[-64.307770000000005,44.340828000000101],[-64.301102000000014,44.341933999999924],[-64.273620999999878,44.330276000000083],[-64.260558999999944,44.324164999999994],[-64.239440999999943,44.294158999999922],[-64.253341999999918,44.27526899999998],[-64.258056999999951,44.269989000000123],[-64.283324999999877,44.253052000000082],[-64.319457999999997,44.264717000000019],[-64.355835000000013,44.273323000000119],[-64.391113000000018,44.253326000000015],[-64.428054999999915,44.228325000000041],[-64.432220000000029,44.223602000000028],[-64.444716999999912,44.190269000000001],[-64.616394000000014,44.133049000000142],[-64.61860699999994,44.071937999999989],[-64.666397000000018,43.990273000000116],[-64.671386999999982,43.986382000000049],[-64.732223999999917,43.951660000000004],[-64.738051999999925,43.949432000000058],[-64.745269999999948,43.948874999999987],[-64.776397999999972,43.950828999999999],[-64.80610699999994,43.950546000000031],[-64.812774999999931,43.949432000000058],[-64.818068999999923,43.946381000000031],[-64.832229999999925,43.926102000000128],[-64.881103999999993,43.838882000000126],[-64.906386999999995,43.800544999999943],[-65.030562999999972,43.704163000000051],[-65.066665999999941,43.696381000000088],[-65.242217999999923,43.679161000000136],[-65.325835999999867,43.674995000000024],[-65.375274999999874,43.575272000000098],[-65.449158000000011,43.55971500000004],[-65.453338999999971,43.554993000000138],[-65.475829999999974,43.505829000000006],[-65.481383999999991,43.464439000000027],[-65.496947999999975,43.490829000000019],[-65.548049999999932,43.556099000000017],[-65.559433000000013,43.568054000000075],[-65.568618999999956,43.570274000000097],[-65.575561999999991,43.569717000000026],[-65.584732000000031,43.560271999999941],[-65.591385000000002,43.549721000000034],[-65.603881999999999,43.534721000000104],[-65.612212999999997,43.526099999999985],[-65.617492999999968,43.523604999999975],[-65.646118000000001,43.511940000000038],[-65.67332499999992,43.506103999999993],[-65.712783999999999,43.498604000000114],[-65.720550999999944,43.499161000000015],[-65.72582999999986,43.50249500000001],[-65.777221999999995,43.562492000000134],[-65.783324999999934,43.571106000000043],[-65.783889999999985,43.576385000000016],[-65.781951999999933,43.587769000000094],[-65.778885000000002,43.599998000000085],[-65.773055999999997,43.612770000000125],[-65.771117999999944,43.624435000000005],[-65.769454999999937,43.64138000000014],[-65.768065999999919,43.658043000000021],[-65.768340999999964,43.668883999999991],[-65.769729999999868,43.679161000000136],[-65.77555799999999,43.688324000000136],[-65.868880999999988,43.786385000000053],[-65.907775999999956,43.821663000000058],[-65.912215999999887,43.825272000000041],[-65.918610000000001,43.828331000000048],[-65.932770000000005,43.827217000000019],[-65.938888999999961,43.824997000000053],[-65.942490000000021,43.819443000000035],[-65.956115999999895,43.776100000000099],[-65.968886999999995,43.719436999999971],[-65.971663999999976,43.71276899999998],[-65.975006000000008,43.707214000000079],[-65.983063000000016,43.697768999999994],[-66.013335999999867,43.691658000000132],[-66.020553999999947,43.69110100000006],[-66.029449,43.731659000000093],[-66.030562999999972,43.736107000000061],[-66.033614999999998,43.740273000000002],[-66.042220999999984,43.748046999999985],[-66.080841000000021,43.768051000000071],[-66.088607999999965,43.768326000000116],[-66.09445199999999,43.766106000000093],[-66.107772999999952,43.753326000000129],[-66.121658000000025,43.762215000000026],[-66.135559000000001,43.78943600000008],[-66.166945999999939,43.858603999999957],[-66.168059999999912,43.863051999999925],[-66.168059999999912,43.895546000000024],[-66.167495999999971,43.901382000000069],[-66.165832999999964,43.907211000000075],[-66.151947000000007,43.919159000000093],[-66.150283999999942,43.925270000000012],[-66.149993999999936,43.93082400000003],[-66.14916999999997,44.001106000000107],[-66.14973399999991,44.011108000000036],[-66.181945999999925,44.067497000000117],[-66.204453000000001,44.086655000000007],[-66.190552000000025,44.150543000000027],[-66.187774999999931,44.161934000000031],[-66.118606999999997,44.338043000000027],[-66.093886999999881,44.367493000000138],[-66.089995999999985,44.371658000000139],[-66.037505999999951,44.423325000000091],[-65.976943999999946,44.477485999999999],[-65.967223999999987,44.486107000000118],[-65.95666499999993,44.491661000000079],[-65.950286999999946,44.493050000000096],[-65.944442999999978,44.489716000000101],[-65.938048999999921,44.491104000000007],[-65.865828999999962,44.538886999999988],[-65.841674999999952,44.568604000000107],[-65.841384999999946,44.574164999999994],[-65.844451999999876,44.578331000000048],[-65.848891999999978,44.582213999999965],[-65.855270000000019,44.585823000000005],[-65.862777999999878,44.586936999999978],[-65.931106999999997,44.582213999999965],[-65.943053999999961,44.577773999999977],[-65.958617999999944,44.567497000000003],[-66.004456000000005,44.535827999999981],[-66.03472899999997,44.514717000000132],[-66.12332200000003,44.448875000000044],[-66.177779999999927,44.396660000000054],[-66.185821999999973,44.387214999999969],[-66.190552000000025,44.383330999999998],[-66.197220000000016,44.386108000000036],[-66.198607999999979,44.412766000000033],[-66.191100999999946,44.423325000000091],[-66.103058000000033,44.500000000000114],[-66.068068999999923,44.524994000000106],[-65.971663999999976,44.591934000000094],[-65.820220999999947,44.654434000000037],[-65.816726999999958,44.655768999999964],[-65.808722999999929,44.651936000000092],[-65.802895000000035,44.644604000000072],[-65.796394000000021,44.624268000000029],[-65.796897999999942,44.617603000000145],[-65.797897000000034,44.613937000000021],[-65.756957999999941,44.615273000000059],[-65.756393000000003,44.609993000000031],[-65.753066999999987,44.60582700000009],[-65.745270000000005,44.605552999999986],[-65.697220000000016,44.612495000000081],[-65.690276999999924,44.614440999999999],[-65.68499799999995,44.61693600000001],[-65.625274999999988,44.658882000000006],[-65.522507000000019,44.737769999999955],[-65.548614999999984,44.733879000000115],[-65.682616999999937,44.693156999999928],[-65.686278999999956,44.691825999999935],[-65.690276999999924,44.691162000000077],[-65.695441999999957,44.691825999999935],[-65.704116999999997,44.69499200000007],[-65.706116000000009,44.697654999999997],[-65.707114999999988,44.700489000000005],[-65.707450999999992,44.703487000000052],[-65.705947999999978,44.707489000000066],[-65.700942999999938,44.713157999999964],[-65.697937000000024,44.71549200000004],[-65.717772999999966,44.721931000000041],[-65.658339999999953,44.758605999999986],[-65.646956999999929,44.765273999999977],[-65.299987999999928,44.928329000000133],[-65.202498999999989,44.973877000000073],[-65.114166000000012,45.011665000000107],[-64.934158000000025,45.100273000000016],[-64.918059999999912,45.111107000000061],[-64.879439999999988,45.130820999999969],[-64.861938000000009,45.139717000000076],[-64.814712999999983,45.158043000000077],[-64.808608999999933,45.16027100000008],[-64.777221999999995,45.169990999999982],[-64.744995000000017,45.178329000000076],[-64.710830999999985,45.183876000000055],[-64.590285999999935,45.208046000000024],[-64.550551999999925,45.216660000000104],[-64.468886999999938,45.242766999999958],[-64.451400999999976,45.249435000000119],[-64.434432999999899,45.25750000000005],[-64.417770000000019,45.266663000000051],[-64.397506999999962,45.281105000000025],[-64.393889999999999,45.28694200000001],[-64.391952999999944,45.292770000000132],[-64.391113000000018,45.298332000000073],[-64.393065999999862,45.303322000000094],[-64.401671999999962,45.311104000000057],[-64.406951999999933,45.314438000000052],[-64.413895000000025,45.317497000000003],[-64.430832000000009,45.322220000000016],[-64.454726999999934,45.323608000000092],[-64.462218999999948,45.323051000000021],[-64.470839999999953,45.324440000000038],[-64.488051999999982,45.329162999999994],[-64.494719999999973,45.332214000000022],[-64.489165999999955,45.335266000000104],[-64.465835999999911,45.334717000000012],[-64.440552000000025,45.331665000000044],[-64.353057999999919,45.316101000000003],[-64.338333000000034,45.310271999999941],[-64.327498999999989,45.303322000000094],[-64.321395999999936,45.294715999999994],[-64.317779999999914,45.285271000000137],[-64.317229999999881,45.280273000000136],[-64.317779999999914,45.274437000000034],[-64.321944999999914,45.269714000000079],[-64.327498999999989,45.266936999999984],[-64.343062999999972,45.256103999999993],[-64.353333000000021,45.239159000000029],[-64.385833999999932,45.145546000000081],[-64.380279999999857,45.131104000000107],[-64.363891999999964,45.101386999999988],[-64.359725999999966,45.097487999999942],[-64.352218999999934,45.09804500000007],[-64.346953999999982,45.101105000000075],[-64.337219000000005,45.108604000000071],[-64.333892999999932,45.115272999999945],[-64.334441999999967,45.120270000000062],[-64.333327999999995,45.131660000000124],[-64.329178000000013,45.13638300000008],[-64.324387000000002,45.139343000000054],[-64.31138599999997,45.141380000000026],[-64.295836999999949,45.141380000000026],[-64.244155999999975,45.123877999999991],[-64.221114999999941,45.110549999999989],[-64.210280999999952,45.103607000000011],[-64.157226999999978,45.056938000000002],[-64.146956999999986,45.044441000000063],[-64.14555399999989,45.034720999999934],[-64.154449,44.98443600000013],[-64.156386999999938,44.978325000000041],[-64.116942999999935,45.009163000000058],[-64.114165999999955,45.046661000000029],[-64.121933000000013,45.058044000000052],[-64.136397999999929,45.074440000000038],[-64.141678000000013,45.078605999999979],[-64.162505999999894,45.092216000000008],[-64.188323999999909,45.104713000000004],[-64.192490000000021,45.108604000000071],[-64.198607999999865,45.11721],[-64.198882999999967,45.122490000000084],[-64.195830999999941,45.150543000000027],[-64.16361999999998,45.185265000000015],[-64.152785999999992,45.192764000000011],[-64.118331999999953,45.208885000000009],[-64.106110000000001,45.213326000000109],[-64.099990999999932,45.215271000000087],[-64.065826000000015,45.222214000000122],[-64.008057000000008,45.236381999999992],[-63.982215999999937,45.243049999999926],[-63.956664999999987,45.251388999999961],[-63.805831999999953,45.301933000000133],[-63.596107000000018,45.315544000000102],[-63.470832999999857,45.321663000000115],[-63.384170999999924,45.35083000000003],[-63.371940999999993,45.354996000000142],[-63.365554999999915,45.357773000000009],[-63.360832000000016,45.360824999999977],[-63.36860699999994,45.36360900000011],[-63.738892000000021,45.396660000000054],[-63.755561999999941,45.398048000000131],[-63.797226000000023,45.392768999999987],[-63.837775999999963,45.385551000000135],[-63.988051999999982,45.384438000000046],[-64.040558000000033,45.401100000000042],[-64.044998000000021,45.404434000000037],[-64.061110999999983,45.409714000000122],[-64.069732999999985,45.410271000000023],[-64.083618000000001,45.409430999999984],[-64.16332999999986,45.403877000000136],[-64.214721999999995,45.399719000000005],[-64.312774999999931,45.39138000000014],[-64.357772999999952,45.38110400000005],[-64.529998999999975,45.408043000000021],[-64.674164000000019,45.383049000000085],[-64.815825999999959,45.348602000000085],[-64.929442999999992,45.324440000000038],[-64.937209999999993,45.326942000000088],[-64.938048999999921,45.332214000000022],[-64.936661000000015,45.343323000000112],[-64.933318999999983,45.355553000000043],[-64.917769999999905,45.408599999999922],[-64.909163999999976,45.418052999999986],[-64.831389999999942,45.479155999999932],[-64.765563999999983,45.505554000000132],[-64.699157999999954,45.531104999999968],[-64.568893000000003,45.604163999999969],[-64.470550999999944,45.670273000000122],[-64.430282999999974,45.715546000000018],[-64.332229999999925,45.76888300000013],[-64.331680000000006,45.763611000000026],[-64.326110999999969,45.749435000000005],[-64.296660999999915,45.763328999999942],[-64.283066000000019,45.776656999999943],[-64.27555799999999,45.799995000000081],[-64.27305599999994,45.811661000000015],[-64.270003999999915,45.828880000000083],[-64.272933999999964,45.835754000000065],[-64.273620999999878,45.838599999999985],[-64.276671999999962,45.842766000000097],[-64.324722000000008,45.879990000000021],[-64.33277899999996,45.882767000000058],[-64.347778000000005,45.881934999999999],[-64.361388999999974,45.879158000000075],[-64.366942999999992,45.876380999999981],[-64.367766999999958,45.870544000000052],[-64.363327000000027,45.866661000000079],[-64.354720999999927,45.865547000000106],[-64.357498000000021,45.851105000000132],[-64.418059999999912,45.796104000000014],[-64.478332999999907,45.750549000000035],[-64.49722300000002,45.783882000000006],[-64.489990000000034,45.794998000000135],[-64.488051999999982,45.801102000000014],[-64.489165999999955,45.811378000000047],[-64.49221799999998,45.815543999999989],[-64.597335999999984,45.922104000000047],[-64.681945999999868,46.021659999999997],[-64.686935000000005,46.041382000000056],[-64.690551999999968,46.050827000000083],[-64.694991999999957,46.054710000000057],[-64.736937999999952,46.083878000000084],[-64.747498000000007,46.090546000000018],[-64.754456000000005,46.089157000000057],[-64.764450000000011,46.083054000000118],[-64.706389999999999,45.994713000000104],[-64.701949999999954,45.990829000000076],[-64.648009999999942,45.933047999999928],[-64.631171999999992,45.922718000000032],[-64.628998000000024,45.920383000000072],[-64.601180999999997,45.881550000000118],[-64.601180999999997,45.877384000000006],[-64.601340999999991,45.873881999999981],[-64.602844000000005,45.86721399999999],[-64.604507000000012,45.863552000000084],[-64.583069000000023,45.826942000000145],[-64.756392999999946,45.622489999999971],[-64.772506999999962,45.609993000000145],[-64.778335999999967,45.607216000000051],[-64.785827999999924,45.610275000000058],[-64.791381999999999,45.613609000000054],[-64.796660999999972,45.622489999999971],[-64.801665999999955,45.626381000000038],[-64.808334000000002,45.629715000000033],[-64.817229999999938,45.632492000000127],[-64.825287000000003,45.633331000000055],[-64.847504000000015,45.633331000000055],[-64.884445000000028,45.631660000000011],[-64.904175000000009,45.627769000000114],[-64.941375999999991,45.602218999999991],[-64.947219999999959,45.598045000000127],[-64.961945000000014,45.586105000000032],[-64.976395000000025,45.572494999999947],[-64.986663999999962,45.564437999999996],[-64.99722300000002,45.557213000000104],[-65.015015000000005,45.548882000000049],[-65.047501000000011,45.539161999999976],[-65.104445999999939,45.524994000000106],[-65.138335999999924,45.517769000000044],[-65.152221999999938,45.516106000000093],[-65.164444000000003,45.513054000000011],[-65.220551,45.493881000000101],[-65.326675000000023,45.457497000000046],[-65.339447000000007,45.452216999999962],[-65.368057000000022,45.437767000000065],[-65.394454999999994,45.419441000000063],[-65.421386999999925,45.402771000000087],[-65.53195199999999,45.342490999999995],[-65.883620999999948,45.209160000000054],[-65.889998999999989,45.207497000000103],[-65.903609999999958,45.205551000000014],[-65.910827999999981,45.205268999999987],[-65.918883999999935,45.206099999999992],[-65.98332199999993,45.219711000000132],[-65.989989999999977,45.223045000000127],[-66.09060699999992,45.295657999999946],[-66.092940999999939,45.297989000000086],[-66.094611999999984,45.300659000000053],[-66.091605999999956,45.303824999999961],[-66.083892999999932,45.34276600000004],[-66.078063999999927,45.345543000000077],[-66.05749499999996,45.348602000000085],[-66.045273000000009,45.353325000000041],[-66.029449,45.364158999999916],[-66.015288999999996,45.377769000000001],[-66.003066999999987,45.394997000000103],[-66.000838999999985,45.401100000000042],[-65.99722300000002,45.417770000000019],[-65.994445999999982,45.455550999999957],[-65.994445999999982,45.460823000000062],[-66.002501999999993,45.461662000000047],[-66.008346999999901,45.458885000000123],[-66.19027699999998,45.339432000000045],[-66.193329000000006,45.333603000000039],[-66.193329000000006,45.328331000000105],[-66.190552000000025,45.323883000000137],[-66.179169000000002,45.305823999999973],[-66.176102000000014,45.301933000000133],[-66.145279000000016,45.279160000000047],[-66.14166999999992,45.259769000000006],[-66.137000999999941,45.259270000000129],[-66.113997999999981,45.25877400000013],[-66.113509999999906,45.237770000000069],[-66.147232000000031,45.19221500000009],[-66.205565999999976,45.163878999999952],[-66.21665999999999,45.15915700000005],[-66.427779999999984,45.084991000000002],[-66.459732000000031,45.106102000000021],[-66.459732000000031,45.111382000000106],[-66.461120999999935,45.116104000000007],[-66.468063000000029,45.129714999999976],[-66.488891999999908,45.149994000000049],[-66.496384000000035,45.149719000000061],[-66.531386999999995,45.147217000000012],[-66.537505999999951,45.145271000000093],[-66.55999799999995,45.133330999999998],[-66.571395999999936,45.126656000000139],[-66.586120999999991,45.116936000000067],[-66.608046999999942,45.104164000000083],[-66.642226999999991,45.086380000000133],[-66.648055999999997,45.083603000000039],[-66.754729999999881,45.055550000000096],[-66.792496000000028,45.055267000000129],[-66.77694699999995,45.086380000000133],[-66.776107999999965,45.09137700000008],[-66.777785999999992,45.096100000000035],[-66.783065999999963,45.099716000000114],[-66.965560999999923,45.17943600000001],[-67.021941999999854,45.170273000000009],[-67.027221999999995,45.168052999999986],[-67.046386999999982,45.126938000000052],[-67.129439999999988,45.172217999999987],[-67.186934999999949,45.19221500000009],[-67.206542999999897,45.18303700000007],[-67.236114999999927,45.193877999999984],[-67.25306699999993,45.199432000000002],[-67.261123999999995,45.201103000000046],[-67.267775999999969,45.200546000000145],[-67.275009000000011,45.1988750000001],[-67.287215999999944,45.194153000000028],[-67.290557999999976,45.182770000000005],[-67.290282999999988,45.177489999999921],[-67.292220999999927,45.166100000000085],[-67.296386999999925,45.160820000000001],[-67.301391999999964,45.156937000000084],[-67.306655999999862,45.153320000000122],[-67.318893000000003,45.148605000000089],[-67.325561999999991,45.147491000000116],[-67.333069000000023,45.147491000000116],[-67.341948999999943,45.149994000000049],[-67.354172000000005,45.156097000000045],[-67.403884999999946,45.194435000000055],[-67.408050999999944,45.198325999999952],[-67.422500999999954,45.214996000000099],[-67.455275999999969,45.263054000000068],[-67.462783999999999,45.276099999999985],[-67.465011999999888,45.281105000000025],[-67.465285999999992,45.286385000000109],[-67.464172000000019,45.29193900000007],[-67.450561999999934,45.333054000000061],[-67.485001000000011,45.489159000000029],[-67.485275000000001,45.494438000000002],[-67.482772999999952,45.500274999999931],[-67.478881999999885,45.504439999999931],[-67.467772999999966,45.510826000000066],[-67.43638599999997,45.521378000000027],[-67.421936000000017,45.523323000000005],[-67.415832999999964,45.525269000000094],[-67.410827999999924,45.529990999999995],[-67.406951999999876,45.578049000000135],[-67.408889999999985,45.582214000000135],[-67.412505999999951,45.586936999999978],[-67.424163999999962,45.594711000000132],[-67.453888000000006,45.612495000000081],[-67.462219000000005,45.614715999999987],[-67.46945199999999,45.613051999999982],[-67.486114999999984,45.603607000000068],[-67.499999999999943,45.60166200000009],[-67.515015000000005,45.601105000000018],[-67.573897999999986,45.611664000000019],[-67.656661999999983,45.630546999999922],[-67.664443999999946,45.6336060000001],[-67.791107000000011,45.693047000000092],[-67.796660999999915,45.696098000000063],[-67.799164000000019,45.701102999999932],[-67.804442999999992,45.731377000000009],[-67.806380999999988,45.78472099999999],[-67.786666999999909,45.888329000000056],[-67.772507000000019,45.957496999999933],[-67.779174999999952,46.283332999999971],[-67.788894999999968,46.787773000000072],[-67.791671999999949,46.921379000000059],[-67.794998000000021,47.06999200000007],[-67.85972599999991,47.097488000000112],[-67.874161000000015,47.103607000000125],[-67.892226999999991,47.114440999999999],[-67.948607999999922,47.166382000000112],[-67.951400999999976,47.17083000000008],[-67.955841000000021,47.179993000000081],[-67.957229999999925,47.184989999999971],[-67.961944999999957,47.194153000000142],[-67.968886999999938,47.20277400000009],[-68.18582200000003,47.332771000000037],[-68.208617999999944,47.341660000000104],[-68.244995000000017,47.351936000000023],[-68.306655999999919,47.364440999999943],[-68.323059000000001,47.365829000000076],[-68.337219000000005,47.363609000000054],[-68.348891999999921,47.359992999999974],[-68.367766999999958,47.351105000000018],[-68.373046999999929,47.347214000000122],[-68.564712999999927,47.289719000000048],[-68.761948000000018,47.232764999999972],[-68.787505999999951,47.224709000000075],[-68.831679999999892,47.208884999999952],[-68.887786999999946,47.188042000000053],[-68.895279000000016,47.189987000000087],[-68.958618000000001,47.217209000000025],[-68.965285999999878,47.220543000000021],[-69.023894999999925,47.250274999999931],[-69.036117999999988,47.257217000000026],[-69.044998000000021,47.264442000000088],[-69.049164000000019,47.274437000000034],[-69.053054999999972,47.28943600000008],[-69.053588999999931,47.293777000000091],[-69.054992999999854,47.299438000000066],[-69.055266999999958,47.30471],[-69.056106999999997,47.336655000000064],[-69.055556999999965,47.347488000000055],[-69.052490000000034,47.380546999999979],[-69.049437999999952,47.392219999999952],[-69.045837000000006,47.398604999999975],[-69.043610000000001,47.404709000000025],[-69.039444000000003,47.416939000000127],[-69.038329999999974,47.422493000000088],[-69.039992999999981,47.427490000000034],[-69.048614999999984,47.435546999999985],[-69.055556999999965,47.438599000000124],[-69.123885999999914,47.458327999999995],[-69.132766999999944,47.459991000000116],[-69.232498000000021,47.471375000000023],[-69.239623999999992,47.464413000000093],[-69.305267000000015,47.40026899999998],[-69.423614999999984,47.283332999999971],[-69.653884999999946,47.055267000000129],[-69.712509000000011,46.996940999999993],[-69.84722899999997,46.862213000000111],[-69.992767000000015,46.715828000000045],[-70.009170999999867,46.698043999999982],[-70.026947000000007,46.587493999999992],[-70.038605000000018,46.509995000000004],[-70.044158999999922,46.474991000000102],[-70.047775000000001,46.453880000000083],[-70.050551999999982,46.438599000000124],[-70.06361400000003,46.424164000000019],[-70.068893000000003,46.419716000000051],[-70.075286999999946,46.417770000000132],[-70.081389999999999,46.417770000000132],[-70.088057999999876,46.414993000000038],[-70.119155999999975,46.393608000000086],[-70.200287000000003,46.336380000000077],[-70.242492999999911,46.279160000000047],[-70.287780999999939,46.203049000000135],[-70.305556999999908,46.078880000000083],[-70.3125,45.985825000000091],[-70.309722999999963,45.980820000000051],[-70.303329000000019,45.977767999999969],[-70.293883999999991,45.975548000000117],[-70.278335999999967,45.975266000000033],[-70.260559000000001,45.971374999999966],[-70.253615999999909,45.968323000000055],[-70.248336999999935,45.964714000000072],[-70.23971599999993,45.956657000000064],[-70.238051999999982,45.951934999999992],[-70.255004999999983,45.913048000000003],[-70.258895999999993,45.907493999999986],[-70.263335999999981,45.90277100000003],[-70.393889999999942,45.778046000000131],[-70.466659999999933,45.711937000000034],[-70.555267000000015,45.672768000000133],[-70.576949999999954,45.660820000000058],[-70.631942999999978,45.627769000000114],[-70.693054000000018,45.571938000000046],[-70.720276000000013,45.528328000000101],[-70.725280999999995,45.49971800000003],[-70.724715999999944,45.49471299999999],[-70.712783999999999,45.477768000000026],[-70.704726999999934,45.469154000000003],[-70.689437999999939,45.458046000000024],[-70.86860699999994,45.246101000000124],[-70.873046999999985,45.241379000000052],[-70.878600999999946,45.238601999999958],[-70.886123999999995,45.238045000000056],[-71.021118000000001,45.326660000000004],[-71.085128999999995,45.307708999999988],[-71.139998999999932,45.253052000000082],[-71.146392999999989,45.25249500000001],[-71.170272999999952,45.253883000000087],[-71.189163000000008,45.257773999999984],[-71.211669999999913,45.266105999999979],[-71.233063000000016,45.274993999999936],[-71.239715999999987,45.278046000000074],[-71.264449999999954,45.290833000000077],[-71.280562999999972,45.301933000000133],[-71.288604999999961,45.304436000000067],[-71.302779999999984,45.303047000000106],[-71.314712999999927,45.299438000000066],[-71.327498999999932,45.294441000000006],[-71.424438000000009,45.25],[-71.408614999999998,45.223045000000127],[-71.402221999999938,45.21915400000006],[-71.398894999999982,45.215546000000131],[-71.396118000000001,45.210548000000131],[-71.395843999999954,45.205268999999987],[-71.398620999999991,45.199432000000002],[-71.43249499999996,45.130272000000048],[-71.436110999999926,45.125267000000008],[-71.459166999999979,45.102776000000006],[-71.482772999999952,45.083878000000084],[-71.493056999999965,45.075271999999984],[-71.496383999999921,45.068886000000077],[-71.49888599999997,45.057213000000047],[-71.497222999999963,45.041663999999969],[-71.494155999999975,45.020546000000024],[-71.55471799999998,45.019989000000123],[-71.892776000000026,45.019157000000064],[-72.049987999999985,45.019440000000031],[-72.271652000000017,45.018775999999946],[-72.459166999999866,45.017494000000113],[-72.510283999999956,45.017212000000029],[-72.778884999999946,45.020828000000108],[-72.956389999999942,45.018326000000059],[-73.337173000000007,45.01186400000006],[-73.346114999999998,45.011383000000023],[-73.352997000000016,45.009421999999972],[-73.359267999999986,45.010063000000059],[-73.376662999999951,45.011108000000036],[-73.622771999999941,45.006660000000068],[-73.91164399999991,45.000000000000057],[-74.249161000000015,44.992218000000094],[-74.682021999999904,45.006714000000102],[-74.75111400000003,45.002220000000023],[-74.769729999999925,45.006386000000134],[-74.785827999999981,45.011383000000023],[-74.81220999999988,45.01776899999993],[-74.828887999999949,45.019157000000064],[-74.850280999999939,45.016663000000108],[-74.990829000000019,44.986655999999925],[-75.00140399999998,44.980545000000063],[-75.170546999999999,44.898604999999975],[-75.278060999999923,44.857216000000051],[-75.301666000000012,44.846656999999993],[-75.317779999999857,44.837212000000136],[-75.395843999999954,44.785827999999924],[-75.537216000000001,44.691376000000048],[-75.5625,44.673882000000106],[-75.618057000000022,44.634995000000117],[-75.628051999999968,44.627769000000001],[-75.682495000000017,44.588043000000027],[-75.736114999999927,44.546387000000038],[-75.801940999999999,44.491104000000007],[-75.81138599999997,44.483047000000056],[-75.820557000000008,44.474990999999989],[-75.824722000000008,44.469986000000119],[-75.828338999999971,44.446655000000078],[-75.834166999999979,44.43443300000007],[-75.841109999999901,44.423050000000103],[-75.849441999999954,44.414711000000068],[-75.864166000000012,44.402771000000143],[-75.879990000000021,44.393326000000059],[-75.904449,44.384995000000004],[-75.966109999999958,44.364158999999972],[-75.982177999999919,44.358864000000096],[-75.997771999999998,44.355270000000075],[-76.019454999999937,44.353325000000098],[-76.034728999999913,44.353050000000053],[-76.046950999999979,44.349716000000058],[-76.057769999999948,44.344993999999986],[-76.064437999999939,44.341377000000023],[-76.363373000000024,44.150992999999971],[-76.410278000000005,44.121101000000124],[-76.43472300000002,44.104713000000061],[-76.439986999999974,44.099434000000088],[-76.531386999999995,43.983046999999942],[-76.569457999999997,43.934157999999968],[-76.583618000000001,43.915824999999927],[-76.697494999999947,43.768600000000049],[-76.801940999999999,43.633605999999986],[-76.816955999999948,43.633049000000085],[-76.974166999999909,43.634438000000046],[-77.288329999999917,43.636658000000068],[-77.582779000000016,43.638603000000046],[-77.729996000000028,43.639160000000118],[-77.857773000000009,43.639434999999992],[-77.887222000000008,43.639434999999992],[-78.388061999999934,43.638329000000113],[-78.663054999999986,43.637497000000053],[-78.724715999999944,43.629433000000006],[-78.938323999999909,43.553878999999995],[-79.02806099999998,43.521934999999985],[-79.095275999999956,43.497771999999998],[-79.18472300000002,43.465546000000131],[-79.132216999999969,43.382492000000013],[-79.066787999999974,43.279400000000066],[-79.054169000000002,43.262496999999996],[-79.053328999999962,43.256660000000068],[-79.044997999999964,43.165543000000014],[-79.044723999999974,43.160545000000013],[-79.045836999999949,43.148880000000133],[-79.049438000000009,43.143883000000017],[-79.05972300000002,43.137215000000083],[-79.063613999999916,43.132210000000043],[-79.081115999999952,43.085548000000074],[-79.043334999999956,43.011664999999994],[-79.040832999999964,43.007774000000097],[-79.021666999999923,42.987213000000054],[-79.005843999999911,42.977211000000125],[-78.978606999999954,42.961380000000133],[-78.97193900000002,42.958046000000138],[-78.962783999999942,42.956383000000017],[-78.946655000000021,42.955551000000128],[-78.938599000000011,42.953322999999955],[-78.932770000000005,42.950829000000056],[-78.927490000000034,42.946937999999989],[-78.920273000000009,42.939156000000025],[-78.918335000000013,42.934715000000097],[-78.915282999999988,42.924164000000019],[-78.917220999999927,42.904991000000109],[-78.918335000000013,42.89888000000002],[-78.926665999999898,42.880546999999979],[-78.932219999999973,42.868324000000086],[-78.935271999999998,42.862495000000081],[-78.942490000000021,42.852493000000095],[-78.965835999999967,42.833602999999982],[-78.986937999999952,42.819992000000013],[-79.12110899999999,42.769157000000121],[-79.154448999999943,42.757217000000026],[-79.299437999999952,42.702492000000007],[-79.56645199999997,42.600708000000054],[-79.763427999999919,42.524703999999986],[-79.776672000000019,42.52027099999998],[-80.086120999999991,42.399994000000106],[-80.096953999999926,42.396385000000066],[-80.510283999999899,42.329163000000051],[-80.528548999999998,42.326617999999996],[-80.869155999999975,42.279160000000104],[-81.249161000000015,42.224991000000045],[-81.424437999999952,42.144997000000046],[-81.623610999999983,42.052773000000116],[-81.822234999999978,41.96027400000014],[-82.218062999999972,41.774437000000034],[-82.238891999999964,41.763885000000073],[-82.425277999999992,41.675551999999982],[-82.462783999999942,41.676102000000014],[-82.649993999999936,41.681938000000059],[-82.696654999999964,41.683875999999998],[-83.071944999999914,41.859717999999987],[-83.080841000000021,41.874992000000077],[-83.117415999999878,41.946194000000048],[-83.130828999999892,41.970543000000134],[-83.150283999999942,42.008330999999998],[-83.168609999999944,42.046104000000014],[-83.168335000000013,42.048050000000103],[-83.137222000000008,42.201385000000016],[-83.132492000000013,42.220824999999991],[-83.12332200000003,42.245827000000077],[-83.118056999999965,42.25777400000004],[-83.107772999999952,42.272766000000047],[-83.086959999999976,42.300545000000056],[-83.062209999999993,42.318603999999993],[-83.051940999999999,42.324715000000083],[-83.027221999999995,42.331940000000145],[-83.002227999999945,42.339157000000057],[-82.975829999999974,42.344711000000075],[-82.940551999999968,42.357498000000078],[-82.841384999999946,42.396941999999967],[-82.808884000000035,42.413322000000107],[-82.793609999999944,42.422768000000076],[-82.775283999999942,42.43721000000005],[-82.763061999999991,42.448600999999996],[-82.729996000000028,42.48333000000008],[-82.704453000000001,42.508331000000055],[-82.670273000000009,42.539993000000038],[-82.665282999999931,42.544158999999922],[-82.659103000000016,42.548195000000078],[-82.650756999999942,42.553642000000139],[-82.644973999999991,42.556411999999966],[-82.630553999999961,42.557495000000074],[-82.622222999999963,42.556656000000089],[-82.614166000000012,42.554710000000057],[-82.605835000000013,42.554161000000079],[-82.586394999999925,42.558601000000124],[-82.571670999999981,42.56888600000002],[-82.535827999999867,42.599434000000031],[-82.521392999999932,42.618881000000044],[-82.513335999999867,42.63638300000008],[-82.484726000000023,42.719154000000003],[-82.474716000000001,42.751663000000065],[-82.471114999999941,42.769989000000066],[-82.470551,42.782493999999986],[-82.47193900000002,42.793053000000043],[-82.473327999999924,42.797493000000031],[-82.480559999999912,42.812492000000134],[-82.481948999999929,42.823326000000009],[-82.481109999999944,42.829437000000098],[-82.464446999999893,42.898048000000074],[-82.462509000000011,42.904709000000025],[-82.418776999999977,43.018639000000064],[-82.404175000000009,43.049164000000076],[-82.322234999999978,43.21054799999996],[-82.252791999999943,43.346382000000119],[-82.228881999999942,43.391380000000026],[-82.146118000000001,43.553047000000106],[-82.130279999999971,43.585266000000104],[-82.214447000000007,43.952217000000132],[-82.331679999999949,44.460823000000119],[-82.430556999999965,44.882767000000115],[-82.543059999999969,45.355826999999977],[-82.629990000000021,45.396102999999982],[-82.665008999999998,45.411933999999917],[-82.954178000000013,45.54193900000007],[-83.050826999999913,45.585266000000047],[-83.11221299999994,45.612770000000069],[-83.270844000000011,45.683326999999963],[-83.500290000000007,45.784995999999978],[-83.597778000000005,45.827217000000019],[-83.523894999999982,45.918053000000043],[-83.487777999999992,45.961661999999933],[-83.447768999999994,46.011940000000095],[-83.474716000000001,46.036385000000109],[-83.483321999999987,46.043884000000105],[-83.566665999999998,46.098602000000085],[-83.577498999999989,46.105270000000075],[-83.596114999999998,46.114158999999972],[-83.610549999999932,46.119156000000089],[-83.627776999999867,46.123046999999929],[-83.663054999999872,46.126099000000067],[-83.830565999999862,46.126099000000067],[-83.846114999999941,46.124992000000134],[-83.883895999999936,46.102776000000119],[-83.888031000000012,46.096161000000109],[-83.892257999999913,46.092346000000134],[-83.898009999999942,46.08718900000008],[-83.917998999999952,46.073303000000124],[-83.923003999999935,46.070250999999985],[-83.936004999999966,46.065383999999995],[-83.942840999999987,46.066101000000003],[-83.952788999999996,46.068603999999993],[-83.958892999999932,46.071663000000115],[-83.962783999999999,46.075554000000011],[-84.076675000000023,46.203049000000135],[-84.089721999999938,46.220267999999976],[-84.099166999999909,46.232764999999972],[-84.105834999999956,46.247771999999998],[-84.15695199999999,46.391663000000108],[-84.15834000000001,46.396659999999997],[-84.160277999999948,46.424995000000024],[-84.154448999999943,46.445267000000115],[-84.149170000000026,46.457214000000079],[-84.139998999999989,46.474159000000043],[-84.121933000000013,46.498877999999991],[-84.118057000000022,46.512497000000053],[-84.118331999999953,46.518051000000071],[-84.119994999999903,46.523323000000005],[-84.12249799999995,46.527771000000143],[-84.126389000000017,46.531937000000084],[-84.132491999999957,46.53472099999999],[-84.192763999999954,46.546661000000086],[-84.408614999999884,46.508605999999986],[-84.428328999999962,46.503052000000025],[-84.434433000000013,46.500275000000101],[-84.454453000000001,46.486938000000066],[-84.459441999999967,46.482764999999915],[-84.463897999999972,46.478325000000098],[-84.474715999999944,46.463608000000079],[-84.479996000000028,46.46027400000014],[-84.486388999999974,46.458885000000123],[-84.494719999999973,46.458046000000138],[-84.512512000000015,46.45915999999994],[-84.529998999999975,46.461380000000133],[-84.565001999999993,46.466385000000002],[-84.775008999999955,46.653046000000074],[-84.787780999999995,46.68971300000004],[-84.806945999999925,46.748328999999956],[-84.825561999999877,46.806938000000059],[-84.83277899999996,46.829163000000051],[-84.856948999999986,46.902214000000072],[-84.872222999999963,46.909431000000041],[-84.917495999999971,46.928604000000121],[-85.354445999999996,47.111664000000076],[-85.464171999999905,47.157211000000132],[-85.738891999999964,47.270827999999995],[-85.839721999999938,47.31221000000005],[-86.014724999999942,47.383880999999917],[-86.051391999999964,47.39888000000002],[-86.466659999999933,47.567215000000033],[-86.568893000000003,47.608330000000024],[-86.884444999999971,47.734717999999987],[-87.201400999999976,47.860275000000115],[-87.341674999999952,47.915542999999957],[-87.444716999999969,47.955826000000002],[-88.188323999999966,48.244156000000089],[-88.368056999999908,48.31221000000005],[-88.645554000000004,48.264160000000004],[-88.691665999999941,48.255554000000075],[-88.974166999999909,48.139160000000118],[-89.323333999999988,47.993050000000096],[-89.356658999999979,47.979713000000061],[-89.447768999999937,48.003326000000015],[-89.493125999999961,48.003166000000078],[-89.556655999999975,48.001389000000131],[-89.573059000000001,48.001663000000065],[-89.57887299999993,48.00262500000008],[-89.583069000000023,48.003326000000015],[-89.598617999999931,48.006660000000011],[-89.603881999999999,48.00999500000006],[-89.608337000000006,48.014160000000061],[-89.614715999999987,48.016663000000051],[-89.750564999999995,48.029160000000047],[-89.760559000000001,48.029991000000052],[-89.838897999999972,48.01166500000005],[-89.862502999999947,48.000832000000059],[-89.888061999999991,47.991936000000123],[-89.895554000000004,47.989990000000034],[-89.903885000000002,47.989159000000029],[-89.911666999999966,47.991379000000052],[-89.982223999999974,48.016105999999979],[-89.993057000000022,48.02276599999999],[-90,48.030204999999967],[-90.000838999999985,48.031105000000025],[-90.032775999999956,48.069717000000026],[-90.056106999999997,48.100548000000117],[-90.059432999999956,48.104996000000085],[-90.065001999999936,48.10833000000008],[-90.081680000000006,48.111938000000009],[-90.12721299999987,48.119156000000032],[-90.146118000000001,48.121658000000082],[-90.156386999999938,48.122490000000028],[-90.279998999999975,48.113051999999982],[-90.740829000000019,48.090828000000045],[-90.758895999999993,48.094711000000018],[-90.769454999999937,48.099998000000085],[-90.778335999999967,48.107498000000021],[-90.838608000000022,48.184158000000025],[-90.841674999999952,48.191658000000132],[-90.843063000000029,48.205826000000002],[-90.83805799999999,48.208603000000039],[-90.833625999999924,48.209099000000094],[-90.829726999999991,48.212493999999936],[-90.829192999999975,48.214638000000093],[-90.828887999999949,48.221656999999936],[-90.830291999999929,48.225548000000003],[-90.832503999999915,48.227211000000125],[-90.849166999999909,48.233879000000115],[-90.868606999999997,48.237495000000138],[-90.898055999999883,48.236656000000039],[-90.928329000000019,48.228600000000142],[-90.969161999999926,48.214714000000129],[-91.126098999999954,48.154991000000109],[-91.14916999999997,48.144157000000064],[-91.192489999999964,48.114998000000071],[-91.232223999999974,48.087769000000094],[-91.24888599999997,48.079437000000098],[-91.269454999999994,48.07388300000008],[-91.283324999999991,48.071381000000031],[-91.311661000000015,48.069160000000124],[-91.325561999999991,48.069717000000026],[-91.34722899999997,48.068054000000075],[-91.381377999999984,48.061661000000129],[-91.392226999999934,48.056099000000017],[-91.418335000000013,48.041107000000011],[-91.462783999999942,48.057770000000062],[-91.573623999999995,48.093048000000067],[-91.645142000000021,48.098343000000114],[-91.6875,48.144714000000135],[-91.729720999999984,48.187209999999936],[-91.734160999999915,48.190543999999932],[-91.739715999999987,48.193321000000026],[-91.756957999999997,48.194434999999999],[-91.776107999999965,48.194153000000142],[-91.791672000000005,48.195267000000115],[-91.850554999999986,48.203880000000083],[-91.940276999999924,48.23054500000012],[-91.956589000000008,48.23663300000004],[-91.97084000000001,48.244437999999946],[-91.985824999999977,48.255829000000119],[-91.997771999999998,48.266662999999994],[-92.007232999999985,48.27915999999999],[-92.008895999999993,48.28276800000009],[-92.011123999999938,48.292496000000085],[-92.011672999999917,48.297493000000031],[-92.013335999999924,48.304993000000081],[-92.020554000000004,48.322769000000051],[-92.02806099999998,48.336105000000032],[-92.035552999999993,48.343605000000082],[-92.041945999999939,48.347771000000023],[-92.051940999999943,48.353882000000056],[-92.141678000000013,48.357216000000051],[-92.162216000000001,48.356658999999979],[-92.257232999999928,48.346939000000077],[-92.265014999999892,48.343605000000082],[-92.276107999999965,48.337493999999992],[-92.280288999999982,48.332771000000037],[-92.285827999999981,48.326103000000046],[-92.300551999999925,48.304993000000081],[-92.300827000000027,48.298050000000103],[-92.297225999999966,48.28943600000008],[-92.288604999999961,48.276100000000099],[-92.283614999999998,48.263885000000016],[-92.283065999999963,48.256660000000124],[-92.285552999999936,48.250549000000035],[-92.290282999999988,48.246658000000139],[-92.306716999999935,48.241592000000026],[-92.331680000000006,48.234160999999972],[-92.351943999999946,48.228325000000098],[-92.356658999999979,48.228600000000142],[-92.361664000000019,48.231102000000021],[-92.369155999999975,48.238883999999985],[-92.426392000000021,48.311661000000072],[-92.455275999999969,48.394157000000007],[-92.582229999999981,48.441375999999991],[-92.697768999999994,48.485268000000076],[-92.715285999999935,48.541382000000056],[-92.943054000000018,48.621101000000067],[-92.953063999999927,48.62332200000003],[-92.966109999999958,48.624991999999963],[-93.244995000000017,48.640549000000021],[-93.308883999999978,48.630272000000048],[-93.322509999999966,48.628044000000102],[-93.40834000000001,48.608604000000128],[-93.449996999999996,48.597214000000065],[-93.456664999999987,48.594994000000042],[-93.458618000000001,48.592491000000052],[-93.458618000000001,48.589432000000102],[-93.456116000000009,48.583054000000118],[-93.452788999999996,48.579436999999984],[-93.449721999999952,48.570549000000028],[-93.449996999999996,48.56749700000006],[-93.454177999999899,48.559714999999926],[-93.46055599999994,48.55332199999998],[-93.465835999999911,48.54972099999992],[-93.476394999999968,48.544158999999979],[-93.489440999999999,48.539718999999991],[-93.503066999999874,48.537498000000085],[-93.65695199999999,48.51527399999992],[-93.664444000000003,48.514999000000103],[-93.724166999999966,48.51388500000013],[-93.778610000000015,48.51638800000012],[-93.793059999999969,48.517768999999987],[-93.800277999999935,48.520271000000037],[-93.803604000000007,48.524712000000136],[-93.805557000000022,48.532211000000132],[-93.80972300000002,48.550270000000069],[-93.817779999999971,48.581940000000145],[-93.820007000000032,48.590546000000074],[-93.830001999999979,48.612770000000012],[-93.833327999999995,48.616386000000034],[-93.842498999999975,48.623604000000057],[-93.851944000000003,48.626938000000052],[-93.865554999999972,48.630272000000048],[-93.880553999999961,48.630272000000048],[-93.885283999999899,48.630272000000048],[-94.063888999999961,48.638046000000031],[-94.111937999999896,48.641106000000093],[-94.134170999999867,48.642769000000044],[-94.235275000000001,48.653046000000018],[-94.250564999999995,48.656097000000045],[-94.252791999999886,48.65776800000009],[-94.25418099999996,48.660545000000013],[-94.252228000000002,48.671379000000059],[-94.252228000000002,48.679993000000138],[-94.256667999999934,48.687767000000122],[-94.263061999999991,48.694153000000028],[-94.271117999999888,48.699158000000068],[-94.278610000000015,48.702492000000063],[-94.291107000000011,48.706099999999992],[-94.305832000000009,48.708328000000108],[-94.390563999999927,48.711105000000032],[-94.406112999999948,48.711105000000032],[-94.414169000000015,48.709991000000059],[-94.433318999999983,48.701934999999992],[-94.453613000000018,48.695824000000073],[-94.460555999999997,48.694435000000112],[-94.476395000000025,48.693878000000041],[-94.500838999999985,48.696938000000046],[-94.523894999999925,48.701934999999992],[-94.605835000000013,48.724433999999917],[-94.637221999999952,48.739159000000086],[-94.643616000000009,48.743049999999982],[-94.689986999999917,48.774712000000079],[-94.699996999999996,48.782767999999976],[-94.706664999999987,48.79055000000011],[-94.709441999999967,48.803047000000106],[-94.711120999999991,48.846382000000062],[-94.710007000000019,48.855270000000075],[-94.709075999999982,48.857948000000135],[-94.705001999999979,48.862770000000125],[-94.700287000000003,48.868881000000044],[-94.699722000000008,48.871101000000067],[-94.700287000000003,48.895271000000037],[-94.701675000000023,48.909714000000122],[-94.704178000000013,48.924438000000009],[-94.707503999999972,48.941932999999949],[-94.71665999999999,48.970543000000021],[-94.720550999999887,48.978874000000076],[-94.727218999999934,48.99221799999998],[-94.732773000000009,49.001663000000065],[-94.745270000000005,49.028603000000089],[-94.766952999999944,49.075554000000125],[-94.797774999999945,49.155822999999998],[-94.798889000000031,49.159156999999993],[-94.804717999999866,49.17971799999998],[-94.806655999999975,49.193603999999993],[-94.81527699999998,49.29332700000009],[-94.815552000000025,49.306099000000131],[-94.818344000000025,49.309989999999971],[-94.821944999999971,49.312767000000065],[-94.922775000000001,49.355827000000033],[-94.935927999999933,49.360297999999943],[-94.946380999999974,49.36221299999994],[-94.958617999999944,49.361664000000019],[-94.96556099999998,49.360275000000001],[-94.998610999999983,49.357498000000078],[-95.025833000000034,49.357498000000078],[-95.078063999999927,49.359161000000029],[-95.085662999999954,49.360023000000126],[-95.120834000000002,49.364998000000014],[-95.142501999999922,49.371658000000025],[-95.152785999999935,49.376656000000025],[-95.154174999999952,49.366386000000091],[-95.154448999999886,49.333328000000108],[-95.153960999999981,49.173332000000073],[-95.154174999999952,48.999435000000119],[-95.26655599999998,48.999977000000001],[-97.219940000000008,48.999718000000087],[-97.502791999999943,48.999435000000119],[-97.635833999999988,48.999435000000119],[-97.801940999999999,49.000000000000114],[-97.969161999999926,49.000274999999988],[-98.26916499999993,49.000274999999988],[-98.502227999999889,48.999435000000119],[-98.868606999999997,49.000000000000114],[-99.335555999999997,48.999435000000119],[-99.835555999999997,49.000000000000114],[-100.00222799999995,49.000000000000114],[-100.50195300000001,48.999718000000087],[-101.06916799999999,49.000000000000114],[-101.30222299999997,49.000274999999988],[-101.367233,48.998787000000107],[-101.46888699999994,48.999435000000119],[-102.16887699999995,49.000000000000114],[-102.33556399999998,48.999435000000119],[-102.53555299999994,49.000274999999988],[-102.76834099999996,48.999435000000119],[-103.03527800000001,48.999435000000119],[-103.16832699999992,48.999435000000119],[-103.26889,49.000000000000114],[-103.43554699999993,49.000274999999988],[-103.53527800000001,48.999435000000119],[-103.73528299999987,48.999435000000119],[-104.033096,49.000251999999989],[-104.13527699999986,48.999718000000087],[-104.33500699999996,48.999435000000119],[-104.83500700000002,48.999435000000119],[-105.00140399999998,48.999435000000119],[-105.26834100000002,49.000000000000114],[-105.70221699999996,48.999435000000119],[-105.93554699999999,48.999435000000119],[-106.03472899999991,48.999435000000119],[-106.13527699999997,48.999435000000119],[-106.26862299999993,48.999435000000119],[-106.46806300000003,48.999435000000119],[-106.73554999999993,48.999435000000119],[-107.33528100000001,49.000000000000114],[-107.43499800000001,49.000000000000114],[-107.63474300000001,48.999435000000119],[-107.73554999999993,48.999435000000119],[-107.80110199999996,48.999435000000119],[-108.16887700000001,48.999435000000119],[-108.33500699999996,48.999435000000119],[-108.53472899999997,48.999435000000119],[-108.6677699999999,48.999435000000119],[-108.83473200000003,48.999435000000119],[-109.33473200000003,48.999435000000119],[-109.63474299999996,48.999435000000119],[-109.801941,48.999435000000119],[-109.96777299999997,48.999718000000087],[-109.99965700000001,49.000603000000126],[-110.10138699999999,48.999435000000119],[-110.20111099999991,48.999435000000119],[-110.30166599999995,49.000000000000114],[-110.36776699999996,49.000000000000114],[-110.50110599999988,49.000000000000114],[-110.66777000000002,49.000000000000114],[-110.76862299999993,48.999435000000119],[-111.36833199999995,48.999435000000119],[-111.80110199999996,48.999435000000119],[-112.03472899999997,48.999435000000119],[-112.16832699999998,48.999435000000119],[-112.234734,49.000000000000114],[-112.33500699999996,49.000000000000114],[-112.43499799999995,49.000000000000114],[-112.53500399999996,49.000000000000114],[-112.60166900000002,49.000000000000114],[-112.93472300000002,49.000000000000114],[-113.03443900000002,49.000000000000114],[-113.23416099999997,48.999435000000119],[-113.36833200000001,48.999435000000119],[-113.567497,48.999435000000119],[-114.03443899999991,48.999435000000119],[-114.05985999999996,49.000603000000126],[-114.33500700000002,48.999435000000119],[-114.46749899999992,48.999435000000119],[-114.53472899999991,49.000000000000114],[-114.63390399999997,49.000000000000114],[-114.90110800000002,48.999435000000119],[-115.03415699999999,48.999435000000119],[-115.16750299999995,48.999435000000119],[-115.36805700000002,49.000000000000114],[-115.46806300000003,49.000000000000114],[-115.56723,49.000000000000114],[-115.60138699999987,48.999435000000119],[-115.734444,48.999435000000119],[-116.04833999999994,48.999718000000087],[-117.00140399999998,48.999718000000087],[-117.03662099999997,49.003128000000117],[-117.06722999999994,48.999718000000087],[-117.20084399999996,48.999435000000119],[-117.234734,49.000000000000114],[-117.30055199999993,49.000000000000114],[-117.567497,49.000000000000114],[-117.83444199999991,49.000000000000114],[-117.86749299999997,48.999435000000119],[-118.00083899999998,48.999435000000119],[-118.13417099999998,48.999435000000119],[-118.36805699999996,48.999435000000119],[-118.76777600000003,48.999435000000119],[-118.96749899999992,48.999435000000119],[-119.13417099999987,48.999435000000119],[-119.26722699999999,48.999435000000119],[-119.46777299999985,48.999435000000119],[-119.86749299999991,48.999435000000119],[-119.93415800000002,48.999435000000119],[-120.03415699999999,48.999435000000119],[-120.53472899999997,48.999435000000119],[-121.08497599999993,48.999718000000087],[-122.10056299999997,49.000000000000114],[-122.33389299999993,49.000000000000114],[-122.43360899999993,49.000000000000114],[-122.56667299999992,49.000000000000114],[-122.69999699999994,49.000000000000114],[-122.76030000000003,48.999435000000119],[-122.81360599999994,49.005272000000048],[-122.83112299999999,49.008606000000043],[-122.86250299999989,49.022217000000012],[-122.87777699999998,49.032211000000018],[-122.87970699999994,49.034438999999963],[-122.88110399999999,49.038605000000075],[-122.87748699999986,49.049438000000066],[-122.87609900000001,49.051383999999928],[-122.87249799999989,49.054436000000067],[-122.86416600000001,49.061661000000129],[-122.85888699999992,49.067497000000003],[-122.85804699999994,49.072769000000108],[-122.859444,49.077217000000076],[-122.86638599999998,49.081107999999972],[-122.87444299999999,49.083602999999982],[-122.89998600000001,49.087211999999965],[-122.91887700000001,49.087211999999965],[-122.94167299999992,49.082496999999933],[-123.02194199999997,49.051658999999972],[-123.03916900000002,49.042496000000142],[-123.04666099999997,49.033332999999971],[-123.048607,49.027214000000129],[-123.04833999999994,49.022491000000116],[-123.04778299999998,49.018326000000116],[-123.03916900000002,49.005272000000048],[-123.03431699999999,48.999435000000119],[-123.09374999999994,48.999435000000119],[-123.11332699999997,49.036658999999986],[-123.13890099999998,49.107216000000108],[-123.14835399999998,49.10833000000008],[-123.20500199999998,49.123603999999943],[-123.20973200000003,49.127212999999983],[-123.247772,49.265273999999977],[-123.24889399999995,49.273605000000032],[-123.24749800000001,49.275551000000121],[-123.09449799999993,49.283938999999975],[-123.00933800000001,49.281944000000067],[-122.94332900000001,49.284164000000089],[-122.92360699999995,49.28833000000003],[-122.91251399999999,49.29332700000009],[-122.87917299999998,49.339157000000114],[-122.87499999999994,49.351387000000045],[-122.85388199999994,49.429993000000138],[-122.85278299999999,49.436104000000057],[-122.85333300000002,49.438880999999924],[-122.86054999999993,49.447487000000024],[-122.87082700000002,49.457214000000022],[-122.87638899999996,49.455551000000071],[-122.87832600000002,49.449432000000058],[-122.876938,49.429993000000138],[-122.87721299999993,49.414992999999981],[-122.88110399999999,49.40277100000003],[-122.88583399999993,49.391936999999984],[-122.90139799999992,49.360550000000046],[-122.91555800000003,49.342216000000064],[-122.93138099999999,49.328049000000135],[-123.00538599999999,49.319549999999992],[-123.03671999999989,49.313217000000009],[-123.04521899999992,49.312550000000044],[-123.06339299999996,49.313217000000009],[-123.08023100000003,49.315547999999978],[-123.23638900000003,49.338882000000069],[-123.25418099999996,49.384720000000016],[-123.25666799999993,49.512772000000041],[-123.25334199999992,49.523048000000131],[-123.24722299999996,49.534995999999978],[-123.20162199999999,49.615715000000137],[-123.1558379999999,49.676102000000014],[-123.15416700000003,49.67943600000001],[-123.15222199999994,49.685547000000099],[-123.15361000000001,49.690269000000001],[-123.15972899999997,49.699158000000068],[-123.16471899999993,49.702217000000019],[-123.16777000000002,49.702217000000019],[-123.17027300000001,49.701103000000046],[-123.24194299999999,49.660544999999956],[-123.24804699999993,49.648605000000089],[-123.24804699999993,49.639717000000076],[-123.26677699999999,49.617378000000031],[-123.26594499999999,49.610382000000129],[-123.265106,49.607880000000023],[-123.26494600000001,49.603713999999968],[-123.26576999999997,49.598381000000131],[-123.26812000000001,49.595551000000114],[-123.27095799999995,49.593215999999984],[-123.27977799999991,49.590050000000019],[-123.34333800000002,49.561378000000047],[-123.38110399999999,49.556655999999975],[-123.39444699999996,49.551933000000133],[-123.43028299999997,49.538329999999974],[-123.48306300000002,49.516663000000108],[-123.49249299999997,49.509720000000129],[-123.495003,49.506943000000035],[-123.49610899999993,49.500275000000045],[-123.49416399999996,49.468596999999988],[-123.491669,49.463608000000022],[-123.48777799999993,49.46054799999996],[-123.47778299999993,49.455268999999987],[-123.47416699999997,49.450828999999999],[-123.47332799999992,49.441101000000117],[-123.47609699999998,49.421936000000017],[-123.47666899999996,49.419159000000093],[-123.48194899999993,49.409988000000112],[-123.48665599999993,49.406097000000045],[-123.506958,49.389435000000049],[-123.512787,49.386383000000137],[-123.51944699999996,49.383881000000088],[-123.52694700000001,49.382210000000043],[-123.53555299999994,49.381378000000097],[-123.54499800000002,49.383331000000055],[-123.60109699999987,49.397490999999945],[-123.60610999999994,49.399994000000106],[-123.67555199999998,49.425269999999955],[-123.77500900000001,49.458327999999995],[-123.85500299999995,49.468879999999956],[-123.86165599999993,49.46665999999999],[-123.88082899999995,49.466385000000116],[-123.88890100000003,49.468048000000067],[-123.89611799999994,49.470543000000077],[-123.95973200000003,49.510551000000135],[-123.96362299999993,49.513329000000113],[-123.98860200000001,49.541663999999969],[-124.06806899999992,49.633881000000031],[-124.07055700000001,49.638046000000031],[-124.07112099999995,49.644440000000088],[-124.07028199999991,49.649719000000061],[-124.05915800000002,49.671104000000014],[-124.03250100000002,49.713882000000126],[-124.02861000000001,49.71915400000006],[-124.021118,49.726379000000065],[-124.00527999999997,49.735825000000034],[-123.99833699999999,49.738884000000041],[-123.987213,49.743050000000096],[-123.97528099999994,49.745270000000119],[-123.95694700000001,49.746101000000124],[-123.94748700000002,49.744995000000131],[-123.94055199999997,49.742493000000024],[-123.93443299999996,49.739432999999963],[-123.92971799999992,49.735825000000034],[-123.876938,49.683327000000077],[-123.83306900000002,49.627486999999974],[-123.82917799999996,49.616936000000067],[-123.82444800000002,49.595825000000048],[-123.82277699999997,49.585548000000074],[-123.82333399999999,49.581383000000073],[-123.82224300000001,49.573051000000078],[-123.79972800000002,49.519440000000031],[-123.79444899999993,49.510277000000031],[-123.78971899999999,49.506660000000068],[-123.78250099999997,49.504166000000112],[-123.77639799999992,49.503882999999973],[-123.76972999999998,49.504715000000033],[-123.76640299999991,49.506660000000068],[-123.76390100000003,49.509438000000046],[-123.76139799999999,49.513329000000113],[-123.75389100000001,49.537773000000072],[-123.76862299999993,49.561935000000119],[-123.77139299999999,49.572220000000073],[-123.77223200000003,49.581940000000145],[-123.77027900000002,49.588043000000084],[-123.74017300000003,49.602599999999995],[-123.73733500000003,49.605270000000075],[-123.73517599999991,49.606937000000016],[-123.69599899999997,49.623604000000057],[-123.68683599999997,49.625603000000069],[-123.67283599999996,49.625271000000112],[-123.63890099999998,49.634995000000004],[-123.61501299999992,49.639160000000004],[-123.56331599999999,49.667213000000118],[-123.54695100000004,49.677215999999987],[-123.53751399999993,49.684990000000028],[-123.53362300000003,49.689712999999983],[-123.53167699999995,49.695541000000105],[-123.53222699999998,49.700546000000145],[-123.53388999999993,49.701934999999992],[-123.54167199999989,49.701103000000046],[-123.54998799999998,49.693877999999984],[-123.56054699999993,49.686935000000005],[-123.57195299999995,49.680824000000086],[-123.58556399999992,49.676102000000014],[-123.67578100000003,49.653046000000018],[-123.69061299999993,49.651051000000109],[-123.73978399999999,49.645882000000029],[-123.75010700000001,49.64521400000001],[-123.79666099999997,49.638328999999999],[-123.80387899999999,49.640831000000048],[-123.8125,49.647491000000116],[-123.93499800000001,49.768326000000002],[-123.93749999999989,49.77276599999999],[-123.93582200000003,49.778046000000074],[-123.93055699999996,49.785271000000137],[-123.91999800000002,49.792495999999971],[-123.88890100000003,49.819717000000026],[-123.88500999999997,49.823608000000092],[-123.88249199999996,49.82749200000012],[-123.87970699999994,49.832771000000093],[-123.87638900000002,49.842215999999951],[-123.87332200000003,49.864158999999916],[-123.87249799999995,49.87110100000001],[-123.872772,49.877212999999983],[-123.88500999999997,49.914993000000095],[-123.889183,49.922767999999962],[-123.89417300000002,49.92721599999993],[-123.90139799999992,49.928879000000052],[-123.91082799999998,49.930275000000108],[-123.920547,49.928604000000064],[-123.92999299999997,49.929718000000037],[-123.93720999999994,49.932213000000047],[-123.94193999999999,49.936104000000114],[-123.94860799999998,49.943877999999927],[-123.95472699999999,49.953049000000078],[-123.95889299999999,49.962212000000079],[-123.929779,49.985321000000056],[-123.929283,49.989493999999979],[-123.92544599999997,49.994156000000089],[-123.92044099999998,49.997325999999987],[-123.88160700000003,50.01499600000011],[-123.87343599999986,50.018326000000116],[-123.860771,50.021660000000111],[-123.85294299999998,50.022995000000037],[-123.84310199999999,50.023659000000123],[-123.80832699999996,50.040276000000119],[-123.79611199999994,50.04444100000012],[-123.75334199999998,50.07638500000013],[-123.74861099999998,50.080276000000026],[-123.74445300000002,50.086936999999921],[-123.74944299999999,50.09665700000005],[-123.82140399999997,50.152213999999958],[-123.83056599999998,50.156936999999971],[-123.846947,50.163321999999994],[-123.97778299999993,50.213882000000012],[-123.98500100000001,50.216103000000089],[-123.99054699999999,50.215828000000101],[-123.99109599999986,50.21166199999999],[-123.98832699999997,50.207496999999989],[-123.96056399999998,50.180550000000096],[-123.94695300000001,50.169441000000006],[-123.93720999999994,50.163321999999994],[-123.92388899999992,50.158600000000092],[-123.90583800000002,50.15638000000007],[-123.88806199999988,50.152489000000003],[-123.882767,50.150826000000052],[-123.87165800000002,50.145546000000024],[-123.80915799999997,50.099998000000085],[-123.8125,50.090546000000131],[-123.81639099999995,50.086105000000032],[-123.85716200000002,50.066883000000132],[-123.86933099999993,50.058048000000099],[-123.87499999999994,50.054214000000115],[-123.87899799999997,50.052380000000085],[-123.916,50.039883000000088],[-123.95465899999988,50.029217000000074],[-123.99526999999989,50.011664999999994],[-123.99916099999996,50.00638600000002],[-124,50.000275000000101],[-123.99916099999996,49.990547000000106],[-123.99526999999989,49.961662000000047],[-123.99249299999997,49.942764000000125],[-123.99109599999986,49.937209999999993],[-123.98860200000001,49.931664000000126],[-123.97972099999998,49.916663999999969],[-123.96721600000001,49.906380000000127],[-123.95140100000003,49.895828000000108],[-123.91972399999992,49.877769000000001],[-123.91471899999993,49.873878000000104],[-123.91111799999999,49.869713000000104],[-123.922234,49.834435000000099],[-123.92639199999996,49.825828999999999],[-123.97277799999989,49.80471],[-123.97833299999996,49.803047000000106],[-123.98581699999994,49.802772999999945],[-123.99194299999994,49.804436000000067],[-124.00418100000002,49.810546999999985],[-124.01012400000002,49.834602000000075],[-124.00862100000001,49.841938000000084],[-124.00728600000002,49.856769999999983],[-124.01806599999998,49.909156999999993],[-124.02166699999987,49.91415400000011],[-124.029449,49.920547000000056],[-124.037781,49.922493000000145],[-124.04222099999998,49.921379000000002],[-124.04472399999997,49.917496000000028],[-124.068893,49.878876000000105],[-124.07195299999995,49.873322000000087],[-124.07028199999991,49.869156000000032],[-124.06261399999988,49.846328999999912],[-124.05877700000002,49.841991000000007],[-124.05860899999999,49.838325999999995],[-124.06028000000003,49.835158999999976],[-124.08444199999991,49.799164000000133],[-124.09028599999999,49.795830000000137],[-124.14555399999995,49.779716000000008],[-124.17694099999989,49.773604999999975],[-124.18582199999997,49.77276599999999],[-124.2702789999999,49.768051000000128],[-124.40416700000003,49.763329000000056],[-124.41361999999998,49.763610999999969],[-124.42916899999994,49.766388000000006],[-124.43639400000001,49.768883000000073],[-124.51194800000002,49.796104000000071],[-124.52166699999992,49.804161000000079],[-124.52443699999998,49.808327000000133],[-124.52583300000003,49.813880999999981],[-124.52583300000003,49.831665000000044],[-124.52749599999987,49.837212000000022],[-124.53278399999999,49.844437000000084],[-124.57195299999995,49.874435000000005],[-124.59137699999997,49.883049000000085],[-124.63221699999997,49.899436999999921],[-124.702789,49.934989999999971],[-124.74194299999999,49.958328000000051],[-124.77306399999992,49.985825000000034],[-124.80332900000002,50.020271000000093],[-124.82556199999999,50.051384000000098],[-124.82972699999999,50.061935000000005],[-124.828056,50.066666000000112],[-124.82140400000003,50.069160000000068],[-124.81304899999992,50.067496999999946],[-124.80695300000002,50.06360600000005],[-124.76722699999988,50.036385000000053],[-124.70333900000003,49.995543999999995],[-124.66805999999991,50.07027400000004],[-124.61694299999999,50.179161000000079],[-124.60193599999997,50.234993000000031],[-124.60138699999993,50.238884000000098],[-124.60417200000001,50.243881000000044],[-124.63110399999999,50.279716000000121],[-124.63890100000003,50.286942000000067],[-124.665009,50.303879000000052],[-124.708618,50.318329000000006],[-124.71362299999987,50.321937999999989],[-124.71501199999994,50.327492000000007],[-124.65778399999994,50.386108000000092],[-124.65194699999989,50.389160000000061],[-124.62609899999995,50.398330999999985],[-124.60193599999997,50.40277100000003],[-124.58055100000001,50.399990000000116],[-124.57555400000001,50.39899400000013],[-124.57122800000002,50.397495000000106],[-124.54998799999993,50.393883000000017],[-124.53362300000003,50.395827999999995],[-124.51999699999999,50.399994000000106],[-124.43415800000002,50.431664000000012],[-124.42054699999994,50.43721000000005],[-124.39862099999999,50.450545999999974],[-124.38305700000001,50.462212000000136],[-124.36138900000003,50.479713000000118],[-124.35193600000002,50.487495000000081],[-124.34805299999999,50.492218000000037],[-124.34528399999988,50.497489999999971],[-124.34777800000001,50.50249500000001],[-124.35527000000002,50.504997000000117],[-124.36389200000002,50.503882999999917],[-124.378601,50.499161000000015],[-124.38445299999995,50.49610100000001],[-124.39388999999989,50.488884000000041],[-124.39778099999995,50.484161000000086],[-124.40055799999993,50.478874000000133],[-124.404449,50.4741590000001],[-124.40915699999999,50.470268000000033],[-124.42749000000003,50.462212000000136],[-124.51834099999991,50.432212999999933],[-124.58383199999997,50.414051000000029],[-124.58833300000003,50.41338300000001],[-124.59999800000003,50.413048000000003],[-124.71167000000003,50.375549000000092],[-124.73916599999995,50.351936000000137],[-124.80332900000002,50.317772000000105],[-124.81582600000002,50.312209999999993],[-124.83000199999992,50.30943300000007],[-124.85056299999991,50.309714999999983],[-124.93916299999995,50.325271999999984],[-125.06388900000002,50.317772000000105],[-125.07224299999996,50.319442999999978],[-125.07833900000003,50.322495000000117],[-125.08416699999998,50.329719999999952],[-125.08889799999997,50.346382000000119],[-125.08750900000001,50.357215999999994],[-125.05666399999996,50.476936000000023],[-125.05194099999989,50.480820000000051],[-125.04499799999996,50.48333000000008],[-125.02667199999996,50.483047000000113],[-125.01806599999998,50.484161000000086],[-124.97112299999998,50.498047000000042],[-124.96528599999999,50.50110600000005],[-124.88082900000001,50.560546999999985],[-124.85973399999989,50.585823000000062],[-124.858047,50.590546000000018],[-124.85444599999994,50.691376000000105],[-124.86888099999999,50.764998999999989],[-124.87805200000003,50.811377999999991],[-124.86749299999997,50.817771999999991],[-124.78943599999991,50.88110400000005],[-124.78694199999995,50.884438000000046],[-124.78751399999993,50.889160000000118],[-124.79998799999998,50.91304800000006],[-124.80277999999998,50.9180530000001],[-124.80583200000001,50.920830000000024],[-124.81916799999993,50.926384000000041],[-124.84999099999993,50.935265000000129],[-124.85417200000001,50.935547000000042],[-124.86138900000003,50.928879000000052],[-124.92443800000001,50.834717000000126],[-124.9449919999999,50.775268999999923],[-124.91221599999994,50.699431999999945],[-124.90139799999997,50.630271999999991],[-124.90194700000001,50.62471000000005],[-124.90361000000001,50.619987000000094],[-124.91111799999999,50.611382000000049],[-124.92887899999994,50.596382000000062],[-125.02694700000001,50.540833000000077],[-125.09944200000001,50.5],[-125.10417199999989,50.496941000000049],[-125.11277799999999,50.487495000000081],[-125.11694299999999,50.478043000000127],[-125.118607,50.471930999999984],[-125.11193800000001,50.452492000000063],[-125.11138899999997,50.447769000000108],[-125.11221299999994,50.44221500000009],[-125.11472299999997,50.436935000000005],[-125.11945300000002,50.432770000000005],[-125.12526700000001,50.429718000000094],[-125.17027299999995,50.412491000000102],[-125.17777999999998,50.41137700000013],[-125.1875,50.412491000000102],[-125.195831,50.414711000000068],[-125.20221699999991,50.417213000000004],[-125.20722999999998,50.420830000000137],[-125.24610899999993,50.462212000000136],[-125.33612099999993,50.479713000000118],[-125.40361000000001,50.473602000000028],[-125.42166099999992,50.465271000000143],[-125.44275699999997,50.459435000000042],[-125.46028099999995,50.457214000000135],[-125.48832700000003,50.45638300000013],[-125.54444899999993,50.490379000000132],[-125.54811099999995,50.492050000000006],[-125.54928599999994,50.494549000000006],[-125.54961399999996,50.497547000000054],[-125.54911799999996,50.501545000000135],[-125.53222700000003,50.62721300000004],[-125.51944700000001,50.647217000000126],[-125.51194800000002,50.657211000000132],[-125.50723299999999,50.661102000000028],[-125.50055699999996,50.663048000000117],[-125.48194899999999,50.664993000000095],[-125.46749899999998,50.668602000000135],[-125.45612299999999,50.674995000000081],[-125.45140100000003,50.678879000000109],[-125.42804699999999,50.705551000000014],[-125.42555199999998,50.710823000000119],[-125.43277,50.713882000000069],[-125.44360399999999,50.714157000000114],[-125.45889299999993,50.713608000000136],[-125.46639999999996,50.713051000000064],[-125.47332799999998,50.709159999999997],[-125.53778099999994,50.669991000000095],[-125.54723399999995,50.661933999999974],[-125.55832699999996,50.648048000000131],[-125.56388900000002,50.637214999999969],[-125.56806899999998,50.62721300000004],[-125.57167099999998,50.611382000000049],[-125.57224300000001,50.605270000000075],[-125.5849,50.571323000000064],[-125.58206899999999,50.56582300000008],[-125.58039099999996,50.563656000000037],[-125.5800549999999,50.559994000000074],[-125.58623499999999,50.536659000000043],[-125.610229,50.489326000000062],[-125.61238900000001,50.486492000000055],[-125.63722200000001,50.445540999999935],[-125.65167200000002,50.441375999999934],[-125.69249000000002,50.429993000000138],[-125.700287,50.428047000000049],[-125.70584099999996,50.427773000000116],[-125.71611000000001,50.432212999999933],[-125.84665699999994,50.502777000000094],[-125.86472300000003,50.495269999999948],[-125.93028299999992,50.473602000000028],[-125.95221700000002,50.468880000000127],[-125.968613,50.468880000000127],[-126.06331599999999,50.470825000000104],[-126.15915699999999,50.484992999999974],[-126.19332900000001,50.490273000000059],[-126.26777599999997,50.504997000000117],[-126.27500899999995,50.50750000000005],[-126.27916700000003,50.51166500000005],[-126.2808379999999,50.515830999999991],[-126.279449,50.520546000000024],[-126.27694700000001,50.524712000000079],[-126.22670699999998,50.536285000000021],[-126.18665299999998,50.548405000000059],[-126.18559999999997,50.566322000000014],[-126.23805199999998,50.591377000000023],[-126.25167799999991,50.609718000000044],[-126.26418299999995,50.615547000000049],[-126.27500899999995,50.627486999999974],[-126.27471899999995,50.631660000000068],[-126.266953,50.634720000000129],[-126.02006499999999,50.66188000000011],[-126.014725,50.662048000000141],[-125.90856200000002,50.664046999999982],[-125.73832699999997,50.682213000000104],[-125.69387799999993,50.704712000000029],[-125.62249799999995,50.750000000000114],[-125.61776700000001,50.754166000000055],[-125.54305999999991,50.863884000000098],[-125.53778099999994,50.87193300000007],[-125.51000999999997,50.921661000000029],[-125.50723299999999,50.926941000000113],[-125.50556899999998,50.93332700000002],[-125.50666799999993,50.945541000000048],[-125.50834699999996,50.951102999999989],[-125.55166600000001,51.042221000000097],[-125.56555200000003,51.056380999999988],[-125.58167999999995,51.072220000000129],[-125.59306299999997,51.07888000000014],[-125.610817,51.087769000000037],[-125.63390400000003,51.096939000000077],[-125.63722200000001,51.096382000000006],[-125.63890100000003,51.090271000000087],[-125.639183,51.077217000000019],[-125.63806199999999,51.06610100000006],[-125.58332799999999,50.974709000000018],[-125.61028299999987,50.89888000000002],[-125.69110099999995,50.771378000000084],[-125.73110999999989,50.735550000000046],[-125.81527699999987,50.707214000000079],[-125.96383700000001,50.688660000000084],[-126.12516799999997,50.678989000000115],[-126.13100400000002,50.678658000000098],[-126.133667,50.678825000000074],[-126.13799999999998,50.681827999999996],[-126.13917500000002,50.683495000000107],[-126.22222899999991,50.69110100000006],[-126.21362299999993,50.70388000000014],[-126.20889299999999,50.70777099999998],[-126.20333899999997,50.711104999999975],[-126.11165599999993,50.753883000000087],[-126.19888299999997,50.85582700000009],[-126.26944700000001,50.858047000000113],[-126.37609899999995,50.855270000000019],[-126.39750699999996,50.848602000000028],[-126.40306099999998,50.845268000000033],[-126.42166099999997,50.829437000000098],[-126.42748999999992,50.826103000000103],[-126.43415799999997,50.823608000000092],[-126.44304699999998,50.821663000000058],[-126.49333199999995,50.81638300000003],[-126.55277999999998,50.834717000000126],[-126.55695300000002,50.838882000000126],[-126.55972299999996,50.843880000000127],[-126.557503,50.876656000000082],[-126.55359599999991,50.881377999999984],[-126.53611799999999,50.898048000000074],[-126.531387,50.901932000000102],[-126.50110599999999,50.916099999999972],[-126.49445300000002,50.9180530000001],[-126.48332199999999,50.919158999999979],[-126.47471599999994,50.917496000000028],[-126.468613,50.914436000000137],[-126.46444700000001,50.910271000000137],[-126.45805399999995,50.907211000000075],[-126.36833200000001,50.901932000000102],[-126.35833700000001,50.901382000000069],[-126.24638400000003,50.898604999999975],[-126.22582999999997,50.898604999999975],[-126.21028100000001,50.902771000000087],[-126.20445299999994,50.90554800000001],[-126.18388399999992,50.918602000000078],[-126.17555199999993,50.92582700000014],[-126.17027299999995,50.936653000000035],[-126.17166099999997,50.946381000000088],[-126.17471299999988,50.950546000000088],[-126.17777999999998,50.951385000000016],[-126.181107,50.950829000000056],[-126.18888899999996,50.948875000000044],[-126.20028699999989,50.942490000000021],[-126.20500199999992,50.93832400000008],[-126.21556099999998,50.931106999999997],[-126.228882,50.926102000000128],[-126.24553700000001,50.923325000000034],[-126.30860899999999,50.925270000000012],[-126.412216,50.936104000000114],[-126.42639200000002,50.938599000000124],[-126.5625,50.907767999999976],[-126.56833599999993,50.903877000000136],[-126.58084099999996,50.898604999999975],[-126.66139199999998,50.868049999999982],[-126.67777999999998,50.866385999999977],[-126.72165699999994,50.876099000000011],[-126.80638099999999,50.909156999999993],[-126.81916799999999,50.915824999999984],[-126.90261799999996,50.905098000000066],[-126.90595199999996,50.90410200000008],[-126.91711399999997,50.903439000000105],[-127.01471700000002,50.903877000000136],[-127.04804999999993,50.910271000000137],[-127.08556399999998,50.921378999999945],[-127.112213,50.931106999999997],[-127.1641689999999,50.932495000000074],[-127.17639200000002,50.929161000000079],[-127.17999299999991,50.92582700000014],[-127.17804699999994,50.920273000000122],[-127.17166099999992,50.917496000000028],[-127.06276699999995,50.885269000000051],[-127.01883700000002,50.868267000000003],[-127.00765999999993,50.867939000000035],[-126.976158,50.870438000000036],[-126.97166400000003,50.869938000000047],[-126.96916999999991,50.869105999999931],[-126.96599600000002,50.86693600000001],[-126.96681999999998,50.864101000000062],[-127.01471700000002,50.819443000000092],[-127.02250700000002,50.817497000000003],[-127.03333299999997,50.817771999999991],[-127.047234,50.821663000000058],[-127.05776999999995,50.828048999999965],[-127.06166100000002,50.832213999999965],[-127.06696299999993,50.835823000000005],[-127.07333399999993,50.838882000000126],[-127.13276699999994,50.862212999999997],[-127.243607,50.896659999999997],[-127.33444199999997,50.906936999999971],[-127.39862099999993,50.926384000000041],[-127.43055699999991,50.940544000000102],[-127.53527800000001,51.000549000000035],[-127.53832999999997,51.005554000000075],[-127.53806299999997,51.008330999999998],[-127.502792,51.097487999999998],[-127.495003,51.0991590000001],[-127.47749299999992,51.097487999999998],[-127.43582199999997,51.082771000000037],[-127.40888999999987,51.071938000000046],[-127.39306599999992,51.064712999999983],[-127.38137799999998,51.059714999999983],[-127.3683319999999,51.055267000000015],[-127.354446,51.051659000000086],[-127.33056599999998,51.048331999999959],[-127.24249299999997,51.041382000000112],[-127.23610699999995,51.041107000000125],[-127.21861299999995,51.040832999999964],[-127.09612299999998,51.043883999999991],[-126.99873400000001,51.058883999999978],[-126.97956099999999,51.062881000000118],[-126.94840199999999,51.067050999999992],[-126.87339800000001,51.072883999999988],[-126.86672999999996,51.072716000000128],[-126.82656899999995,51.067050999999992],[-126.81689499999987,51.064716000000033],[-126.69167299999998,51.110550000000046],[-126.68694299999999,51.114716000000101],[-126.65278599999999,51.149994000000106],[-126.65139799999997,51.153320000000008],[-126.65110799999997,51.157494000000042],[-126.654449,51.185822000000144],[-126.65527299999997,51.187766999999951],[-126.65834000000001,51.192764000000068],[-126.66251399999993,51.194992000000013],[-126.67582700000003,51.193878000000041],[-126.67916899999994,51.192764000000068],[-126.68167099999994,51.188599000000067],[-126.68250299999994,51.176383999999985],[-126.68167099999994,51.172768000000076],[-126.68331899999998,51.165268000000026],[-126.68831599999999,51.157211000000075],[-126.69666299999994,51.14777400000014],[-126.71749899999998,51.132767000000115],[-126.84055299999989,51.094936000000075],[-126.84654999999992,51.093105000000094],[-126.85589599999997,51.092102000000068],[-126.927887,51.084938000000079],[-127.14111299999996,51.060272000000055],[-127.19249000000002,51.057213000000104],[-127.20667300000002,51.056380999999988],[-127.23832700000003,51.056938000000059],[-127.32668299999995,51.059714999999983],[-127.34084299999989,51.060822000000087],[-127.35916099999992,51.063323999999966],[-127.38861099999991,51.068054000000018],[-127.49273700000003,51.114883000000077],[-127.50985000000003,51.117359000000135],[-127.53376000000003,51.108082000000138],[-127.556107,51.099998000000028],[-127.63194299999998,51.091934000000037],[-127.64943699999998,51.092216000000064],[-127.66665599999988,51.095268000000033],[-127.67944299999988,51.101105000000132],[-127.78999299999992,51.165543000000014],[-127.79611199999994,51.197212000000036],[-127.79583700000001,51.202217000000076],[-127.787216,51.226097000000095],[-127.78472899999991,51.231376999999952],[-127.76194800000002,51.249435000000005],[-127.59973100000002,51.289435999999966],[-127.59306300000003,51.290833000000134],[-127.56555199999997,51.293052999999929],[-127.53999299999998,51.294441000000063],[-127.45140099999998,51.291939000000127],[-127.4036099999999,51.282494000000099],[-127.37554899999998,51.274437000000091],[-127.36472299999997,51.274162000000103],[-127.23110999999994,51.286110000000122],[-127.22222899999991,51.287216000000001],[-127.21444699999995,51.290549999999996],[-127.20388800000001,51.298607000000118],[-127.14334100000002,51.318329000000006],[-127.13305699999989,51.325554000000068],[-127.12693799999994,51.334991000000002],[-127.11776700000001,51.357498000000078],[-127.11110699999989,51.37721300000004],[-127.10973399999995,51.383330999999998],[-127.11028299999992,51.389717000000076],[-127.11582899999996,51.391662999999994],[-127.12249800000001,51.389160000000004],[-127.13054699999998,51.381934999999942],[-127.13417099999998,51.37721300000004],[-127.14417300000002,51.358046999999999],[-127.18250299999994,51.326942000000145],[-127.18804899999998,51.323607999999979],[-127.20834400000001,51.315826000000015],[-127.24749800000001,51.306380999999931],[-127.28056300000003,51.301102000000128],[-127.29055800000003,51.300545000000056],[-127.36749299999991,51.298881999999935],[-127.39584400000001,51.30221599999993],[-127.45221699999996,51.315826000000015],[-127.462784,51.341660000000047],[-127.55444299999999,51.332497000000046],[-127.57000699999998,51.328605999999979],[-127.75499699999989,51.319442999999978],[-127.76390100000003,51.319442999999978],[-127.77250699999996,51.3211060000001],[-127.77887699999997,51.324715000000083],[-127.78415699999994,51.333054000000118],[-127.78778099999994,51.34887700000013],[-127.78307299999994,51.356941000000006],[-127.77834300000001,51.361107000000061],[-127.74109599999997,51.380272000000048],[-127.72749299999998,51.385551000000021],[-127.69332899999995,51.390831000000048],[-127.68443300000001,51.390831000000048],[-127.65055799999999,51.408043000000077],[-127.55166600000001,51.468323000000055],[-127.51583900000003,51.519157000000007],[-127.51306199999993,51.529991000000052],[-127.512787,51.535552999999993],[-127.515289,51.5472180000001],[-127.521118,51.563880999999981],[-127.51640299999997,51.587769000000094],[-127.51500699999985,51.593880000000013],[-127.50890399999997,51.604712999999947],[-127.50055700000001,51.61360900000011],[-127.48805199999998,51.619438000000116],[-127.44444299999998,51.629990000000078],[-127.37609900000001,51.644997000000103],[-127.32584400000002,51.651382000000126],[-127.23332199999999,51.662490999999989],[-127.09584000000001,51.668052999999986],[-126.95344499999999,51.658325000000104],[-126.94693799999993,51.657657999999969],[-126.93778199999997,51.655327000000057],[-126.88377400000002,51.649494000000061],[-126.708054,51.641937000000041],[-126.66332999999986,51.64888000000002],[-126.65527299999997,51.651382000000126],[-126.620003,51.679993000000024],[-126.60694899999993,51.706940000000145],[-126.60527000000002,51.713051000000064],[-126.60582699999992,51.719436999999971],[-126.60777300000001,51.724990999999932],[-126.63555899999989,51.769714000000022],[-126.63944999999995,51.773880000000133],[-126.66027800000001,51.792221000000097],[-126.66528299999999,51.772491000000116],[-126.66665599999999,51.766388000000006],[-126.66251399999993,51.747215000000097],[-126.65387699999991,51.732491000000039],[-126.64362299999999,51.719154000000003],[-126.63999899999999,51.709991000000002],[-126.64138800000001,51.705269000000101],[-126.64388999999994,51.701102999999989],[-126.64750700000002,51.697768999999994],[-126.69304699999998,51.664711000000011],[-126.703056,51.664436000000023],[-126.91521499999999,51.682438000000047],[-126.96421799999996,51.686604000000102],[-126.97788199999997,51.690605000000062],[-127.05387899999988,51.697768999999994],[-127.07501199999996,51.697768999999994],[-127.14055599999995,51.694435000000055],[-127.27416999999997,51.68332700000002],[-127.3999859999999,51.669716000000051],[-127.41583300000002,51.665824999999984],[-127.42582699999997,51.666663999999969],[-127.43222000000003,51.66832700000009],[-127.43554699999987,51.671103999999957],[-127.43971299999993,51.674712999999997],[-127.44167299999992,51.680275000000108],[-127.42748999999998,51.731934000000138],[-127.364441,51.768326000000116],[-127.36193800000001,51.771660000000111],[-127.359444,51.777214000000072],[-127.33917200000002,51.839156999999943],[-127.33721899999989,51.851387000000045],[-127.33999599999999,51.861106999999947],[-127.34555099999994,51.864159000000086],[-127.35109699999992,51.863609000000054],[-127.35694899999999,51.860275000000058],[-127.44833399999987,51.777214000000072],[-127.57195299999989,51.706940000000145],[-127.58556399999986,51.677773000000059],[-127.54638699999992,51.627486999999917],[-127.55860899999999,51.543884000000105],[-127.56111099999998,51.538605000000132],[-127.57417299999997,51.518883000000073],[-127.58139,51.509437999999989],[-127.63583399999999,51.460548000000131],[-127.640289,51.458602999999925],[-127.65915699999999,51.457497000000103],[-127.70639,51.45638300000013],[-127.71639999999996,51.457214000000135],[-127.72389199999992,51.459435000000042],[-127.73029300000002,51.463051000000121],[-127.75473,51.479988000000105],[-127.75917099999992,51.484161000000029],[-127.76083399999993,51.48971599999993],[-127.75974300000001,51.494438000000059],[-127.74416400000001,51.498329000000126],[-127.712784,51.504439999999988],[-127.787216,51.560271999999941],[-127.87416099999996,51.663322000000051],[-127.87805200000003,51.673881999999992],[-127.88999899999999,51.798332000000016],[-127.88944999999995,51.807770000000005],[-127.886124,51.852218999999991],[-127.88474299999996,51.858604000000014],[-127.86971999999997,51.89527099999998],[-127.86609599999997,51.899993999999992],[-127.86165599999987,51.904160000000047],[-127.83306899999997,51.919991000000039],[-127.82055699999995,51.926659000000029],[-127.79638699999998,51.938599000000124],[-127.78971899999999,51.941101000000003],[-127.76611300000002,51.946937999999932],[-127.73805199999993,51.949715000000026],[-127.66443600000002,51.953880000000026],[-127.65527299999997,52.040276000000063],[-127.65387699999991,52.046386999999982],[-127.65139799999997,52.051659000000086],[-127.64527900000002,52.061934999999949],[-127.62943999999999,52.088326000000052],[-127.62581599999999,52.093047999999953],[-127.61749299999997,52.101936000000137],[-127.58029199999993,52.129158000000075],[-127.52555799999993,52.147217000000012],[-127.49944299999993,52.151657000000057],[-127.48055999999997,52.151099999999929],[-127.47721899999999,52.150543000000027],[-127.46528599999988,52.143883000000017],[-127.46140300000002,52.133049000000142],[-127.46250899999995,52.112495000000024],[-127.46611000000001,52.107773000000122],[-127.47556299999997,52.099716000000114],[-127.48249799999996,52.09693900000002],[-127.49833699999999,52.093322999999998],[-127.50834700000001,52.093322999999998],[-127.51834100000002,52.094436999999971],[-127.52722199999994,52.095825000000048],[-127.53500400000001,52.098877000000016],[-127.55277999999998,52.101105000000132],[-127.56276700000001,52.100829999999917],[-127.57167099999998,52.098877000000016],[-127.58444199999991,52.093605000000082],[-127.58889799999992,52.089714000000015],[-127.61416600000001,52.035828000000095],[-127.61332699999997,52.032494000000099],[-127.59416199999998,52.035553000000107],[-127.58612099999993,52.038048000000117],[-127.42083700000001,52.120270000000119],[-127.43360899999999,52.131659999999954],[-127.45056199999999,52.169159000000093],[-127.45249899999988,52.173882000000049],[-127.45305599999995,52.179993000000138],[-127.44972199999995,52.182770000000062],[-127.37609900000001,52.216934000000037],[-127.35417199999995,52.224709000000132],[-127.33138999999994,52.230270000000019],[-127.30027799999993,52.228325000000041],[-127.29110700000001,52.229431000000034],[-127.28443900000002,52.231934000000024],[-127.24526999999995,52.248878000000104],[-127.23944099999994,52.252220000000023],[-127.19304699999998,52.290833000000077],[-127.18582200000003,52.300270000000012],[-127.17749000000003,52.309715000000097],[-127.17166099999992,52.31249200000002],[-127.16361999999987,52.314156000000025],[-127.04276999999996,52.309158000000025],[-127.01251200000002,52.306381000000101],[-127.00499699999995,52.303604000000007],[-126.99861099999993,52.298607000000118],[-126.96444700000001,52.271659999999997],[-126.94526699999994,52.25610400000005],[-126.93804899999986,52.246941000000049],[-126.93611099999998,52.241379000000109],[-126.93554699999999,52.235268000000019],[-126.82749899999999,52.128044000000102],[-126.75195300000001,52.078605999999979],[-126.71193700000003,52.044441000000063],[-126.69415300000003,52.028877000000136],[-126.691101,52.023880000000077],[-126.68388399999998,51.999717999999973],[-126.67804699999994,51.990547000000049],[-126.67388899999997,51.986382000000049],[-126.66944899999999,51.983604000000071],[-126.66832699999998,51.985549999999932],[-126.66776999999996,51.991104000000121],[-126.66583300000002,52.031380000000127],[-126.66665599999999,52.036384999999996],[-126.66972399999997,52.041939000000013],[-126.73805199999987,52.113052000000096],[-126.76363399999991,52.13249200000007],[-126.81722999999988,52.166100000000085],[-126.83112299999999,52.17193599999996],[-126.85555999999997,52.178047000000049],[-126.86305199999993,52.181107000000111],[-126.88027999999986,52.190544000000045],[-126.90055799999999,52.205268999999987],[-126.90666199999993,52.215271000000143],[-126.94082600000002,52.303879000000052],[-126.94027699999998,52.31082200000003],[-126.93611099999998,52.32249500000006],[-126.932503,52.327217000000132],[-126.92083700000001,52.333603000000039],[-126.87361099999998,52.350830000000087],[-126.82084700000001,52.363883999999928],[-126.81416299999995,52.365273000000116],[-126.78888699999999,52.369987000000094],[-126.77667199999996,52.370270000000062],[-126.76194800000002,52.370543999999995],[-126.73638900000003,52.366386000000034],[-126.73166700000002,52.367767000000072],[-126.73249800000002,52.373877999999991],[-126.73665599999998,52.378044000000045],[-126.75167799999991,52.388328999999999],[-126.76363399999991,52.393326000000059],[-126.79277000000002,52.395546000000081],[-126.91027799999995,52.373877999999991],[-126.92610200000001,52.370827000000133],[-126.94110099999995,52.366386000000034],[-126.948036,52.363883999999928],[-126.95973199999997,52.357215999999994],[-126.96972699999998,52.34165999999999],[-126.97444200000001,52.337768999999923],[-126.98137699999995,52.33526599999999],[-127.00279199999994,52.334991000000116],[-127.08249699999993,52.334991000000116],[-127.14111299999996,52.348045000000013],[-127.15778399999999,52.352492999999981],[-127.18639400000001,52.380820999999969],[-127.22805800000003,52.453049000000135],[-127.23610699999995,52.505554000000132],[-127.23665599999998,52.51166500000005],[-127.23416099999997,52.517211999999972],[-127.19695299999995,52.549995000000138],[-127.18639400000001,52.557770000000062],[-127.08112299999993,52.613051999999982],[-127.07417299999997,52.616385999999977],[-127.05915800000002,52.620827000000077],[-127.00446299999999,52.626937999999996],[-126.99638399999998,52.62860100000006],[-126.989441,52.631935000000055],[-126.97972099999998,52.639434999999935],[-126.97609699999998,52.64388300000013],[-126.924713,52.714714000000129],[-126.92223399999995,52.718880000000013],[-126.92166099999997,52.725822000000107],[-126.92250100000001,52.731102000000021],[-126.966949,52.828606000000036],[-126.97112300000003,52.832771000000037],[-126.975281,52.835548000000131],[-126.98332199999987,52.837769000000037],[-127.01777599999991,52.845543000000021],[-127.02139299999993,52.82777400000009],[-127.01834100000002,52.823608000000036],[-127.00778199999996,52.808883999999978],[-126.98082699999992,52.724434000000031],[-126.98111,52.717491000000052],[-126.98528299999992,52.707497000000046],[-127.04250300000001,52.64777399999997],[-127.04737899999992,52.643462999999997],[-127.05561799999998,52.641815000000065],[-127.13445300000001,52.60943600000013],[-127.24054699999988,52.557770000000062],[-127.25723299999999,52.545830000000137],[-127.28083799999996,52.509162999999944],[-127.28222700000003,52.503052000000082],[-127.28028899999993,52.497489999999914],[-127.27610800000002,52.49332400000003],[-127.26528899999988,52.485550000000046],[-127.25805699999995,52.477211000000011],[-127.25834699999996,52.47304500000007],[-127.26194800000002,52.467491000000109],[-127.26666299999988,52.464157000000114],[-127.33345800000001,52.433895000000007],[-127.40082599999994,52.424431000000141],[-127.46541599999995,52.395477000000085],[-127.48935699999987,52.362072000000126],[-127.61165599999998,52.294716000000051],[-127.61833200000001,52.291939000000127],[-127.72138999999993,52.274712000000079],[-127.73055999999997,52.273604999999975],[-127.739441,52.27388000000002],[-127.74610899999999,52.276657000000114],[-127.75029000000001,52.281661999999983],[-127.80471799999998,52.248878000000104],[-127.84277299999997,52.2241590000001],[-127.84528399999999,52.219437000000028],[-127.85249299999987,52.209991000000059],[-127.85833699999995,52.206657000000064],[-127.86389200000002,52.207496999999933],[-127.86916399999996,52.211105000000032],[-127.87110899999999,52.216385000000116],[-127.87304699999999,52.223320000000001],[-127.90527299999991,52.27887700000008],[-127.86776700000001,52.494995000000074],[-127.86776700000001,52.500549000000092],[-127.86971999999997,52.506103999999993],[-127.87499999999994,52.510276999999917],[-127.88166799999999,52.51249700000011],[-127.89195299999994,52.513329000000056],[-127.89998599999996,52.50999500000006],[-127.92488899999995,52.443886000000134],[-127.92971799999992,52.427547000000004],[-127.92854299999999,52.424213000000009],[-127.92588000000001,52.421215000000132],[-127.916718,52.414879000000099],[-127.90905800000002,52.407382999999982],[-127.90589099999988,52.401549999999986],[-127.90538800000002,52.39788400000009],[-127.95694700000001,52.324440000000038],[-127.96389799999997,52.321663000000115],[-127.97277800000001,52.323326000000066],[-127.995003,52.330551000000128],[-128.00805699999989,52.336937000000034],[-128.01251200000002,52.341102999999919],[-128.05721999999997,52.394713999999965],[-128.05917399999998,52.400269000000094],[-128.06832899999995,52.447769000000051],[-128.06695599999995,52.45388000000014],[-128.05944799999992,52.470267999999976],[-128.05111699999992,52.478874000000076],[-128.0419619999999,52.487770000000012],[-128.03250100000002,52.495270000000119],[-128.00945999999999,52.508606000000043],[-127.97721899999999,52.519714000000079],[-127.96916199999993,52.521660000000111],[-127.96140300000002,52.519440000000145],[-127.95612299999993,52.515831000000105],[-127.89611799999994,52.542220999999984],[-127.89138800000001,52.546387000000038],[-127.88778699999995,52.551102000000071],[-127.87998999999991,52.574164999999994],[-127.87970699999994,52.579720000000066],[-127.88751200000002,52.577773999999977],[-128.0291749999999,52.541664000000083],[-128.04083300000002,52.535827999999981],[-128.09973099999991,52.503052000000082],[-128.1049349999999,52.492382000000077],[-128.11831699999999,52.465546000000074],[-128.14834599999995,52.422217999999987],[-128.22500599999989,52.330826000000116],[-128.23330699999997,52.321937999999989],[-128.27862499999998,52.280822999999998],[-128.28332499999993,52.276657000000114],[-128.28890999999999,52.273323000000119],[-128.29583700000001,52.270828000000108],[-128.30499299999997,52.269439999999975],[-128.39388999999989,52.291382000000056],[-128.32971199999992,52.380271999999991],[-128.29751599999992,52.400543000000027],[-128.29083300000002,52.401657],[-128.28085299999992,52.400825999999995],[-128.27416999999997,52.39804799999996],[-128.267517,52.396660000000054],[-128.260559,52.399161999999933],[-128.25585899999999,52.403320000000065],[-128.22442599999994,52.459717000000069],[-128.22192399999989,52.465271000000087],[-128.22055099999994,52.471375000000137],[-128.22109999999992,52.484436000000073],[-128.22860700000001,52.523048000000017],[-128.23055999999997,52.528328000000101],[-128.23831200000001,52.536658999999986],[-128.24221799999998,52.547775000000115],[-128.24194299999999,52.55471],[-128.23916600000001,52.566940000000102],[-128.18527199999988,52.671104000000128],[-128.14584399999995,52.719986000000063],[-128.120544,52.757217000000026],[-128.13165300000003,52.876381000000038],[-128.17001299999998,52.856658999999979],[-128.17501800000002,52.851935999999966],[-128.22305299999994,52.812492000000077],[-128.22888199999994,52.80860100000001],[-128.23525999999993,52.805824000000086],[-128.24972500000001,52.801384000000098],[-128.2744449999999,52.799438000000009],[-128.30029300000001,52.800270000000125],[-128.33999600000004,52.805549999999982],[-128.42611699999998,52.817497000000117],[-128.43612699999994,52.818886000000134],[-128.441101,52.822769000000051],[-128.48776199999986,52.873604000000114],[-128.49359100000004,52.882767000000115],[-128.495544,52.887496999999939],[-128.49887100000001,52.903602999999976],[-128.50640899999996,52.96305099999995],[-128.51556399999998,53.019988999999953],[-128.53973400000001,53.131934999999942],[-128.62554899999992,53.202217000000019],[-128.66140699999994,53.202217000000019],[-128.66082799999992,53.196938000000046],[-128.66305499999999,53.190826000000072],[-128.66723599999995,53.187492000000077],[-128.67666600000001,53.187767000000122],[-128.68527199999994,53.189430000000016],[-128.70111099999997,53.195541000000105],[-128.78832999999997,53.239715999999987],[-128.79473899999999,53.243324000000086],[-128.84887699999996,53.275826000000052],[-128.85888699999998,53.283607000000131],[-128.86639400000001,53.292220999999984],[-128.86944600000004,53.2972180000001],[-128.87832599999996,53.31638300000003],[-128.88558999999998,53.374378000000092],[-128.88798499999996,53.424965000000043],[-128.92186000000004,53.453601999999989],[-128.95916699999998,53.502777000000037],[-128.97332799999998,53.547493000000031],[-128.97277799999995,53.553047000000049],[-128.966095,53.556099000000131],[-128.80499299999997,53.569992000000013],[-128.79501300000004,53.568604000000107],[-128.78832999999997,53.564995000000067],[-128.78332499999999,53.561104],[-128.77972399999987,53.556938000000116],[-128.69250499999998,53.485268000000133],[-128.55862399999995,53.413879000000122],[-128.52362099999999,53.396660000000054],[-128.44601399999999,53.413158000000124],[-128.44517499999995,53.415993000000071],[-128.42950399999989,53.429824999999994],[-128.18972799999989,53.459991000000002],[-128.15945399999993,53.455826000000002],[-128.14862099999993,53.453605999999979],[-128.13192699999996,53.448875000000044],[-128.105255,53.440543999999989],[-128.09387199999998,53.433052000000032],[-128.07081600000004,53.394114999999942],[-128.03488200000004,53.369289000000038],[-128.00598099999996,53.34705699999995],[-127.95195000000001,53.326102999999932],[-127.94999699999988,53.321381000000031],[-127.951683,53.309990000000084],[-127.95388799999995,53.304161000000079],[-127.95694700000001,53.28138000000007],[-127.95527600000003,53.265830999999991],[-127.95111099999997,53.256386000000077],[-127.94611399999985,53.252220000000023],[-127.87526700000001,53.224433999999917],[-127.87027,53.222763000000043],[-127.868607,53.233879000000002],[-127.86776700000001,53.239715999999987],[-127.87138399999998,53.244155999999975],[-127.92259999999993,53.273685],[-127.93297599999994,53.293323999999927],[-127.92408,53.318153000000109],[-127.92593399999993,53.330750000000023],[-127.98805199999998,53.353881999999942],[-128.07165499999991,53.431380999999988],[-128.09387199999998,53.451935000000105],[-128.12692300000003,53.481102000000021],[-128.16528299999993,53.483879000000115],[-128.18331899999993,53.484161000000029],[-128.30139199999991,53.478324999999927],[-128.45187399999992,53.50332300000008],[-128.45339999999999,53.499656999999956],[-128.45640600000002,53.496822000000066],[-128.48156700000004,53.487987999999916],[-128.49021900000002,53.485325000000046],[-128.53340100000003,53.478324999999927],[-128.54457100000002,53.478992000000062],[-128.54937699999994,53.480823999999927],[-128.81304899999992,53.619155999999975],[-128.81664999999998,53.623322000000087],[-128.81805399999996,53.644714000000079],[-128.81750499999993,53.65026899999998],[-128.81390399999998,53.656936999999971],[-128.808899,53.661659000000043],[-128.78417999999988,53.675552000000096],[-128.77279699999997,53.733330000000137],[-128.79388399999988,53.764998999999932],[-128.79333500000001,53.770546000000081],[-128.79110699999995,53.776657],[-128.77056899999991,53.79583000000008],[-128.67767300000003,53.839775000000088],[-128.67384300000003,53.84160600000007],[-128.66551200000004,53.844608000000107],[-128.66067499999997,53.845439999999996],[-128.65583799999996,53.843605000000082],[-128.64482099999987,53.837105000000122],[-128.64166299999994,53.834770000000049],[-128.60360699999995,53.842216000000064],[-128.59387199999998,53.839714000000015],[-128.47720299999997,53.828605999999979],[-128.47137499999997,53.832497000000046],[-128.47555499999999,53.842216000000064],[-128.48275799999999,53.850829999999917],[-128.48944099999994,53.854163999999912],[-128.49887100000001,53.856941000000006],[-128.51000999999991,53.859161000000029],[-128.53030399999994,53.861664000000019],[-128.53832999999992,53.860275000000001],[-128.54501299999998,53.857216000000051],[-128.55306999999988,53.856102000000078],[-128.61726399999992,53.868546000000094],[-128.65962199999996,53.882885000000101],[-128.662598,53.885216000000014],[-128.66461200000003,53.888218000000109],[-128.67903099999995,53.907524000000024],[-128.67869599999995,53.910857999999962],[-128.66686999999996,53.92285900000013],[-128.66072099999997,53.928524000000095],[-128.6480709999999,53.949432000000058],[-128.63946499999997,53.96054799999996],[-128.59832799999998,54.02693899999997],[-128.60055499999993,54.031661999999983],[-128.60916099999997,54.03138000000007],[-128.61663799999997,54.029160000000104],[-128.67861899999997,54.00360900000004],[-128.68527199999994,54.000832000000116],[-128.68890399999998,53.994156000000032],[-128.69555699999989,53.976097000000095],[-128.72283899999991,53.944046000000071],[-128.72499099999999,53.940216000000078],[-128.72766100000001,53.936710000000062],[-128.73100299999993,53.933547999999917],[-128.79943799999995,53.87499200000002],[-128.91528299999999,53.787216000000001],[-128.93194600000004,53.774711999999965],[-128.98361199999994,53.762214999999969],[-129.10497999999995,53.72026800000009],[-129.11804199999989,53.714157000000057],[-129.12359599999996,53.710274000000084],[-129.21749899999992,53.64027400000009],[-129.232483,53.625824000000136],[-129.23803699999991,53.61332700000014],[-129.239441,53.601936000000023],[-129.23693800000001,53.537216000000058],[-129.23138399999999,53.500832000000059],[-129.23443599999996,53.461937000000091],[-129.23498499999999,53.456100000000106],[-129.23748799999993,53.433600999999953],[-129.27279699999997,53.379158000000018],[-129.30334499999992,53.384994999999947],[-129.33389299999999,53.397491000000059],[-129.35360700000001,53.407768000000033],[-129.51861600000001,53.514998999999989],[-129.62914999999987,53.587769000000037],[-129.686127,53.630272000000105],[-129.83084099999996,53.74721500000004],[-129.86111499999998,53.765273999999977],[-129.912781,53.79833200000013],[-130.04501300000004,53.883049000000142],[-130.05029300000001,53.886940000000038],[-130.099152,53.941933000000063],[-130.10137899999995,53.946655000000135],[-130.09136999999987,54.066101000000003],[-130.09082000000001,54.071662999999944],[-130.07693499999993,54.114441000000056],[-130.07333399999999,54.120827000000133],[-130.06500199999999,54.132209999999986],[-130.05166600000001,54.148605000000089],[-130.04666099999997,54.153320000000122],[-129.86361699999998,54.213051000000064],[-129.84887700000002,54.217491000000109],[-129.83194000000003,54.219436999999971],[-129.78205899999995,54.210601999999938],[-129.72637899999995,54.200771000000088],[-129.69738799999993,54.194435000000055],[-129.68756099999996,54.19093300000003],[-129.64416499999999,54.181938000000059],[-129.63333099999994,54.179993000000081],[-129.6141659999999,54.178917000000069],[-129.591949,54.185822000000087],[-129.47082499999999,54.235825000000034],[-129.47000100000002,54.23721299999994],[-129.47442599999999,54.239990000000034],[-129.48275799999988,54.243050000000096],[-129.51141399999989,54.244155999999975],[-129.51889,54.241936000000123],[-129.56140099999993,54.226935999999966],[-129.56777999999997,54.223877000000016],[-129.68238799999995,54.221602999999959],[-129.68823199999997,54.223099000000104],[-129.77654999999993,54.234767999999974],[-129.83666999999997,54.23832700000014],[-129.8549799999999,54.238045000000056],[-129.87136799999996,54.235268000000133],[-129.966949,54.206940000000031],[-129.97997999999995,54.200829000000113],[-129.99166899999989,54.192764000000011],[-130.03750600000001,54.173050000000103],[-130.10443099999998,54.154434000000094],[-130.11331200000001,54.153877000000023],[-130.122772,54.154434000000094],[-130.13110399999999,54.157210999999961],[-130.19168099999996,54.193321000000083],[-130.22805800000003,54.258606000000043],[-130.238586,54.294998000000078],[-130.2611389999999,54.342765999999983],[-130.27584799999994,54.349716000000058],[-130.28250100000002,54.346382000000062],[-130.332764,54.329720000000066],[-130.34887700000002,54.326942000000088],[-130.39138799999995,54.330276000000083],[-130.45166,54.336655000000121],[-130.45916699999998,54.338600000000099],[-130.48111,54.364715999999987],[-130.48388699999998,54.401657000000114],[-130.47637899999989,54.430550000000096],[-130.47360199999997,54.43582200000003],[-130.43362400000001,54.496658000000139],[-130.42999299999997,54.562492000000077],[-130.43972799999989,54.612212999999997],[-130.44055200000003,54.617493000000024],[-130.43859900000001,54.623604000000114],[-130.43277,54.627487000000031],[-130.42556799999994,54.629715000000033],[-130.41665599999993,54.630272000000105],[-130.40750099999997,54.62860100000006],[-130.39779699999997,54.626381000000038],[-130.38946499999992,54.62332200000003],[-130.37554899999992,54.616661000000136],[-130.33215299999995,54.578552000000002],[-130.28167699999995,54.528381000000024],[-130.22277799999989,54.471931000000041],[-130.06304899999986,54.339989000000116],[-130.05776999999995,54.336105000000089],[-130.03723100000002,54.326103000000103],[-130.02084400000001,54.319992000000013],[-129.99304199999989,54.31221000000005],[-129.98275799999993,54.311104000000057],[-129.96581999999995,54.313049000000035],[-129.95916699999998,54.316100999999946],[-129.95584099999985,54.322495000000004],[-129.95971700000001,54.326942000000088],[-129.96722399999993,54.328880000000026],[-129.98165900000004,54.324439999999981],[-129.99054000000001,54.32388300000008],[-130.02362099999993,54.335548000000017],[-130.0386049999999,54.341934000000094],[-130.04388399999999,54.345824999999991],[-130.14779699999997,54.44193300000012],[-130.31382799999994,54.586269000000073],[-130.36721799999992,54.635268999999994],[-130.37222299999996,54.644714000000079],[-130.374146,54.654991000000052],[-130.36859100000004,54.667770000000132],[-130.35861199999999,54.677490000000034],[-130.35278299999999,54.681381000000101],[-130.33972199999999,54.687492000000134],[-130.32501200000002,54.692214999999976],[-130.24386599999997,54.707771000000093],[-130.23553499999997,54.709160000000111],[-130.22582999999997,54.708885000000066],[-130.17193599999996,54.703606000000093],[-130.16195700000003,54.701103000000103],[-130.15362500000003,54.698326000000009],[-130.10110499999996,54.671660999999972],[-130.075287,54.657767999999976],[-130.06887800000004,54.648604999999975],[-130.06500199999999,54.644440000000145],[-130.054169,54.636658000000011],[-130.02694699999989,54.623047000000042],[-130.00058000000001,54.61471599999993],[-129.98083500000001,54.609993000000145],[-129.959991,54.607498000000135],[-129.91027800000001,54.605552999999929],[-129.968323,54.62193300000007],[-130.00445599999989,54.632767000000115],[-130.02807599999994,54.641936999999984],[-130.19473299999999,54.723320000000001],[-130.20166,54.72693600000008],[-130.20111099999986,54.732490999999982],[-130.17388899999992,54.846656999999993],[-130.17111199999999,54.851662000000033],[-130.16583300000002,54.856659000000093],[-130.16082799999998,54.861382000000106],[-130.05835000000002,54.952773999999977],[-130.04583700000001,54.959991000000059],[-130.03195199999993,54.965271000000143],[-129.94694499999991,54.970490000000098],[-129.9362789999999,54.971153000000072],[-129.92394999999993,54.970322000000067],[-129.91810599999985,54.968826000000092],[-129.90977499999997,54.964661000000092],[-129.90745500000003,54.962158000000102],[-129.65444899999994,54.980545000000006],[-129.646973,54.982765000000029],[-129.64028899999994,54.985825000000091],[-129.62249799999995,54.997772000000055],[-129.62499999999994,55.00249500000001],[-129.79998799999998,55.006942999999978],[-129.86608899999999,55.006660000000011],[-129.87527499999999,55.00610400000005],[-129.883331,55.004715000000033],[-129.90585299999998,54.997772000000055],[-129.91390999999993,54.996383999999921],[-129.96487400000001,55.003436999999963],[-129.97171000000003,55.004608000000076],[-129.97905000000003,55.008938000000057],[-129.98138399999993,55.011608000000138],[-129.98104899999993,55.014938000000143],[-129.9963679999999,55.024162000000047],[-129.97555499999993,55.066939999999931],[-129.96139500000004,55.093323000000112],[-129.95638999999989,55.098045000000013],[-129.84750399999996,55.210548000000074],[-129.72665399999988,55.338600000000099],[-129.66300999999999,55.412212000000011],[-129.64334099999996,55.434158000000025],[-129.63723800000002,55.438042000000053],[-129.62222299999996,55.442490000000021],[-129.60525499999994,55.445267000000115],[-129.58471700000001,55.443878000000097],[-129.54110700000001,55.438042000000053],[-129.52389500000004,55.439987000000031],[-129.50863599999997,55.444434999999999],[-129.48831199999995,55.453605999999922],[-129.47610499999996,55.461380000000133],[-129.47164899999996,55.467209000000139],[-129.47109999999992,55.472762999999986],[-129.47500600000001,55.47693600000008],[-129.48416099999997,55.478600000000085],[-129.62027,55.459434999999985],[-129.63696299999998,55.45665699999995],[-129.679123,55.473156000000131],[-129.68611099999998,55.467491000000052],[-129.69662500000004,55.45399100000003],[-129.69979899999993,55.450993000000096],[-129.70428500000003,55.449661000000049],[-129.70979299999993,55.450657000000035],[-129.71211199999999,55.453327000000115],[-129.71362299999993,55.456161000000122],[-129.78695700000003,55.566666000000112],[-129.78582800000004,55.50277699999998],[-129.779449,55.493607000000111],[-129.77224699999999,55.47943099999992],[-129.78030399999994,55.359717999999987],[-129.78250100000002,55.353607000000068],[-129.81390399999987,55.289719000000048],[-129.81750499999998,55.283332999999971],[-129.90695199999988,55.168052999999986],[-129.911407,55.162491000000045],[-129.92083699999995,55.151931999999988],[-130.02835099999999,55.036385000000109],[-130.06832900000001,54.996941000000049],[-130.07443199999994,54.992767000000015],[-130.08166499999999,54.990546999999992],[-130.09082000000001,54.989990000000091],[-130.10055499999999,54.990546999999992],[-130.10833699999995,54.992493000000081],[-130.11361699999992,54.996383999999921],[-130.12777700000004,55.013885000000073],[-130.16027799999995,55.069717000000026],[-130.16223099999996,55.079993999999999],[-130.1600039999999,55.086105000000089],[-130.11859099999998,55.142493999999942],[-130.11416599999995,55.148331000000098],[-130.08084099999991,55.184714999999983],[-130.06390399999998,55.195266999999944],[-130.04528799999997,55.204163000000051],[-130.03918499999992,55.208046000000024],[-129.948059,55.276382000000012],[-129.94387799999998,55.282211000000018],[-129.94473300000004,55.287216000000058],[-129.94888300000002,55.295830000000137],[-129.96054100000003,55.308884000000035],[-130.00863599999997,55.370827000000077],[-130.101654,55.556380999999988],[-130.10360700000001,55.566666000000112],[-130.12887599999999,55.722214000000122],[-130.12942499999997,55.732765000000029],[-130.12887599999999,55.738602000000014],[-130.12609900000001,55.750275000000045],[-130.12191799999994,55.762496999999996],[-130.11639400000001,55.774993999999992],[-130.11276199999998,55.781661999999983],[-130.10833699999995,55.787216000000001],[-130.09109499999994,55.799995000000024],[-130.07916299999999,55.808044000000052],[-130.06722999999994,55.815826000000015],[-130.0552669999999,55.823883000000137],[-130.03945899999997,55.838326000000052],[-129.96664399999992,55.912209000000018],[-129.962219,55.917770000000019],[-129.96417199999991,55.928329000000076],[-129.97137499999985,55.931663999999955],[-129.97970599999985,55.932213000000104],[-129.99499500000002,55.927773000000059],[-130.0019529999999,55.924713000000054],[-130.00500499999993,55.921661000000086],[-130.01507600000002,55.909179999999992],[-130.01419099999998,56.023880000000133],[-130.0147399999999,56.025826000000052],[-130.0538939999999,56.075554000000011],[-130.08859299999995,56.118049999999982],[-130.22915599999993,56.090271000000143],[-130.36526499999991,56.123878000000104],[-130.44750999999991,56.206383000000073],[-130.46194499999996,56.235268000000133],[-130.48471099999995,56.239433000000133],[-130.53277599999996,56.246384000000035],[-130.5607149999999,56.250000000000114],[-130.62719699999997,56.258606000000043],[-130.720551,56.325554000000125],[-130.75585899999999,56.353049999999996],[-130.77444500000001,56.366104000000064],[-130.84722899999997,56.374435000000119],[-130.92001300000004,56.382492000000127],[-131.05499299999997,56.398048000000074],[-131.07055699999995,56.403602999999976],[-131.12582399999997,56.424163999999962],[-131.1444699999999,56.434715000000097],[-131.16473400000001,56.445267000000058],[-131.20526100000001,56.465828000000101],[-131.22137499999997,56.472488000000112],[-131.290009,56.500548999999978],[-131.31445299999996,56.509994999999947],[-131.53945899999991,56.596656999999993],[-131.55777,56.602219000000105],[-131.57888800000001,56.603324999999927],[-131.61111499999998,56.602219000000105],[-131.81610099999995,56.594994000000042],[-131.82415800000001,56.59693900000002],[-131.82861299999996,56.600830000000087],[-131.85803199999987,56.718880000000127],[-131.86361699999992,56.786110000000122],[-131.86053500000003,56.797775000000001],[-131.86138899999997,56.79972100000009],[-132.10305800000003,56.866661000000022],[-132.09194899999994,56.893607999999972],[-132.06195100000002,56.959717000000069],[-132.03668199999993,57.013054000000011],[-132.02749600000004,57.036385000000053],[-132.22109999999992,57.068054000000075],[-132.316956,57.083878000000027],[-132.33694500000001,57.088325999999995],[-132.32611099999997,57.100548000000117],[-132.26806599999986,57.16304800000006],[-132.25473,57.17471299999994],[-132.226654,57.204711999999972],[-132.35415599999988,57.354439000000127],[-132.36972000000003,57.37082700000002],[-132.37914999999992,57.37943300000012],[-132.45111099999986,57.435265000000072],[-132.471924,57.451103000000103],[-132.4927669999999,57.46665999999999],[-132.50363200000004,57.474158999999986],[-132.61944599999998,57.583328000000051],[-132.75250199999994,57.709435000000042],[-132.76113899999996,57.717765999999926],[-132.76889,57.72665400000011],[-132.78222700000003,57.745270000000119],[-132.79110699999995,57.7586060000001],[-132.79583700000001,57.768883000000073],[-132.79611199999999,57.773879999999963],[-132.80722000000003,57.787773000000016],[-132.81362899999988,57.795546999999999],[-132.82138099999992,57.804436000000067],[-132.87304699999999,57.855270000000075],[-132.88165299999997,57.86360900000011],[-132.92861900000003,57.90554800000001],[-132.93777499999999,57.913322000000051],[-132.96472199999999,57.93332700000002],[-132.99499500000002,57.951660000000061],[-133.03332499999988,57.978874000000076],[-133.04388399999999,57.986938000000066],[-133.05306999999993,57.99471299999999],[-133.058044,57.999435000000062],[-133.070831,58.012215000000026],[-133.08749399999999,58.033332999999971],[-133.09500100000002,58.047775000000115],[-133.10415599999999,58.073051000000135],[-133.10720800000001,58.083328000000108],[-133.11111500000004,58.093323000000055],[-133.13696299999998,58.135826000000122],[-133.18472299999991,58.176102000000128],[-133.19500700000003,58.184158000000025],[-133.21139499999998,58.196381000000031],[-133.23361199999999,58.211380000000133],[-133.3061219999999,58.257216999999969],[-133.36111499999993,58.28054800000001],[-133.43029799999994,58.359993000000088],[-133.408905,58.400268999999923],[-133.38790899999998,58.4120640000001],[-133.42999299999991,58.459160000000054],[-133.55889899999994,58.528046000000074],[-133.73580900000002,58.644713999999965],[-133.80834999999996,58.709991000000002],[-133.82693499999999,58.726097000000038],[-134.08749399999999,58.808327000000133],[-134.23110999999989,58.851936000000023],[-134.245544,58.856941000000063],[-134.32000699999998,58.916099999999972],[-134.32556199999999,58.920830000000024],[-134.33221400000002,58.929718000000037],[-134.33221400000002,58.935265000000129],[-134.32556199999999,58.971100000000035],[-134.37942499999991,59.049164000000076],[-134.38613899999996,59.058044000000109],[-134.45556599999998,59.122489999999971],[-134.46139499999992,59.126656000000025],[-134.47500599999989,59.1336060000001],[-134.53222700000003,59.132210000000043],[-134.56640599999997,59.130547000000092],[-134.65084799999994,59.185546999999985],[-134.67166099999997,59.200272000000098],[-134.67529300000001,59.214714000000072],[-134.68804899999992,59.243324000000086],[-134.73889199999991,59.250275000000045],[-134.95193499999993,59.279991000000109],[-135.09167499999995,59.426940999999999],[-135.07971199999992,59.4447100000001],[-135.06332399999997,59.458046000000081],[-135.03973399999995,59.466934000000037],[-135.03057899999999,59.46804800000001],[-135.02111799999994,59.471099999999922],[-135.01779199999999,59.498878000000047],[-135.01501500000001,59.54055000000011],[-135.01446499999997,59.567497000000003],[-135.09722899999997,59.621376000000055],[-135.12027,59.621658000000139],[-135.13275099999998,59.622765000000072],[-135.1541749999999,59.62721300000004],[-135.17749000000003,59.636939999999981],[-135.33612099999999,59.726654000000053],[-135.47360199999997,59.801933000000076],[-135.50613399999997,59.793884000000048],[-135.82333399999999,59.705550999999957],[-135.94915800000001,59.669158999999979],[-136.07138099999997,59.657494000000099],[-136.12081899999998,59.651656999999943],[-136.16000399999996,59.646660000000054],[-136.20776399999988,59.639434999999992],[-136.31054700000004,59.612495000000138],[-136.34387200000003,59.602776000000119],[-136.34637499999991,59.600548000000003],[-136.29834,59.583603000000039],[-136.23916600000001,59.561377999999991],[-136.23388699999992,59.525826000000052],[-136.29305999999991,59.476097000000038],[-136.29998799999993,59.471099999999922],[-136.37164300000001,59.452492000000063],[-136.46362299999993,59.469711000000132],[-136.46417199999996,59.414153999999996],[-136.46249399999994,59.37221500000004],[-136.46249399999994,59.302490000000091],[-136.46276899999998,59.289436000000023],[-136.48083499999996,59.261939999999925],[-136.49221799999998,59.249718000000144],[-136.55835000000002,59.186377999999991],[-136.58389299999988,59.163321999999937],[-136.61138900000003,59.164711000000125],[-136.71972699999998,59.165268000000026],[-136.80889899999994,59.165268000000026],[-136.88833599999998,59.131934999999999],[-136.94195599999995,59.109436000000073],[-136.96972700000003,59.098328000000095],[-137.03308100000004,59.077492000000063],[-137.25167799999997,59.006104000000107],[-137.29611199999999,58.989989999999977],[-137.31417799999997,58.981102000000021],[-137.33889799999997,58.965546000000074],[-137.39279199999999,58.928329000000019],[-137.42028800000003,58.91415400000011],[-137.42749000000003,58.911377000000016],[-137.44500699999998,58.907494000000099],[-137.46554600000002,58.906096999999932],[-137.47805800000003,58.907211000000132],[-137.48803699999996,58.909156999999993],[-137.49581899999998,58.911934000000088],[-137.50167799999991,58.916382000000056],[-137.50500499999993,58.920273000000122],[-137.50750700000003,58.925552000000096],[-137.50723299999999,58.937767000000008],[-137.50527999999997,58.944153000000142],[-137.49722299999996,58.964157000000057],[-137.48776199999992,58.982490999999982],[-137.47970599999996,58.998046999999985],[-137.49914599999994,59.041382000000112],[-137.54528799999997,59.143051000000128],[-137.566101,59.186935000000062],[-137.59082000000001,59.238602000000014],[-137.91027800000001,59.408043000000077],[-138.11776699999996,59.516663000000051],[-138.30361900000003,59.613052000000039],[-138.49108899999993,59.708328000000051],[-138.5386049999999,59.732208000000071],[-138.615814,59.77416199999999],[-138.64724699999999,59.805550000000039],[-138.65472399999993,59.81471300000004],[-138.66363499999989,59.829162999999937],[-138.66610699999995,59.834435000000042],[-138.66915900000004,59.844994000000099],[-138.67501799999997,59.86693600000001],[-138.69027700000004,59.906936999999971],[-138.97192399999994,59.978600000000085],[-139.04779099999996,59.997490000000028],[-139.11639400000001,60.041382000000112],[-139.161407,60.07027400000004],[-139.18890399999987,60.088882000000069],[-139.183899,60.102219000000105],[-139.15527299999997,60.154991000000052],[-139.13363600000002,60.194435000000112],[-139.12527499999993,60.207771000000093],[-139.08221399999996,60.287498000000028],[-139.06500199999988,60.330276000000083],[-139.06640600000003,60.344153999999946],[-139.06805399999996,60.352219000000048],[-139.51947000000001,60.344711000000018],[-139.67666599999995,60.340546000000018],[-139.77166699999992,60.292496000000028],[-139.86639400000001,60.244438000000059],[-139.91305499999987,60.220824999999934],[-139.97943099999998,60.187767000000122],[-140.005585,60.193878000000041],[-140.45083599999992,60.309715000000097],[-140.471924,60.283882000000006],[-140.493042,60.25777400000004],[-140.50195299999996,60.244713000000104],[-140.52139299999993,60.222214000000122],[-140.94638099999997,60.297775000000001],[-140.995544,60.307213000000047],[-141.00058000000001,60.366661000000022],[-141.00112899999999,60.399436999999978],[-141.00030500000003,60.933051999999975],[-141.00167799999991,60.966384999999946],[-141.00030500000003,62.733046999999942],[-141.00140399999998,63.099998000000141],[-141.00195299999996,63.83277099999998],[-141.00030500000003,63.966385000000059],[-141.00030500000003,64.199706999999989],[-141.00195299999996,65.132751000000098],[-141.00030500000003,65.166092000000049],[-141.00030500000003,65.232758000000047],[-141.00195299999996,65.699416999999983],[-141.00195299999996,66.099425999999994],[-141.00167799999991,66.499419999999986],[-141.00085399999995,66.666382000000112],[-141.00058000000001,66.866089000000102],[-141.00167799999991,67.066376000000105],[-141.00222799999995,67.299149000000057],[-141.00058000000001,67.532486000000119],[-141,67.732758000000103],[-141.00195299999996,67.865814000000057],[-141.00195299999996,68.065811000000053],[-141.00195299999996,68.23275799999999],[-141.00167799999991,68.532761000000107],[-141.00085399999995,68.965546000000018],[-141.00058000000001,69.432479999999941],[-141.00085399999995,69.532211000000018],[-141.00299100000001,69.642365000000098],[-140.98220800000001,69.642761000000007],[-140.90945399999998,69.639160000000118],[-140.83306900000002,69.635269000000051],[-140.81610099999995,69.6336060000001],[-140.79528799999997,69.627197000000081],[-140.77001999999999,69.621643000000063],[-140.73831200000001,69.617751999999996],[-140.61554000000001,69.60832199999993],[-140.48831200000001,69.599425999999994],[-140.39611799999994,69.596099999999979],[-140.26141399999995,69.596649000000127],[-140.21887200000003,69.600815000000011],[-140.17944299999988,69.606369000000029],[-140.12914999999998,69.614990000000091],[-140.10055499999999,69.617477000000008],[-140.08471700000001,69.618042000000003],[-139.94387800000004,69.618865999999969],[-139.92639199999991,69.618590999999981],[-139.88833599999998,69.616653000000042],[-139.81054699999999,69.606644000000017],[-139.78112799999997,69.602203000000088],[-139.605255,69.575546000000031],[-139.57611099999986,69.570830999999998],[-139.67001299999998,69.579162999999994],[-139.68472299999996,69.581375000000037],[-139.77639799999997,69.599716000000001],[-139.7647399999999,69.590820000000065],[-139.75668299999995,69.586655000000064],[-139.73165899999998,69.581099999999992],[-139.60665899999992,69.559417999999994],[-139.573059,69.556091000000038],[-139.5350039999999,69.553863999999976],[-139.351654,69.53637700000013],[-139.14306599999998,69.510817999999915],[-139.11639400000001,69.505554000000132],[-139.10833699999995,69.501663000000065],[-139.10137899999995,69.491364000000033],[-139.09222399999999,69.481658999999979],[-139.069458,69.463318000000129],[-139.05584699999991,69.454987000000074],[-139.04806499999995,69.450821000000133],[-138.975281,69.414993000000095],[-138.95748900000001,69.407486000000006],[-138.93945299999996,69.399994000000049],[-138.88275099999993,69.384720000000129],[-138.83361799999994,69.373306000000071],[-138.79916399999991,69.364150999999993],[-138.76916499999999,69.35386699999998],[-138.75140399999998,69.346375000000023],[-138.64389,69.291367000000037],[-138.62164300000001,69.273041000000035],[-138.61639400000001,69.268326000000002],[-138.60720799999996,69.2586060000001],[-138.60498000000001,69.247482000000048],[-138.44998199999992,69.229156000000046],[-138.26916499999999,69.196365000000071],[-138.25390599999997,69.188309000000004],[-138.21887200000003,69.173309000000074],[-138.17721599999993,69.159988000000112],[-138.14334099999996,69.150818000000072],[-138.06332399999997,69.129424999999969],[-138.03945899999997,69.123596000000134],[-138.00112899999993,69.115265000000022],[-137.69638099999992,69.049712999999997],[-137.59445199999999,69.027771000000143],[-137.41915900000004,68.988876000000005],[-137.25500499999998,68.948318000000086],[-137.22610499999996,68.944977000000051],[-137.19222999999994,68.943863000000079],[-137.13027999999986,68.944977000000051],[-136.9786069999999,68.931931000000134],[-136.97332799999998,68.927200000000028],[-136.966095,68.923309000000131],[-136.95416299999994,68.920258000000103],[-136.78973399999995,68.881927000000076],[-136.74554399999994,68.875259000000085],[-136.68249499999996,68.871918000000051],[-136.65972899999997,68.874984999999981],[-136.64279199999993,68.878036000000009],[-136.63751199999996,68.884155000000021],[-136.63082900000001,68.889160000000061],[-136.61999500000002,68.891936999999984],[-136.52224699999999,68.909149000000014],[-136.50836199999998,68.910262999999986],[-136.47747800000002,68.910812000000135],[-136.42059299999994,68.9015500000001],[-136.39306599999992,68.897217000000069],[-136.35861199999999,68.893874999999923],[-136.25585899999999,68.889435000000105],[-136.14501999999999,68.885817999999972],[-136.09722899999991,68.88220200000012],[-136.02780199999989,68.873032000000023],[-135.98666399999996,68.864990000000091],[-135.85879499999993,68.838974000000064],[-135.83166499999999,68.831940000000031],[-135.54055799999992,68.752486999999974],[-135.519745,68.74581900000004],[-135.49194299999988,68.735259999999982],[-135.48498499999999,68.731094000000098],[-135.45388799999995,68.709427000000062],[-135.40695199999993,68.679977000000122],[-135.36554000000001,68.675812000000121],[-135.21054099999998,68.661377000000016],[-135.1600039999999,68.657211000000132],[-135.14752199999998,68.658874999999966],[-135.14639299999993,68.663879000000122],[-135.21444699999995,68.693038999999999],[-135.25363200000004,68.706940000000145],[-135.34359699999993,68.737762000000032],[-135.48193400000002,68.809418000000107],[-135.50613399999997,68.832488999999953],[-135.500854,68.838593000000003],[-135.48666399999996,68.839431999999988],[-135.45306399999998,68.838042999999971],[-135.43917799999991,68.835541000000092],[-135.40499899999998,68.831940000000031],[-135.341949,68.831664999999987],[-135.33804299999997,68.834991000000059],[-135.34973099999996,68.838042999999971],[-135.42166099999997,68.848877000000016],[-135.49472000000003,68.854979999999955],[-135.52835099999993,68.856368999999972],[-135.56054700000004,68.860260000000039],[-135.59527600000001,68.86943100000002],[-135.60443099999998,68.873032000000023],[-135.61886599999997,68.881362999999965],[-135.62359600000002,68.886107999999979],[-135.61389199999991,68.889435000000105],[-135.33581499999997,68.917755000000113],[-135.241669,68.926926000000094],[-135.22720299999997,68.925537000000077],[-135.21554600000002,68.922484999999995],[-135.20861799999994,68.918319999999994],[-135.19665499999991,68.909714000000065],[-135.19168100000002,68.904984000000013],[-135.18695100000002,68.90026899999998],[-135.12191799999999,68.893326000000002],[-134.97747799999996,68.878311000000053],[-134.95111099999997,68.88108799999992],[-134.91723599999995,68.898041000000035],[-134.89474499999994,68.912490999999932],[-134.87777700000004,68.920822000000044],[-134.85803199999998,68.927765000000022],[-134.845551,68.929428000000144],[-134.81723,68.925812000000064],[-134.80334499999998,68.923035000000027],[-134.74581899999998,68.907486000000063],[-134.70889299999999,68.892761000000121],[-134.66946399999989,68.873305999999957],[-134.64169299999992,68.856644000000017],[-134.49554399999994,68.75221300000004]],[[-93.519729999999925,63.839432000000102],[-93.339995999999985,63.80832700000002],[-93.329726999999934,63.809715000000097],[-93.217498999999975,63.838599999999985],[-93.216110000000015,63.843605000000025],[-93.225006000000008,63.847771000000137],[-93.236389000000031,63.847487999999942],[-93.267501999999922,63.84276600000004],[-93.278884999999946,63.842491000000052],[-93.291671999999949,63.844994000000042],[-93.333892999999932,63.859160999999972],[-93.343338000000017,63.863052000000039],[-93.357498000000021,63.871376000000112],[-93.441939999999931,63.921660999999915],[-93.448883000000023,63.925827000000027],[-93.449721999999952,63.930824000000086],[-93.452498999999989,63.954437000000041],[-93.451110999999969,63.959717000000126],[-93.443329000000006,63.965546000000131],[-93.433884000000035,63.968596999999988],[-93.423614999999927,63.970825000000104],[-93.413054999999986,63.971930999999927],[-93.389998999999932,63.971656999999993],[-93.36471599999993,63.967491000000109],[-93.27305599999994,63.928047000000049],[-93.12222300000002,63.892493999999999],[-92.960281000000009,63.855826999999977],[-92.841675000000009,63.83526599999999],[-92.65194699999995,63.787498000000028],[-92.549728000000016,63.81082200000003],[-92.540558000000033,63.814713000000097],[-92.530563000000029,63.816939999999988],[-92.507506999999976,63.816383000000087],[-92.583892999999989,63.829436999999984],[-92.606948999999872,63.829720000000123],[-92.619155999999919,63.831383000000073],[-92.669158999999979,63.839989000000003],[-92.706954999999937,63.846656999999936],[-92.935546999999985,63.904990999999995],[-92.942489999999964,63.90915700000005],[-92.956116000000009,63.932770000000005],[-92.965285999999992,63.936652999999922],[-93.218886999999995,63.979431000000034],[-93.266113000000018,63.981934000000024],[-93.276397999999972,63.979713000000061],[-93.288054999999986,63.980545000000006],[-93.301102000000014,63.983047000000056],[-93.436661000000015,64.015274000000034],[-93.612212999999997,64.093048000000067],[-93.627212999999983,64.106369000000029],[-93.635009999999909,64.115265000000136],[-93.635833999999988,64.120255000000043],[-93.689986999999917,64.156096999999988],[-93.751677999999913,64.188873000000058],[-93.761123999999882,64.192748999999992],[-93.773055999999997,64.19358799999992],[-93.779723999999987,64.189697000000024],[-93.776947000000007,64.184981999999991],[-93.665008999999941,64.087204000000042],[-93.660004000000015,64.083054000000061],[-93.604172000000005,64.044434000000138],[-93.654723999999931,63.992493000000024],[-93.731673999999998,63.987212999999997],[-93.759170999999924,63.984161000000029],[-93.770553999999947,63.957771000000037],[-93.654449,63.896660000000111],[-93.59973100000002,63.870270000000062],[-93.55360399999995,63.850548000000003],[-93.533324999999991,63.84276600000004],[-93.519729999999925,63.839432000000102]],[[-70.783065999999963,48.380547000000092],[-70.782501000000025,48.348045000000127],[-70.768065999999919,48.35054800000006],[-70.548049999999989,48.356383999999991],[-70.498885999999914,48.353324999999984],[-70.464172000000019,48.3491590000001],[-70.383057000000008,48.331108000000086],[-70.332229999999981,48.316666000000112],[-70.272780999999952,48.298332000000016],[-70.237777999999992,48.282493999999986],[-70.210007000000019,48.269714000000022],[-70.198607999999979,48.26249700000011],[-70.06138599999997,48.239989999999977],[-70.040833000000021,48.244437999999946],[-70.025833000000034,48.246101000000067],[-70.017501999999865,48.245270000000062],[-69.995543999999995,48.239989999999977],[-69.936935000000005,48.221931000000041],[-69.920546999999885,48.216385000000002],[-69.828339000000028,48.166382000000056],[-69.838333000000034,48.173881999999935],[-69.84722899999997,48.181938000000002],[-69.861938000000009,48.198875000000044],[-69.871933000000013,48.212493999999936],[-69.879439999999931,48.220825000000048],[-69.884170999999981,48.224159000000043],[-69.95944199999991,48.269440000000088],[-69.977218999999991,48.274436999999978],[-69.985549999999989,48.274994000000049],[-69.993332000000009,48.274712000000022],[-70.043610000000001,48.267211999999915],[-70.099990999999989,48.267211999999915],[-70.131942999999978,48.269714000000022],[-70.151108000000022,48.274436999999978],[-70.167770000000019,48.279990999999995],[-70.272507000000019,48.325554000000125],[-70.420273000000009,48.361381999999992],[-70.427779999999984,48.361107000000118],[-70.635009999999966,48.390549000000078],[-70.727782999999874,48.415825000000098],[-70.739165999999955,48.423049999999989],[-70.751952999999958,48.42849300000006],[-70.761397999999929,48.431938000000002],[-70.779998999999975,48.435546999999985],[-70.954726999999991,48.459717000000012],[-70.980559999999912,48.462212000000022],[-71.012221999999952,48.46166199999999],[-71.025283999999886,48.457496999999989],[-71.048614999999927,48.445267000000058],[-71.047774999999888,48.444434999999942],[-71.031386999999995,48.443320999999969],[-70.906386999999938,48.423325000000034],[-70.799987999999985,48.401657000000057],[-70.785552999999879,48.395828000000051],[-70.781386999999881,48.391936999999984],[-70.779449,48.386940000000095],[-70.783065999999963,48.380547000000092]],[[-108.13890100000003,71.981658999999979],[-108.15583799999996,71.980820000000051],[-108.17415599999998,71.983322000000101],[-108.18720999999999,71.986649000000057],[-108.18916300000001,71.99192800000003],[-108.19972199999995,72.050537000000077],[-108.19027699999998,72.055542000000116],[-108.1702729999999,72.064423000000033],[-108.16027799999995,72.062759000000028],[-108.13417099999992,72.056091000000094],[-108.07444799999996,72.034149000000014],[-108.06416299999995,72.030272999999966],[-108.06220999999999,72.02526899999998],[-108.06304899999998,72.019440000000145],[-108.069458,72.013046000000088],[-108.07721700000002,72.007217000000082],[-108.10526999999996,71.992751999999996],[-108.12526700000001,71.983871000000022],[-108.13890100000003,71.981658999999979]],[[-85.84722899999997,72.294144000000074],[-85.837218999999948,72.288879000000009],[-85.837218999999948,72.262771999999927],[-85.851669000000015,72.241364000000033],[-85.877486999999917,72.221649000000014],[-85.889175000000023,72.218047999999953],[-85.90834000000001,72.217758000000117],[-85.981110000000001,72.236373999999955],[-86.005844000000025,72.243591000000094],[-86.061110999999983,72.261658000000125],[-86.096389999999985,72.276382000000012],[-86.107223999999917,72.283875000000023],[-86.110001000000011,72.289703000000145],[-86.101395000000025,72.293594000000041],[-86.093338000000017,72.294708000000014],[-86.067229999999995,72.293869000000029],[-86.005004999999983,72.296646000000123],[-85.863891999999964,72.297211000000004],[-85.84722899999997,72.294144000000074]],[[-78.735000999999954,72.365540000000124],[-78.75389100000001,72.363312000000008],[-78.81220999999988,72.365265000000079],[-78.830840999999964,72.364990000000091],[-78.854172000000005,72.362197999999978],[-78.874435000000005,72.358871000000079],[-78.889450000000011,72.354706000000078],[-78.91332999999986,72.345535000000098],[-78.920836999999949,72.341370000000097],[-78.93499799999995,72.336380000000077],[-78.950286999999946,72.334991000000059],[-79.053054999999972,72.360809000000017],[-79.075561999999934,72.403046000000074],[-79.075012000000015,72.409714000000065],[-79.070847000000015,72.414993000000038],[-79.066665999999998,72.420258000000103],[-79.044448999999929,72.426651000000049],[-79.00140399999998,72.438309000000118],[-78.97084000000001,72.445250999999985],[-78.955565999999919,72.444427000000019],[-78.950561999999991,72.442199999999957],[-78.946655000000021,72.440262000000018],[-78.939986999999917,72.435806000000127],[-78.846953999999926,72.415543000000071],[-78.833892999999989,72.411926000000108],[-78.740829000000019,72.374419999999986],[-78.731673999999941,72.36943100000002],[-78.735000999999954,72.365540000000124]],[[-79.508056999999951,72.348602000000028],[-79.533889999999985,72.346099999999979],[-79.555832000000009,72.346939000000077],[-79.572234999999978,72.349152000000061],[-79.581954999999994,72.35165399999994],[-79.59445199999999,72.356934000000024],[-79.609436000000017,72.36692800000003],[-79.624160999999901,72.379425000000026],[-79.683318999999983,72.430542000000116],[-79.586120999999991,72.453872999999987],[-79.576675000000023,72.456100000000049],[-79.552489999999921,72.451096000000121],[-79.541381999999999,72.444977000000051],[-79.529174999999952,72.439697000000024],[-79.502791999999886,72.429977000000122],[-79.46945199999999,72.423035000000027],[-79.43638599999997,72.418319999999994],[-79.42971799999998,72.411652000000004],[-79.440552000000025,72.37052900000009],[-79.446654999999907,72.364990000000091],[-79.455565999999919,72.359985000000052],[-79.470275999999956,72.355545000000006],[-79.508056999999951,72.348602000000028]],[[-79.993606999999997,72.413315000000125],[-80.009445000000028,72.410538000000031],[-80.022232000000031,72.413605000000132],[-80.124435000000005,72.506653000000028],[-80.130554000000018,72.512497000000053],[-80.133330999999941,72.519440000000031],[-80.129989999999907,72.523041000000092],[-80.11999499999996,72.526931999999988],[-80.112502999999947,72.526931999999988],[-80.063613999999973,72.523880000000077],[-80.036941999999897,72.51638800000012],[-79.921936000000017,72.463318000000072],[-79.916397000000018,72.458037999999988],[-79.926940999999999,72.447754000000145],[-79.939162999999951,72.436645999999996],[-79.956954999999994,72.426086000000055],[-79.978881999999885,72.417755000000113],[-79.993606999999997,72.413315000000125]],[[-110.46916199999993,72.569152999999972],[-110.48137699999995,72.565811000000053],[-110.54415899999998,72.569152999999972],[-110.57195300000001,72.575546000000145],[-110.58833299999998,72.583878000000141],[-110.593887,72.588592999999946],[-110.593887,72.594147000000135],[-110.576683,72.594986000000119],[-110.53888699999993,72.594986000000119],[-110.51666299999999,72.593322999999998],[-110.50446299999999,72.590820000000008],[-110.48249799999991,72.583603000000096],[-110.47444200000001,72.579437000000041],[-110.46888699999994,72.574706999999989],[-110.46916199999993,72.569152999999972]],[[-110.35582699999998,72.601929000000098],[-110.37304699999993,72.601379000000065],[-110.39499699999993,72.603043000000071],[-110.46417199999991,72.613312000000121],[-110.49472000000003,72.619141000000127],[-110.46916199999993,72.621368000000018],[-110.450287,72.621368000000018],[-110.39862099999993,72.618041999999946],[-110.35888699999992,72.614990000000034],[-110.34500100000002,72.611923000000104],[-110.34500100000002,72.606094000000098],[-110.35582699999998,72.601929000000098]],[[-108.510559,72.602768000000083],[-108.51999699999993,72.598038000000031],[-108.53778099999994,72.599426000000108],[-108.593613,72.61775200000011],[-108.604446,72.621643000000006],[-108.61221299999994,72.625809000000118],[-108.6141659999999,72.631088000000091],[-108.61361699999986,72.636657999999954],[-108.60388199999994,72.639435000000049],[-108.51722699999999,72.642487000000017],[-108.49665800000002,72.641372999999987],[-108.49194299999999,72.636657999999954],[-108.49416400000001,72.631927000000019],[-108.510559,72.602768000000083]],[[-110.30722000000003,72.630813999999987],[-110.36389199999996,72.630813999999987],[-110.39695699999993,72.636383000000137],[-110.41082799999998,72.639435000000049],[-110.40028399999994,72.643600000000049],[-110.36000100000001,72.648880000000133],[-110.31500199999999,72.651932000000045],[-110.28083799999996,72.642211999999972],[-110.281113,72.636383000000137],[-110.28999299999992,72.631653000000085],[-110.30722000000003,72.630813999999987]],[[-109.215012,72.790268000000083],[-109.22749299999992,72.787200999999982],[-109.24833699999999,72.788040000000137],[-109.37277199999994,72.806091000000094],[-109.41694599999988,72.815262000000075],[-109.41944899999993,72.820541000000048],[-109.37832600000002,72.828598],[-109.33389299999999,72.834990999999945],[-109.32028200000002,72.8316650000001],[-109.31220999999994,72.827484000000027],[-109.22444200000001,72.811096000000134],[-109.21056399999998,72.8077550000001],[-109.21166999999997,72.796371000000022],[-109.215012,72.790268000000083]],[[-95.735000999999954,72.798874000000012],[-95.753615999999909,72.796097000000088],[-95.771392999999932,72.799149],[-95.835555999999997,72.831100000000049],[-95.854172000000005,72.853591999999992],[-95.850829999999974,72.858321999999987],[-95.810546999999929,72.876647999999989],[-95.791106999999954,72.880264000000068],[-95.774170000000026,72.880264000000068],[-95.769164999999987,72.878036000000122],[-95.763061999999877,72.872482000000105],[-95.735275000000001,72.859985000000108],[-95.720550999999944,72.848037999999974],[-95.716949,72.84387200000009],[-95.714171999999905,72.838593000000117],[-95.71362299999987,72.832214000000079],[-95.718886999999938,72.809418000000051],[-95.725005999999951,72.803314],[-95.735000999999954,72.798874000000012]],[[-96.754181000000017,72.721374999999966],[-96.77027899999996,72.719710999999961],[-96.955275999999969,72.734146000000067],[-96.96945199999999,72.737761999999975],[-96.977782999999988,72.745254999999986],[-97.011123999999938,72.775818000000129],[-97.010283999999899,72.776657000000114],[-96.921386999999982,72.835815000000082],[-96.911117999999931,72.841094999999996],[-96.798614999999984,72.881363000000022],[-96.757232999999928,72.892761000000064],[-96.737212999999997,72.895264000000054],[-96.725554999999986,72.89498900000001],[-96.713332999999921,72.893326000000059],[-96.688323999999966,72.883330999999998],[-96.692215000000033,72.862762000000032],[-96.666945999999996,72.811096000000134],[-96.651672000000019,72.804152999999985],[-96.642501999999979,72.797760000000039],[-96.639998999999989,72.791655999999989],[-96.639998999999989,72.786652000000004],[-96.641388000000006,72.782211000000075],[-96.728058000000033,72.730545000000063],[-96.741378999999995,72.725539999999967],[-96.754181000000017,72.721374999999966]],[[-95.756957999999997,72.892487000000131],[-95.777495999999985,72.891937000000098],[-95.795272999999952,72.89498900000001],[-95.808334000000002,72.907210999999961],[-95.824721999999952,72.965271000000087],[-95.786666999999966,73.012496999999939],[-95.761672999999973,73.004714999999976],[-95.757232999999928,73.001663000000065],[-95.756118999999956,72.998596000000134],[-95.743606999999997,72.987762000000089],[-95.702498999999989,72.933593999999971],[-95.708343999999954,72.917206000000078],[-95.735549999999989,72.900543000000027],[-95.744445999999925,72.895827999999995],[-95.756957999999997,72.892487000000131]],[[-95.733886999999982,73.128860000000032],[-95.718062999999972,73.118042000000059],[-95.715835999999911,73.11192299999999],[-95.71556099999998,73.105545000000063],[-95.717772999999966,73.10026600000009],[-95.726395000000025,73.088881999999955],[-95.729171999999949,73.071105999999986],[-95.724715999999944,73.059142999999949],[-95.728332999999907,73.054428000000144],[-95.745543999999938,73.049423000000047],[-95.775283999999999,73.05525200000011],[-95.787216000000001,73.061920000000043],[-95.799437999999952,73.072769000000108],[-95.822509999999966,73.083054000000061],[-95.859726000000023,73.090820000000122],[-95.893341000000021,73.095824999999991],[-95.893065999999976,73.100815000000011],[-95.891112999999962,73.101089000000115],[-95.885009999999909,73.104706000000078],[-95.881942999999978,73.108597000000145],[-95.874709999999993,73.114150999999993],[-95.865279999999927,73.119979999999998],[-95.863051999999982,73.125259000000142],[-95.865279999999927,73.131363000000022],[-95.868332000000009,73.136383000000023],[-95.868880999999988,73.140548999999965],[-95.854995999999971,73.140548999999965],[-95.840835999999967,73.136658000000068],[-95.828888000000006,73.129974000000004],[-95.822509999999966,73.124695000000031],[-95.818343999999968,73.125533999999959],[-95.814163000000008,73.131087999999977],[-95.807495000000017,73.135544000000095],[-95.790833000000021,73.139434999999992],[-95.776397999999915,73.140548999999965],[-95.763335999999981,73.139709000000096],[-95.74499499999996,73.136658000000068],[-95.738892000000021,73.133880999999974],[-95.733886999999982,73.128860000000032]],[[-96.808333999999945,72.926376000000118],[-96.915282999999931,72.917755000000056],[-96.955275999999969,72.920531999999923],[-96.968338000000017,72.923874000000069],[-96.990554999999972,72.931090999999981],[-97.017776000000026,72.940536000000066],[-97.032227000000034,72.946640000000059],[-97.061385999999914,72.963318000000129],[-97.089721999999995,72.981658999999979],[-97.105834999999956,72.99832200000003],[-97.111938000000009,73.004714999999976],[-97.136947999999961,73.045822000000044],[-97.139724999999885,73.051926000000037],[-97.141953000000001,73.064148000000046],[-97.142775999999969,73.075272000000098],[-97.141112999999962,73.085541000000148],[-97.127776999999924,73.095824999999991],[-97.069732999999985,73.136932000000002],[-97.059432999999956,73.142212000000029],[-97.045546999999999,73.147491000000059],[-97.003341999999975,73.159714000000065],[-96.946944999999971,73.172484999999995],[-96.904449,73.179977000000122],[-96.848052999999993,73.187484999999981],[-96.809433000000013,73.189148000000102],[-96.786391999999978,73.18803400000013],[-96.771941999999967,73.181655999999975],[-96.755279999999971,73.175812000000121],[-96.653060999999923,73.136383000000023],[-96.602218999999934,73.099152000000117],[-96.580841000000021,73.081100000000049],[-96.575011999999901,73.074997000000053],[-96.568619000000012,73.062195000000088],[-96.565826000000015,73.056091000000038],[-96.564712999999983,73.050537000000077],[-96.565552000000025,73.044708000000014],[-96.573623999999995,73.033325000000048],[-96.636672999999973,72.965820000000065],[-96.643341000000021,72.96138000000002],[-96.65834000000001,72.954163000000108],[-96.697219999999959,72.941650000000038],[-96.743057000000022,72.933593999999971],[-96.765014999999948,72.930817000000047],[-96.808333999999945,72.926376000000118]],[[-96.90583799999996,73.220825000000048],[-96.924712999999997,73.218048000000124],[-96.944991999999957,73.218322999999941],[-96.984725999999966,73.220535000000041],[-97.040833000000021,73.228591999999992],[-97.079177999999956,73.235259999999982],[-97.106948999999929,73.242203000000131],[-97.117767000000015,73.249145999999939],[-97.115279999999927,73.253052000000025],[-97.090285999999878,73.261932000000058],[-97.058043999999995,73.269150000000081],[-97.035004000000015,73.272766000000104],[-96.977492999999981,73.273880000000077],[-96.967772999999966,73.273315000000082],[-96.968338000000017,73.267487000000131],[-96.951400999999976,73.239426000000037],[-96.909164000000033,73.238312000000064],[-96.896118000000001,73.237762000000032],[-96.886672999999917,73.231094000000041],[-96.889174999999966,73.224991000000102],[-96.90583799999996,73.220825000000048]],[[-113.99749799999995,72.799423000000104],[-114.01112399999994,72.79664600000001],[-114.06806899999998,72.795822000000044],[-114.15167200000002,72.798035000000027],[-114.20861799999994,72.796936000000073],[-114.22416699999997,72.794983000000116],[-114.23581699999994,72.791655999999989],[-114.35138699999993,72.747482000000048],[-114.35749800000002,72.74136400000009],[-114.35637700000001,72.735809000000017],[-114.33444199999997,72.693588000000034],[-114.327789,72.688873000000001],[-114.36582900000002,72.66276600000009],[-114.45168299999995,72.623032000000023],[-114.46501199999994,72.6202550000001],[-114.49553699999996,72.616379000000052],[-114.53138699999988,72.614990000000034],[-114.576683,72.60914600000001],[-114.58999599999993,72.606368999999916],[-114.60472099999998,72.60165400000011],[-114.55832700000002,72.560806000000014],[-114.42666600000001,72.556090999999981],[-114.38527699999986,72.555251999999996],[-114.35138699999993,72.557479999999941],[-114.33999599999999,72.560806000000014],[-114.33029199999999,72.565262000000075],[-114.32584400000002,72.571930000000066],[-114.12805200000003,72.626083000000051],[-114.10305800000003,72.632202000000063],[-114.06276699999995,72.640274000000034],[-113.99027999999998,72.651382000000012],[-113.91027800000001,72.659148999999957],[-113.89306599999998,72.660262999999986],[-113.88333099999988,72.657486000000063],[-113.89046499999995,72.648048000000017],[-113.89222699999999,72.640822999999955],[-113.88054699999992,72.637207000000103],[-113.858047,72.635817999999915],[-113.80666399999996,72.639160000000061],[-113.76222199999995,72.646103000000039],[-113.70834400000001,72.656937000000084],[-113.67138699999992,72.666656000000103],[-113.61277799999988,72.683868000000132],[-113.58750899999995,72.689971999999955],[-113.54666099999997,72.698029000000133],[-113.51611300000002,72.701934999999992],[-113.50611900000001,72.699141999999995],[-113.52084400000001,72.688034000000016],[-113.55055199999987,72.675262000000032],[-113.57250999999991,72.667480000000069],[-113.61945299999996,72.653594999999996],[-113.64277599999991,72.646652000000017],[-113.68776699999995,72.631927000000019],[-113.70944199999991,72.624145999999996],[-113.72917200000001,72.615540000000067],[-113.73082699999998,72.609421000000054],[-113.72193900000002,72.60554499999995],[-113.69972200000001,72.604155999999989],[-113.68443299999996,72.606094000000098],[-113.65750100000002,72.611374000000012],[-113.46639999999996,72.665268000000026],[-113.44275700000003,72.672211000000004],[-113.43639400000001,72.67804000000001],[-113.43167099999999,72.684708000000001],[-113.41000399999996,72.729431000000034],[-113.41332999999992,72.734711000000118],[-113.41972399999997,72.739150999999936],[-113.43138099999999,72.742751999999996],[-113.44860799999992,72.744979999999998],[-113.53527799999995,72.748871000000065],[-113.58029199999987,72.751663000000121],[-113.59750399999996,72.754166000000112],[-113.60637699999995,72.758331000000112],[-113.60804699999994,72.769439999999975],[-113.59889199999998,72.782760999999937],[-113.58249699999999,72.793045000000006],[-113.38694800000002,72.907486000000006],[-113.33139,72.935257000000092],[-113.30277999999998,72.948868000000061],[-113.26862299999999,72.960266000000047],[-113.14862099999999,72.994705000000067],[-113.06276699999989,73.00749200000007],[-113.02806099999998,73.009430000000009],[-113.00695799999994,73.008881000000088],[-112.823059,72.998871000000008],[-112.81139400000001,72.9952550000001],[-112.79472399999997,72.982208000000071],[-112.78582799999998,72.978317000000004],[-112.77139299999993,72.975266000000033],[-112.75418100000002,72.972763000000043],[-112.708618,72.969711000000132],[-112.64362299999993,72.966934000000037],[-112.60082999999986,72.963607999999965],[-112.56360599999994,72.959152000000074],[-112.51500699999991,72.951096000000007],[-112.5,72.947922000000119],[-112.47165699999994,72.941925000000026],[-112.44583099999994,72.935257000000092],[-112.41388699999993,72.924149000000057],[-112.387787,72.911102000000028],[-112.37638900000002,72.907760999999994],[-112.36193800000001,72.904709000000082],[-112.34472700000003,72.902205999999921],[-112.27944899999994,72.896941999999967],[-112.23777799999999,72.895537999999988],[-112.14195299999994,72.896378000000027],[-112.09834299999989,72.894150000000025],[-112.06166099999996,72.889434999999992],[-111.94776899999999,72.870529000000147],[-111.78333299999997,72.834717000000012],[-111.67582699999997,72.814697000000024],[-111.65888999999999,72.8119200000001],[-111.59416199999998,72.806641000000127],[-111.54055799999998,72.799423000000104],[-111.52639799999997,72.796371000000022],[-111.23693799999995,72.726379000000122],[-111.22582999999997,72.7227630000001],[-111.22000100000002,72.718323000000055],[-111.20249899999999,72.67053199999998],[-111.20527599999997,72.664429000000041],[-111.26278699999995,72.579163000000108],[-111.27694699999989,72.567490000000078],[-111.45221699999996,72.477768000000026],[-111.52778599999999,72.44999700000011],[-111.65110800000002,72.40887500000008],[-111.675003,72.402206000000035],[-111.736107,72.395264000000111],[-111.76999699999993,72.393600000000106],[-111.78527799999995,72.391936999999984],[-111.81220999999999,72.386658000000011],[-111.859734,72.373306000000014],[-111.890289,72.360535000000084],[-111.89890299999996,72.355545000000006],[-111.90556299999997,72.349716000000001],[-111.90167200000002,72.346099999999979],[-111.86250299999995,72.330551000000071],[-111.85138699999999,72.326934999999992],[-111.66388699999999,72.276382000000012],[-111.50446299999999,72.311920000000043],[-111.44499200000001,72.328873000000101],[-111.42443799999995,72.337204000000042],[-111.41915899999998,72.343871999999976],[-111.43305999999995,72.346939000000077],[-111.45140100000003,72.346939000000077],[-111.487213,72.336655000000064],[-111.51944700000001,72.334152000000074],[-111.5616609999999,72.336655000000064],[-111.578056,72.339156999999943],[-111.58917200000002,72.342758000000003],[-111.60582699999998,72.350815000000011],[-111.61165599999998,72.361099000000024],[-111.609444,72.367203000000075],[-111.58833299999998,72.376373000000115],[-111.37444299999993,72.446640000000002],[-111.350281,72.453322999999955],[-111.3094329999999,72.460815000000082],[-111.29387700000001,72.462768999999923],[-111.26583899999997,72.465546000000018],[-111.24889400000001,72.466385000000002],[-111.22860699999995,72.465546000000018],[-111.20249899999999,72.46026599999999],[-111.21333300000003,72.446930000000009],[-111.23277299999995,72.4369200000001],[-111.24500299999994,72.433594000000085],[-111.27223200000003,72.428588999999988],[-111.30139200000002,72.404160000000047],[-111.27749599999993,72.369979999999941],[-111.11277799999993,72.335266000000104],[-111.09528399999994,72.379700000000014],[-111.09137699999997,72.401932000000102],[-111.00446299999999,72.46527100000003],[-110.8691639999999,72.473312000000078],[-110.82444799999996,72.479156000000103],[-110.80304699999999,72.485259999999926],[-110.82501200000002,72.503875999999934],[-110.83332799999999,72.519150000000025],[-110.827789,72.525818000000015],[-110.73805199999993,72.565536000000009],[-110.72749299999998,72.569716999999912],[-110.71528599999999,72.573044000000039],[-110.70140100000003,72.575546000000145],[-110.68083199999995,72.574706999999989],[-110.66610700000001,72.573044000000039],[-110.53527799999995,72.546646000000067],[-110.52639799999992,72.526931999999988],[-110.57501199999996,72.51388500000013],[-110.59445199999993,72.50471500000009],[-110.60166899999996,72.498871000000065],[-110.60193600000002,72.493317000000104],[-110.59361299999989,72.489150999999993],[-110.55249000000003,72.47387700000013],[-110.53083800000002,72.46665999999999],[-110.35056299999997,72.428040000000067],[-110.32861299999996,72.426086000000055],[-110.30999799999995,72.426086000000055],[-110.30387899999999,72.430542000000116],[-110.31194299999993,72.434708000000057],[-110.41027799999995,72.462204000000099],[-110.50334199999998,72.484985000000108],[-110.514183,72.488585999999998],[-110.52250700000002,72.492752000000053],[-110.52778599999999,72.497482000000105],[-110.53056299999992,72.502486999999974],[-110.52333099999998,72.508330999999998],[-110.39639299999999,72.552200000000084],[-110.38417099999998,72.555542000000003],[-110.36527999999998,72.555542000000003],[-110.34333800000002,72.55386400000009],[-110.32389799999993,72.551650999999936],[-110.31304899999998,72.547760000000039],[-110.22028399999994,72.51388500000013],[-110.20140100000003,72.505829000000062],[-110.15527299999997,72.480270000000075],[-110.06139399999995,72.437484999999924],[-110.05055199999993,72.433868000000018],[-110.03999299999998,72.438034000000073],[-110.02194199999991,72.447754000000145],[-109.99889400000001,72.455261000000121],[-109.97112300000003,72.46026599999999],[-109.95249899999999,72.459991000000116],[-109.91972399999986,72.454711999999972],[-109.81388900000002,72.428314],[-109.79666099999992,72.426926000000094],[-109.78278399999999,72.429428000000144],[-109.77806099999998,72.434708000000057],[-109.78582799999992,72.438873000000058],[-109.80583199999995,72.445526000000029],[-109.83029199999999,72.452208999999982],[-110.04250300000001,72.50471500000009],[-110.22305299999999,72.545822000000101],[-110.23665599999998,72.548874000000069],[-110.24777199999994,72.552765000000136],[-110.25583599999987,72.55693100000002],[-110.252792,72.56303400000013],[-110.24221799999992,72.566940000000045],[-110.22165699999994,72.566086000000041],[-110.12082699999996,72.560257000000036],[-110.10417200000001,72.557754999999986],[-110.09056099999998,72.55442800000003],[-110.06889299999995,72.546936000000073],[-110.03888699999987,72.535538000000088],[-110.02278099999995,72.527206000000092],[-110.00361599999991,72.519440000000031],[-109.97112300000003,72.508330999999998],[-109.90499899999998,72.487198000000092],[-109.88861099999986,72.484711000000004],[-109.80943300000001,72.491653000000099],[-109.79527300000001,72.49414100000007],[-109.78472899999997,72.498322000000144],[-109.78278399999999,72.503051999999968],[-109.94275700000003,72.604155999999989],[-109.95889299999993,72.612762000000089],[-110.09306300000003,72.65637200000009],[-110.11332699999997,72.657211000000018],[-110.17111199999999,72.648330999999985],[-110.18666100000002,72.646652000000017],[-110.22112299999998,72.645264000000054],[-110.241669,72.646103000000039],[-110.25556899999998,72.649429000000055],[-110.26666299999999,72.653046000000018],[-110.283073,72.66137700000013],[-110.28832999999992,72.666091999999992],[-110.29110700000001,72.671097000000032],[-110.20973200000003,72.71775800000006],[-110.20056199999999,72.7227630000001],[-110.18831599999999,72.726089000000115],[-110.17083699999995,72.726928999999984],[-110.078079,72.727065999999979],[-110.04167200000001,72.722488000000055],[-110.03056300000003,72.718596999999988],[-109.99804699999999,72.701934999999992],[-109.98693800000001,72.698318000000029],[-109.85221899999993,72.665817000000118],[-109.83277899999996,72.663315000000068],[-109.81723,72.664992999999981],[-109.77084399999995,72.716385000000116],[-109.77027900000002,72.722214000000122],[-109.78138699999994,72.725815000000011],[-109.80082700000003,72.728043000000127],[-109.81973299999993,72.728043000000127],[-110.03111299999995,72.747757000000036],[-110.17887899999994,72.769149999999968],[-110.17138699999998,72.774993999999992],[-110.16832699999986,72.781097000000102],[-110.17083699999995,72.786101999999971],[-110.17639199999996,72.790817000000004],[-110.21166999999997,72.818328999999949],[-110.24526999999995,72.823607999999979],[-110.32640099999992,72.826385000000016],[-110.36638599999998,72.827208999999982],[-110.47666899999996,72.834990999999945],[-110.493607,72.83776899999998],[-110.53555299999994,72.847214000000008],[-110.54666099999997,72.850815000000068],[-110.56331599999999,72.859145999999953],[-110.74276699999996,72.957214000000135],[-110.75389099999995,72.966385000000059],[-110.75666799999993,72.971374999999966],[-110.75389099999995,72.977768000000083],[-110.74804699999993,72.984421000000054],[-110.74082900000002,72.989975000000072],[-110.73166700000002,72.994980000000112],[-110.70834400000001,73.002487000000031],[-110.69415300000003,73.004990000000021],[-110.67832899999991,73.006653000000142],[-110.61860699999994,73.011383000000137],[-110.51139799999993,73.015274000000034],[-110.432503,73.014435000000105],[-110.39083899999997,73.012496999999939],[-110.16610700000001,72.996094000000085],[-110.05110199999996,72.984711000000061],[-109.91887700000001,72.96804800000001],[-109.65943899999996,72.924988000000042],[-109.63445299999995,72.918045000000063],[-109.61805700000002,72.909424000000115],[-109.618607,72.903869999999927],[-109.62943999999993,72.899719000000061],[-109.66111799999999,72.896652000000131],[-109.69471699999997,72.894440000000088],[-109.724716,72.890549000000021],[-109.73889200000002,72.888046000000031],[-109.75,72.883881000000031],[-109.75472999999994,72.878585999999984],[-109.74665799999997,72.874420000000043],[-109.65862300000003,72.844711000000018],[-109.379707,72.770538000000101],[-109.22778299999993,72.761658000000068],[-109.05110200000001,72.680267000000072],[-109.02999899999998,72.647217000000012],[-109.04915599999993,72.604155999999989],[-109.045547,72.572495000000117],[-109.04332699999998,72.567490000000078],[-109.02861000000001,72.565536000000009],[-108.88249200000001,72.564423000000147],[-108.86527999999998,72.564987000000087],[-108.85109699999998,72.567490000000078],[-108.84194899999994,72.572495000000117],[-108.81916799999993,72.591095000000053],[-108.72277800000001,72.582763999999941],[-108.70361300000002,72.58027600000014],[-108.67666600000001,72.573883000000023],[-108.64472999999987,72.562485000000038],[-108.62138399999998,72.549988000000042],[-108.61638599999998,72.54525799999999],[-108.58805799999993,72.505554000000075],[-108.58944700000001,72.494431000000077],[-108.59638999999993,72.482208000000014],[-108.60278299999999,72.475540000000024],[-108.61054999999993,72.469986000000063],[-108.62470999999994,72.457489000000066],[-108.63722200000001,72.444427000000019],[-108.64499699999993,72.426651000000049],[-108.65055799999999,72.403595000000053],[-108.66361999999998,72.362761999999975],[-108.66278099999994,72.346374999999966],[-108.65834000000001,72.336105000000032],[-108.52416999999997,72.199706999999989],[-108.45500199999998,72.157211000000132],[-108.44415300000003,72.161102000000028],[-108.42832900000002,72.158325000000104],[-108.41805999999997,72.154434000000037],[-108.404449,72.14694199999991],[-108.40222199999994,72.141663000000108],[-108.39890300000002,72.113602000000071],[-108.39472999999998,72.042755000000113],[-108.39527900000002,72.036926000000108],[-108.396118,72.03137200000009],[-108.31639099999995,71.984146000000067],[-108.20417799999996,71.963882000000126],[-108.19138299999992,71.960541000000092],[-108.18666100000002,71.955826000000059],[-108.18276999999995,71.945525999999916],[-108.18971299999998,71.933318999999983],[-108.19611399999997,71.92692599999998],[-108.23361199999999,71.899719000000061],[-108.28639199999992,71.860809000000131],[-108.28278399999999,71.792206000000022],[-108.28083800000002,71.786925999999994],[-108.24276700000001,71.718597000000045],[-108.23805199999998,71.713882000000012],[-108.23082699999992,71.709426999999948],[-108.22055099999994,71.705826000000116],[-108.20777900000002,71.70248400000014],[-108.19248999999996,71.699707000000046],[-108.17748999999998,71.701096000000064],[-108.14111300000002,71.710541000000148],[-108.13054699999992,71.714432000000045],[-108.10333300000002,71.719147000000078],[-108.08693700000003,71.719711000000018],[-108.066101,71.71775800000006],[-108.03639199999998,71.705826000000116],[-108.02194199999997,71.697204999999997],[-107.98805199999987,71.675537000000077],[-107.97609699999987,71.666381999999999],[-107.96694899999994,71.656936999999971],[-107.96777299999991,71.651382000000069],[-107.91583300000002,71.624984999999981],[-107.84528399999994,71.603867000000093],[-107.82888799999995,71.604431000000034],[-107.75334199999998,71.610260000000039],[-107.74109599999997,71.613312000000121],[-107.73194899999999,71.618042000000003],[-107.72416699999991,71.623871000000008],[-107.72609699999998,71.629149999999981],[-107.74054699999994,71.637496999999939],[-107.75028999999995,71.641373000000044],[-107.77583299999998,71.648041000000035],[-107.82472199999995,71.672759999999982],[-107.83194700000001,71.676926000000037],[-107.83640300000002,71.681656000000089],[-107.83833300000003,71.686920000000043],[-107.83750899999995,71.692474000000061],[-107.82305899999994,71.716934000000094],[-107.81527699999998,71.7227630000001],[-107.80444299999999,71.726653999999996],[-107.78943600000002,71.728043000000014],[-107.7519529999999,71.726653999999996],[-107.73665599999998,71.723602000000085],[-107.63027999999997,71.732208000000014],[-107.49472000000003,71.786377000000016],[-107.451683,71.857483000000059],[-107.36361699999992,71.871917999999994],[-107.34555099999994,71.871643000000006],[-107.29695099999998,71.874145999999939],[-107.28333299999997,71.876373000000001],[-107.27084400000001,71.879424999999969],[-107.26139799999999,71.884155000000135],[-107.25334199999998,71.889708999999982],[-107.25250199999994,71.895537999999988],[-107.25695799999994,71.900269000000094],[-107.264183,71.904434000000094],[-107.41805999999997,71.953873000000101],[-107.59638999999993,72.004439999999988],[-107.61389199999996,72.012496999999996],[-107.62581599999999,72.021652000000017],[-107.63027999999997,72.026382000000069],[-107.65139799999997,72.061096000000134],[-107.65334300000001,72.066375999999991],[-107.64943700000003,72.072495000000004],[-107.63999899999993,72.077208999999982],[-107.62609899999995,72.079437000000098],[-107.61389199999996,72.082764000000054],[-107.61000100000001,72.08859300000006],[-107.61193799999995,72.093872000000033],[-107.63527699999997,72.121917999999937],[-107.68138099999999,72.136108000000036],[-107.699997,72.138596000000007],[-107.729446,72.137207000000046],[-107.74333199999995,72.134994999999947],[-107.76027699999992,72.134430000000123],[-107.77887699999997,72.136658000000068],[-107.78083800000002,72.141937000000041],[-107.787216,72.184708000000114],[-107.77806099999992,72.208038000000045],[-107.843887,72.354156000000046],[-107.87748699999992,72.424423000000104],[-107.88639799999993,72.519713999999965],[-107.87693799999994,72.524428999999998],[-107.87165799999997,72.529709000000082],[-107.87666299999995,72.567215000000033],[-107.88054699999998,72.577484000000084],[-107.88555899999989,72.586655000000007],[-107.91555799999998,72.597214000000065],[-107.92887899999994,72.60054000000008],[-107.99082900000002,72.612487999999985],[-108.00418099999996,72.615814],[-108.01194800000002,72.619980000000112],[-108.025284,72.666091999999992],[-108.02639799999997,72.676926000000037],[-108.02667199999996,72.719986000000006],[-108.05110200000001,72.781372000000147],[-108.05803699999996,72.791092000000049],[-108.11193799999995,72.890823000000125],[-108.15194699999989,72.971100000000092],[-108.16528299999993,73.010817999999972],[-108.26363400000002,73.091934000000094],[-108.29361,73.120254999999986],[-108.29998799999998,73.135544000000095],[-108.295547,73.147491000000059],[-108.291946,73.153595000000053],[-108.28527799999995,73.159987999999998],[-108.26862299999999,73.171371000000022],[-108.23029299999996,73.187484999999981],[-108.18110699999994,73.201660000000061],[-108.16639700000002,73.203873000000044],[-108.13390400000003,73.206940000000145],[-108.11582900000002,73.207489000000066],[-108.07389799999993,73.205261000000121],[-108.02390300000002,73.201096000000121],[-107.93443300000001,73.187484999999981],[-107.91471899999993,73.184981999999991],[-107.89388999999994,73.183868000000018],[-107.87416099999996,73.183594000000085],[-107.86416599999995,73.188583000000051],[-107.87222300000002,73.192748999999935],[-107.90471600000001,73.204163000000051],[-107.94611399999991,73.214157000000057],[-108.01027699999997,73.226089000000002],[-108.05166599999995,73.236098999999911],[-108.08444199999997,73.247482000000105],[-108.11638599999992,73.264435000000049],[-108.15361000000001,73.302475000000129],[-108.08444199999997,73.349990999999989],[-108.07140399999992,73.353317000000061],[-108.05332899999996,73.353867000000093],[-107.99109599999991,73.351379000000122],[-107.94722000000002,73.348328000000095],[-107.77139299999999,73.323883000000023],[-107.675003,73.323318000000029],[-107.63110399999999,73.319991999999957],[-107.614441,73.31721500000009],[-107.40334300000001,73.270537999999988],[-107.33583099999987,73.248031999999967],[-107.24999999999994,73.217484000000013],[-107.21028099999995,73.201660000000061],[-107.18888900000002,73.194138000000123],[-107.172234,73.191086000000041],[-107.10582699999998,73.17942800000003],[-107.06973299999999,73.173874000000012],[-107.05027799999999,73.173598999999967],[-107.03694200000001,73.176651000000106],[-107.025284,73.180542000000003],[-107.01666299999999,73.186095999999964],[-107.01083399999999,73.191360000000145],[-107.02027899999996,73.200821000000133],[-107.05249000000003,73.212493999999936],[-107.09028599999994,73.223037999999974],[-107.11081699999994,73.231369000000086],[-107.11860699999994,73.23553499999997],[-107.12361099999998,73.240265000000022],[-107.11945300000002,73.246368000000132],[-107.03028899999998,73.29553199999998],[-107.01862299999999,73.299423000000047],[-106.88249199999996,73.312195000000031],[-106.86138899999997,73.310806000000014],[-106.76139799999999,73.293045000000063],[-106.75083899999993,73.289153999999996],[-106.74610899999999,73.284423999999944],[-106.74109599999991,73.268875000000037],[-106.72721899999993,73.254715000000147],[-106.69666299999994,73.237488000000099],[-106.66471899999999,73.226089000000002],[-106.65110800000002,73.222487999999942],[-106.63474300000001,73.219711000000075],[-106.60305800000003,73.216660000000047],[-106.58222999999998,73.21527100000003],[-106.39862099999993,73.149155000000064],[-106.24027999999998,73.085815000000082],[-106.06388899999996,73.047759999999982],[-106.04750100000001,73.044708000000014],[-106.02834300000001,73.044434000000081],[-105.94888300000002,73.053313999999943],[-105.91027799999989,73.058868000000132],[-105.87638899999996,73.058318999999983],[-105.85555999999997,73.056931000000077],[-105.84221600000001,73.053588999999988],[-105.83194699999996,73.049713000000111],[-105.82472200000001,73.045258000000047],[-105.82195299999995,73.034987999999942],[-105.82333399999999,73.029433999999981],[-105.83249699999999,73.017211999999972],[-105.82972699999993,73.006942999999978],[-105.82224299999996,73.002487000000031],[-105.80471799999998,72.994431000000134],[-105.79444899999993,72.990265000000079],[-105.76083399999999,72.976929000000098],[-105.737503,72.969436999999971],[-105.69776899999999,72.959152000000074],[-105.67859599999997,72.95637499999998],[-105.62917299999998,72.939972000000125],[-105.56220999999999,72.913040000000024],[-105.445831,72.838318000000072],[-105.32611099999991,72.746368000000075],[-105.32195299999995,72.741653000000042],[-105.32055700000001,72.736649000000057],[-105.32528699999995,72.730545000000063],[-105.33693700000003,72.726653999999996],[-105.35610999999994,72.727203000000088],[-105.37777699999998,72.729431000000034],[-105.39778100000001,72.737198000000035],[-105.41194200000001,72.745819000000097],[-105.41915899999992,72.750275000000045],[-105.42748999999992,72.759720000000073],[-105.43472300000002,72.764160000000118],[-105.46472199999994,72.775818000000129],[-105.47778299999999,72.779434000000037],[-105.49833699999994,72.780822999999998],[-105.51000999999997,72.776932000000102],[-105.45722999999992,72.702773999999977],[-105.44722000000002,72.698868000000061],[-105.38249200000001,72.681366000000025],[-105.35665899999998,72.674423000000047],[-105.29472399999997,72.631927000000019],[-105.23110999999994,72.543320000000051],[-105.19583099999988,72.482483000000059],[-105.19972199999995,72.460541000000148],[-105.20140100000003,72.454711999999972],[-105.20612299999993,72.448868000000118],[-105.21777299999991,72.444977000000051],[-105.23194899999993,72.447205000000054],[-105.26167299999992,72.458878000000027],[-105.27722199999994,72.462204000000099],[-105.29305999999997,72.460815000000082],[-105.301941,72.455261000000121],[-105.29778299999987,72.450546000000088],[-105.24137899999999,72.399718999999948],[-105.23029299999996,72.390549000000078],[-105.21665999999993,72.381927000000076],[-105.18998699999997,72.369705000000124],[-105.16055299999988,72.35775799999999],[-105.13999899999999,72.344711000000132],[-105.04415899999998,72.248032000000023],[-105.03639199999986,72.238586000000055],[-105.03362299999998,72.234711000000061],[-105.02443700000003,72.219986000000119],[-104.99166899999989,72.203323000000012],[-104.95749699999999,72.181366000000139],[-104.95527599999997,72.171097000000145],[-104.95722999999992,72.165543000000127],[-104.96167000000003,72.159424000000115],[-104.96916199999998,72.153046000000131],[-104.97805799999992,72.147491000000059],[-104.98805199999993,72.142761000000007],[-104.99973299999999,72.13888500000013],[-105.02999899999998,72.124695000000031],[-105.03751399999999,72.118317000000104],[-105.03639199999986,72.11303700000002],[-105.01862299999993,72.066939999999931],[-104.92944299999988,72.034149000000014],[-104.87193299999996,71.989975000000072],[-104.82917800000001,71.937195000000031],[-104.82444800000002,71.927475000000129],[-104.82028200000002,71.906647000000078],[-104.82556199999999,71.889708999999982],[-104.82250999999997,71.874145999999939],[-104.8186189999999,71.86914100000007],[-104.78999299999998,71.84137000000004],[-104.78333299999986,71.836929000000112],[-104.771118,71.833603000000096],[-104.70056199999999,71.829987000000017],[-104.68554699999993,71.826935000000105],[-104.67331699999994,71.823317999999972],[-104.66000400000001,71.81442300000009],[-104.53472899999986,71.719711000000018],[-104.37638900000002,71.598038000000031],[-104.36638600000003,71.588882000000126],[-104.35527000000002,71.574432000000002],[-104.35916099999997,71.563309000000004],[-104.36361699999998,71.557204999999954],[-104.37581599999993,71.544707999999957],[-104.383331,71.538315000000011],[-104.40167200000002,71.514435000000049],[-104.40361000000001,71.508605999999986],[-104.40194700000001,71.498322000000144],[-104.34416199999993,71.410811999999964],[-104.33332799999994,71.396378000000141],[-104.35722399999986,71.357483000000002],[-104.37165799999997,71.360809000000017],[-104.38918299999995,71.363602000000014],[-104.40805099999994,71.364990000000091],[-104.43804899999998,71.362761999999975],[-104.45056199999988,71.359711000000118],[-104.46167000000003,71.355820000000051],[-104.47138999999993,71.351089000000115],[-104.48860199999996,71.339980999999966],[-104.49333200000001,71.334152000000131],[-104.49694799999997,71.322769000000108],[-104.49500299999988,71.312485000000095],[-104.49137899999988,71.307480000000055],[-104.46250900000001,71.281097000000045],[-104.44972200000001,71.272217000000012],[-104.43888900000002,71.257767000000115],[-104.43971299999998,71.246933000000013],[-104.44055200000003,71.236098999999967],[-104.44444299999992,71.224990999999989],[-104.44888300000002,71.218872000000147],[-104.470551,71.199706999999989],[-104.49610899999999,71.183044000000109],[-104.52555799999999,71.168869000000029],[-104.55610699999994,71.155548000000067],[-104.57805599999995,71.148041000000092],[-104.59056099999998,71.145263999999997],[-104.62361099999987,71.133605999999986],[-104.64862099999999,71.11914100000007],[-104.60472099999998,71.079711999999972],[-104.58583099999998,71.066666000000055],[-104.57028199999996,71.05831900000004],[-104.53666699999997,71.044144000000131],[-104.48916600000001,71.024703999999986],[-104.45667300000002,71.013610999999969],[-104.33778399999994,70.979706000000078],[-104.23805199999998,70.964996000000099],[-104.22389199999998,70.961928999999998],[-104.122772,70.914703000000145],[-104.11665299999999,70.910262999999929],[-104.09999099999999,70.891372999999987],[-104.07640099999992,70.863037000000077],[-104.05277999999993,70.834427000000062],[-104.04583699999995,70.824996999999996],[-104.04277000000002,70.804153000000042],[-104.02887699999991,70.784988000000055],[-104.01583900000003,70.770827999999938],[-104.00029000000001,70.757216999999969],[-103.99416400000001,70.75277699999998],[-103.98528299999998,70.748871000000065],[-103.97138999999987,70.745529000000147],[-103.95472699999999,70.742752000000053],[-103.94027699999987,70.741653000000099],[-103.92443800000001,70.741928000000087],[-103.806107,70.723037999999974],[-103.73111,70.691649999999925],[-103.64083899999997,70.646652000000017],[-103.63417099999992,70.637206999999989],[-103.62470999999994,70.628036000000009],[-103.59889199999992,70.615814000000057],[-103.55638099999999,70.600815000000011],[-103.52333099999987,70.59304800000001],[-103.506958,70.590271000000143],[-103.49027999999998,70.587494000000049],[-103.47305299999999,70.586928999999998],[-103.44193999999999,70.587204000000042],[-103.39835399999993,70.590546000000131],[-103.34277299999997,70.59664900000007],[-103.32721699999991,70.59664900000007],[-103.30915799999997,70.595260999999994],[-103.26500699999997,70.581665000000044],[-103.239441,70.569443000000035],[-103.20472699999993,70.548035000000141],[-103.14972699999998,70.513885000000016],[-103.13276699999994,70.505829000000119],[-103.12165800000002,70.501938000000052],[-103.095551,70.498031999999967],[-103.01194799999996,70.492202999999961],[-102.97693600000002,70.489975000000015],[-102.96056399999998,70.489151000000049],[-102.93055699999996,70.490540000000067],[-102.92027299999995,70.494980000000055],[-102.91443599999991,70.500000000000114],[-102.915009,70.505264000000068],[-102.91832699999998,70.510268999999937],[-102.92388900000003,70.514435000000049],[-102.93250299999988,70.518600000000049],[-102.95722999999998,70.525543000000027],[-102.97528099999994,70.527205999999978],[-103.03028899999998,70.534988000000112],[-103.05526700000001,70.541931000000091],[-103.09973099999991,70.55664100000007],[-103.10833700000001,70.56053199999991],[-103.12609899999995,70.57388300000008],[-103.13999899999993,70.609421000000111],[-103.15556300000003,70.654984000000013],[-103.156113,70.659987999999998],[-103.15387699999997,70.665817000000004],[-103.14916999999991,70.67164600000001],[-103.13667299999992,70.674423000000104],[-103.12110899999999,70.674698000000092],[-103.10417200000001,70.673873999999955],[-103.08583099999998,70.672484999999995],[-103.06667299999998,70.669983000000059],[-103.0250089999999,70.660262999999986],[-103.00250199999999,70.652771000000087],[-102.85665899999992,70.597763000000043],[-102.84834299999994,70.593871999999976],[-102.84528399999999,70.588882000000126],[-102.83833300000003,70.574158000000068],[-102.83583099999998,70.548035000000141],[-102.74445300000002,70.494705000000067],[-102.61501299999992,70.460541000000035],[-102.60138699999999,70.457214000000079],[-102.52027899999996,70.438309000000118],[-102.45749699999988,70.426376000000118],[-102.40862299999998,70.417479999999955],[-102.33332799999999,70.397766000000047],[-102.281387,70.384155000000078],[-102.11749299999997,70.339432000000045],[-101.99610899999988,70.287201000000096],[-101.97972099999998,70.279160000000047],[-101.92555199999998,70.260544000000039],[-101.89334099999996,70.254439999999988],[-101.87666300000001,70.25360100000006],[-101.86138899999997,70.253876000000048],[-101.84916699999985,70.256653000000142],[-101.83805799999993,70.260268999999994],[-101.828056,70.264709000000039],[-101.82195299999995,70.269714000000079],[-101.81722999999988,70.281097000000102],[-101.81749699999995,70.286102000000142],[-101.80972300000002,70.297759999999982],[-101.79972800000002,70.302199999999971],[-101.71472199999999,70.308868000000132],[-101.69803599999995,70.308029000000033],[-101.68195300000002,70.304977000000065],[-101.59944200000001,70.275818000000129],[-101.58860800000002,70.271927000000062],[-101.58029199999993,70.267761000000121],[-101.58029199999993,70.262771999999984],[-101.58556399999998,70.256653000000142],[-101.60555999999997,70.247757000000036],[-101.63417099999998,70.233047000000056],[-101.64306599999998,70.227768000000083],[-101.65083300000003,70.221374999999966],[-101.65055799999993,70.210815000000025],[-101.64222699999993,70.196365000000071],[-101.62249799999995,70.162491000000045],[-101.61416599999995,70.153046000000018],[-101.55999800000001,70.113602000000071],[-101.55194099999994,70.109420999999998],[-101.53971899999999,70.106934000000138],[-101.52667200000002,70.108597000000032],[-101.39723200000003,70.139435000000049],[-101.39222699999999,70.150543000000027],[-101.37581599999999,70.177765000000136],[-101.358047,70.176086000000112],[-101.28666699999991,70.152480999999966],[-101.265289,70.14498900000001],[-101.25723299999999,70.140823000000125],[-101.25195300000001,70.13638300000008],[-101.23889200000002,70.133040999999992],[-101.22222899999991,70.131927000000019],[-101.14499699999999,70.15525800000006],[-101.13500999999997,70.159713999999951],[-101.12721299999998,70.166092000000106],[-101.12193300000001,70.171921000000111],[-101.11665299999993,70.183044000000109],[-101.12193300000001,70.192749000000049],[-101.11193800000001,70.19720500000011],[-101.09555099999994,70.196365000000071],[-101.03971899999999,70.183044000000109],[-100.99973299999999,70.172760000000096],[-100.98388699999992,70.164703000000145],[-100.97332799999998,70.155548000000067],[-100.97332799999998,70.145264000000054],[-100.97609699999992,70.134430000000009],[-100.96028099999995,70.053040000000067],[-100.92194399999988,69.965271000000143],[-100.88694800000002,69.884155000000021],[-100.870003,69.814423000000147],[-100.870003,69.788315000000011],[-100.87805200000003,69.771652000000131],[-100.89998600000001,69.753875999999991],[-100.92555199999998,69.721100000000035],[-100.92027300000001,69.711380000000133],[-100.92027300000001,69.701096000000121],[-100.92832899999996,69.684143000000006],[-100.93859900000001,69.672484999999995],[-100.94748699999997,69.666930999999977],[-100.95722999999992,69.662490999999989],[-100.96916199999998,69.659714000000065],[-101.06443799999994,69.648604999999975],[-101.28362300000003,69.663879000000065],[-101.31777999999991,69.667480000000126],[-101.32972699999988,69.669983000000116],[-101.34028599999999,69.678864000000033],[-101.43831599999993,69.769714000000022],[-101.45472699999993,69.798874000000069],[-101.46806299999997,69.823044000000095],[-101.47332799999998,69.832763999999997],[-101.468613,69.838882000000069],[-101.458618,69.843322999999998],[-101.43998699999997,69.853317000000004],[-101.43472300000002,69.859146000000067],[-101.41610700000001,69.886932000000115],[-101.41860999999989,69.891936999999984],[-101.42944299999994,69.906097000000045],[-101.44526699999994,69.909149000000014],[-101.45638999999994,69.905548000000124],[-101.46888699999994,69.893051000000128],[-101.47917199999995,69.881362999999908],[-101.51972999999992,69.828323000000069],[-101.53999299999998,69.79942299999999],[-101.54750100000001,69.78776600000009],[-101.55972299999996,69.764998999999989],[-101.56220999999999,69.754165999999998],[-101.56194299999999,69.74914600000011],[-101.564438,69.743317000000104],[-101.569458,69.737488000000099],[-101.60777300000001,69.705825999999945],[-101.65249599999999,69.6827550000001],[-101.69193999999999,69.680267000000129],[-101.69722000000002,69.684708000000057],[-101.75805699999995,69.717758000000117],[-101.76611300000002,69.721924000000001],[-101.77916700000003,69.725266000000147],[-101.85637700000001,69.743042000000116],[-101.87000299999994,69.74414100000007],[-101.88722200000001,69.733321999999987],[-101.89916999999997,69.73054500000012],[-101.91416900000002,69.73054500000012],[-101.92999299999997,69.733597000000032],[-101.94055200000003,69.737198000000092],[-101.94860799999998,69.741363999999976],[-101.962784,69.753052000000025],[-102.02306399999992,69.817764000000011],[-102.06555199999997,69.850540000000137],[-102.20667300000002,69.91304000000008],[-102.21749899999998,69.916930999999977],[-102.23029300000002,69.917205999999965],[-102.24082900000002,69.913315000000068],[-102.37581599999999,69.809418000000107],[-102.51027699999992,69.758040999999992],[-102.57640100000003,69.737488000000099],[-102.59249899999998,69.738312000000064],[-102.60582699999998,69.741653000000099],[-102.61638600000003,69.745255000000043],[-102.64890300000002,69.761658000000125],[-102.65972899999997,69.765273999999977],[-102.673317,69.76638800000012],[-102.68055700000002,69.759995000000004],[-102.67443800000001,69.750275000000101],[-102.65805099999994,69.736923000000047],[-102.60028099999994,69.69802900000002],[-102.59221600000001,69.693862999999908],[-102.57640100000003,69.691086000000041],[-102.55943299999996,69.68942300000009],[-102.53138699999994,69.691360000000145],[-102.52084400000001,69.695251000000042],[-102.50917099999998,69.69802900000002],[-102.49194299999994,69.696365000000014],[-102.48361199999988,69.692200000000014],[-102.47805800000003,69.682480000000112],[-102.49777199999988,69.595260999999994],[-102.50778199999996,69.564147999999989],[-102.51500699999985,69.559982000000105],[-102.525284,69.556366000000025],[-102.60305800000003,69.538315000000068],[-102.81304899999986,69.529709000000139],[-102.82861300000002,69.53276100000005],[-102.94387799999993,69.559417999999994],[-103.08528099999995,69.597214000000122],[-103.18666099999996,69.629425000000026],[-103.20556599999998,69.636932000000002],[-103.22471599999994,69.644714000000135],[-103.23277300000001,69.648604999999975],[-103.260559,69.665543000000071],[-103.27166699999998,69.674423000000104],[-103.32195300000001,69.692200000000014],[-103.41639699999996,69.706375000000094],[-103.43055699999996,69.705261000000121],[-103.47693600000002,69.693588000000091],[-103.48665599999998,69.684708000000057],[-103.50723299999999,69.617751999999996],[-103.5041809999999,69.613036999999963],[-103.33528100000001,69.574997000000053],[-103.08917200000002,69.521927000000005],[-103.07528699999995,69.523041000000148],[-103.05695300000002,69.520537999999988],[-103.04638699999998,69.516936999999984],[-103.03806299999997,69.512771999999984],[-103.03278399999999,69.508331000000055],[-103.02333099999998,69.493866000000082],[-103.01390099999998,69.474152000000004],[-102.99137899999999,69.424698000000035],[-102.99082899999996,69.419434000000024],[-103.00778199999996,69.326935000000049],[-103.01917300000002,69.282761000000107],[-103.02306399999998,69.271652000000017],[-103.04444899999999,69.252487000000087],[-103.07195299999995,69.238586000000112],[-103.11332700000003,69.223602000000028],[-103.12444299999999,69.220825000000104],[-103.16000399999996,69.213042999999971],[-103.17250099999995,69.211380000000077],[-103.19415299999997,69.204712000000086],[-103.204453,69.200821000000019],[-103.21140299999996,69.194427000000132],[-103.21444700000001,69.189697000000137],[-103.21777299999997,69.137207000000103],[-103.208618,69.122756999999979],[-103.20305599999989,69.11831699999999],[-103.19499199999996,69.114426000000094],[-103.18222000000003,69.111098999999967],[-103.141953,69.15776100000005],[-103.13390400000003,69.163315000000068],[-103.12444299999999,69.167755000000056],[-103.10500300000001,69.176085999999998],[-103.07417299999997,69.187485000000038],[-103.03721599999994,69.205826000000059],[-103.021118,69.216934000000037],[-103.00611900000001,69.228592000000106],[-102.99889399999989,69.234985000000052],[-102.98082699999992,69.259155000000078],[-102.96916199999993,69.271378000000084],[-102.95056199999999,69.290268000000083],[-102.94360399999999,69.29664600000001],[-102.87249799999995,69.360535000000141],[-102.84084299999995,69.383330999999998],[-102.829453,69.386108000000036],[-102.817497,69.383881000000031],[-102.80666400000001,69.379974000000061],[-102.79360999999994,69.376923000000033],[-102.76083399999993,69.374420000000043],[-102.74694799999997,69.375534000000016],[-102.72277799999995,69.380264000000068],[-102.51083399999999,69.439697000000081],[-102.50862100000001,69.445526000000086],[-102.48972300000003,69.469436999999971],[-102.47193900000002,69.479430999999977],[-102.46028100000001,69.482208000000071],[-102.31304899999998,69.49832200000003],[-102.29804999999999,69.498596000000134],[-102.09306300000003,69.487762000000089],[-102.05750299999988,69.483597000000088],[-102.04750100000001,69.479980000000126],[-101.95527599999997,69.43553200000008],[-101.94748699999997,69.431365999999969],[-101.93694299999999,69.422485000000052],[-101.93138099999999,69.412766000000033],[-101.93110699999994,69.407486000000006],[-101.93611099999998,69.401657],[-102.03527799999995,69.287200999999982],[-102.14890300000002,69.270264000000111],[-102.15943899999996,69.27388000000002],[-102.18776700000001,69.280272999999966],[-102.20140100000003,69.279160000000047],[-102.21278399999994,69.276382000000069],[-102.22972099999993,69.265549000000078],[-102.23194899999999,69.259720000000073],[-102.21721600000001,69.225266000000033],[-102.11972000000003,69.183043999999938],[-102.10665899999992,69.179703000000131],[-102.09361299999989,69.178588999999931],[-102.08112299999993,69.180267000000072],[-102.07167099999992,69.184982000000105],[-102.06416300000001,69.191360000000032],[-102.05943299999996,69.19720499999994],[-102.05721999999992,69.202773999999977],[-102.05750299999988,69.208038000000101],[-102.05444299999999,69.214431999999988],[-102.04499800000002,69.226089000000115],[-102.03666699999997,69.231658999999979],[-102.01666299999999,69.239975000000072],[-102.00611899999996,69.243590999999981],[-101.96305799999999,69.257216999999912],[-101.95140099999998,69.259995000000117],[-101.9385989999999,69.261931999999945],[-101.92194399999994,69.260269000000051],[-101.78500399999996,69.196365000000071],[-101.77055399999995,69.189147999999989],[-101.75472999999994,69.175812000000064],[-101.75195300000001,69.165543000000014],[-101.75167799999991,69.160537999999974],[-101.75389099999995,69.149719000000061],[-101.80638099999999,69.003876000000105],[-101.80860899999993,68.99803199999991],[-101.81806899999992,68.993591000000038],[-101.85138699999993,68.984420999999941],[-101.89916999999997,68.97526600000009],[-101.94888300000002,68.96775800000006],[-101.962784,68.96665999999999],[-101.97693600000002,68.96665999999999],[-101.993607,68.968323000000112],[-102.00140399999992,68.972488000000112],[-102.02223200000003,68.990265000000136],[-102.03250100000002,68.99414100000007],[-102.04778299999998,68.996933000000126],[-102.06220999999994,68.996933000000126],[-102.09665699999994,68.988585999999941],[-102.11305199999998,68.977767999999969],[-102.12609900000001,68.966385000000002],[-102.13082900000001,68.960265999999933],[-102.14502699999997,68.94766199999998],[-102.15638699999994,68.944702000000063],[-102.16972399999997,68.946091000000024],[-102.323624,68.937195000000088],[-102.38612399999994,68.925537000000077],[-102.38583399999993,68.920258000000103],[-102.39028899999994,68.914429000000098],[-102.39835399999987,68.90887500000008],[-102.48554999999999,68.871368000000018],[-102.53582799999998,68.864425999999924],[-102.58972199999999,68.860535000000084],[-102.60417200000001,68.860260000000039],[-102.61972000000003,68.861099000000024],[-102.63500999999991,68.863876000000118],[-102.64527900000002,68.867751999999996],[-102.76306199999999,68.877762000000075],[-102.81889299999995,68.834152000000074],[-102.89472999999992,68.799988000000042],[-102.99054699999999,68.794434000000081],[-103.00583599999999,68.795258000000047],[-103.047234,68.809707999999944],[-103.146118,68.840546000000131],[-103.16416899999996,68.84304800000001],[-103.19499199999996,68.844437000000028],[-103.208618,68.843596999999988],[-103.32084699999996,68.829712000000086],[-103.34111000000001,68.822220000000129],[-103.36000099999995,68.813872999999944],[-103.36805700000002,68.808318999999983],[-103.40306099999992,68.777205999999978],[-103.50917099999987,68.801375999999948],[-103.83583099999993,68.83638000000002],[-104.09472699999992,68.856644000000017],[-104.11028299999998,68.859421000000054],[-104.13834399999996,68.865540000000124],[-104.287781,68.901932000000102],[-104.40249599999999,68.931091000000094],[-104.43083199999995,68.9369200000001],[-104.445267,68.938873000000001],[-104.45749699999999,68.936645999999996],[-104.46167000000003,68.930542000000116],[-104.46305799999988,68.924987999999928],[-104.46250900000001,68.919708000000071],[-104.47444199999995,68.901657000000057],[-104.487503,68.888885000000073],[-104.50279199999989,68.877762000000075],[-104.51167299999992,68.873032000000023],[-104.52139299999999,68.869140999999956],[-104.54360999999989,68.863311999999951],[-104.583618,68.859711000000118],[-104.84999099999993,68.870254999999986],[-105.12917299999998,68.896378000000084],[-105.14472999999992,68.899155000000007],[-105.16610699999995,68.906097000000102],[-105.19332900000001,68.917480000000126],[-105.24889399999989,68.945526000000029],[-105.18305999999995,68.988312000000008],[-105.173317,68.991928000000087],[-105.14666699999998,68.992477000000008],[-105.128601,68.989975000000129],[-105.06471299999998,68.986923000000047],[-105.03916900000002,68.990265000000136],[-104.93639400000001,69.03054800000001],[-104.92887899999999,69.036102000000028],[-104.91610700000001,69.048874000000012],[-104.91166699999991,69.065811000000053],[-104.915009,69.070541000000048],[-104.92304999999999,69.074706999999989],[-104.93388399999998,69.078323000000012],[-105.06500199999999,69.104155999999989],[-105.08332799999999,69.106369000000086],[-105.09665699999999,69.105255000000113],[-105.122772,69.091095000000053],[-105.16027799999995,69.071930000000066],[-105.47361799999999,69.106934000000138],[-105.48055999999997,69.116652999999928],[-105.49249299999991,69.125259000000028],[-105.50695799999994,69.133606000000043],[-105.51528899999994,69.13749700000011],[-105.55387899999999,69.152480999999966],[-105.58056599999998,69.156372000000033],[-105.61694299999994,69.160812000000078],[-105.76806599999998,69.171371000000136],[-105.83029199999999,69.172211000000004],[-105.87416100000002,69.171097000000032],[-105.90222199999999,69.169144000000074],[-105.91443600000002,69.167205999999965],[-105.92555199999998,69.164153999999996],[-106.03888699999993,69.153869999999984],[-106.17777999999998,69.144150000000081],[-106.19360399999999,69.144714000000022],[-106.256958,69.154984000000127],[-106.28888699999999,69.160262999999929],[-106.39611799999994,69.17804000000001],[-106.40611299999995,69.180542000000059],[-106.41471899999999,69.184417999999937],[-106.41471899999999,69.195251000000098],[-106.41027799999995,69.217758000000003],[-106.40666199999998,69.223877000000073],[-106.3944469999999,69.23692299999999],[-106.38612399999994,69.241653000000042],[-106.37638899999996,69.24552900000009],[-106.30777,69.262206999999989],[-106.28832999999992,69.269989000000123],[-106.27362099999993,69.281372000000147],[-106.26777600000003,69.292206000000022],[-106.26889,69.297211000000061],[-106.31639100000001,69.386658000000068],[-106.49527,69.474426000000108],[-106.52139299999993,69.486098999999967],[-106.54138199999989,69.49331699999999],[-106.55499299999985,69.496368000000018],[-106.57112099999989,69.498870999999951],[-106.60221899999999,69.498870999999951],[-106.61444099999994,69.496643000000006],[-106.62554899999986,69.493591000000094],[-106.73306299999996,69.441650000000038],[-106.74027999999998,69.435806000000014],[-106.74388099999993,69.429703000000075],[-106.74553700000001,69.407760999999994],[-106.86277799999999,69.36914100000007],[-106.93083200000001,69.361649000000114],[-106.95500199999992,69.357208000000014],[-106.96611000000001,69.354156000000103],[-106.98554999999999,69.346100000000035],[-106.99249299999997,69.340546000000018],[-106.99722300000002,69.33526599999999],[-106.99833699999999,69.329711999999972],[-106.99694799999997,69.324432000000058],[-106.96528599999994,69.303040000000067],[-106.95749699999993,69.293319999999994],[-106.925003,69.23942599999998],[-106.92223399999995,69.228867000000093],[-106.929169,69.216660000000104],[-106.93611099999998,69.211105000000032],[-106.94444299999998,69.206375000000037],[-106.96362299999993,69.198318000000029],[-107.03999299999998,69.181091000000038],[-107.12832600000002,69.154434000000094],[-107.13806199999999,69.150543000000027],[-107.16221599999994,69.134430000000009],[-107.19167299999998,69.112487999999928],[-107.22666900000002,69.084152000000017],[-107.24889400000001,69.068054000000018],[-107.264183,69.057480000000112],[-107.27944899999994,69.046936000000073],[-107.304169,69.032485999999949],[-107.31360599999994,69.028595000000109],[-107.34221599999995,69.01887499999998],[-107.37444299999993,69.009430000000123],[-107.43167099999994,68.996368000000075],[-107.50334199999992,68.982758000000047],[-107.55387899999994,68.975540000000024],[-107.64611799999989,68.965546000000018],[-107.67388900000003,68.963608000000079],[-107.74610899999999,68.960815000000082],[-107.93749999999994,68.934981999999934],[-107.95584099999996,68.931046000000094],[-107.97693600000002,68.930542000000116],[-108.17555199999998,68.931091000000094],[-108.20944199999997,68.93331900000004],[-108.26444999999995,68.939148000000046],[-108.29833999999988,68.941360000000088],[-108.42804699999994,68.945816000000036],[-108.49221799999992,68.94747899999993],[-108.521118,68.946365000000128],[-108.53443900000002,68.944702000000063],[-108.54611199999994,68.942474000000061],[-108.56331599999993,68.933594000000028],[-108.56388900000002,68.927765000000022],[-108.55082699999997,68.919434000000138],[-108.54194599999994,68.915543000000071],[-108.53555299999999,68.911376999999959],[-108.531387,68.906647000000135],[-108.52971599999995,68.901382000000069],[-108.53028899999993,68.895828000000051],[-108.53555299999999,68.889160000000061],[-108.55139200000002,68.879425000000026],[-108.59722899999997,68.859146000000067],[-108.67443799999995,68.829437000000041],[-108.926941,68.744431000000134],[-108.93749999999994,68.741088999999988],[-108.97250400000001,68.733870999999965],[-109.10472099999998,68.710541000000035],[-109.19138299999992,68.697205000000054],[-109.23416099999997,68.694977000000108],[-109.26390099999998,68.694427000000076],[-109.31194299999999,68.695816000000093],[-109.345551,68.697754000000032],[-109.37416100000002,68.696365000000014],[-109.39998600000001,68.693313999999987],[-109.43472300000002,68.686095999999964],[-109.49137899999994,68.673308999999961],[-109.52306399999992,68.664993000000095],[-109.55359599999991,68.655258000000003],[-109.59722899999997,68.64387499999998],[-109.64362299999999,68.634430000000123],[-109.65638699999994,68.632751000000098],[-109.68331899999998,68.630539000000056],[-109.756958,68.628586000000098],[-109.97028399999999,68.627197000000081],[-110.12416099999996,68.627197000000081],[-110.16055299999994,68.630539000000056],[-110.19167299999998,68.630814000000044],[-110.22000099999997,68.629150000000038],[-110.24416400000001,68.625259000000142],[-110.26306199999999,68.617752000000053],[-110.27194199999997,68.613602000000014],[-110.27916700000003,68.608597000000145],[-110.295547,68.599426000000051],[-110.32917800000001,68.582214000000022],[-110.33917200000002,68.578872999999987],[-110.35082999999997,68.576385000000016],[-110.36361699999998,68.574707000000046],[-110.37777699999998,68.574158000000125],[-110.39138800000001,68.576660000000004],[-110.39806399999986,68.580826000000116],[-110.42027299999995,68.604156000000046],[-110.42722300000003,68.608321999999987],[-110.44082600000002,68.611099000000081],[-110.45889299999999,68.612761999999975],[-110.56111099999998,68.616653000000042],[-110.576683,68.616653000000042],[-110.58944699999989,68.614990000000148],[-110.60944399999994,68.608321999999987],[-110.61694299999994,68.603592000000106],[-110.63417099999987,68.59526100000005],[-110.65695199999999,68.590271000000143],[-110.68138099999999,68.586105000000089],[-110.89666699999998,68.55720500000001],[-110.92223399999995,68.553863999999976],[-110.950287,68.551926000000037],[-111.01363400000002,68.552765000000022],[-111.03195199999999,68.554428000000144],[-111.03859699999992,68.558594000000028],[-111.03500400000001,68.563873000000001],[-110.98332199999993,68.577773999999977],[-110.97193900000002,68.580276000000083],[-110.95777900000002,68.581100000000049],[-110.92555199999993,68.580276000000083],[-110.89723200000003,68.581940000000088],[-110.87165800000002,68.585266000000104],[-110.86028299999987,68.587769000000094],[-110.850281,68.591095000000109],[-110.84306299999997,68.596099999999979],[-110.84306299999997,68.601653999999996],[-110.84973099999996,68.605820000000051],[-110.86361699999992,68.608597000000145],[-111.01750199999998,68.598327999999981],[-111.03028899999998,68.596649000000127],[-111.05888399999998,68.585815000000082],[-111.068893,68.58248900000001],[-111.08029199999999,68.579987000000131],[-111.09306300000003,68.578323000000125],[-111.13527699999997,68.575821000000076],[-111.16639700000002,68.575821000000076],[-111.23249800000002,68.578049000000021],[-111.26750199999998,68.580551000000071],[-111.28362299999998,68.582764000000054],[-111.32000700000003,68.585815000000082],[-111.33693699999998,68.586655000000121],[-111.37917299999998,68.584152000000131],[-111.39195299999994,68.58248900000001],[-111.41166699999997,68.575546000000031],[-111.41665599999999,68.571106000000043],[-111.40527299999997,68.568054000000075],[-111.389183,68.56581099999994],[-111.29804999999999,68.557755000000043],[-111.25028999999989,68.55720500000001],[-111.23194899999999,68.555542000000116],[-111.21833800000002,68.552765000000022],[-111.20916699999998,68.549148999999943],[-111.204453,68.544708000000071],[-111.204453,68.538879000000009],[-111.21112099999999,68.526093000000117],[-111.21556099999992,68.519440000000145],[-111.22556299999997,68.516098],[-111.23805199999993,68.514435000000105],[-111.25361599999991,68.514435000000105],[-111.35861199999999,68.521652000000017],[-111.37470999999999,68.523604999999975],[-111.38834400000002,68.526382000000069],[-111.46806300000003,68.536926000000108],[-111.52278100000001,68.541656000000103],[-111.60056299999991,68.543594000000041],[-111.85109699999998,68.534149000000014],[-112.060272,68.523041000000035],[-112.21000700000002,68.513610999999969],[-112.23665599999987,68.510817999999972],[-112.35916099999997,68.501938000000109],[-112.40110799999997,68.499145999999996],[-112.50917099999992,68.498032000000023],[-112.63527699999992,68.483047000000056],[-112.63694800000002,68.476928999999927],[-112.64527900000002,68.472763000000043],[-112.67027299999995,68.469146999999964],[-112.72749299999992,68.465820000000065],[-112.77390299999996,68.465546000000131],[-112.80750299999994,68.466660000000104],[-113.05166600000001,68.464157000000114],[-113.091949,68.460266000000047],[-113.220551,68.45277400000009],[-113.25140399999992,68.452209000000096],[-113.26944699999996,68.453873000000101],[-113.297234,68.458602999999925],[-113.30444299999999,68.462769000000037],[-113.30943300000001,68.467209000000025],[-113.310272,68.473038000000031],[-113.30638099999993,68.479706000000022],[-113.29972800000002,68.484711000000061],[-113.29138199999994,68.489151000000106],[-113.26944699999996,68.494430999999963],[-113.256958,68.496094000000085],[-113.19360399999999,68.496368000000018],[-113.05166600000001,68.487487999999985],[-113.03778099999994,68.488312000000121],[-113.03388999999999,68.494980000000112],[-113.04360999999994,68.504166000000055],[-113.07250999999991,68.520538000000045],[-113.11805700000002,68.544434000000138],[-113.14138800000001,68.550537000000077],[-113.19721999999996,68.560256999999979],[-113.21333300000003,68.562195000000088],[-113.26888999999994,68.572220000000016],[-113.33416699999998,68.585541000000148],[-113.35777299999995,68.591369999999984],[-113.36721799999992,68.594986000000006],[-113.38166799999988,68.603043000000014],[-113.44304699999998,68.640548999999965],[-113.44833399999999,68.645263999999997],[-113.45111099999997,68.650269000000037],[-113.45249899999999,68.661652000000061],[-113.45084400000002,68.667755],[-113.52443700000003,68.724990999999932],[-113.66665599999999,68.802199999999914],[-113.676941,68.811096000000077],[-113.67887899999994,68.894714000000079],[-113.67722299999997,68.900818000000129],[-113.671944,68.906647000000135],[-113.62389400000001,68.93331900000004],[-113.60694899999993,68.942474000000061],[-113.58444199999997,68.948028999999963],[-113.57472199999995,68.951385000000016],[-113.569458,68.957214000000022],[-113.54583700000001,69.043045000000006],[-113.54499799999996,69.048035000000084],[-113.55471799999987,69.051376000000118],[-113.61501299999998,69.066376000000048],[-113.63221699999997,69.073883000000023],[-113.64723199999992,69.081940000000145],[-113.65778399999999,69.091095000000053],[-113.69611399999991,69.154709000000139],[-113.69220699999994,69.189423000000033],[-113.68083200000001,69.191925000000083],[-113.66583300000002,69.191086000000098],[-113.65583800000002,69.187485000000038],[-113.62193300000001,69.17804000000001],[-113.53888699999999,69.168594000000041],[-113.51972999999998,69.167205999999965],[-113.50862099999995,69.169708000000014],[-113.51363399999997,69.174423000000047],[-113.52111799999994,69.178588999999931],[-113.55359599999991,69.187195000000031],[-113.58000199999992,69.192474000000004],[-113.62332200000003,69.199707000000046],[-113.90888999999999,69.24192800000003],[-114.27555799999999,69.281936999999971],[-114.31139400000001,69.284987999999998],[-114.32888800000001,69.285538000000031],[-114.39277600000003,69.284149000000014],[-114.42138699999998,69.281936999999971],[-114.4472199999999,69.278046000000074],[-114.49249299999991,69.267212000000029],[-114.51834100000002,69.263321000000133],[-114.66972399999997,69.255829000000006],[-114.764183,69.252212999999983],[-115.08889799999992,69.244705000000124],[-115.25361599999991,69.245254999999986],[-115.40083299999998,69.256942999999978],[-115.64472999999998,69.273315000000139],[-115.79527299999995,69.282761000000107],[-115.92138699999992,69.290268000000083],[-115.95584099999996,69.292206000000022],[-115.96833799999996,69.294983000000116],[-115.9786069999999,69.298598999999967],[-115.98665599999998,69.302475000000015],[-116.00029000000001,69.310806000000127],[-116.00611900000001,69.315262000000018],[-116.016953,69.322220000000016],[-116.02694700000001,69.325546000000088],[-116.05638099999999,69.32998699999996],[-116.17527799999993,69.34165999999999],[-116.21945199999999,69.348327999999981],[-116.52583300000003,69.407486000000006],[-116.53859699999998,69.4102630000001],[-116.54888900000003,69.413605000000018],[-116.56527699999992,69.421371000000079],[-116.62970699999994,69.458878000000141],[-116.63137799999993,69.464706000000035],[-116.62666299999989,69.470535000000041],[-116.61888099999993,69.474990999999989],[-116.60777300000001,69.478043000000071],[-116.569458,69.48414600000001],[-116.56139400000001,69.488586000000055],[-116.55860899999993,69.4952550000001],[-116.57556199999993,69.555817000000104],[-116.58138999999989,69.560531999999967],[-116.591949,69.563873000000001],[-116.60472099999993,69.566665999999998],[-116.63667299999997,69.570267000000058],[-116.73388699999998,69.575546000000031],[-116.74999999999994,69.574997000000053],[-116.75945299999995,69.571381000000031],[-116.76611299999996,69.565177999999946],[-116.78138699999988,69.55720500000001],[-116.89750700000002,69.587494000000049],[-116.88054699999986,69.608871000000079],[-116.85193600000002,69.619705000000124],[-116.84612299999998,69.643051000000014],[-116.84750399999996,69.648604999999975],[-116.858047,69.651932000000102],[-116.96193700000003,69.679427999999973],[-116.987503,69.684981999999991],[-117.01777600000003,69.68942300000009],[-117.03500399999996,69.690810999999997],[-117.05027799999993,69.693038999999942],[-117.07584400000002,69.69859300000013],[-117.11805699999996,69.711654999999951],[-117.23889200000002,69.753052000000025],[-117.24749799999995,69.756943000000092],[-117.26917300000002,69.78166200000004],[-117.27278100000001,69.792755000000056],[-117.30777,69.844436999999971],[-117.36721799999992,69.919983000000059],[-117.42250099999995,69.972488000000055],[-117.43499799999995,69.981369000000029],[-117.43666099999996,69.98692299999999],[-117.43611099999993,69.993042000000059],[-117.41528299999993,70.009995000000117],[-117.38527699999997,70.028595000000053],[-117.35637700000001,70.039703000000031],[-117.32584400000002,70.049987999999985],[-117.28362300000003,70.063309000000118],[-117.25140399999992,70.072768999999994],[-117.23999000000003,70.075821000000133],[-117.19444299999998,70.087493999999936],[-117.16999800000002,70.092484000000013],[-117.12082700000002,70.102478000000019],[-117.08167999999995,70.108871000000136],[-117.01083399999993,70.116928000000144],[-116.87721299999998,70.129150000000095],[-116.58306899999997,70.156937000000084],[-116.236107,70.191360000000032],[-116.16639700000002,70.199997000000053],[-116.09999099999999,70.210266000000047],[-116.07167099999998,70.213608000000022],[-115.90834000000001,70.228867000000093],[-115.80194099999994,70.236649000000057],[-115.69360399999994,70.243866000000139],[-115.64695699999993,70.246643000000063],[-115.49665799999997,70.250549000000092],[-115.44833399999993,70.252487000000031],[-115.31471299999998,70.264160000000061],[-115.30139200000002,70.266388000000063],[-115.229446,70.273879999999963],[-115.16750299999995,70.27777100000003],[-115.08389299999999,70.279708999999968],[-115.03028899999998,70.279984000000013],[-114.86721799999998,70.28387500000008],[-114.80194099999989,70.286102000000142],[-114.74137899999999,70.290817000000004],[-114.71305799999988,70.293869000000086],[-114.65888999999999,70.301651000000049],[-114.61694299999994,70.30664100000007],[-114.58833299999992,70.309708000000001],[-114.54305999999997,70.313309000000061],[-114.511124,70.314696999999967],[-114.323624,70.316665999999998],[-114.254997,70.317215000000147],[-114.21833800000002,70.316085999999984],[-114.17832900000002,70.313599000000067],[-114.16082799999998,70.311645999999939],[-114.13527699999997,70.305816999999934],[-114.111107,70.293869000000086],[-114.09028599999994,70.286926000000108],[-114.057503,70.282486000000063],[-113.84166700000003,70.269440000000145],[-113.68388399999992,70.263046000000088],[-113.65055799999993,70.263610999999969],[-113.59166700000003,70.268600000000106],[-113.54943799999995,70.273315000000139],[-113.50556899999998,70.277481000000023],[-113.46000700000002,70.280548000000124],[-113.42804699999999,70.281662000000097],[-113.39138799999995,70.280548000000124],[-113.33332799999994,70.277206000000035],[-113.29611199999999,70.273879999999963],[-113.16832699999998,70.259155000000021],[-113.09084299999995,70.247481999999991],[-112.66665599999993,70.203873000000101],[-112.56471299999998,70.198318000000029],[-112.54804999999999,70.198593000000017],[-112.53278399999994,70.199416999999983],[-112.52084399999995,70.202209000000096],[-112.51722699999999,70.207488999999953],[-112.52749599999993,70.211105000000032],[-112.56304899999998,70.213608000000022],[-112.577789,70.216095000000053],[-112.58084100000002,70.221374999999966],[-112.57501200000002,70.227203000000088],[-112.56582599999996,70.231368999999972],[-112.55526700000001,70.234984999999995],[-112.54332699999992,70.237487999999985],[-112.295547,70.266663000000051],[-112.212784,70.265823000000012],[-112.195831,70.265823000000012],[-112.16388699999999,70.266936999999984],[-112.13834399999996,70.271378000000084],[-112.14584400000001,70.275543000000084],[-112.16306299999991,70.277481000000023],[-112.24249299999991,70.283600000000035],[-112.29695099999998,70.289154000000053],[-112.30471799999992,70.293319999999937],[-112.29723399999995,70.298325000000034],[-112.28333299999997,70.299988000000099],[-112.26666299999999,70.300262000000032],[-112.24833699999999,70.299423000000104],[-112.23111,70.297484999999938],[-112.10888699999992,70.277481000000023],[-111.92639199999996,70.252212999999927],[-111.91583300000002,70.255553999999961],[-111.90805099999989,70.260544000000039],[-111.89917000000003,70.264709000000039],[-111.88054699999998,70.270264000000111],[-111.86527999999993,70.271378000000084],[-111.84861799999993,70.271378000000084],[-111.743607,70.269440000000145],[-111.55555700000002,70.269714000000079],[-111.53888699999993,70.269989000000066],[-111.46806300000003,70.278320000000008],[-111.45445299999989,70.279984000000013],[-111.445267,70.284149000000014],[-111.44275699999992,70.290268000000026],[-111.487213,70.336929000000055],[-111.49472000000003,70.341094999999939],[-111.50723299999993,70.344147000000078],[-111.53694200000001,70.349426000000051],[-111.63110399999999,70.358321999999987],[-111.66471899999999,70.35803199999998],[-111.69387799999998,70.355545000000063],[-111.73528299999998,70.35026600000009],[-111.75055700000001,70.349426000000051],[-111.80387899999999,70.350815000000011],[-111.98055999999991,70.370818999999983],[-112.00083899999987,70.378036000000066],[-112.05387899999999,70.401093000000003],[-112.06166099999996,70.405258000000003],[-112.06973299999993,70.414993000000095],[-112.07250999999997,70.42025799999999],[-112.073059,70.431655999999975],[-112.07584400000002,70.436646000000053],[-112.08917200000002,70.451096000000121],[-112.11527999999998,70.474152000000004],[-112.14611799999994,70.490540000000067],[-112.156387,70.494141000000127],[-112.16915899999998,70.497208000000001],[-112.19915800000001,70.502213000000097],[-112.42722299999997,70.526382000000012],[-112.49553700000001,70.515274000000034],[-112.5,70.514740000000074],[-112.50945300000001,70.513611000000083],[-112.52806099999998,70.514160000000004],[-112.58612099999999,70.524994000000106],[-112.62193300000001,70.534424000000001],[-112.65278599999994,70.545258000000047],[-112.67083700000001,70.552765000000136],[-112.67859599999991,70.556931000000077],[-112.70973199999997,70.567490000000078],[-112.72805799999998,70.568329000000062],[-112.81471299999993,70.568054000000075],[-112.84861799999993,70.567764000000011],[-112.85610999999994,70.562758999999971],[-112.93749999999994,70.56721500000009],[-113.00083899999993,70.576659999999947],[-113.01611300000002,70.579163000000108],[-113.14222699999999,70.606093999999985],[-113.30304699999994,70.641936999999984],[-113.49221799999992,70.677200000000028],[-113.51112399999994,70.677765000000022],[-113.51999699999993,70.673598999999967],[-113.51917299999997,70.667755000000113],[-113.5227809999999,70.655547999999953],[-113.52834300000001,70.649719000000118],[-113.54055800000003,70.646942000000024],[-113.55444299999994,70.644989000000123],[-113.57140399999997,70.644714000000079],[-113.59166700000003,70.646103000000096],[-113.60722399999997,70.648604999999975],[-113.63054699999998,70.654984000000013],[-113.64917000000003,70.662766000000147],[-113.66528299999999,70.670822000000044],[-113.68388399999992,70.678314],[-113.72860700000001,70.691649999999925],[-113.76194800000002,70.696091000000024],[-113.88221699999997,70.710265999999933],[-113.93831599999993,70.71527100000003],[-113.97416699999991,70.715546000000018],[-113.98972299999997,70.714432000000045],[-114.015556,70.709991000000116],[-114.06833599999993,70.692474000000061],[-114.08944700000001,70.685256999999979],[-114.12082699999996,70.674698000000092],[-114.14362299999999,70.668594000000098],[-114.17111199999999,70.664703000000031],[-114.20834400000001,70.665817000000004],[-114.26194800000002,70.671371000000022],[-114.323059,70.675262000000089],[-114.37748699999997,70.675812000000121],[-114.40834000000001,70.673598999999967],[-114.4202729999999,70.670822000000044],[-114.43083200000001,70.667206000000022],[-114.44833399999999,70.658600000000092],[-114.45889299999999,70.655258000000117],[-114.49500299999994,70.646942000000024],[-114.54527299999995,70.636107999999979],[-114.57112100000001,70.631362999999965],[-114.64111299999996,70.622482000000048],[-114.98916599999995,70.603867000000093],[-115.13694800000002,70.598038000000088],[-115.25250199999994,70.601379000000122],[-115.38054699999998,70.604706000000078],[-115.39943700000003,70.604980000000012],[-115.88971700000002,70.595260999999994],[-115.921944,70.593596999999988],[-115.97609699999998,70.585266000000047],[-116.05555700000002,70.572220000000129],[-116.08556399999992,70.587769000000037],[-116.16251399999999,70.62303200000008],[-116.17111199999994,70.626923000000147],[-116.26363400000002,70.634720000000073],[-116.36389200000002,70.639160000000118],[-116.38082900000001,70.638885000000073],[-116.52999899999992,70.632477000000108],[-116.63221699999997,70.614990000000091],[-116.65583800000002,70.609146000000067],[-116.66915899999998,70.607208000000128],[-116.71501199999994,70.603043000000127],[-116.90110799999997,70.597214000000122],[-116.91972399999997,70.597488000000055],[-117.05972300000002,70.601379000000122],[-117.10056299999997,70.603317000000061],[-117.34584000000001,70.614990000000091],[-117.34973100000002,70.619980000000112],[-117.35861199999994,70.623871000000008],[-117.37666300000001,70.62553400000013],[-117.50556899999998,70.61692800000003],[-117.51528899999994,70.613311999999951],[-117.51806599999986,70.606368999999972],[-117.51862299999993,70.600266000000033],[-117.52500900000001,70.594985999999949],[-117.54360999999994,70.595260999999994],[-117.5594329999999,70.597214000000122],[-117.61305199999998,70.608597000000145],[-117.67111199999999,70.624419999999986],[-117.70472699999999,70.634155000000021],[-117.724716,70.641373000000044],[-117.73777799999993,70.65026899999998],[-117.74194299999994,70.655258000000117],[-117.741669,70.661376999999959],[-117.73944099999994,70.666930999999977],[-117.73473399999995,70.673035000000027],[-117.72222899999986,70.68331900000004],[-117.71417199999996,70.688034000000073],[-117.70944199999985,70.693863000000079],[-117.71140300000002,70.699707000000103],[-117.71806300000003,70.703872999999987],[-117.73581699999994,70.711655000000121],[-117.74694799999997,70.714995999999985],[-117.89806399999998,70.756104000000107],[-117.94554099999999,70.768599999999992],[-118.00890400000003,70.783051],[-118.04750100000001,70.791656000000046],[-118.09277299999997,70.804703000000075],[-118.13583399999999,70.818054000000018],[-118.16750300000001,70.828598000000056],[-118.18776700000001,70.836104999999975],[-118.20584099999996,70.843872000000147],[-118.26445000000001,70.871918000000051],[-118.28028899999993,70.879974000000118],[-118.30972300000002,70.897217000000012],[-118.31639100000001,70.901657000000057],[-118.32972699999993,70.910537999999974],[-118.40862299999998,70.970260999999994],[-118.41750300000001,70.980270000000019],[-118.41972399999986,70.985809000000017],[-118.41944899999993,70.99192800000003],[-118.415009,70.99803200000008],[-118.40862299999998,71.003326000000072],[-118.40055799999999,71.007766999999944],[-118.37082700000002,71.019149999999968],[-118.33944699999995,71.029433999999981],[-118.27250699999991,71.048874000000012],[-117.98055999999997,71.124420000000043],[-117.84973099999996,71.156937000000028],[-117.79666099999992,71.166382000000112],[-117.728882,71.169708000000128],[-117.69055199999997,71.169434000000024],[-117.640289,71.171921000000111],[-117.54305999999991,71.178589000000102],[-117.49445300000002,71.18193100000002],[-117.41665599999988,71.188873000000115],[-117.38722199999995,71.192474000000004],[-117.28859699999992,71.206649999999968],[-116.98528299999998,71.236098999999967],[-116.83666999999997,71.269149999999911],[-116.83332799999994,71.276093000000117],[-116.82472200000001,71.280548000000124],[-116.80055199999993,71.286102000000085],[-116.71333300000003,71.297211000000004],[-116.66972399999992,71.302765000000022],[-116.60166900000002,71.313873000000001],[-116.51777600000003,71.326384999999959],[-116.40583800000002,71.343048000000067],[-116.20889299999993,71.364150999999993],[-116.17722300000003,71.366653000000042],[-116.14195299999989,71.367751999999996],[-116.08556399999992,71.367477000000008],[-116.077789,71.365814000000057],[-116.05249000000003,71.356093999999985],[-115.81027199999994,71.362761999999975],[-115.77667200000002,71.36442599999998],[-115.76083399999993,71.365814000000057],[-115.74638399999998,71.368317000000047],[-115.73416099999986,71.371368000000075],[-115.72693599999997,71.376373000000115],[-115.72666900000002,71.381362999999965],[-115.73306299999996,71.385818000000029],[-115.74416400000001,71.389160000000118],[-115.75805700000001,71.391937000000041],[-115.79055800000003,71.396378000000141],[-115.84166700000003,71.394440000000031],[-115.85582699999992,71.392212000000029],[-115.885559,71.389160000000118],[-115.91915899999998,71.387206999999989],[-115.93360899999999,71.38888500000013],[-116.01777599999997,71.411101999999971],[-116.06471299999998,71.438583000000051],[-115.82805599999995,71.483046999999999],[-115.76306199999999,71.490265000000022],[-115.62082700000002,71.498596000000077],[-115.60472099999993,71.496094000000028],[-115.58444199999991,71.488876000000005],[-115.58416699999998,71.485259999999982],[-115.53555299999994,71.470261000000107],[-115.41555800000003,71.449707000000103],[-115.37832599999996,71.449707000000103],[-115.20028699999995,71.479430999999977],[-115.17527799999988,71.484985000000108],[-115.06667299999998,71.518600000000049],[-115.05750299999994,71.523041000000148],[-115.06194299999999,71.526657],[-115.08168000000001,71.527205999999921],[-115.11361699999998,71.524704000000042],[-115.15638699999994,71.518875000000037],[-115.17054699999994,71.516662999999994],[-115.24553700000001,71.500000000000114],[-115.26000999999997,71.498031999999967],[-115.32224300000001,71.492477000000065],[-115.44275699999992,71.488037000000077],[-115.45973200000003,71.489151000000049],[-115.53859699999998,71.50082400000008],[-115.54998799999998,71.504440000000102],[-115.55860899999999,71.508330999999998],[-115.55583199999995,71.513611000000083],[-115.54332699999986,71.516662999999994],[-115.53083800000002,71.519440000000088],[-115.51666299999999,71.521378000000027],[-115.51222199999989,71.53776600000009],[-115.61888099999987,71.555252000000053],[-115.65499899999992,71.55802900000009],[-115.70638999999994,71.555817000000047],[-115.79194599999994,71.543593999999985],[-115.87638900000002,71.53276100000005],[-115.965012,71.522216999999955],[-116.16027799999989,71.49971000000005],[-116.20805399999995,71.495818999999983],[-116.28250100000002,71.495528999999976],[-116.33389299999999,71.493317000000104],[-116.41361999999998,71.486648999999943],[-116.44360399999999,71.483322000000044],[-116.806107,71.436096000000134],[-116.98610699999995,71.427200000000028],[-117.17666600000001,71.404709000000025],[-117.20111099999997,71.398331000000098],[-117.21528599999994,71.396378000000141],[-117.328056,71.386108000000036],[-117.35944399999994,71.383331000000112],[-117.37721299999987,71.382751000000098],[-117.39835399999998,71.383880999999974],[-117.41221599999994,71.386383000000023],[-117.41665599999988,71.391373000000101],[-117.41610700000001,71.397766000000047],[-117.41306299999997,71.404434000000037],[-117.39083900000003,71.435257000000036],[-117.38110399999994,71.447205000000054],[-117.37832600000002,71.454163000000051],[-117.44776899999988,71.47387700000013],[-117.49445300000002,71.486923000000047],[-117.51750199999998,71.493317000000104],[-117.54583700000001,71.498871000000122],[-117.56276699999995,71.49971000000005],[-117.628601,71.467758000000117],[-117.63333099999994,71.461929000000112],[-117.63166799999999,71.456375000000094],[-117.62470999999999,71.451935000000105],[-117.61305199999998,71.44859300000013],[-117.59665699999999,71.446365000000014],[-117.55583200000001,71.445251000000042],[-117.5369419999999,71.443862999999908],[-117.506393,71.439148000000102],[-117.48332199999999,71.432480000000112],[-117.47888199999989,71.427475000000072],[-117.48194899999999,71.420532000000037],[-117.51722699999999,71.379425000000026],[-117.52749599999993,71.375809000000004],[-117.53943600000002,71.372757000000092],[-117.59416199999987,71.371643000000063],[-117.68138099999993,71.379700000000071],[-117.75666799999999,71.376083000000108],[-117.79444899999999,71.368042000000059],[-117.82749899999999,71.372208000000114],[-117.94833399999999,71.377762000000132],[-118.01500699999997,71.37303200000008],[-118.03278399999994,71.372482000000048],[-118.09084299999995,71.372757000000092],[-118.112213,71.37359600000002],[-118.18536399999999,71.379791000000125],[-118.24388099999999,71.389984000000084],[-118.25556899999998,71.393326000000002],[-118.28362300000003,71.404709000000025],[-118.29750099999995,71.413605000000132],[-118.31111099999993,71.428589000000045],[-118.31527699999992,71.439697000000024],[-118.31471299999998,71.452209000000039],[-118.30943300000001,71.465820000000008],[-118.28999299999992,71.481659000000093],[-118.28195199999988,71.486098999999911],[-118.2633439999999,71.49414100000007],[-118.21250900000001,71.513046000000031],[-118.20221699999996,71.516662999999994],[-118.19027699999998,71.519714000000022],[-118.17804699999994,71.522766000000104],[-118.12609900000001,71.533051000000057],[-118.08612099999988,71.540267999999969],[-118.05444299999999,71.543045000000063],[-117.83583099999998,71.554703000000075],[-117.70722999999998,71.54942299999999],[-117.68720999999994,71.549988000000042],[-117.675003,71.552765000000136],[-117.658051,71.561646000000053],[-117.65139799999992,71.566940000000045],[-117.65583800000002,71.571930000000123],[-117.66999800000002,71.574706999999989],[-117.87304699999993,71.611649],[-117.88722199999995,71.614151000000106],[-117.90888999999999,71.614990000000034],[-117.86361699999998,71.639435000000105],[-117.718887,71.659714000000008],[-117.70694700000001,71.662491000000102],[-117.69638099999992,71.666091999999992],[-117.70084399999996,71.671371000000136],[-117.715012,71.673874000000126],[-117.73665599999993,71.674988000000099],[-118.01000999999997,71.672484999999938],[-118.02778599999994,71.67164600000001],[-118.11665299999993,71.65277100000003],[-118.12693799999988,71.648880000000133],[-118.17278299999998,71.628036000000009],[-118.17749000000003,71.621918000000051],[-118.16388699999993,71.606933999999967],[-118.16639699999996,71.599990999999989],[-118.17666600000001,71.596374999999966],[-118.19082600000002,71.594146999999964],[-118.29998799999993,71.583328000000108],[-118.31777999999991,71.582763999999997],[-118.33444199999997,71.584717000000126],[-118.36527999999998,71.589431999999931],[-118.38639799999999,71.613602000000128],[-118.38612399999994,71.619705000000067],[-118.45500199999987,71.650818000000072],[-118.485817,71.655548000000124],[-118.56639099999995,71.662766000000147],[-118.60527000000002,71.664154000000053],[-118.84166700000003,71.664702999999975],[-118.85555999999997,71.662491000000102],[-118.86389199999996,71.658035000000041],[-118.90387699999997,71.614700000000028],[-118.90387699999997,71.608322000000101],[-118.88971699999996,71.599716000000001],[-118.88027999999991,71.595825000000104],[-118.86609599999997,71.586928999999998],[-118.8683319999999,71.580276000000026],[-118.88054699999998,71.577209000000096],[-118.89778099999995,71.57777400000009],[-118.90972899999991,71.581099999999992],[-119.05027799999999,71.626648000000102],[-119.07472200000001,71.644149999999968],[-119.08416699999998,71.654160000000047],[-119.10582699999998,71.685806000000071],[-119.12470999999999,71.730545000000063],[-119.13445300000001,71.76527399999992],[-119.13445300000001,71.783874999999966],[-119.10555999999991,71.876648000000046],[-119.10305800000003,71.883330999999998],[-119.09194899999994,71.902205999999978],[-119.08750900000001,71.908324999999991],[-118.945831,71.99136400000009],[-118.929169,72.000548999999921],[-118.86694299999999,72.023879999999963],[-118.84249899999998,72.029709000000025],[-118.80166599999995,72.037200999999925],[-118.76471699999996,72.046370999999965],[-118.73361199999999,72.057480000000055],[-118.72501399999987,72.0619200000001],[-118.71665999999999,72.066665999999998],[-118.71028099999995,72.071930000000009],[-118.70556599999992,72.077774000000034],[-118.703056,72.084717000000012],[-118.70749699999999,72.095824999999991],[-118.715012,72.10026600000009],[-118.71972700000003,72.105255000000056],[-118.71945199999999,72.111374000000069],[-118.71749899999998,72.116928000000087],[-118.69193999999999,72.130539000000056],[-118.58860800000002,72.176086000000112],[-118.57640100000003,72.179152999999985],[-118.56194299999999,72.181366000000139],[-118.545547,72.182754999999986],[-118.44248999999996,72.181655999999975],[-118.40583799999996,72.183044000000052],[-118.38945000000001,72.184708000000114],[-118.15722699999992,72.217758000000117],[-118.12832599999996,72.222214000000065],[-118.11945299999996,72.226654000000053],[-118.11277799999993,72.231934000000138],[-118.108047,72.237762000000089],[-118.10527000000002,72.244705000000067],[-118.10417199999995,72.263321000000076],[-118.12138400000003,72.308029000000147],[-118.13082899999995,72.318054000000075],[-118.14527899999996,72.326934999999992],[-118.16471899999993,72.334427000000119],[-118.176941,72.337769000000037],[-118.19193999999999,72.340546000000131],[-118.20916699999998,72.34248400000007],[-118.25140399999998,72.344711000000132],[-118.27166699999992,72.344711000000132],[-118.28832999999992,72.343323000000055],[-118.32528699999995,72.341934000000037],[-118.36416600000001,72.341370000000097],[-118.40695199999993,72.34248400000007],[-118.446663,72.345260999999994],[-118.49109599999997,72.353043000000127],[-118.52306399999992,72.363876000000118],[-118.55499299999997,72.380814000000044],[-118.56973299999999,72.389709000000039],[-118.58194700000001,72.399155000000007],[-118.58860800000002,72.416655999999989],[-118.58805799999999,72.435256999999979],[-118.58528100000001,72.441924999999969],[-118.573059,72.460815000000082],[-118.56833599999993,72.46665999999999],[-118.55027799999999,72.483321999999987],[-118.53694199999995,72.493866000000025],[-118.51972999999992,72.50277699999998],[-118.20722999999998,72.618591000000094],[-118.12554899999998,72.642487000000017],[-118.08306900000002,72.649719000000118],[-117.90361000000001,72.689697000000137],[-117.89083899999991,72.692749000000049],[-117.86888099999993,72.699997000000053],[-117.63305700000001,72.784987999999998],[-117.60193600000002,72.796936000000073],[-117.51944700000001,72.828873000000044],[-117.48999000000003,72.841369999999984],[-117.48111,72.845825000000048],[-117.46472199999994,72.85554500000012],[-117.43611099999993,72.876373000000001],[-117.42054699999994,72.894440000000088],[-117.40222199999999,72.903320000000122],[-117.37999000000002,72.910538000000088],[-117.35360699999995,72.916382000000112],[-117.32333399999993,72.92082199999993],[-117.30638099999993,72.921921000000111],[-117.24916099999996,72.923874000000069],[-117.12721299999998,72.932479999999998],[-116.95639,72.954163000000108],[-116.94138299999997,72.95637499999998],[-116.89972699999998,72.964157000000114],[-116.862503,72.972214000000065],[-116.83805799999999,72.978592000000049],[-116.775284,72.9952550000001],[-116.70722999999998,73.017211999999972],[-116.65972899999991,73.031097000000045],[-116.58750900000001,73.051376000000005],[-116.57417299999997,73.054153000000099],[-116.54167199999995,73.057480000000055],[-116.52416999999991,73.058868000000132],[-116.31916799999993,73.09165999999999],[-116.24221799999998,73.110260000000096],[-116.20195000000001,73.118590999999981],[-116.15556300000003,73.124695000000031],[-115.90055799999993,73.154160000000104],[-115.60973399999995,73.194138000000123],[-115.44082600000002,73.22387700000013],[-115.34638999999999,73.253326000000129],[-115.32305899999994,73.260269000000108],[-115.30915799999997,73.263046000000031],[-115.14917000000003,73.288315000000011],[-115.10221899999999,73.294144000000017],[-115.01418299999989,73.299988000000042],[-114.95111099999997,73.307754999999986],[-114.89417299999997,73.318054000000018],[-114.86638599999998,73.323608000000036],[-114.83056599999998,73.334152000000074],[-114.81054699999999,73.342758000000003],[-114.70722999999992,73.368042000000003],[-114.67555199999998,73.371918000000051],[-114.65778399999999,73.373032000000023],[-114.56166100000002,73.37553400000013],[-114.54083300000002,73.373595999999964],[-114.50527999999991,73.368866000000139],[-114.337784,73.343323000000055],[-114.30499299999991,73.338042999999971],[-114.27500899999995,73.332214000000135],[-114.22609699999987,73.318329000000062],[-114.19776899999999,73.306366000000025],[-114.16306299999997,73.289703000000145],[-114.11054999999999,73.263885000000016],[-114.05610699999994,73.233597000000032],[-114.01666299999994,73.206375000000094],[-113.96167000000003,73.153046000000131],[-113.95694700000001,73.142487000000074],[-113.95388799999989,73.125533999999959],[-113.95749699999999,73.113312000000008],[-113.99582700000002,73.077773999999977],[-114.00499699999995,73.064423000000033],[-114.03555299999999,73.004990000000021],[-114.04750100000001,72.954987000000074],[-114.05499299999997,72.883605999999986],[-114.05277999999998,72.872208000000001],[-114.04915599999998,72.867203000000131],[-114.0427699999999,72.862762000000032],[-114.02722199999999,72.854156000000103],[-113.98166700000002,72.834152000000017],[-113.96888699999994,72.82499700000011],[-113.96777299999997,72.819442999999978],[-113.96945199999999,72.813034000000073],[-113.97582999999992,72.807205000000067],[-113.985817,72.803040000000067],[-113.99749799999995,72.799423000000104]],[[-95.669723999999917,73.604980000000126],[-95.688598999999897,73.603317000000004],[-95.702498999999989,73.60554500000012],[-95.711670000000026,73.612198000000092],[-95.703887999999949,73.617477000000065],[-95.684157999999968,73.6202550000001],[-95.669997999999964,73.620529000000033],[-95.655563000000029,73.616652999999928],[-95.654998999999975,73.609984999999995],[-95.669723999999917,73.604980000000126]],[[-107.89555399999989,73.541367000000093],[-107.93055699999996,73.539428999999984],[-107.9519499999999,73.540268000000083],[-107.97193900000002,73.542755],[-108.00917099999992,73.548035000000084],[-108.02306399999998,73.551376000000118],[-108.07472200000001,73.576385000000073],[-108.08277899999996,73.580826000000002],[-108.08500700000002,73.585815000000139],[-108.08332799999999,73.597214000000065],[-108.07640099999992,73.603591999999992],[-108.066101,73.608597000000032],[-108.05444299999988,73.612487999999928],[-108.04083299999996,73.615540000000067],[-108.00750700000003,73.618591000000094],[-107.89943699999992,73.622756999999979],[-107.86277799999993,73.624145999999996],[-107.82444800000002,73.6244200000001],[-107.80444299999999,73.624145999999996],[-107.68110699999994,73.621367999999961],[-107.61472299999991,73.614700000000028],[-107.60056299999997,73.611374000000126],[-107.58944699999995,73.607758000000103],[-107.58473200000003,73.603043000000071],[-107.58249699999999,73.597762999999986],[-107.58473200000003,73.586655000000007],[-107.59194899999994,73.579987000000017],[-107.60221899999988,73.575271999999984],[-107.64527900000002,73.570267000000115],[-107.65722700000003,73.568603999999993],[-107.7491609999999,73.55581699999999],[-107.89555399999989,73.541367000000093]],[[-124.307503,73.556366000000139],[-124.33167999999995,73.556366000000139],[-124.343613,73.559981999999991],[-124.35193600000002,73.5711060000001],[-124.35861199999988,73.630264000000068],[-124.34612300000003,73.633606000000043],[-124.33138999999994,73.636383000000137],[-124.307503,73.632202000000063],[-124.30332900000002,73.626648000000046],[-124.29387700000001,73.622481999999934],[-124.28222700000003,73.618866000000082],[-124.26806599999992,73.616088999999988],[-124.21028100000001,73.611374000000126],[-124.19360399999994,73.60914600000001],[-124.17944299999994,73.606369000000086],[-124.16777000000002,73.603043000000071],[-124.14916999999997,73.594711000000075],[-124.12666300000001,73.580826000000002],[-124.11972000000003,73.575821000000133],[-124.11554699999988,73.570541000000048],[-124.11389199999996,73.564148000000102],[-124.12638899999996,73.560805999999957],[-124.307503,73.556366000000139]],[[-124.58473199999992,73.679153000000042],[-124.59944199999995,73.676376000000005],[-124.62361099999998,73.676650999999993],[-124.640556,73.678863999999976],[-124.70056199999993,73.689422999999977],[-124.72917199999995,73.694976999999994],[-124.73361199999999,73.700545999999974],[-124.72582999999992,73.705261000000007],[-124.71584299999995,73.709152000000074],[-124.70111099999997,73.711928999999998],[-124.68167099999999,73.713042999999971],[-124.66471899999999,73.710815000000025],[-124.66278099999994,73.706099999999992],[-124.64835399999998,73.704712000000086],[-124.61694299999999,73.699707000000046],[-124.57140399999992,73.691925000000083],[-124.564438,73.687195000000031],[-124.57224299999996,73.682479999999998],[-124.58473199999992,73.679153000000042]],[[-105.08944700000001,73.735260000000039],[-104.96028099999995,73.688582999999937],[-104.84306300000003,73.650818000000072],[-104.71140300000002,73.63081399999993],[-104.69167299999992,73.628310999999997],[-104.675003,73.624985000000095],[-104.58084100000002,73.600266000000147],[-104.53056300000003,73.581374999999923],[-104.51306199999999,73.573044000000039],[-104.49445300000002,73.559418000000051],[-104.49027999999998,73.554703000000018],[-104.48528299999998,73.544708000000128],[-104.48306299999996,73.534424000000115],[-104.512787,73.493042000000059],[-104.55583200000001,73.403320000000008],[-104.56639100000001,73.334717000000126],[-104.56833599999999,73.329163000000108],[-104.57333399999999,73.323044000000095],[-104.58138999999994,73.316666000000112],[-104.60193599999997,73.306366000000025],[-104.64916999999997,73.280823000000112],[-104.69499200000001,73.25221300000004],[-104.76000999999991,73.203873000000044],[-104.76500699999985,73.197754000000032],[-104.76390099999998,73.192474000000118],[-104.79415899999998,73.168045000000006],[-104.86805700000002,73.136658000000068],[-104.97556299999997,73.085266000000104],[-104.98332199999999,73.078872999999987],[-104.98805199999993,73.073043999999982],[-104.98388699999992,73.068054000000075],[-104.97749299999998,73.05304000000001],[-104.97361799999999,73.031662000000097],[-104.97860699999995,73.025543000000084],[-104.984734,73.020538000000045],[-104.99527,73.015823000000012],[-105.031677,73.004166000000055],[-105.0750119999999,72.997208000000057],[-105.08833300000003,72.994141000000127],[-105.13639799999993,72.978867000000037],[-105.14695699999999,72.974152000000004],[-105.22582999999997,72.933044000000109],[-105.30304699999994,72.951096000000007],[-105.31916799999999,72.954163000000108],[-105.33972199999999,72.955551000000014],[-105.354446,72.953323000000069],[-105.35610999999994,72.947754000000032],[-105.33139,72.910538000000088],[-105.32417299999997,72.906096999999988],[-105.279449,72.885543999999925],[-105.25361599999997,72.878585999999984],[-105.237503,72.875534000000016],[-105.21140300000002,72.868591000000038],[-105.20417799999996,72.864151000000049],[-105.26222199999989,72.848602000000085],[-105.27555799999993,72.845534999999984],[-105.28999299999987,72.847762999999986],[-105.38305699999995,72.866653000000099],[-105.43611099999993,72.896652000000131],[-105.44332900000001,72.90109300000006],[-105.45612299999999,72.915267999999969],[-105.458618,72.925536999999963],[-105.45694699999996,72.931366000000025],[-105.45834400000001,72.936371000000065],[-105.46250900000001,72.941360000000032],[-105.57472199999995,72.984421000000054],[-105.73277299999995,73.047759999999982],[-105.91388699999999,73.145538000000101],[-105.94638099999992,73.160263000000043],[-106.09249899999992,73.199706999999933],[-106.08194700000001,73.241088999999988],[-106.32195300000001,73.338882000000126],[-106.44776899999994,73.393051000000128],[-106.45556599999998,73.397491000000002],[-106.46611000000001,73.401382000000069],[-106.72028399999999,73.44999700000011],[-106.88137799999998,73.463318000000072],[-106.89806399999992,73.461929000000055],[-106.91610699999995,73.461380000000077],[-106.9375,73.462494000000106],[-107,73.469711000000018],[-107.016953,73.4727630000001],[-107.02749599999999,73.476379000000009],[-107.03555299999994,73.480820000000108],[-107.03415699999999,73.486374000000069],[-107.02583300000003,73.498596000000077],[-107.01834100000002,73.504990000000078],[-107.00974299999996,73.510544000000095],[-106.97112299999992,73.531661999999983],[-106.92944299999999,73.550537000000134],[-106.89334100000002,73.562484999999981],[-106.74526999999995,73.648041000000148],[-106.70028699999995,73.676085999999941],[-106.65805099999994,73.695251000000098],[-106.64584399999995,73.699141999999995],[-106.61833200000001,73.705261000000007],[-106.57224300000001,73.711928999999998],[-106.32721700000002,73.72665400000011],[-106.18554699999999,73.733597000000145],[-106.03916900000002,73.731368999999972],[-105.80055199999998,73.726928999999984],[-105.72666900000002,73.728592000000049],[-105.68028300000003,73.734985000000052],[-105.66639699999996,73.737761999999918],[-105.637787,73.74443100000002],[-105.61277799999993,73.752212999999983],[-105.58473200000003,73.758041000000048],[-105.569458,73.760269000000051],[-105.53527799999995,73.762771999999984],[-105.51666299999994,73.763321000000133],[-105.30387899999994,73.762206999999989],[-105.28388999999999,73.761658000000011],[-105.16999800000002,73.755554000000018],[-105.14862099999999,73.754166000000055],[-105.10749799999991,73.743590999999981],[-105.08944700000001,73.735260000000039]],[[-80.142226999999878,73.696640000000116],[-80.108611999999994,73.693863000000022],[-80.074448000000018,73.697479000000044],[-79.901397999999972,73.698318000000029],[-79.625548999999978,73.670821999999987],[-79.586120999999991,73.66276600000009],[-79.523055999999997,73.646652000000131],[-79.493056999999965,73.637772000000098],[-79.476394999999911,73.634154999999964],[-79.451949999999954,73.630539000000113],[-79.373610999999983,73.63081399999993],[-78.96166999999997,73.632750999999985],[-78.946105999999986,73.634720000000016],[-78.934433000000013,73.638596000000064],[-78.931106999999997,73.642487000000131],[-78.928878999999938,73.647491000000116],[-78.924164000000019,73.650269000000094],[-78.912505999999894,73.653869999999984],[-78.887787000000003,73.656647000000078],[-78.861389000000031,73.658324999999991],[-78.64416499999993,73.656647000000078],[-78.40834000000001,73.661652000000117],[-78.206664999999987,73.667755000000056],[-78.166397000000018,73.668045000000063],[-78.12777699999998,73.664703000000145],[-78.113327000000027,73.663040000000024],[-78.064437999999996,73.651932000000045],[-78.009734999999978,73.63749700000011],[-77.965285999999935,73.628310999999997],[-77.823058999999944,73.603867000000037],[-77.738601999999958,73.591933999999981],[-77.608046999999999,73.574158000000011],[-77.535004000000015,73.565536000000009],[-77.453887999999949,73.559708000000057],[-77.424437999999952,73.554703000000018],[-77.395554000000004,73.545822000000101],[-77.373046999999929,73.529709000000082],[-77.363327000000027,73.524703999999986],[-77.351394999999968,73.519988999999953],[-77.338333000000034,73.516663000000108],[-77.294723999999974,73.512772000000041],[-77.237212999999997,73.509994999999947],[-77.203063999999927,73.505554000000018],[-77.191939999999988,73.501389000000017],[-77.148620999999991,73.476379000000009],[-77.153610000000015,73.468048000000067],[-77.157226999999978,73.458603000000039],[-77.055266999999958,73.366379000000052],[-77.048888999999917,73.36192299999999],[-76.999435000000005,73.345825000000104],[-76.969726999999978,73.337203999999986],[-76.91361999999998,73.324432000000002],[-76.893340999999964,73.321105999999986],[-76.884170999999924,73.321655000000078],[-76.878875999999934,73.324158000000068],[-76.858611999999994,73.32638500000013],[-76.837219000000005,73.327209000000096],[-76.736389000000031,73.324706999999989],[-76.72193900000002,73.322495000000117],[-76.708054000000004,73.317764000000011],[-76.579726999999991,73.219711000000075],[-76.577498999999932,73.205551000000128],[-76.585006999999962,73.194427000000076],[-76.601944000000003,73.183319000000097],[-76.619720000000029,73.175812000000121],[-76.605270000000019,73.15914900000007],[-76.586945000000014,73.146378000000141],[-76.582229999999981,73.14387499999998],[-76.510559000000001,73.120254999999986],[-76.495543999999938,73.116928000000087],[-76.487502999999947,73.116089000000102],[-76.381942999999978,73.106093999999985],[-76.31361400000003,73.100540000000024],[-76.312499999999943,73.067490000000134],[-76.318068999999923,73.062759000000028],[-76.319457999999941,73.058318999999983],[-76.333068999999909,72.963607999999965],[-76.323059000000001,72.957214000000135],[-76.309433000000013,72.952484000000084],[-76.291671999999949,72.948868000000061],[-76.275283999999999,72.946640000000059],[-76.211945000000014,72.945526000000086],[-76.162216000000001,72.946365000000071],[-76.118606999999997,72.940262000000132],[-76.103607000000011,72.936371000000065],[-76.077224999999942,72.924988000000042],[-76.071670999999924,72.921097000000145],[-76.062209999999993,72.906937000000028],[-76.059432999999899,72.900818000000015],[-76.086394999999982,72.863602000000071],[-76.093886999999938,72.85803199999998],[-76.103881999999942,72.853043000000014],[-76.115279999999927,72.849426000000051],[-76.13110399999988,72.845534999999984],[-76.149993999999992,72.842209000000139],[-76.25140399999998,72.826385000000016],[-76.315552000000025,72.817214999999976],[-76.339721999999995,72.814987000000031],[-76.5625,72.812484999999981],[-76.581679999999949,72.812484999999981],[-76.601944000000003,72.813873000000058],[-76.618606999999884,72.816939999999988],[-76.634170999999981,72.820541000000048],[-76.662780999999995,72.829163000000051],[-76.681380999999931,72.831375000000094],[-76.72193900000002,72.833878000000084],[-76.740829000000019,72.833878000000084],[-76.767501999999922,72.833878000000084],[-76.891952999999944,72.830825999999945],[-76.937209999999993,72.830825999999945],[-77.084754999999973,72.839684000000148],[-77.101668999999958,72.84027100000003],[-77.143889999999942,72.841933999999981],[-77.226943999999946,72.846100000000035],[-77.265838999999914,72.849426000000051],[-77.314437999999939,72.85554500000012],[-77.365829000000019,72.864426000000037],[-77.40055799999999,72.870818999999983],[-77.416106999999954,72.874695000000088],[-77.447219999999959,72.879974000000061],[-77.522780999999952,72.886108000000092],[-77.704178000000013,72.897216999999955],[-77.723327999999981,72.896941999999967],[-77.860000999999954,72.893051000000071],[-77.904175000000009,72.891662999999994],[-77.997771999999941,72.888321000000019],[-78.107223999999917,72.88638300000008],[-78.236358999999993,72.893005000000016],[-78.273055999999997,72.890549000000021],[-78.297226000000023,72.887772000000098],[-78.486114999999984,72.86554000000001],[-78.62388599999997,72.848037999999974],[-78.865828999999962,72.804427999999973],[-79.047775000000001,72.771378000000141],[-79.161941999999897,72.750548999999978],[-79.209166999999923,72.744979999999998],[-79.296111999999994,72.737761999999975],[-79.359160999999972,72.733597000000145],[-79.382492000000013,72.733047000000113],[-79.400283999999999,72.733597000000145],[-79.429168999999945,72.735809000000017],[-79.543334999999956,72.74859600000002],[-79.62388599999997,72.763321000000133],[-79.927779999999927,72.842484000000013],[-79.972778000000005,72.854705999999965],[-79.998610999999983,72.86303700000002],[-80.009170999999924,72.872756999999922],[-80.120833999999945,72.978867000000037],[-80.151672000000019,73.011932000000115],[-80.181380999999931,73.043869000000086],[-80.181106999999997,73.050262000000032],[-80.164169000000015,73.061920000000043],[-80.147232000000031,73.071381000000031],[-80.134734999999921,73.084716999999955],[-80.131667999999991,73.08859300000006],[-80.128875999999991,73.09526100000005],[-80.122771999999998,73.11442599999998],[-80.110000999999954,73.179703000000018],[-80.114440999999999,73.186371000000008],[-80.134445000000028,73.209152000000017],[-80.143065999999919,73.216933999999981],[-80.15194699999995,73.222487999999942],[-80.216948999999943,73.243317000000104],[-80.238051999999982,73.24414100000007],[-80.415282999999931,73.24414100000007],[-80.61999499999996,73.264160000000004],[-80.760009999999909,73.274704000000042],[-80.797500999999954,73.276932000000045],[-80.876098999999954,73.32777399999992],[-80.876098999999954,73.338593000000003],[-80.872498000000007,73.424988000000099],[-80.820281999999963,73.489150999999993],[-80.80999799999995,73.644440000000088],[-80.857772999999952,73.74192800000003],[-80.771666999999923,73.749709999999993],[-80.683318999999983,73.755829000000006],[-80.560546999999872,73.76776099999995],[-80.434998000000007,73.766098000000056],[-80.37332200000003,73.761658000000011],[-80.353058000000033,73.759720000000073],[-80.320847000000015,73.753876000000048],[-80.30860899999999,73.75],[-80.29861499999987,73.745819000000097],[-80.265288999999996,73.730270000000019],[-80.223327999999924,73.715820000000065],[-80.192763999999954,73.707214000000135],[-80.15834000000001,73.699417000000039],[-80.142226999999878,73.696640000000116]],[[-73.354674999999929,68.329215999999974],[-73.328170999999998,68.328208999999958],[-73.31617,68.328712000000053],[-73.306830999999988,68.330544000000089],[-73.211670000000026,68.376923000000033],[-73.230559999999912,68.384155000000135],[-73.253066999999987,68.390823000000125],[-73.279448999999886,68.39498900000001],[-73.302779999999927,68.396102999999982],[-73.31806899999998,68.393051000000071],[-73.357498000000021,68.371368000000132],[-73.359725999999966,68.364989999999977],[-73.357773000000009,68.357483000000059],[-73.353057999999976,68.352478000000019],[-73.349166999999909,68.344986000000063],[-73.34722899999997,68.337494000000106],[-73.34944200000001,68.331100000000106],[-73.354674999999929,68.329215999999974],[-73.506667999999991,68.291367000000037],[-73.589721999999995,68.254715000000033],[-73.597777999999948,68.251937999999996],[-73.620834000000002,68.246093999999971],[-73.632216999999912,68.246643000000063],[-73.639724999999942,68.249709999999993],[-73.851668999999958,68.342209000000139],[-73.855834999999956,68.346649000000014],[-73.896117999999944,68.392211999999915],[-73.889449999999954,68.44470200000012],[-73.877486999999917,68.481093999999928],[-73.873610999999926,68.487762000000089],[-73.86721799999998,68.493042000000003],[-73.856110000000001,68.497481999999991],[-73.823623999999995,68.503326000000015],[-73.806655999999975,68.503876000000048],[-73.749999999999943,68.510817999999972],[-73.738891999999964,68.514999000000046],[-73.730285999999978,68.519989000000066],[-73.725829999999974,68.525818000000072],[-73.704726999999934,68.656647000000021],[-73.75389100000001,68.683594000000085],[-73.761397999999986,68.686371000000008],[-73.774719000000005,68.689697000000024],[-73.865828999999906,68.705826000000002],[-73.893889999999999,68.707764000000111],[-74.094161999999983,68.719986000000063],[-74.106109999999944,68.690536000000009],[-73.99221799999998,68.624695000000031],[-73.888061999999877,68.561645999999939],[-73.881667999999991,68.55664100000007],[-73.881667999999991,68.549713000000111],[-73.903609999999958,68.52777100000003],[-73.921386999999925,68.511932000000115],[-73.941939999999988,68.504715000000033],[-73.990279999999927,68.492751999999996],[-74.028335999999911,68.513610999999969],[-74.171660999999972,68.521652000000017],[-74.221114999999998,68.52526899999998],[-74.351395000000025,68.536926000000108],[-74.366104000000007,68.539154000000053],[-74.379439999999931,68.542205999999965],[-74.391112999999962,68.546371000000136],[-74.514175000000023,68.599991000000045],[-74.526397999999972,68.610809000000017],[-74.532776000000013,68.62164300000012],[-74.531676999999945,68.626373000000115],[-74.598891999999921,68.681930999999963],[-74.701950000000011,68.71887200000009],[-74.712218999999948,68.723038000000031],[-74.726105000000018,68.730270000000132],[-74.728333000000021,68.737198000000092],[-74.724715999999944,68.766097999999943],[-74.71945199999999,68.770537999999988],[-74.664168999999958,68.774155000000121],[-74.620833999999888,68.782486000000006],[-74.591949,68.788879000000009],[-74.576949999999954,68.793045000000063],[-74.565276999999924,68.802199999999914],[-74.546386999999982,68.822494999999947],[-74.548049999999989,68.828598000000113],[-74.551392000000021,68.830551000000014],[-74.604172000000005,68.841660000000104],[-74.634170999999924,68.846374999999966],[-74.648055999999997,68.847214000000122],[-74.666655999999932,68.845825000000104],[-74.678328999999962,68.842758000000003],[-74.687377999999967,68.835991000000035],[-74.718718999999965,68.824821000000043],[-74.723052999999936,68.822318999999993],[-74.721221999999955,68.821152000000041],[-74.71421799999996,68.82098400000001],[-74.705222999999933,68.821655000000078],[-74.689437999999939,68.819716999999969],[-74.671660999999972,68.818877999999984],[-74.660277999999892,68.81581100000011],[-74.639724999999999,68.807479999999998],[-74.633330999999941,68.79693600000013],[-74.635009999999966,68.793320000000108],[-74.648055999999997,68.789429000000041],[-74.665832999999964,68.786652000000117],[-74.771666999999979,68.774155000000121],[-74.917769999999962,68.801375999999948],[-74.913894999999968,68.81721500000009],[-74.837508999999955,68.840820000000065],[-74.787780999999995,68.854431000000034],[-74.764167999999984,68.872040000000027],[-74.74017299999997,68.872710999999981],[-74.72222899999997,68.934143000000006],[-74.862945999999909,68.954178000000013],[-74.872779999999977,68.955001999999979],[-74.887610999999993,68.954178000000013],[-74.898108999999977,68.952515000000062],[-74.920113000000015,68.946671000000038],[-74.935944000000006,68.942001000000005],[-75,68.937607000000071],[-75.005004999999926,68.929977000000065],[-75.033614999999884,68.926085999999998],[-75.042770000000019,68.928314],[-75.041945999999882,68.930267000000129],[-75.021118000000001,68.953049000000021],[-74.962340999999981,68.972824000000003],[-74.953002999999967,68.978484999999978],[-74.915337000000022,68.992821000000049],[-74.907668999999885,68.993988000000002],[-74.764724999999999,69.019440000000031],[-74.748336999999992,69.021378000000141],[-74.735000999999954,69.021927000000119],[-74.729445999999996,69.019440000000031],[-74.758057000000008,69.008880999999974],[-74.752228000000002,69.002486999999974],[-74.675003000000004,69.006943000000035],[-74.65834000000001,69.008330999999941],[-74.642776000000026,69.011658000000068],[-74.638061999999991,69.016098000000113],[-74.641113000000018,69.021378000000141],[-74.652495999999928,69.040267999999912],[-74.785827999999981,69.076385000000073],[-74.820846999999958,69.082214000000079],[-74.834166999999923,69.081664999999987],[-74.845839999999953,69.078598000000056],[-74.948607999999922,69.048874000000012],[-75.043334999999956,69.013321000000019],[-75.051940999999886,69.008605999999986],[-75.036117999999931,68.992203000000075],[-75.037780999999882,68.985809000000074],[-75.071395999999936,68.921097000000032],[-75.075561999999934,68.915817000000004],[-75.109160999999858,68.894989000000123],[-75.116394000000014,68.890823000000012],[-75.124161000000015,68.888046000000088],[-75.139724999999999,68.884720000000073],[-75.169998000000021,68.886383000000023],[-75.192490000000021,68.891663000000051],[-75.201950000000011,68.894440000000145],[-75.315826000000015,68.942200000000128],[-75.373885999999914,68.968872000000033],[-75.383330999999998,68.974426000000051],[-75.400283999999999,68.985535000000141],[-75.422500999999954,69.001937999999996],[-75.445830999999941,69.016937000000041],[-75.454452999999944,69.021102999999982],[-75.466399999999965,69.021378000000141],[-75.478881999999999,69.019714000000135],[-75.494155999999975,69.01638800000012],[-75.528335999999967,69.005829000000062],[-75.565552000000025,68.993591000000038],[-75.573623999999995,68.988585999999941],[-75.578612999999962,68.984146000000123],[-75.580841000000021,68.975540000000024],[-75.574172999999917,68.968323000000112],[-75.537780999999939,68.951096000000064],[-75.506957999999941,68.939696999999967],[-75.499724999999955,68.934708000000001],[-75.494995000000017,68.930267000000129],[-75.534163999999976,68.90387000000004],[-75.542770000000019,68.898879999999963],[-75.56527699999998,68.891373000000044],[-75.603881999999942,68.879700000000014],[-75.647780999999952,68.869140999999956],[-75.809158000000025,68.836928999999998],[-75.976104999999961,68.791092000000106],[-75.979445999999996,68.787201000000039],[-75.985001000000011,68.783875000000023],[-75.995543999999938,68.779434000000094],[-76.008620999999948,68.775543000000027],[-76.049437999999952,68.764435000000049],[-76.227218999999991,68.721100000000035],[-76.327224999999999,68.697478999999987],[-76.376098999999954,68.687484999999981],[-76.420546999999999,68.679152999999985],[-76.436385999999857,68.677200000000028],[-76.456664999999987,68.675262000000089],[-76.540282999999988,68.673308999999961],[-76.559432999999956,68.673035000000027],[-76.575561999999991,68.674149000000057],[-76.59056099999998,68.676376000000062],[-76.628875999999991,68.68691999999993],[-76.660827999999981,68.699416999999926],[-76.674164000000019,68.71026599999999],[-76.680283000000031,68.716094999999996],[-76.688599000000011,68.733597000000032],[-76.689437999999996,68.740540000000067],[-76.688048999999978,68.746933000000013],[-76.678604000000007,68.758330999999998],[-76.666945999999996,68.769150000000081],[-76.636947999999961,68.78166200000004],[-76.608611999999937,68.794144000000074],[-76.577498999999932,68.808318999999983],[-76.561385999999914,68.818054000000018],[-76.546111999999994,68.833054000000004],[-76.537216000000001,68.842209000000082],[-76.523055999999997,68.863876000000118],[-76.521666999999979,68.870254999999986],[-76.523894999999925,68.876373000000058],[-76.532775999999956,68.880538999999999],[-76.544158999999979,68.883041000000048],[-76.559432999999956,68.88499500000006],[-76.576674999999966,68.88499500000006],[-76.59333799999996,68.883331000000055],[-76.606658999999922,68.883041000000048],[-76.610000999999954,68.884720000000073],[-76.644164999999987,68.911102000000142],[-76.655562999999972,68.924698000000092],[-76.655562999999972,68.930542000000116],[-76.642775999999969,69.003876000000105],[-76.640563999999927,69.009155000000078],[-76.625548999999978,69.018326000000059],[-76.603607000000011,69.025818000000015],[-76.578338999999914,69.032211000000132],[-76.543335000000013,69.038315000000011],[-76.501403999999923,69.042755],[-76.422500999999954,69.050537000000134],[-76.368606999999997,69.055251999999996],[-76.348891999999921,69.054976999999951],[-76.33277899999996,69.05442800000003],[-76.240279999999927,69.048325000000091],[-76.208054000000004,69.044144000000017],[-76.140563999999927,69.034714000000122],[-76.124435000000005,69.031096999999988],[-76.114165999999955,69.027771000000143],[-76.091674999999952,69.011658000000068],[-76.080001999999922,69.006378000000041],[-76.068619000000012,69.003876000000105],[-75.996932999999956,69.003036000000066],[-75.969161999999983,69.010269000000108],[-75.904998999999918,69.036925999999994],[-75.813889000000017,69.067763999999954],[-75.655838000000017,69.080550999999957],[-75.637786999999946,69.079987000000017],[-75.619155999999919,69.081374999999923],[-75.6058349999999,69.08526599999999],[-75.598891999999978,69.089432000000102],[-75.593886999999938,69.099716000000114],[-75.569732999999928,69.15277100000003],[-75.569457999999997,69.158324999999991],[-75.571121000000005,69.163879000000009],[-75.591674999999952,69.22164900000007],[-75.603057999999976,69.238876000000118],[-75.619719999999973,69.249419999999986],[-75.669723999999917,69.271103000000096],[-75.759734999999978,69.304977000000122],[-75.783324999999991,69.313599000000124],[-75.956389999999885,69.366088999999931],[-75.970275999999956,69.36914100000007],[-76.168610000000001,69.411377000000073],[-76.202498999999932,69.413879000000122],[-76.241942999999935,69.413315000000011],[-76.298049999999989,69.407760999999994],[-76.417770000000019,69.44720500000011],[-76.607497999999964,69.529709000000139],[-76.637787000000003,69.546645999999953],[-76.641112999999962,69.554153000000099],[-76.641678000000013,69.557480000000055],[-76.626662999999951,69.581375000000037],[-76.61999499999996,69.586380000000077],[-76.611663999999962,69.591095000000109],[-76.489165999999898,69.648331000000042],[-76.477782999999988,69.652206000000035],[-76.459166999999979,69.654434000000037],[-76.442215000000033,69.653046000000074],[-76.347777999999948,69.64027400000009],[-76.261397999999986,69.626647999999932],[-76.226943999999946,69.637206999999989],[-76.186110999999983,69.659714000000065],[-76.182495000000017,69.663605000000132],[-76.187774999999988,69.665268000000083],[-76.226105000000018,69.664703000000031],[-76.295546999999942,69.660263000000043],[-76.376388999999961,69.671371000000022],[-76.388335999999924,69.673874000000012],[-76.397506999999962,69.678040000000067],[-76.399733999999853,69.684143000000006],[-76.450561999999934,69.690262000000075],[-76.537780999999939,69.696091000000081],[-76.551666000000012,69.695526000000029],[-76.634170999999981,69.683594000000085],[-76.641953000000001,69.679977000000122],[-76.638900999999976,69.673309000000131],[-76.631942999999922,69.669708000000071],[-76.616394000000014,69.667480000000126],[-76.581679999999949,69.666930999999977],[-76.557769999999948,69.673309000000131],[-76.542769999999905,69.674698000000149],[-76.530838000000017,69.672211000000061],[-76.517776000000026,69.662765999999976],[-76.522780999999952,69.65248100000008],[-76.535004000000015,69.638596000000007],[-76.553329000000019,69.625259000000142],[-76.561661000000015,69.620254999999986],[-76.683883999999978,69.56581100000011],[-76.691939999999988,69.563034000000016],[-76.707503999999972,69.559417999999994],[-76.730285999999978,69.560256999999922],[-76.844726999999921,69.576096000000064],[-77.136947999999961,69.626373000000115],[-77.18582200000003,69.637496999999996],[-77.191665999999941,69.639709000000039],[-77.200561999999991,69.646103000000096],[-77.200561999999991,69.64888000000002],[-77.194442999999922,69.657211000000075],[-77.164444000000003,69.676086000000055],[-77.155562999999972,69.680541999999946],[-77.144454999999994,69.682205000000067],[-76.949431999999945,69.695526000000029],[-76.939437999999939,69.679703000000018],[-76.929992999999968,69.677765000000079],[-76.896666999999979,69.679152999999985],[-76.868056999999965,69.684708000000057],[-76.829726999999934,69.695816000000036],[-76.820281999999963,69.699417000000096],[-76.80471799999998,69.708603000000039],[-76.793883999999991,69.718597000000045],[-76.791945999999996,69.721649000000014],[-76.781386999999995,69.743042000000116],[-76.781386999999995,69.748596000000077],[-76.835280999999952,69.815811000000053],[-76.851944000000003,69.813599000000011],[-76.933059999999898,69.809708000000114],[-77.026672000000019,69.811919999999986],[-77.150283999999999,69.816086000000098],[-77.293059999999855,69.828873000000101],[-77.308884000000035,69.830826000000002],[-77.310546999999985,69.835814999999968],[-77.307770000000005,69.840271000000087],[-77.297774999999888,69.851089000000059],[-77.28472899999997,69.860535000000027],[-77.25418099999996,69.87692300000009],[-77.243056999999965,69.881362999999908],[-77.208344000000011,69.886658000000011],[-77.116652999999928,69.901382000000012],[-76.992767000000015,69.927199999999971],[-76.981673999999941,69.931656000000089],[-76.974715999999944,69.935806000000071],[-76.980559999999969,69.938034000000016],[-76.992767000000015,69.940536000000122],[-77.002791999999943,69.940536000000122],[-77.125274999999931,69.925812000000064],[-77.141112999999962,69.922485000000108],[-77.164444000000003,69.915268000000026],[-77.188323999999909,69.906097000000045],[-77.226943999999946,69.894989000000066],[-77.260284000000013,69.887496999999939],[-77.438048999999921,69.857208000000071],[-77.508347000000015,69.826660000000118],[-77.455565999999976,69.798325000000091],[-77.444442999999978,69.789428999999984],[-77.449158000000011,69.784714000000122],[-77.551391999999964,69.747756999999922],[-77.559158000000025,69.744980000000055],[-77.574722000000008,69.741363999999976],[-77.597777999999948,69.739151000000049],[-77.608611999999937,69.740265000000022],[-77.615829000000019,69.741653000000099],[-77.626388999999904,69.744980000000055],[-77.637787000000003,69.753875999999991],[-77.645279000000016,69.760818000000086],[-77.649993999999992,69.769714000000022],[-77.668059999999969,69.836655000000064],[-77.691939999999931,69.963043000000027],[-77.695267000000001,69.98803700000002],[-77.694442999999922,70.000275000000045],[-77.693054000000018,70.00610400000005],[-77.68582200000003,70.023041000000092],[-77.678604000000007,70.034987999999998],[-77.672500999999954,70.045532000000094],[-77.669723999999974,70.052200000000028],[-77.667220999999984,70.062194999999974],[-77.665008999999941,70.088043000000084],[-77.665557999999976,70.106934000000138],[-77.668334999999956,70.113037000000077],[-77.673888999999974,70.11970500000001],[-77.671936000000017,70.177199999999914],[-77.672500999999954,70.180542000000059],[-77.678328999999962,70.187759000000142],[-77.685271999999998,70.191360000000032],[-77.810821999999973,70.24552900000009],[-77.884170999999981,70.2586060000001],[-77.892226999999878,70.258041000000048],[-78.133621000000005,70.215271000000087],[-78.239166000000012,70.203873000000101],[-78.345000999999911,70.19720500000011],[-78.351395000000025,70.197479000000044],[-78.364715999999987,70.201096000000007],[-78.401672000000019,70.212493999999992],[-78.405272999999966,70.214157000000114],[-78.480835000000013,70.288589000000002],[-78.406113000000005,70.326935000000049],[-78.396118000000001,70.328049000000021],[-78.389175000000023,70.332214000000022],[-78.398894999999925,70.336380000000077],[-78.425827000000027,70.3477630000001],[-78.436661000000015,70.351088999999945],[-78.486389000000031,70.356934000000081],[-78.504180999999903,70.35803199999998],[-78.521118000000001,70.357758000000047],[-78.536391999999978,70.356369000000029],[-78.55749499999996,70.351379000000009],[-78.573623999999995,70.345534999999984],[-78.579726999999878,70.343048000000067],[-78.583327999999995,70.336929000000055],[-78.581115999999952,70.334152000000131],[-78.569167999999991,70.325546000000031],[-78.564712999999983,70.320267000000058],[-78.56138599999997,70.314148000000046],[-78.564712999999983,70.310256999999979],[-78.578888000000006,70.309708000000001],[-78.655272999999909,70.346939000000134],[-78.662506000000008,70.350540000000024],[-78.704726999999934,70.374695000000031],[-78.74749799999995,70.438873000000058],[-78.858337000000006,70.453873000000044],[-78.903335999999911,70.449416999999926],[-78.944442999999865,70.450271999999984],[-79.031951999999933,70.454987000000017],[-79.070557000000008,70.469711000000075],[-79.095550999999887,70.493042000000116],[-79.100280999999995,70.49832200000003],[-79.081680000000006,70.529984000000127],[-79.068068999999923,70.536377000000073],[-78.893616000000009,70.590546000000131],[-78.879989999999964,70.594711000000132],[-78.860274999999888,70.59664900000007],[-78.832779000000016,70.594437000000028],[-78.821945000000028,70.589706000000092],[-78.815551999999911,70.57748400000014],[-78.816100999999946,70.573318000000029],[-78.815001999999879,70.571930000000123],[-78.806655999999975,70.564986999999974],[-78.788054999999929,70.556091000000038],[-78.766112999999905,70.550261999999975],[-78.733321999999987,70.547211000000004],[-78.718886999999938,70.547760000000096],[-78.720276000000013,70.549149000000114],[-78.84056099999998,70.634995000000117],[-78.851944000000003,70.638046000000088],[-78.861938000000009,70.637206999999989],[-78.868331999999953,70.63220200000012],[-78.867492999999968,70.628586000000041],[-78.868057000000022,70.624419999999986],[-78.871933000000013,70.621918000000051],[-78.879989999999964,70.621093999999914],[-78.912215999999944,70.621368000000018],[-78.965285999999935,70.632751000000042],[-78.976943999999946,70.635817999999972],[-78.994155999999975,70.643326000000002],[-78.999161000000015,70.651382000000069],[-79.000838999999928,70.662766000000147],[-78.994720000000029,70.672484999999995],[-79.000564999999995,70.676926000000094],[-79.009445000000028,70.679702999999961],[-79.025283999999999,70.680267000000129],[-79.041107000000011,70.678588999999988],[-79.057220000000029,70.672759999999982],[-79.152221999999995,70.627762000000075],[-79.158051,70.622208000000114],[-79.155838000000017,70.617476999999951],[-79.14973399999991,70.613037000000134],[-79.136948000000018,70.610809000000017],[-79.097778000000005,70.610260000000039],[-79.068068999999923,70.615540000000124],[-79.143889999999999,70.453873000000044],[-79.159728999999913,70.43803400000013],[-79.174164000000019,70.428040000000124],[-79.18472300000002,70.423599000000024],[-79.209731999999974,70.418045000000006],[-79.223891999999978,70.419434000000024],[-79.23582499999992,70.423309000000017],[-79.268889999999999,70.436371000000008],[-79.291106999999954,70.446930000000066],[-79.290557999999919,70.453598000000056],[-79.291945999999996,70.459717000000069],[-79.30221599999993,70.473602000000142],[-79.308333999999888,70.480270000000132],[-79.388061999999934,70.49275200000011],[-79.403610000000015,70.493316999999934],[-79.412780999999995,70.491652999999928],[-79.420546999999942,70.488876000000062],[-79.575561999999934,70.42942800000003],[-79.58555599999994,70.421371000000022],[-79.591110000000015,70.413605000000018],[-79.591384999999946,70.40914900000007],[-79.588897999999972,70.399428999999998],[-79.575835999999981,70.389984000000084],[-79.563613999999973,70.385544000000095],[-79.42361499999987,70.355820000000108],[-79.420546999999942,70.359710999999947],[-79.416107000000011,70.363602000000014],[-79.406661999999869,70.367477000000008],[-79.386948000000018,70.37164300000012],[-79.371657999999968,70.371093999999971],[-79.357772999999895,70.36970500000001],[-79.317229999999995,70.360260000000096],[-79.295837000000006,70.353043000000014],[-79.286666999999852,70.349716000000058],[-79.266112999999962,70.341094999999939],[-79.252791999999999,70.333327999999995],[-79.243057000000022,70.324707000000103],[-79.233321999999873,70.318603999999937],[-79.224715999999944,70.316085999999984],[-79.209441999999967,70.313309000000061],[-79.125823999999909,70.304703000000131],[-79.108886999999925,70.304977000000065],[-79.099730999999963,70.308594000000028],[-79.086670000000026,70.317764000000068],[-79.088333000000034,70.324707000000103],[-79.090560999999923,70.329437000000098],[-79.085830999999985,70.33859300000006],[-79.070847000000015,70.340820000000122],[-79.056655999999919,70.341369999999984],[-79.038895000000025,70.340546000000018],[-79.027221999999995,70.339432000000045],[-78.98832699999997,70.331375000000037],[-78.966659999999933,70.323318000000086],[-78.939162999999951,70.311096000000134],[-78.921660999999915,70.300812000000064],[-78.790558000000033,70.205551000000014],[-78.777221999999995,70.194976999999994],[-78.763061999999991,70.183593999999971],[-78.753066999999874,70.169434000000081],[-78.74888599999997,70.162201000000039],[-78.737502999999947,70.114989999999977],[-78.688599000000011,70.054977000000122],[-78.683060000000012,70.046371000000022],[-78.680282999999974,70.040268000000083],[-78.664168999999958,70.004166000000112],[-78.662506000000008,69.983047000000113],[-78.662506000000008,69.973037999999917],[-78.665008999999998,69.961380000000077],[-78.676392000000021,69.945250999999985],[-78.687774999999931,69.934417999999994],[-78.704177999999899,69.924148999999943],[-78.791945999999996,69.891098],[-78.84973100000002,69.886107999999979],[-79.06639100000001,69.878310999999997],[-79.17860399999995,69.883881000000088],[-79.200287000000003,69.884430000000009],[-79.37777699999998,69.886107999999979],[-79.408050999999944,69.88499500000006],[-79.474716000000001,69.878586000000041],[-79.526947000000007,69.871918000000051],[-79.540832999999964,69.868866000000139],[-79.553604000000007,69.864700000000028],[-79.563889000000017,69.859984999999995],[-79.576950000000011,69.855819999999994],[-79.604996000000028,69.849990999999989],[-79.636123999999938,69.848038000000031],[-79.682495000000017,69.848877000000016],[-79.694992000000013,69.851089000000059],[-79.707229999999981,69.855545000000006],[-79.773620999999991,69.885544000000039],[-79.780288999999982,69.890549000000078],[-79.786391999999978,69.897217000000012],[-79.796386999999925,69.908325000000048],[-79.801101999999958,69.915543000000014],[-79.800277999999992,69.917205999999965],[-79.803329000000019,69.927475000000015],[-79.833617999999944,69.949417000000039],[-79.891387999999949,69.973877000000073],[-80.053054999999915,69.997208000000114],[-80.168059999999969,70.006377999999984],[-80.196945000000028,70.008041000000105],[-80.232497999999964,70.007767000000001],[-80.263061999999934,70.002487000000087],[-80.27305599999994,69.999709999999993],[-80.292496000000028,69.98692299999999],[-80.307770000000005,69.981093999999985],[-80.31361400000003,69.980270000000019],[-80.326110999999912,69.980270000000019],[-80.336120999999991,69.982207999999957],[-80.434998000000007,70.004990000000078],[-80.45777899999996,70.013320999999962],[-80.466399999999965,70.018051000000014],[-80.47444200000001,70.024428999999998],[-80.485549999999932,70.029434000000037],[-80.547774999999945,70.04414399999996],[-80.561110999999983,70.046936000000073],[-80.577498999999875,70.048874000000012],[-80.597778000000005,70.048035000000027],[-80.652221999999938,70.038879000000065],[-80.669998000000021,70.039978000000076],[-80.787505999999951,70.050537000000134],[-80.906386999999995,70.070831000000055],[-81.06220999999988,70.085541000000035],[-81.225829999999974,70.09693900000002],[-81.285552999999993,70.095261000000107],[-81.378051999999968,70.092484000000013],[-81.429992999999968,70.093597000000102],[-81.462508999999955,70.09637500000008],[-81.603058000000033,70.113876000000005],[-81.698607999999922,70.128585999999984],[-81.711670000000026,70.130539000000113],[-81.728333000000021,70.132202000000007],[-81.745834000000002,70.1308140000001],[-81.756119000000012,70.12831099999994],[-81.763335999999924,70.123031999999967],[-81.761948000000018,70.117477000000065],[-81.737503000000004,70.093597000000102],[-81.718886999999881,70.079163000000051],[-81.709732000000031,70.074432000000115],[-81.687774999999874,70.067764000000125],[-81.670546999999942,70.065262000000075],[-81.625823999999966,70.062759000000085],[-81.558333999999888,70.056930999999963],[-81.539718999999934,70.053314],[-81.531113000000005,70.050812000000121],[-81.464721999999995,70.024703999999986],[-81.313613999999973,70.032211000000132],[-81.262221999999952,70.016388000000063],[-81.188599000000011,69.991089000000102],[-81.169723999999974,69.982483000000002],[-81.153335999999911,69.969986000000006],[-81.15306099999998,69.963608000000022],[-81.154174999999896,69.958327999999995],[-81.150283999999999,69.945815999999979],[-81.142775999999969,69.938034000000016],[-81.136123999999995,69.933043999999995],[-81.126389000000017,69.927765000000022],[-81.089721999999995,69.913879000000009],[-81.028335999999967,69.893600000000106],[-80.999999999999943,69.886107999999979],[-80.939986999999974,69.862762000000089],[-80.791381999999942,69.790542999999957],[-80.769164999999873,69.778045999999961],[-80.764175000000023,69.770537999999988],[-80.763061999999991,69.767212000000086],[-80.763061999999991,69.760818000000086],[-80.77555799999999,69.75221300000004],[-80.826110999999912,69.733597000000032],[-80.835555999999883,69.730270000000075],[-80.849441999999954,69.727203000000145],[-80.938889000000017,69.714705999999978],[-80.952498999999989,69.713882000000012],[-80.952224999999942,69.732758000000047],[-80.955841000000021,69.734420999999998],[-81.014449999999954,69.745529000000147],[-81.023055999999997,69.746094000000028],[-81.038054999999929,69.748596000000077],[-81.074172999999917,69.758040999999992],[-81.093063000000029,69.764434999999992],[-81.103058000000033,69.768326000000059],[-81.115554999999858,69.776931999999988],[-81.129439999999931,69.797760000000096],[-81.145843999999897,69.812485000000038],[-81.166945999999996,69.821380999999974],[-81.178878999999938,69.824996999999996],[-81.21665999999999,69.833603000000096],[-81.354445999999996,69.880264000000125],[-81.433059999999955,69.91304000000008],[-81.480559999999969,69.926926000000037],[-81.491942999999878,69.929703000000131],[-81.598891999999864,69.95248400000014],[-81.68249499999996,69.964431999999988],[-81.795273000000009,69.988586000000112],[-81.945540999999878,70.039978000000076],[-81.953887999999949,70.043868999999972],[-81.957229999999981,70.047211000000061],[-81.958618000000001,70.052765000000079],[-81.966659999999933,70.060532000000023],[-82.065001999999936,70.095825000000048],[-82.101104999999905,70.108032000000037],[-82.214447000000007,70.134995000000004],[-82.361663999999962,70.161377000000073],[-82.446655000000021,70.174988000000042],[-82.475006000000008,70.179428000000087],[-82.610001000000011,70.207214000000135],[-82.739165999999898,70.237762000000089],[-82.913894999999968,70.282761000000107],[-82.938888999999961,70.292205999999965],[-82.952224999999999,70.296370999999965],[-82.977782999999988,70.301926000000037],[-82.992766999999901,70.303588999999988],[-83.006957999999997,70.304703000000131],[-83.048049999999989,70.306931000000134],[-82.897781000000009,70.248595999999964],[-82.822234999999978,70.220825000000104],[-82.683608999999933,70.189972000000125],[-82.573623999999995,70.171646000000123],[-82.493880999999988,70.158875000000023],[-82.415282999999988,70.143051000000071],[-82.299727999999902,70.118866000000082],[-82.103058000000033,70.065262000000075],[-81.976395000000025,70.012206999999989],[-81.841674999999952,69.963318000000015],[-81.773330999999928,69.954162999999994],[-81.758056999999951,69.951660000000004],[-81.725006000000008,69.944138000000066],[-81.720001000000025,69.941085999999984],[-81.710830999999985,69.934142999999949],[-81.738327000000027,69.876083000000051],[-81.741378999999881,69.872757000000036],[-81.854171999999949,69.855545000000006],[-81.880279999999914,69.852478000000076],[-81.960281000000009,69.844146999999964],[-81.962783999999886,69.844711000000132],[-81.963333000000034,69.847487999999998],[-81.962508999999955,69.852768000000083],[-81.963333000000034,69.857757999999933],[-81.972503999999958,69.862487999999985],[-81.995270000000005,69.872481999999991],[-82.001677999999856,69.874694999999974],[-82.011123999999995,69.875809000000118],[-82.020003999999858,69.873871000000008],[-82.061661000000015,69.859421000000054],[-82.118880999999874,69.814697000000081],[-82.11860699999994,69.81053200000008],[-82.126098999999954,69.784988000000055],[-82.129715000000033,69.782486000000006],[-82.143340999999964,69.781372000000033],[-82.189986999999917,69.790267999999969],[-82.243606999999997,69.801650999999993],[-82.271392999999989,69.82638500000013],[-82.241668999999945,69.828048999999965],[-82.224441999999954,69.823608000000036],[-82.210280999999952,69.826096000000007],[-82.206664999999987,69.828598000000056],[-82.215011999999888,69.832763999999997],[-82.303054999999915,69.856644000000131],[-82.314163000000008,69.857483000000116],[-82.403609999999958,69.860260000000039],[-82.417769999999962,69.857757999999933],[-82.526397999999972,69.860809000000131],[-82.575012000000015,69.87081900000004],[-82.64416499999993,69.892487000000017],[-82.741378999999938,69.910248000000138],[-83.035278000000005,69.98803700000002],[-83.040832999999964,69.993042000000059],[-83.044448999999929,70.004166000000112],[-83.051392000000021,70.008605999999929],[-83.066665999999998,70.010818000000029],[-83.150283999999942,70.009720000000129],[-83.238892000000021,69.998871000000065],[-83.339171999999962,69.979431000000091],[-83.345276000000013,69.977203000000088],[-83.613891999999964,69.948868000000118],[-83.654175000000009,69.946365000000128],[-83.715285999999878,69.947754000000145],[-83.898620999999991,69.960815000000082],[-83.944716999999969,69.965820000000122],[-84.00167799999997,69.974152000000117],[-84.010833999999932,69.976653999999996],[-84.041672000000005,69.981369000000029],[-84.082779000000016,69.985260000000096],[-84.161666999999966,69.984985000000052],[-84.314162999999951,69.979706000000078],[-84.560546999999872,69.993866000000025],[-84.65695199999999,70.002487000000087],[-84.728606999999897,70.010269000000051],[-84.783889999999985,70.01887499999998],[-85.163054999999929,70.09137000000004],[-85.176102000000014,70.093048000000124],[-85.335280999999952,70.102478000000019],[-85.353881999999942,70.103317000000004],[-85.369155999999975,70.103591999999992],[-85.666397000000018,70.104705999999965],[-85.719727000000034,70.103591999999992],[-85.752501999999936,70.101929000000041],[-85.84722899999997,70.088882000000069],[-85.869445999999868,70.085541000000035],[-85.874999999999943,70.083328000000051],[-85.878051999999968,70.076935000000105],[-85.876099000000011,70.071930000000066],[-85.854720999999984,70.040817000000061],[-85.851669000000015,70.038315000000125],[-85.838333000000034,70.041931000000034],[-85.826950000000011,70.046371000000022],[-85.801940999999943,70.05442800000003],[-85.785278000000005,70.058319000000097],[-85.732772999999952,70.066939999999988],[-85.691665999999941,70.070541000000048],[-85.636397999999986,70.071930000000066],[-85.618057000000022,70.070831000000055],[-85.585555999999997,70.067490000000021],[-85.468833999999902,70.049263000000053],[-85.376937999999996,70.032211000000132],[-85.350280999999995,70.026382000000126],[-85.25140399999998,69.998322000000087],[-85.243056999999908,69.994979999999998],[-85.236114999999984,69.989150999999993],[-85.239440999999943,69.986649000000057],[-85.244995000000017,69.984421000000111],[-85.25778200000002,69.983871000000079],[-85.41339099999999,69.997429000000125],[-85.441230999999959,70.00093099999998],[-85.451224999999965,70.001769999999908],[-85.577498999999932,70.009995000000117],[-85.613892000000021,70.009995000000117],[-85.635009999999909,70.007491999999957],[-85.651947000000007,70.00360100000006],[-85.678328999999906,69.995254999999986],[-85.695267000000001,69.991363999999919],[-85.726943999999946,69.990539999999953],[-85.808334000000002,69.99859600000002],[-85.823333999999988,70.000275000000045],[-85.851944000000003,70.005554000000018],[-86.093063000000029,70.062484999999981],[-86.230835000000013,70.098602000000142],[-86.255004999999926,70.10554500000012],[-86.301940999999943,70.121643000000006],[-86.326400999999976,70.132202000000007],[-86.551940999999999,70.234984999999995],[-86.556106999999997,70.244705000000124],[-86.581115999999952,70.356934000000081],[-86.577224999999999,70.36554000000001],[-86.55860899999999,70.386932000000002],[-86.541945999999996,70.401382000000126],[-86.524170000000026,70.411652000000061],[-86.512787000000003,70.416382000000056],[-86.481109999999944,70.424698000000149],[-86.448333999999932,70.431655999999975],[-86.373046999999985,70.445816000000093],[-86.313048999999864,70.46276899999998],[-86.294997999999964,70.472762999999986],[-86.287506000000008,70.484420999999998],[-86.297774999999945,70.494141000000127],[-86.313889000000017,70.502777000000037],[-86.334441999999967,70.511658000000125],[-86.353607000000011,70.519440000000088],[-86.36221299999994,70.522765999999933],[-86.374709999999993,70.525269000000094],[-86.390839000000028,70.522217000000012],[-86.389998999999989,70.519989000000066],[-86.383895999999879,70.513611000000083],[-86.375548999999978,70.508881000000031],[-86.367767000000015,70.504715000000147],[-86.350280999999995,70.49832200000003],[-86.339721999999938,70.491652999999928],[-86.339447000000007,70.486374000000126],[-86.34056099999998,70.483870999999965],[-86.363327000000027,70.474152000000004],[-86.37388599999997,70.470261000000107],[-86.407501000000025,70.459991000000002],[-86.51568599999996,70.433640000000025],[-86.565001999999936,70.425537000000134],[-86.578338999999971,70.422211000000118],[-86.589721999999995,70.417479999999955],[-86.62777699999998,70.395538000000101],[-86.651397999999972,70.374695000000031],[-86.662216000000001,70.361099000000081],[-86.65943900000002,70.357208000000014],[-86.638335999999924,70.324432000000058],[-86.647232000000031,70.319443000000092],[-86.655563000000029,70.318878000000041],[-86.839721999999995,70.320267000000058],[-86.861938000000009,70.322220000000016],[-86.876099000000011,70.326096000000064],[-86.881103999999937,70.329711999999972],[-86.990554999999915,70.431655999999975],[-86.988892000000021,70.435532000000023],[-86.982497999999964,70.438873000000058],[-86.953613000000018,70.442474000000118],[-86.936935000000005,70.443313999999987],[-86.92471299999994,70.446091000000081],[-86.922775000000001,70.447754000000032],[-86.921386999999925,70.451660000000061],[-86.92193599999996,70.455550999999957],[-86.928329000000019,70.460541000000035],[-86.937209999999936,70.463608000000136],[-86.953338999999971,70.467209000000025],[-86.967772999999909,70.468048000000124],[-86.996384000000035,70.467484000000013],[-87.034164000000033,70.464157000000057],[-87.072509999999966,70.457489000000123],[-87.08944699999995,70.453323000000012],[-87.132767000000001,70.439148000000102],[-87.140563999999983,70.434981999999991],[-87.182220000000029,70.399428999999998],[-87.184998000000007,70.388596000000007],[-87.05749499999996,70.381653000000028],[-87.043883999999991,70.379974000000004],[-87.031676999999945,70.377472000000125],[-87.010558999999944,70.37164300000012],[-86.991378999999995,70.364150999999993],[-86.981109999999944,70.35803199999998],[-86.972777999999948,70.351929000000041],[-86.976395000000025,70.284714000000065],[-86.985824999999977,70.281662000000097],[-86.999434999999949,70.280548000000124],[-87.009170999999924,70.281097000000102],[-87.107498000000021,70.28804000000008],[-87.184433000000013,70.295532000000037],[-87.255004999999983,70.30664100000007],[-87.5625,70.322768999999937],[-87.673614999999984,70.319153000000085],[-87.669998000000021,70.298598999999967],[-87.643889999999999,70.295822000000044],[-87.628601000000003,70.29304500000012],[-87.61721799999998,70.289429000000098],[-87.610275000000001,70.284714000000065],[-87.613327000000027,70.281936999999971],[-87.62388599999997,70.278046000000074],[-87.704177999999956,70.257217000000082],[-87.77694699999995,70.24331699999999],[-87.796951000000035,70.240265000000079],[-87.833892999999989,70.238037000000134],[-87.8663939999999,70.238876000000062],[-87.914444000000003,70.24136400000009],[-87.923049999999989,70.242751999999996],[-87.935546999999985,70.24693300000007],[-88.012825000000021,70.277267000000109],[-88.088165000000004,70.285095000000126],[-88.138610999999912,70.296097000000032],[-88.250564999999938,70.321381000000031],[-88.263061999999934,70.325272000000098],[-88.264724999999942,70.328049000000021],[-88.256957999999997,70.333878000000027],[-88.214171999999962,70.351379000000009],[-88.20666499999993,70.352478000000133],[-88.061774999999955,70.329544000000055],[-88.05494699999997,70.327369999999974],[-88.050109999999904,70.325042999999994],[-88.038283999999919,70.315536000000122],[-88.030784999999923,70.314033999999992],[-88.02427699999987,70.313202000000103],[-87.994445999999982,70.31203499999998],[-87.916397000000018,70.301926000000037],[-87.901671999999905,70.304428000000144],[-87.888610999999969,70.308029000000033],[-87.879989999999964,70.311371000000122],[-87.882492000000013,70.316375999999991],[-87.889998999999989,70.321930000000009],[-87.914718999999991,70.331665000000044],[-88.083618000000001,70.378036000000066],[-88.111938000000009,70.384155000000078],[-88.166945999999996,70.394440000000031],[-88.374434999999949,70.432205000000124],[-88.439986999999917,70.438583000000051],[-88.579177999999956,70.450271999999984],[-88.670272999999952,70.453598000000056],[-88.679442999999992,70.453598000000056],[-88.693053999999961,70.455261000000121],[-88.797775000000001,70.489700000000028],[-88.897506999999962,70.53276100000005],[-88.914443999999889,70.546096999999975],[-88.985824999999863,70.608322000000101],[-89.00389100000001,70.624984999999981],[-89.009170999999981,70.636383000000023],[-88.999999999999943,70.645538000000045],[-88.999725000000012,70.651657000000057],[-89.005279999999914,70.656936999999971],[-89.076674999999966,70.696930000000009],[-89.105834999999956,70.707489000000066],[-89.118880999999988,70.711380000000133],[-89.143889999999942,70.717209000000139],[-89.203888000000006,70.737198000000035],[-89.261123999999995,70.759720000000129],[-89.285278000000005,70.769714000000135],[-89.330565999999919,70.791931000000034],[-89.369719999999973,70.814697000000081],[-89.374161000000015,70.819153000000142],[-89.448333999999988,70.902481000000023],[-89.447219999999902,70.906647000000078],[-89.443603999999937,70.910262999999929],[-89.432495000000017,70.915268000000026],[-89.416397000000018,70.918594000000041],[-89.371658000000025,70.925812000000064],[-89.298614999999927,70.933043999999995],[-89.222777999999948,70.935531999999967],[-89.20944199999991,70.939147999999989],[-89.205840999999964,70.942749000000049],[-89.188599000000011,70.960815000000025],[-89.195267000000001,70.968323000000055],[-89.205565999999919,70.973602000000028],[-89.270279000000016,70.983597000000145],[-89.315276999999924,70.991653000000042],[-89.340560999999923,70.997482000000048],[-89.354720999999927,71.001937999999939],[-89.49499499999996,71.0577550000001],[-89.549727999999959,71.088593000000117],[-89.491378999999938,71.092209000000139],[-89.469726999999978,71.091933999999924],[-89.228333000000021,71.072768999999994],[-89.216948999999943,71.06999200000007],[-89.208617999999944,71.063034000000073],[-89.215285999999935,71.056641000000127],[-89.218063000000029,71.050812000000121],[-89.212509000000011,71.045532000000037],[-89.203063999999983,71.03804000000008],[-89.196655000000021,71.035263000000043],[-89.178604000000007,71.031372000000147],[-89.134444999999971,71.026932000000102],[-89.117767000000015,71.026657000000114],[-89.100829999999917,71.027771000000087],[-89.076110999999969,71.030272999999966],[-89.039443999999946,71.035263000000043],[-88.979996000000028,71.041092000000049],[-88.904723999999987,71.045258000000103],[-88.689163000000008,71.046936000000017],[-88.617767000000015,71.044434000000138],[-88.490279999999984,71.031097000000102],[-88.478881999999942,71.029709000000025],[-88.43249499999996,71.021927000000062],[-88.380279999999971,71.011931999999945],[-88.369155999999975,71.007492000000127],[-88.365829000000019,71.001937999999939],[-88.36332699999997,70.99552900000009],[-88.362503000000004,70.990265000000136],[-88.362777999999992,70.984146000000067],[-88.360274999999945,70.977767999999969],[-88.356948999999986,70.972214000000122],[-88.343612999999948,70.961380000000077],[-88.332503999999972,70.957213999999965],[-88.318618999999899,70.95387299999993],[-88.289718999999934,70.950272000000098],[-88.260833999999988,70.947754000000089],[-88.025283999999942,70.930542000000059],[-87.999999999999886,70.929153000000099],[-87.968886999999881,70.928588999999931],[-87.930557000000022,70.929428000000087],[-87.912780999999995,70.931366000000025],[-87.857772999999895,70.941360000000032],[-87.798049999999932,70.949707000000046],[-87.752791999999999,70.953598000000113],[-87.699996999999996,70.955551000000071],[-87.664443999999946,70.954712000000086],[-87.62748699999986,70.95138500000013],[-87.610549999999932,70.949417000000039],[-87.559433000000013,70.947479000000101],[-87.43582200000003,70.944976999999994],[-87.371216000000004,70.944725000000119],[-87.353607000000011,70.945250999999928],[-87.345551,70.949417000000039],[-87.343063000000029,70.954162999999937],[-87.343613000000005,70.959427000000119],[-87.337783999999886,70.969986000000006],[-87.329177999999956,70.980545000000006],[-87.30860899999999,70.99552900000009],[-87.298889000000031,71],[-87.286117999999988,71.004166000000112],[-87.267226999999878,71.006942999999978],[-87.246947999999918,71.009155000000078],[-87.212508999999955,71.007492000000127],[-87.151397999999858,71],[-87.141388000000006,70.997757000000036],[-87.11610399999995,70.994705000000124],[-87.051392000000021,70.987761999999975],[-87.033614999999998,70.986649000000057],[-87.017501999999922,70.986649000000057],[-87.004180999999903,70.990265000000136],[-87.003066999999987,70.991089000000102],[-87.002791999999999,70.994141000000013],[-87.009734999999978,70.996093999999971],[-87.039444000000003,71.000823999999966],[-87.135009999999966,71.011383000000023],[-87.166397000000018,71.014435000000105],[-87.184433000000013,71.01527400000009],[-87.279175000000009,71.026932000000102],[-87.385833999999988,71.041930999999977],[-87.394729999999981,71.043594000000098],[-87.404723999999931,71.047211000000061],[-87.410827999999981,71.053314],[-87.472777999999948,71.074157999999954],[-87.572783999999956,71.09526100000005],[-87.701400999999976,71.123306000000071],[-87.712783999999999,71.126082999999994],[-87.760283999999956,71.143051000000071],[-87.848891999999864,71.184982000000048],[-87.851943999999946,71.191925000000026],[-87.852492999999981,71.19720500000011],[-87.848343,71.202209000000039],[-87.825286999999946,71.217209000000025],[-87.823059000000001,71.223601999999971],[-87.816665999999941,71.254714999999976],[-87.821945000000028,71.258331000000055],[-87.829452999999944,71.261932000000115],[-87.844161999999926,71.264160000000061],[-87.900283999999999,71.268600000000049],[-87.911666999999909,71.266936999999984],[-87.971938999999963,71.250274999999988],[-88.019729999999981,71.236098999999967],[-88.034163999999976,71.231658999999979],[-88.041945999999939,71.228867000000037],[-88.131103999999993,71.219147000000135],[-88.321670999999981,71.228592000000049],[-88.583618000000001,71.234984999999995],[-88.70666499999993,71.247756999999979],[-88.849990999999989,71.259720000000016],[-89.058043999999995,71.276382000000012],[-89.20666499999993,71.283325000000048],[-89.299163999999962,71.287491000000102],[-89.42860399999995,71.294434000000081],[-89.703888000000006,71.31581100000011],[-89.816665999999998,71.324997000000053],[-89.830001999999979,71.328872999999987],[-89.89973399999991,71.351379000000122],[-89.907227000000034,71.354706000000078],[-89.964721999999995,71.411377000000016],[-89.968613000000005,71.416931000000034],[-89.983063000000016,71.446930000000009],[-90.010558999999887,71.57777400000009],[-90.013061999999934,71.600266000000033],[-90.004729999999938,71.630813999999987],[-90.00306699999993,71.635817999999972],[-89.99722300000002,71.641373000000044],[-89.964721999999995,71.655822999999941],[-89.932769999999948,71.667755000000113],[-89.896117999999944,71.679977000000065],[-89.884734999999921,71.684708000000001],[-89.817504999999983,71.724701000000039],[-89.808334000000002,71.747757000000092],[-89.821395999999936,71.760269000000051],[-89.831389999999942,71.760269000000051],[-89.836120999999991,71.761658000000068],[-89.843062999999972,71.764434999999992],[-89.893615999999952,71.789428999999927],[-89.954453000000001,71.820541000000048],[-89.960281000000009,71.824158000000011],[-90.026672000000019,71.892761000000064],[-90.048614999999984,71.953873000000101],[-90.001113999999916,72.063034000000073],[-89.993057000000022,72.070540999999992],[-89.962783999999999,72.07748399999997],[-89.812209999999993,72.111923000000047],[-89.750838999999928,72.12303199999991],[-89.738891999999964,72.124985000000038],[-89.725829999999974,72.124695000000031],[-89.718886999999995,72.121917999999937],[-89.715835999999967,72.118591000000038],[-89.704726999999991,72.113312000000008],[-89.691665999999941,72.109985000000108],[-89.682494999999903,72.110535000000141],[-89.664718999999934,72.113312000000008],[-89.597503999999958,72.148331000000098],[-89.579726999999991,72.158874999999966],[-89.574721999999952,72.163605000000018],[-89.576674999999966,72.169144000000017],[-89.584732000000031,72.175811999999951],[-89.598891999999978,72.178040000000124],[-89.618057000000022,72.17886400000009],[-89.676665999999955,72.17692599999998],[-89.705841000000021,72.174697999999978],[-89.724716000000001,72.172485000000052],[-89.738891999999964,72.168593999999985],[-89.759445000000028,72.159988000000055],[-89.770553999999947,72.157485999999949],[-89.780563000000029,72.157485999999949],[-89.802489999999921,72.161925999999994],[-89.892226999999991,72.186919999999986],[-89.897232000000031,72.188583000000051],[-89.901397999999915,72.194137999999953],[-89.939437999999939,72.261932000000058],[-89.954177999999956,72.304977000000065],[-89.957503999999915,72.316086000000098],[-89.95666499999993,72.321655000000135],[-89.913329999999974,72.422211000000061],[-89.907500999999968,72.432205000000067],[-89.89056399999987,72.444977000000051],[-89.87249799999995,72.449142000000052],[-89.860275000000001,72.451096000000121],[-89.813613999999973,72.456650000000081],[-89.799438000000009,72.46026599999999],[-89.793609999999887,72.462768999999923],[-89.777221999999995,72.493866000000025],[-89.775283999999886,72.498596000000077],[-89.772506999999962,72.51998900000001],[-89.772781000000009,72.526093000000003],[-89.786666999999966,72.559982000000048],[-89.753890999999953,72.60554499999995],[-89.736937999999952,72.616652999999985],[-89.699996999999939,72.625259000000085],[-89.678329000000019,72.629424999999969],[-89.65695199999999,72.630264000000125],[-89.643616000000009,72.62692300000009],[-89.614715999999987,72.616089000000045],[-89.597503999999958,72.614700000000028],[-89.572784000000013,72.616928000000144],[-89.560546999999929,72.621918000000051],[-89.470550999999944,72.666091999999992],[-89.473617999999874,72.672485000000108],[-89.511947999999961,72.688873000000001],[-89.525283999999999,72.693863000000022],[-89.549164000000019,72.691085999999927],[-89.567504999999926,72.693039000000056],[-89.574721999999952,72.698868000000061],[-89.580001999999922,72.711105000000032],[-89.581389999999999,72.71775800000006],[-89.574721999999952,72.785263000000043],[-89.569457999999941,72.786925999999937],[-89.479445999999996,72.779709000000025],[-89.446380999999917,72.775542999999971],[-89.36471599999993,72.762206999999989],[-89.330565999999919,72.755829000000006],[-89.294158999999922,72.797211000000061],[-89.333327999999995,72.950546000000145],[-89.358337000000006,72.965271000000087],[-89.361388999999974,72.991652999999985],[-89.308883999999978,73.048324999999977],[-89.228333000000021,73.125809000000004],[-89.043335000000013,73.252486999999974],[-89.035827999999981,73.257492000000013],[-89.00028999999995,73.278320000000122],[-88.990554999999972,73.283599999999979],[-88.856948999999986,73.336105000000032],[-88.695830999999941,73.411926000000108],[-88.68360899999999,73.417480000000069],[-88.468062999999972,73.491928000000087],[-88.433318999999926,73.514159999999947],[-88.409164000000033,73.523605000000032],[-88.286391999999978,73.566939999999988],[-88.263061999999934,73.573883000000023],[-88.074721999999895,73.627762000000018],[-87.974441999999954,73.654709000000139],[-87.92332499999992,73.667755000000056],[-87.817229999999995,73.694427000000132],[-87.780288999999982,73.703048999999965],[-87.739990000000034,73.711380000000077],[-87.539444000000003,73.746643000000063],[-87.456664999999987,73.760269000000051],[-87.183608999999933,73.792755000000113],[-87.049438000000009,73.80831900000004],[-86.71665999999999,73.840820000000122],[-86.596663999999976,73.84526100000005],[-86.493057000000022,73.844437000000084],[-86.401397999999915,73.845824999999991],[-86.239440999999999,73.849152000000117],[-86.208618000000001,73.849991000000102],[-86.109160999999972,73.849991000000102],[-85.747771999999998,73.836380000000133],[-85.706664999999987,73.832214000000022],[-85.553054999999972,73.820830999999998],[-85.520003999999972,73.81999200000007],[-85.462508999999955,73.820830999999998],[-85.421936000000017,73.824158000000125],[-85.307770000000005,73.821106000000043],[-85.16332999999986,73.813309000000061],[-85.121108999999933,73.809981999999991],[-85.104995999999971,73.808029000000033],[-85.069457999999884,73.801926000000094],[-85.034728999999913,73.794708000000071],[-84.970001000000025,73.777771000000087],[-84.837783999999999,73.741652999999985],[-84.842772999999966,73.735809000000017],[-84.865554999999915,73.713318000000015],[-84.922501000000011,73.680267000000072],[-84.931380999999988,73.67553700000002],[-84.956116000000009,73.665267999999969],[-84.985000999999954,73.655823000000112],[-85.340835999999854,73.556366000000139],[-85.596389999999985,73.486649000000114],[-85.766402999999855,73.425262000000032],[-85.851104999999961,73.391098],[-85.930282999999974,73.355255],[-86.046660999999858,73.287201000000039],[-86.137787000000003,73.228867000000037],[-86.292220999999984,73.103317000000118],[-86.296386999999982,73.097488000000055],[-86.294448999999929,73.091095000000109],[-86.288895000000025,73.087204000000042],[-86.28443900000002,73.08248900000001],[-86.284163999999976,73.077208999999982],[-86.287216000000001,73.072495000000004],[-86.328339000000028,73.036651999999947],[-86.454452999999887,72.963607999999965],[-86.474716000000001,72.953323000000069],[-86.495269999999891,72.943314000000044],[-86.50556899999998,72.938309000000004],[-86.571120999999948,72.908875000000023],[-86.627212999999927,72.883605999999986],[-86.647506999999962,72.873306000000071],[-86.653610000000015,72.868866000000082],[-86.658339999999953,72.863602000000071],[-86.695540999999992,72.819153000000142],[-86.696654999999964,72.816666000000055],[-86.732773000000009,72.716095000000109],[-86.703339000000028,72.659148999999957],[-86.698333999999988,72.652205999999978],[-86.686935000000005,72.644714000000022],[-86.662216000000001,72.631653000000085],[-86.638335999999924,72.620529000000033],[-86.611389000000031,72.60914600000001],[-86.504181000000017,72.56860400000005],[-86.479720999999984,72.56053200000008],[-86.466110000000015,72.556365999999969],[-86.451401000000033,72.553040000000124],[-86.414443999999946,72.541656000000046],[-86.397232000000031,72.534988000000055],[-86.353057999999976,72.511658000000068],[-86.33805799999999,72.503051999999968],[-86.283066000000019,72.468323000000112],[-86.275832999999977,72.463318000000072],[-86.267776000000026,72.456375000000094],[-86.255004999999926,72.443588000000091],[-86.240829000000019,72.420258000000103],[-86.240829000000019,72.406647000000135],[-86.24610899999999,72.394989000000123],[-86.258057000000008,72.384430000000066],[-86.275283999999942,72.373871000000008],[-86.308043999999995,72.359146000000067],[-86.350829999999917,72.339156999999943],[-86.377776999999924,72.323608000000036],[-86.396117999999944,72.30914300000012],[-86.428054999999915,72.281937000000084],[-86.43582200000003,72.270264000000054],[-86.455276000000026,72.207214000000079],[-86.434432999999956,72.049987999999928],[-86.432495000000017,72.043319999999994],[-86.425827000000027,72.024993999999992],[-86.420546999999999,72.012771999999984],[-86.336670000000026,71.951934999999992],[-86.166107000000011,71.824996999999996],[-86.132766999999944,71.795822000000101],[-86.110549999999989,71.783051],[-86.078613000000018,71.775542999999971],[-86.051666000000012,71.771652000000074],[-86.024444999999957,71.765823000000069],[-85.947219999999959,71.726928999999984],[-85.905563000000029,71.699707000000046],[-85.871933000000013,71.676926000000037],[-85.500838999999985,71.511108000000092],[-85.391952999999944,71.481659000000093],[-85.374161000000015,71.47886699999998],[-85.228606999999954,71.465546000000074],[-84.948607999999979,71.421646000000067],[-84.93472300000002,71.418319999999994],[-84.929992999999968,71.414429000000098],[-84.859160999999972,71.321105999999986],[-84.838057999999933,71.29193099999992],[-84.834166999999979,71.285262999999986],[-84.83277899999996,71.278869999999984],[-84.833892999999932,71.274154999999951],[-84.835555999999997,71.271652000000017],[-84.848343,71.269440000000145],[-84.868606999999997,71.268875000000094],[-84.921660999999972,71.270828000000051],[-85.041945999999996,71.278594999999996],[-85.172500999999897,71.272490999999945],[-85.173888999999974,71.269989000000066],[-85.178329000000019,71.266388000000006],[-85.389998999999932,71.196640000000059],[-85.399993999999936,71.193862999999965],[-85.50028999999995,71.177200000000084],[-85.514724999999999,71.176086000000112],[-85.532501000000025,71.177200000000084],[-85.663054999999986,71.194427000000132],[-85.761397999999986,71.192200000000071],[-85.838333000000034,71.187485000000038],[-85.932769999999948,71.17886400000009],[-85.966659999999933,71.171097000000145],[-86.170836999999949,71.106934000000081],[-86.210830999999985,71.09387200000009],[-86.21444699999995,71.089705999999978],[-86.206954999999994,71.083878000000084],[-86.206115999999952,71.078049000000021],[-86.212783999999999,71.072768999999994],[-86.24888599999997,71.058594000000085],[-86.288605000000018,71.052200000000028],[-86.408051,71.035263000000043],[-86.450835999999924,71.031372000000147],[-86.517775999999969,71.031661999999983],[-86.643889999999999,71.019439999999975],[-86.749999999999943,71.007766999999944],[-86.770278999999903,71.004166000000112],[-86.785552999999993,71.000275000000045],[-86.798614999999984,70.996368000000075],[-86.819167999999877,70.98942599999998],[-86.820007000000032,70.988586000000112],[-86.806655999999975,70.983871000000079],[-86.75778200000002,70.97665399999994],[-86.713057999999933,70.974152000000061],[-86.601943999999946,70.97164900000007],[-86.547500999999954,70.978867000000093],[-86.430283000000031,70.988876000000118],[-86.292220999999984,71.000275000000045],[-86.270279000000016,71.002777000000094],[-86.224166999999852,71.014435000000105],[-86.026947000000007,71.071381000000088],[-85.832503999999915,71.127197000000137],[-85.802215999999987,71.135818000000029],[-85.779174999999952,71.139160000000004],[-85.670273000000009,71.148880000000077],[-85.650283999999999,71.149428999999998],[-85.505004999999983,71.158034999999927],[-85.411666999999966,71.17442299999999],[-85.391678000000013,71.174988000000042],[-85.288605000000018,71.159149000000127],[-85.274169999999913,71.15525800000006],[-85.110549999999989,71.161652000000061],[-85.042220999999927,71.181656000000032],[-85.037216000000001,71.183044000000109],[-84.99888599999997,71.187485000000038],[-84.961670000000026,71.188583000000108],[-84.944152999999972,71.187195000000031],[-84.875274999999988,71.172760000000096],[-84.849990999999989,71.154709000000082],[-84.84584000000001,71.147766000000104],[-84.87110899999999,71.073607999999922],[-84.875823999999852,71.06999200000007],[-84.879714999999919,71.069442999999922],[-84.904175000000009,71.078049000000021],[-84.935821999999973,71.092483999999956],[-84.950561999999934,71.09693900000002],[-84.966110000000015,71.10026600000009],[-84.9808349999999,71.101089000000002],[-85.00111400000003,71.100815000000068],[-85.142226999999934,71.086380000000133],[-85.146956999999986,71.082764000000054],[-85.112777999999935,71.079163000000051],[-85.061385999999914,71.076385000000016],[-84.99221799999998,71.077484000000027],[-84.976668999999902,71.075821000000076],[-84.960281000000009,71.072220000000016],[-84.92971799999998,71.004440000000045],[-84.926940999999943,70.988037000000134],[-84.930282999999974,70.981659000000036],[-84.941375999999991,70.970535000000098],[-84.950835999999981,70.965546000000131],[-84.963333000000034,70.955826000000059],[-84.975280999999995,70.945250999999928],[-84.976105000000018,70.933318999999983],[-84.970839999999953,70.927474999999959],[-84.964721999999938,70.922485000000108],[-84.958618000000001,70.919434000000081],[-84.941100999999946,70.918045000000063],[-84.814162999999951,70.919434000000081],[-84.798888999999974,70.921646000000123],[-84.793610000000001,70.926650999999993],[-84.748336999999992,70.975539999999967],[-84.748046999999985,70.988037000000134],[-84.771118000000001,71.037490999999989],[-84.803604000000007,71.047211000000061],[-84.819167999999991,71.057480000000112],[-84.827788999999996,71.068328999999949],[-84.829726999999878,71.073317999999915],[-84.828888000000006,71.079987000000017],[-84.826675000000023,71.085541000000148],[-84.801392000000021,71.148605000000032],[-84.766662999999994,71.197479000000044],[-84.770843999999954,71.254990000000021],[-84.781386999999938,71.261932000000115],[-84.786666999999909,71.267761000000121],[-84.793059999999969,71.278046000000018],[-84.796660999999915,71.297485000000108],[-84.797226000000023,71.303314000000114],[-84.762511999999901,71.406646999999964],[-84.749434999999949,71.416655999999989],[-84.731948999999929,71.424698000000149],[-84.720551,71.428314],[-84.693053999999961,71.434143000000006],[-84.678329000000019,71.435257000000036],[-84.660004000000015,71.431655999999975],[-84.653060999999923,71.431931000000134],[-84.571670999999924,71.440810999999997],[-84.557495000000017,71.444138000000123],[-84.547774999999945,71.447478999999987],[-84.539169000000015,71.451660000000061],[-84.531951999999933,71.456940000000145],[-84.526108000000022,71.46887200000009],[-84.526397999999915,71.478316999999947],[-84.530563000000029,71.492477000000065],[-84.533614999999941,71.502486999999974],[-84.546660999999972,71.527480999999966],[-84.554717999999923,71.541092000000106],[-84.561385999999914,71.549988000000042],[-84.564437999999939,71.552475000000129],[-84.610275000000001,71.562759000000142],[-84.636397999999929,71.570541000000105],[-84.648620999999991,71.57638500000013],[-84.65834000000001,71.583878000000141],[-84.654998999999975,71.608871000000022],[-84.653060999999923,71.612762000000089],[-84.642501999999979,71.622757000000036],[-84.625548999999978,71.633041000000048],[-84.610549999999989,71.641663000000051],[-84.604445999999996,71.646103000000039],[-84.606658999999922,71.649429000000112],[-84.625,71.665817000000004],[-84.628052000000025,71.668319999999937],[-84.635559000000001,71.670258000000103],[-84.649733999999967,71.672211000000004],[-84.710830999999928,71.676085999999998],[-84.77305599999994,71.678588999999988],[-84.782776000000013,71.678863999999976],[-84.827498999999989,71.675262000000032],[-84.867217999999923,71.66804500000012],[-84.886200000000031,71.654251000000102],[-84.926666000000012,71.636107999999979],[-84.975280999999995,71.644440000000145],[-85.097503999999958,71.655258000000117],[-85.176940999999999,71.656647000000135],[-85.196655000000021,71.655822999999941],[-85.230835000000013,71.659987999999942],[-85.263900999999976,71.665543000000071],[-85.279723999999987,71.668594000000041],[-85.291381999999999,71.672211000000004],[-85.570846999999958,71.77998400000007],[-85.579726999999991,71.784988000000055],[-85.573623999999938,71.790817000000061],[-85.557770000000005,71.79525799999999],[-85.543883999999935,71.795532000000094],[-85.458892999999989,71.79414399999996],[-85.449721999999952,71.796097000000088],[-85.436934999999949,71.800812000000121],[-85.432769999999948,71.806366000000139],[-85.431945999999982,71.814697000000024],[-85.434432999999899,71.818053999999961],[-85.551666000000012,71.896378000000027],[-85.559722999999963,71.900543000000027],[-85.744995000000017,71.941360000000032],[-85.845839999999896,71.962494000000049],[-85.900832999999977,71.969147000000021],[-85.939986999999974,71.973038000000088],[-85.963333000000034,71.974425999999994],[-86.002501999999993,71.978043000000127],[-86.022781000000009,71.980545000000006],[-86.026672000000019,71.981658999999979],[-86.039169000000015,71.988876000000118],[-86.043610000000001,71.99552900000009],[-86.050827000000027,72.011107999999979],[-86.047501000000011,72.013885000000073],[-85.981110000000001,72.028594999999996],[-85.778885000000002,72.026932000000102],[-85.538329999999974,72.059143000000006],[-85.509444999999914,72.068054000000132],[-85.495270000000005,72.078872999999987],[-85.440552000000025,72.132751000000098],[-85.449158000000011,72.158325000000104],[-85.481948999999929,72.173309000000017],[-85.50167799999997,72.184143000000063],[-85.502501999999993,72.251663000000065],[-85.49749799999995,72.255264000000125],[-85.48721299999994,72.260268999999994],[-85.291945999999882,72.25999500000006],[-85.271941999999967,72.259720000000016],[-85.029175000000009,72.25082400000008],[-85.013335999999981,72.250000000000114],[-84.936385999999914,72.235809000000131],[-84.919997999999964,72.232758000000103],[-84.867766999999958,72.220825000000048],[-84.861388999999917,72.217758000000117],[-84.847504000000015,72.205550999999957],[-84.839172000000019,72.194137999999953],[-84.815276999999924,72.181366000000139],[-84.803328999999906,72.177765000000079],[-84.710555999999997,72.151656999999943],[-84.612212999999997,72.141098000000113],[-84.595839999999953,72.137772000000041],[-84.512222000000008,72.114150999999993],[-84.286391999999978,72.028594999999996],[-84.275557999999933,72.023879999999963],[-84.269454999999994,72.020828000000051],[-84.261123999999995,72.016098000000056],[-84.258056999999894,72.011932000000115],[-84.25,71.998322000000087],[-84.239989999999921,71.973877000000016],[-84.236389000000031,71.961655000000064],[-84.230559999999855,71.95138500000013],[-84.225006000000008,71.945525999999916],[-84.218886999999995,71.940262000000132],[-84.208617999999888,71.93414300000012],[-84.194442999999978,71.930817000000047],[-84.184722999999963,71.930542000000059],[-84.178329000000019,71.932755000000043],[-84.172774999999945,71.937759000000142],[-84.168883999999878,71.944138000000009],[-84.158614999999998,71.977203000000088],[-84.164718999999877,72.021103000000096],[-84.171111999999994,72.024155000000007],[-84.218063000000029,72.044144000000131],[-84.270003999999915,72.051085999999998],[-84.285827999999981,72.054152999999928],[-84.319732999999871,72.0619200000001],[-84.346663999999976,72.069717000000026],[-84.357772999999952,72.076385000000016],[-84.379990000000021,72.108321999999987],[-84.380553999999961,72.123596000000077],[-84.456116000000009,72.133605999999986],[-84.473327999999981,72.135818000000029],[-84.613326999999913,72.163605000000018],[-84.652221999999938,72.17886400000009],[-84.72193900000002,72.213043000000084],[-84.933318999999926,72.284424000000001],[-84.935271999999941,72.289429000000041],[-84.917495999999971,72.299713000000054],[-84.829452999999944,72.348328000000095],[-84.816101000000003,72.352767999999912],[-84.801392000000021,72.354706000000078],[-84.769729999999981,72.356368999999972],[-84.715012000000002,72.355820000000051],[-84.661941999999954,72.354156000000046],[-84.565001999999993,72.348877000000073],[-84.521117999999944,72.350540000000137],[-84.500838999999928,72.353867000000093],[-84.48443599999996,72.358032000000094],[-84.436110999999926,72.374984999999981],[-84.433060000000012,72.378311000000053],[-84.442215000000033,72.383041000000048],[-84.453339000000028,72.382477000000108],[-84.471389999999928,72.379425000000026],[-84.571670999999924,72.361374000000012],[-84.864166000000012,72.36692800000003],[-84.872771999999998,72.36943100000002],[-84.876098999999954,72.372208000000114],[-84.875548999999921,72.394989000000123],[-84.870834000000002,72.400818000000129],[-84.857772999999952,72.405547999999953],[-84.836670000000026,72.408035000000041],[-84.817504999999983,72.406647000000135],[-84.800277999999992,72.406647000000135],[-84.786666999999909,72.40887500000008],[-84.768341000000021,72.444427000000019],[-84.767226999999934,72.447478999999987],[-84.768341000000021,72.451935000000049],[-84.771118000000001,72.457489000000066],[-84.776947000000007,72.458327999999995],[-84.791945999999996,72.45498699999996],[-84.918609999999944,72.425262000000089],[-85.008347000000015,72.399429000000112],[-85.021666999999979,72.394714000000079],[-85.144729999999925,72.359421000000111],[-85.339019999999948,72.406418000000031],[-85.370270000000005,72.414703000000031],[-85.515288999999996,72.458878000000027],[-85.535277999999948,72.469711000000018],[-85.610001000000011,72.53166200000004],[-85.618057000000022,72.540817000000061],[-85.61721799999998,72.545532000000094],[-85.613892000000021,72.550261999999975],[-85.598617999999931,72.555251999999996],[-85.508347000000015,72.561371000000008],[-85.486114999999927,72.564987000000087],[-85.478057999999976,72.568329000000006],[-85.473052999999993,72.571930000000066],[-85.475554999999986,72.575272000000041],[-85.481110000000001,72.577484000000084],[-85.499999999999943,72.58027600000014],[-85.559998000000007,72.582489000000123],[-85.623885999999914,72.586928999999941],[-85.641953000000001,72.592757999999947],[-85.654174999999952,72.598038000000031],[-85.664718999999934,72.60554499999995],[-85.703063999999927,72.634155000000021],[-85.705276000000026,72.637771999999984],[-85.70777899999996,72.646378000000084],[-85.70944199999991,72.73692299999999],[-85.688048999999978,72.893599999999992],[-85.68472300000002,72.898330999999928],[-85.679442999999992,72.903595000000109],[-85.592223999999987,72.959152000000074],[-85.581680000000006,72.964157000000114],[-85.570557000000008,72.966934000000037],[-85.549164000000019,72.969711000000132],[-85.499725000000012,72.974152000000004],[-85.481948999999929,72.974152000000004],[-85.378875999999934,72.971100000000092],[-85.283066000000019,72.964431999999931],[-85.257507000000032,72.960814999999968],[-85.127486999999974,72.940262000000132],[-85.077498999999932,72.929977000000008],[-85.015015000000005,72.916092000000106],[-84.96665999999999,72.904984000000127],[-84.93249499999996,72.896378000000027],[-84.874434999999949,72.885543999999925],[-84.819457999999997,72.880264000000068],[-84.707503999999972,72.869980000000055],[-84.668610000000001,72.867477000000065],[-84.61082499999992,72.861649000000114],[-84.504455999999948,72.846100000000035],[-84.437209999999993,72.833603000000039],[-84.404998999999918,72.826096000000121],[-84.389450000000011,72.822220000000016],[-84.320847000000015,72.800812000000121],[-84.291107000000011,72.791655999999989],[-84.257507000000032,72.785263000000043],[-84.188323999999966,72.774428999999941],[-83.991378999999938,72.745819000000097],[-83.97222899999997,72.744141000000013],[-83.958054000000004,72.746643000000063],[-83.955275999999913,72.748322000000087],[-83.953063999999927,72.752487000000087],[-83.956389999999999,72.754990000000078],[-83.989440999999999,72.76887499999998],[-84.040832999999964,72.77748100000008],[-84.073623999999995,72.781661999999983],[-84.108046999999942,72.785263000000043],[-84.218613000000005,72.794983000000116],[-84.246947999999975,72.79971299999994],[-84.291381999999942,72.812484999999981],[-84.311935000000005,72.820267000000115],[-84.335280999999952,72.829987000000017],[-84.419158999999922,72.853316999999947],[-84.528885000000002,72.882477000000051],[-84.577224999999942,72.892212000000086],[-84.652495999999985,72.899429000000055],[-84.706389999999999,72.905823000000055],[-84.74360699999994,72.910812000000021],[-84.760558999999944,72.914153999999996],[-84.791107000000011,72.921371000000079],[-84.855835000000013,72.937485000000038],[-84.870269999999948,72.942200000000071],[-85.059998000000007,72.996643000000006],[-85.223609999999951,73.014984000000027],[-85.513901000000033,73.019149999999911],[-85.535277999999948,73.021927000000005],[-85.537216000000001,73.028320000000008],[-85.47193900000002,73.098037999999917],[-85.447768999999937,73.120254999999986],[-85.44027699999998,73.125533999999959],[-85.429442999999935,73.130539000000056],[-85.415832999999964,73.135269000000051],[-85.406951999999933,73.136383000000023],[-85.395554000000004,73.135544000000095],[-85.379990000000021,73.133605999999929],[-85.37332200000003,73.130814000000044],[-85.369995000000017,73.128311000000053],[-85.363891999999964,73.120818999999926],[-85.35943599999996,73.113876000000118],[-85.358046999999942,73.109711000000118],[-85.333618000000001,73.092484000000127],[-85.300277999999935,73.078049000000021],[-85.256888999999944,73.071487000000104],[-85.248061999999948,73.068649000000107],[-85.240891000000033,73.066818000000126],[-85.188057000000015,73.059814000000074],[-85.175887999999986,73.058655000000101],[-85.166388999999981,73.060654000000113],[-85.171393999999964,73.066315000000088],[-85.152495999999985,73.072769000000108],[-85.186935000000005,73.096939000000134],[-85.226943999999946,73.115814000000057],[-85.229172000000005,73.12303200000008],[-85.227782999999988,73.129150000000038],[-85.223052999999993,73.134720000000129],[-85.213622999999984,73.13888500000013],[-85.191939999999988,73.141663000000108],[-85.148345999999947,73.141663000000108],[-85.089171999999962,73.137496999999996],[-85.053329000000019,73.13220200000012],[-85.003066999999874,73.121918000000107],[-84.988602000000014,73.116928000000087],[-84.921386999999982,73.098327999999924],[-84.904175000000009,73.09526100000005],[-84.829726999999878,73.085541000000148],[-84.772781000000009,73.081100000000049],[-84.556655999999975,73.064423000000033],[-84.212508999999955,73.040268000000026],[-84.077224999999942,73.03387500000008],[-83.92332499999992,73.033600000000035],[-83.867766999999901,73.029709000000139],[-83.84973100000002,73.027481000000023],[-83.832503999999972,73.024155000000007],[-83.761397999999929,73.006378000000097],[-83.718886999999995,72.989151000000106],[-83.634445000000028,72.982483000000116],[-83.633330999999941,72.983322000000101],[-83.634445000000028,72.986374000000012],[-83.648346000000004,72.991364000000033],[-83.692490000000021,73.005554000000132],[-83.776672000000019,73.031097000000045],[-83.879715000000033,73.051926000000037],[-83.913619999999923,73.058318999999983],[-83.93472300000002,73.061096000000077],[-83.955841000000021,73.06164600000011],[-83.974716000000001,73.060806000000071],[-84.039718999999991,73.056366000000082],[-84.05972300000002,73.056366000000082],[-84.095001000000025,73.058318999999983],[-84.197495000000004,73.068604000000107],[-84.236938000000009,73.081100000000049],[-84.248046999999985,73.083327999999995],[-84.275283999999999,73.086929000000055],[-84.433884000000035,73.106093999999985],[-84.531112999999948,73.110260000000096],[-84.547501000000011,73.111374000000069],[-84.584441999999967,73.115814000000057],[-84.736389000000031,73.137206999999989],[-84.789444000000003,73.145828000000108],[-84.865004999999883,73.163604999999961],[-84.912780999999939,73.175537000000134],[-84.942215000000033,73.181655999999975],[-84.985275000000001,73.190536000000009],[-85.020003999999972,73.196930000000066],[-85.058334000000002,73.200546000000088],[-85.100554999999986,73.201385000000073],[-85.138061999999934,73.204436999999984],[-85.170546999999942,73.210815000000139],[-85.17721599999993,73.213882000000069],[-85.184433000000013,73.21887200000009],[-85.188599000000011,73.223602000000142],[-85.188599000000011,73.228867000000037],[-85.138900999999976,73.299988000000042],[-85.134170999999981,73.305542000000059],[-85.115828999999962,73.314423000000147],[-85.077788999999882,73.329437000000041],[-85.017226999999991,73.348328000000095],[-84.979996000000028,73.35664399999996],[-84.808043999999938,73.388321000000133],[-84.78694200000001,73.388046000000088],[-84.756392999999946,73.381088000000091],[-84.741669000000002,73.376083000000051],[-84.72193900000002,73.362198000000149],[-84.712783999999942,73.348602000000028],[-84.694992000000013,73.326934999999992],[-84.685271999999998,73.319991999999957],[-84.654998999999975,73.305542000000059],[-84.424712999999997,73.232483000000059],[-84.408889999999985,73.228591999999992],[-84.392501999999922,73.226089000000002],[-84.377212999999927,73.224152000000004],[-84.355269999999905,73.223037999999974],[-84.33944699999995,73.226089000000002],[-84.347777999999948,73.232483000000059],[-84.413054999999986,73.272217000000012],[-84.451110999999969,73.288588999999945],[-84.460830999999985,73.291931000000091],[-84.48971599999993,73.299713000000054],[-84.563613999999973,73.313873000000115],[-84.576674999999909,73.317764000000011],[-84.586945000000014,73.323044000000095],[-84.597778000000005,73.330826000000059],[-84.653609999999958,73.387206999999933],[-84.656113000000005,73.390549000000078],[-84.652221999999938,73.393326000000002],[-84.642226999999934,73.397217000000069],[-84.625,73.401382000000069],[-84.583892999999989,73.409149000000014],[-84.434157999999968,73.435256999999979],[-84.284438999999963,73.461105000000089],[-84.229172000000005,73.47026100000005],[-84.194442999999978,73.474701000000039],[-84.171386999999925,73.47526600000009],[-84.113892000000021,73.469147000000078],[-83.751923000000033,73.427490000000034],[-83.724715999999944,73.41304000000008],[-83.717772999999966,73.405822999999998],[-83.719726999999978,73.399719000000118],[-83.724715999999944,73.393875000000094],[-83.728058000000033,73.381088000000091],[-83.720550999999944,73.365814000000057],[-83.712218999999948,73.351928999999927],[-83.702498999999875,73.339157000000114],[-83.689437999999939,73.323608000000036],[-83.665833000000021,73.307754999999986],[-83.657500999999968,73.303589000000102],[-83.648055999999997,73.300261999999975],[-83.630828999999949,73.297210999999947],[-83.613891999999964,73.296097000000145],[-83.600554999999929,73.297485000000052],[-83.593062999999972,73.301375999999948],[-83.590835999999911,73.307204999999954],[-83.591109999999958,73.313309000000004],[-83.594161999999983,73.325272000000041],[-83.624999999999943,73.415268000000026],[-83.633330999999941,73.428864000000033],[-83.642501999999979,73.439696999999967],[-83.652495999999985,73.445250999999985],[-83.663895000000025,73.449707000000103],[-83.679717999999923,73.453872999999987],[-83.696945000000028,73.457214000000022],[-83.754456000000005,73.463318000000072],[-83.810546999999929,73.470534999999984],[-83.954726999999934,73.492752000000053],[-83.978606999999954,73.49664300000012],[-83.993606999999997,73.500275000000045],[-84.00418099999996,73.504166000000112],[-84.006957999999941,73.509720000000129],[-83.996947999999975,73.51388500000013],[-83.979172000000005,73.518051000000014],[-83.740828999999962,73.567763999999954],[-83.577498999999989,73.59637500000008],[-83.445267000000001,73.615814],[-83.219161999999869,73.656647000000078],[-83.085280999999952,73.65776100000005],[-83.018340999999907,73.666091999999935],[-82.931106999999997,73.690536000000066],[-82.902221999999938,73.700272000000041],[-82.889998999999989,73.705261000000007],[-82.872771999999884,73.715546000000131],[-82.869720000000029,73.721099999999979],[-82.86332699999997,73.726089000000115],[-82.852782999999931,73.730270000000019],[-82.840835999999967,73.73275799999999],[-82.820846999999958,73.733597000000145],[-82.636123999999938,73.727767999999912],[-82.529998999999918,73.722214000000122],[-82.475006000000008,73.719985999999949],[-82.413894999999968,73.718871999999976],[-82.367492999999911,73.719147000000021],[-82.21945199999999,73.725266000000033],[-81.990828999999962,73.731368999999972],[-81.618057000000022,73.721099999999979],[-81.572509999999966,73.719711000000132],[-81.553878999999938,73.717209000000082],[-81.536666999999852,73.713882000000126],[-81.476105000000018,73.698029000000076],[-81.457229999999981,73.691086000000098],[-81.282500999999968,73.58027600000014],[-81.239715999999873,73.546936000000073],[-81.228881999999999,73.535538000000088],[-81.21945199999999,73.521378000000141],[-81.197494999999947,73.477203000000145],[-81.188323999999909,73.389709000000039],[-81.21166999999997,73.326096000000007],[-81.216109999999958,73.314697000000081],[-81.215835999999967,73.303863999999919],[-81.214172000000019,73.291931000000091],[-81.20944199999991,73.272766000000104],[-81.204726999999991,73.266662999999994],[-81.192490000000021,73.260543999999982],[-81.177490000000034,73.256378000000041],[-81.101668999999958,73.238312000000064],[-81.074448000000018,73.232208000000071],[-80.900283999999942,73.209427000000005],[-80.712783999999942,73.180267000000129],[-80.664718999999934,73.171097000000088],[-80.640839000000028,73.165543000000127],[-80.61721799999998,73.157760999999994],[-80.596389999999985,73.148041000000092],[-80.557769999999948,73.111374000000069],[-80.547501000000011,73.098037999999917],[-80.547774999999945,73.091369999999984],[-80.549437999999952,73.081940000000088],[-80.59333799999996,73.025818000000072],[-80.617492999999968,73.005554000000132],[-80.641388000000006,72.996094000000085],[-80.647507000000019,72.990540000000067],[-80.652221999999938,72.974700999999982],[-80.650833000000034,72.969146999999964],[-80.633895999999936,72.940536000000066],[-80.642501999999979,72.93553200000008],[-80.642775999999969,72.92886400000009],[-80.638335999999981,72.922760000000096],[-80.537216000000001,72.851089000000002],[-80.513901000000033,72.838882000000012],[-80.487777999999992,72.828598],[-80.440552000000025,72.818603999999993],[-80.405563000000029,72.813309000000118],[-80.349166999999966,72.806366000000139],[-80.333327999999938,72.803040000000067],[-80.319457999999941,72.799149],[-80.299987999999985,72.788040000000137],[-80.283614999999998,72.77748100000008],[-80.247498000000007,72.730545000000063],[-80.258056999999894,72.724425999999994],[-80.332229999999925,72.712494000000049],[-80.361664000000019,72.706099999999992],[-80.444991999999957,72.673599000000081],[-80.464721999999938,72.665268000000026],[-80.541381999999999,72.628860000000145],[-80.55610699999994,72.6202550000001],[-80.556380999999874,72.607208000000071],[-80.648620999999991,72.554977000000008],[-80.676391999999964,72.547211000000118],[-80.765288999999996,72.516937000000098],[-80.942489999999964,72.455261000000121],[-80.953887999999949,72.450546000000088],[-80.988327000000027,72.429703000000018],[-81.186935000000005,72.299149000000114],[-81.192490000000021,72.293594000000041],[-81.199722000000008,72.289153999999996],[-81.222504000000015,72.281662000000097],[-81.239166000000012,72.27777100000003],[-81.30471799999998,72.268326000000116],[-81.379439999999988,72.241652999999928],[-81.365279999999984,72.241652999999928],[-81.301392000000021,72.246094000000028],[-81.285827999999924,72.247208000000057],[-81.253066999999987,72.251938000000052],[-81.241942999999992,72.254439999999931],[-81.229720999999927,72.258606000000043],[-81.164169000000015,72.287201000000096],[-81.037506000000008,72.351089000000115],[-80.929442999999935,72.40026899999998],[-80.821670999999981,72.439148000000046],[-80.715012000000002,72.473037999999974],[-80.600554999999986,72.506653000000028],[-80.580291999999929,72.509995000000004],[-80.554442999999992,72.512497000000053],[-80.539443999999946,72.511658000000068],[-80.52555799999999,72.508040999999935],[-80.516402999999912,72.503875999999934],[-80.508895999999993,72.49664300000012],[-80.503066999999987,72.484985000000108],[-80.495270000000005,72.464157000000057],[-80.492767000000015,72.453049000000021],[-80.493606999999997,72.447205000000054],[-80.514174999999966,72.379700000000014],[-80.525009000000011,72.374146000000053],[-80.54222099999987,72.37052900000009],[-80.564437999999939,72.366653000000042],[-80.603058000000033,72.363037000000134],[-80.655562999999972,72.351928999999984],[-80.669158999999979,72.347214000000122],[-80.680556999999965,72.342209000000082],[-80.783324999999991,72.290267999999969],[-80.794158999999922,72.284714000000008],[-80.808333999999945,72.274155000000121],[-80.854172000000005,72.235535000000027],[-80.896956999999929,72.194427000000076],[-80.905563000000029,72.180542000000003],[-80.816665999999998,72.150542999999971],[-80.769454999999994,72.141663000000108],[-80.753890999999953,72.140548999999965],[-80.709732000000031,72.131927000000132],[-80.580840999999964,72.094437000000084],[-80.569457999999997,72.088318000000072],[-80.567229999999995,72.077208999999982],[-80.567229999999995,72.072768999999937],[-80.574172999999917,72.068329000000119],[-80.588333000000034,72.064148000000046],[-80.630554000000018,72.062195000000088],[-80.646118000000001,72.063309000000061],[-80.686661000000015,72.073043999999982],[-80.741942999999935,72.094147000000078],[-80.941100999999946,72.087494000000106],[-81.080291999999929,72.051651000000049],[-81.08666999999997,72.04664600000001],[-81.083327999999938,72.045532000000037],[-81.065001999999936,72.041655999999932],[-81.046660999999972,72.039978000000019],[-80.990554999999972,72.037766000000147],[-80.927215999999987,72.037766000000147],[-80.906386999999995,72.039978000000019],[-80.892226999999991,72.044144000000131],[-80.886397999999986,72.049713000000111],[-80.879439999999988,72.054152999999928],[-80.866652999999985,72.0577550000001],[-80.84722899999997,72.056641000000127],[-80.792770000000019,72.02777100000003],[-80.794158999999922,72.022491000000002],[-80.821395999999879,71.95637499999998],[-80.833327999999995,71.945815999999979],[-80.849441999999954,71.934707999999944],[-80.886123999999938,71.920821999999987],[-80.933318999999926,71.908875000000023],[-80.975005999999951,71.895827999999995],[-80.980834999999956,71.890273999999977],[-80.983611999999994,71.886383000000137],[-80.971664000000033,71.881653000000085],[-80.950287000000003,71.881088000000034],[-80.926392000000021,71.882750999999985],[-80.903610000000015,71.885268999999937],[-80.868056999999965,71.893051000000071],[-80.767226999999991,71.929428000000087],[-80.756119000000012,71.93414300000012],[-80.750290000000007,71.939697000000081],[-80.746947999999975,71.945251000000098],[-80.744720000000029,71.951934999999992],[-80.745834000000002,71.957488999999953],[-80.75556899999998,71.971099999999922],[-80.758346999999958,71.977768000000083],[-80.746947999999975,71.982483000000116],[-80.659164000000033,72.003052000000082],[-80.639449999999954,72.006377999999927],[-80.620543999999995,72.006103999999993],[-80.535277999999948,72.016098000000056],[-80.448883000000023,72.029160000000047],[-80.410552999999993,72.039429000000098],[-80.385009999999966,72.048325000000034],[-80.350554999999929,72.069153000000085],[-80.347777999999948,72.075272000000098],[-80.346663999999976,72.081100000000049],[-80.347228999999913,72.088318000000072],[-80.352492999999981,72.095534999999984],[-80.358611999999994,72.101379000000009],[-80.370269999999948,72.10803199999998],[-80.383056999999951,72.113312000000008],[-80.410278000000005,72.121368000000075],[-80.433884000000035,72.132751000000098],[-80.445540999999992,72.139709000000096],[-80.455275999999969,72.146652000000074],[-80.478607000000011,72.168593999999985],[-80.483321999999987,72.175261999999918],[-80.486938000000009,72.183044000000052],[-80.486664000000019,72.189423000000147],[-80.468062999999972,72.191925000000026],[-80.426940999999886,72.191086000000041],[-80.408614999999884,72.189148000000102],[-80.393616000000009,72.177200000000084],[-80.376663000000008,72.17442299999999],[-80.355559999999912,72.17442299999999],[-80.331389999999999,72.176086000000112],[-80.241103999999893,72.197754000000032],[-80.235274999999945,72.203323000000012],[-80.244445999999925,72.209717000000069],[-80.27305599999994,72.219147000000135],[-80.279723999999931,72.22554000000008],[-80.301665999999955,72.248596000000134],[-80.306380999999988,72.255264000000125],[-80.295546999999942,72.274429000000055],[-80.289718999999934,72.279984000000127],[-80.272231999999974,72.290267999999969],[-80.260833999999988,72.294983000000002],[-80.24221799999998,72.297485000000108],[-80.22444200000001,72.296371000000136],[-80.194153000000028,72.28776600000009],[-80.155838000000017,72.273605000000089],[-80.134734999999921,72.262771999999927],[-80.113051999999982,72.244141000000127],[-80.08555599999994,72.226654000000053],[-80.021392999999989,72.189697000000081],[-79.991668999999888,72.176651000000106],[-79.962783999999999,72.168868999999972],[-79.947220000000016,72.165267999999912],[-79.899733999999967,72.15554800000001],[-79.840285999999935,72.145263999999997],[-79.790557999999976,72.137772000000041],[-79.761123999999995,72.134155000000078],[-79.685546999999929,72.126372999999944],[-79.674437999999952,72.126647999999989],[-79.672501000000011,72.129700000000071],[-79.691665999999998,72.141663000000108],[-79.719161999999926,72.148331000000098],[-79.789992999999981,72.155823000000055],[-79.811110999999983,72.160263000000043],[-79.854995999999971,72.171097000000145],[-79.923889000000031,72.190536000000009],[-79.941101000000003,72.195816000000093],[-80.045546999999999,72.242477000000122],[-80.15194699999995,72.310531999999967],[-80.166396999999961,72.322220000000129],[-80.164443999999946,72.32748400000014],[-80.155562999999916,72.336928999999998],[-80.133620999999948,72.349716000000001],[-80.115279999999927,72.359421000000111],[-80.076400999999976,72.378859999999975],[-80.064712999999983,72.3836060000001],[-80.052215999999987,72.387771999999984],[-79.991942999999992,72.402771000000087],[-79.957229999999925,72.408325000000048],[-79.874434999999949,72.470534999999984],[-79.870834000000002,72.483046999999999],[-79.86332699999997,72.489699999999971],[-79.836944999999901,72.498596000000077],[-79.820847000000015,72.501389000000074],[-79.799164000000019,72.501389000000074],[-79.780562999999972,72.499420000000043],[-79.770844000000011,72.49664300000012],[-79.734160999999915,72.484420999999998],[-79.700561999999991,72.472488000000112],[-79.692215000000033,72.466933999999924],[-79.768638999999894,72.411766],[-79.687865999999985,72.384392000000105],[-79.595550999999944,72.334717000000126],[-79.638901000000033,72.289153999999996],[-79.668059999999912,72.280823000000112],[-79.705565999999976,72.273605000000089],[-79.720000999999968,72.269440000000088],[-79.731673999999998,72.264708999999982],[-79.759734999999921,72.250549000000092],[-79.768616000000009,72.2452550000001],[-79.774718999999891,72.239700000000028],[-79.775283999999999,72.233322000000044],[-79.769729999999925,72.225815000000125],[-79.75,72.215546000000074],[-79.732773000000009,72.212203999999986],[-79.712783999999999,72.211104999999975],[-79.701110999999969,72.215820000000008],[-79.565825999999959,72.275269000000094],[-79.485001000000011,72.325545999999974],[-79.355559999999912,72.399155000000007],[-79.342498999999975,72.40026899999998],[-79.329726999999991,72.397217000000069],[-79.243331999999953,72.374419999999986],[-79.182495000000017,72.358322000000101],[-79.146666999999979,72.345825000000104],[-79.113327000000027,72.331099999999992],[-79.082229999999925,72.313873000000001],[-79.012787000000003,72.273880000000133],[-78.945540999999935,72.199996999999996],[-78.943603999999993,72.193038999999999],[-78.946945000000028,72.186919999999986],[-79.036391999999978,72.069443000000092],[-79.136123999999938,72.007492000000127],[-79.145003999999972,72.002487000000087],[-79.156661999999983,71.997757000000036],[-79.206389999999942,71.986649000000057],[-79.229996000000028,71.980270000000019],[-79.233063000000016,71.976379000000122],[-79.203063999999983,71.961928999999998],[-79.19027699999998,71.958328000000108],[-79.176392000000021,71.955826000000059],[-79.161117999999931,71.954437000000041],[-79.138610999999912,71.955261000000007],[-79.123046999999929,71.958038000000101],[-79.099730999999963,71.967209000000082],[-79.090835999999854,71.972488000000055],[-79.072234999999921,71.974990999999989],[-79.061110999999926,71.975266000000033],[-79.026671999999962,71.970535000000098],[-78.81806899999998,71.935257000000092],[-78.768889999999999,71.92692599999998],[-78.722503999999901,71.918869000000029],[-78.683884000000035,71.909714000000008],[-78.65306099999998,71.893875000000037],[-78.639724999999999,71.884430000000009],[-78.625823999999852,71.879150000000095],[-78.585555999999997,71.865814],[-78.571395999999879,71.862762000000032],[-78.551392000000021,71.861098999999967],[-78.529174999999952,71.861649],[-78.511123999999995,71.864699999999971],[-78.503615999999965,71.868866000000082],[-78.508346999999901,71.876373000000001],[-78.595551,71.933318999999983],[-78.607498000000021,71.938583000000108],[-78.622222999999963,71.942200000000071],[-78.691375999999991,71.949707000000046],[-78.740554999999972,71.958038000000101],[-78.855559999999855,71.979706000000022],[-78.914444000000003,72.007767000000115],[-78.923614999999984,72.014999000000046],[-78.924438000000009,72.020538000000045],[-78.877486999999974,72.153320000000065],[-78.869445999999925,72.166656000000046],[-78.866104000000007,72.170532000000094],[-78.854445999999939,72.173035000000084],[-78.843613000000005,72.171097000000145],[-78.554442999999992,72.111374000000069],[-78.512221999999952,72.101089000000002],[-78.487777999999935,72.092484000000127],[-78.476105000000018,72.087204000000099],[-78.460830999999928,72.073318000000086],[-78.432770000000005,72.03804000000008],[-78.39527899999996,71.982483000000116],[-78.389998999999989,71.969437000000028],[-78.392775999999969,71.949997000000053],[-78.391678000000013,71.943587999999977],[-78.386672999999973,71.933318999999983],[-78.381942999999922,71.92804000000001],[-78.365279999999927,71.917480000000012],[-78.317779999999971,71.888321000000076],[-78.226669000000015,71.833054000000118],[-78.210830999999985,71.825821000000133],[-78.18499799999995,71.817490000000021],[-78.157607999999982,71.810577000000023],[-78.123046999999929,71.806366000000139],[-78.090560999999923,71.800812000000121],[-78.05972300000002,71.79414399999996],[-77.924437999999952,71.764709000000096],[-77.907775999999956,71.76638800000012],[-77.904448999999943,71.768051000000014],[-77.90695199999999,71.770538000000101],[-77.914169000000015,71.773605000000032],[-77.966659999999933,71.786652000000061],[-77.997498000000007,71.793319999999994],[-78.029723999999931,71.798874000000012],[-78.085830999999985,71.813309000000118],[-78.107223999999917,71.819153000000142],[-78.139998999999932,71.830551000000128],[-78.178878999999995,71.848602000000142],[-78.308884000000035,71.921096999999975],[-78.316665999999998,71.929428000000087],[-78.321395999999993,71.936920000000043],[-78.315001999999993,71.942474000000004],[-78.305266999999901,71.946930000000123],[-78.279175000000009,71.953598000000113],[-78.258895999999993,71.956650000000025],[-78.178878999999995,71.967209000000082],[-78.156951999999933,71.968323000000055],[-78.141677999999956,71.964157000000114],[-78.018616000000009,71.890823000000125],[-77.974716000000001,71.859984999999938],[-77.785552999999993,71.787490999999989],[-77.807769999999948,71.823044000000039],[-77.960006999999962,71.881653000000085],[-78.096953999999982,71.96804800000001],[-78.107223999999917,71.974152000000061],[-78.116393999999957,71.976928999999984],[-78.149733999999967,71.980545000000006],[-78.156386999999995,71.980545000000006],[-78.196105999999929,71.978592000000049],[-78.262222000000008,71.972763000000043],[-78.281386999999995,71.973877000000016],[-78.298614999999984,71.977478000000076],[-78.322509999999909,71.985809000000017],[-78.334166999999923,71.99136400000009],[-78.341110000000015,71.99859600000002],[-78.342498999999918,72.012771999999984],[-78.341674999999952,72.019149999999968],[-78.341674999999952,72.031936999999971],[-78.356948999999929,72.05831900000004],[-78.375548999999978,72.085815000000082],[-78.386672999999973,72.095534999999984],[-78.402221999999938,72.104980000000069],[-78.424437999999952,72.113602000000071],[-78.436935000000005,72.117477000000008],[-78.468886999999995,72.12414600000011],[-78.515014999999948,72.131363000000022],[-78.599990999999989,72.145263999999997],[-78.696654999999964,72.163605000000018],[-78.809998000000007,72.197205000000054],[-78.842498999999918,72.209152000000017],[-78.854720999999984,72.214432000000102],[-78.870834000000002,72.226654000000053],[-78.869155999999919,72.229706000000022],[-78.734725999999966,72.328598000000113],[-78.615829000000019,72.359146000000067],[-78.604172000000005,72.359421000000111],[-78.580565999999919,72.354156000000046],[-78.515839000000028,72.330551000000071],[-78.512511999999901,72.324432000000002],[-78.519164999999987,72.319153000000028],[-78.528335999999911,72.313873000000001],[-78.533324999999991,72.30914300000012],[-78.53694200000001,72.303314000000114],[-78.537780999999995,72.254715000000147],[-78.531386999999938,72.240265000000022],[-78.529174999999952,72.235535000000027],[-78.520843999999954,72.229155999999989],[-78.42193599999996,72.170822000000101],[-78.40834000000001,72.166382000000112],[-78.399733999999967,72.167206000000078],[-78.390839000000028,72.169982999999945],[-78.386123999999995,72.172485000000052],[-78.384170999999981,72.175537000000134],[-78.411117999999988,72.216660000000047],[-78.414718999999934,72.220535000000041],[-78.422775000000001,72.224152000000004],[-78.459732000000031,72.233871000000022],[-78.472777999999948,72.242477000000122],[-78.46833799999996,72.314986999999974],[-78.462783999999942,72.318878000000041],[-78.451110999999912,72.324158000000068],[-78.439437999999996,72.326660000000004],[-78.40834000000001,72.325821000000019],[-78.305266999999901,72.313309000000004],[-78.012512000000015,72.274994000000106],[-77.893615999999952,72.259430000000009],[-77.827498999999989,72.248596000000134],[-77.793883999999991,72.242202999999961],[-77.665282999999874,72.204712000000029],[-77.655272999999966,72.201385000000073],[-77.648620999999991,72.194137999999953],[-77.644454999999994,72.186646000000053],[-77.540833000000021,72.17692599999998],[-77.381103999999993,72.184982000000048],[-77.32417299999986,72.18609600000002],[-77.289444000000003,72.183319000000097],[-77.239989999999977,72.17442299999999],[-77.115828999999962,72.148331000000098],[-77.039443999999946,72.131653000000028],[-77.023330999999985,72.128860000000032],[-77.006118999999956,72.127472000000125],[-76.99722300000002,72.128036000000066],[-76.995833999999945,72.128860000000032],[-76.994719999999973,72.130539000000056],[-77.005004999999983,72.134430000000123],[-77.068619000000012,72.152206000000092],[-77.251677999999913,72.193313999999987],[-77.27806099999998,72.196930000000066],[-77.306945999999925,72.19802900000002],[-77.397232000000031,72.192748999999992],[-77.455840999999964,72.190811000000053],[-77.476944000000003,72.191360000000145],[-77.514175000000023,72.193862999999965],[-77.549987999999985,72.19802900000002],[-77.578888000000006,72.204163000000051],[-77.604172000000005,72.211929000000112],[-77.623885999999914,72.221100000000092],[-77.658614999999998,72.231658999999922],[-77.760833999999932,72.257217000000026],[-77.823058999999944,72.271927000000005],[-77.866104000000007,72.281097000000045],[-77.949996999999883,72.296097000000032],[-78.072509999999966,72.312485000000038],[-78.121384000000035,72.319716999999969],[-78.154723999999987,72.325545999999974],[-78.220001000000025,72.337769000000037],[-78.326950000000011,72.359146000000067],[-78.37388599999997,72.36943100000002],[-78.389175000000023,72.37303200000008],[-78.473327999999981,72.394989000000123],[-78.499161000000015,72.404709000000025],[-78.520843999999954,72.414993000000038],[-78.559158000000025,72.438034000000073],[-78.561110999999926,72.444977000000051],[-78.556655999999919,72.504440000000102],[-78.443053999999961,72.581939999999975],[-78.430556999999965,72.586655000000007],[-78.170273000000009,72.653594999999996],[-78.156386999999995,72.656937000000084],[-78.001677999999913,72.682480000000055],[-77.869994999999903,72.697479000000101],[-77.845001000000025,72.698868000000061],[-77.78083799999996,72.706940000000031],[-77.768616000000009,72.709427000000119],[-77.701401000000033,72.724701000000039],[-77.670273000000009,72.732208000000128],[-77.656951999999876,72.736099000000024],[-77.639998999999989,72.743865999999969],[-77.627486999999974,72.74859600000002],[-77.613892000000021,72.751663000000121],[-77.576401000000033,72.755554000000018],[-77.532226999999921,72.756943000000035],[-77.513625999999988,72.754715000000033],[-77.413054999999872,72.752212999999983],[-77.259734999999978,72.751663000000121],[-77.05581699999999,72.752861000000109],[-77.002501999999993,72.749419999999986],[-76.947219999999902,72.743865999999969],[-76.799728000000016,72.727478000000133],[-76.753066999999987,72.720534999999927],[-76.693053999999961,72.694702000000007],[-76.684997999999894,72.691085999999927],[-76.662505999999894,72.678588999999988],[-76.653609999999958,72.670821999999987],[-76.655272999999966,72.664429000000041],[-76.65972899999997,72.658324999999991],[-76.646118000000001,72.639708999999982],[-76.584732000000031,72.628585999999984],[-76.428328999999962,72.614151000000049],[-76.328339000000028,72.607483000000116],[-76.288329999999917,72.604980000000126],[-76.215285999999935,72.596100000000092],[-76.182219999999973,72.58998100000008],[-76.166945999999996,72.58638000000002],[-76.155562999999916,72.580826000000002],[-76.150283999999999,72.574158000000011],[-76.154723999999931,72.562485000000038],[-76.160552999999936,72.54942299999999],[-76.165833000000021,72.538315000000011],[-76.162506000000008,72.526093000000003],[-76.156112999999948,72.518051000000071],[-76.121657999999911,72.478317000000118],[-76.107773000000009,72.473037999999974],[-76.087783999999999,72.471648999999957],[-76.069457999999997,72.474991000000102],[-76.046386999999868,72.483597000000032],[-76.036941999999897,72.489426000000037],[-76.037780999999939,72.496368000000132],[-76.052215999999987,72.51138300000008],[-76.068619000000012,72.525818000000015],[-76.077224999999942,72.536377000000073],[-76.074172999999917,72.541656000000046],[-76.06471299999987,72.549988000000042],[-76.018889999999999,72.574431999999945],[-76.005843999999968,72.579163000000108],[-75.988601999999958,72.580826000000002],[-75.931945999999925,72.583603000000096],[-75.885284000000013,72.584152000000074],[-75.841948999999943,72.583053999999947],[-75.798888999999974,72.581939999999975],[-75.759170999999981,72.579163000000108],[-75.56806899999998,72.557479999999941],[-75.553328999999962,72.553589000000102],[-75.547226000000023,72.545532000000094],[-75.537780999999939,72.539703000000088],[-75.521117999999888,72.536102000000028],[-75.472228999999913,72.527480999999966],[-75.435271999999998,72.522491000000059],[-75.379439999999931,72.51638800000012],[-75.360001000000011,72.515548999999965],[-75.301666000000012,72.509720000000129],[-75.231673999999998,72.500549000000035],[-75.215285999999878,72.497482000000105],[-75.192490000000021,72.491928000000087],[-75.186661000000015,72.487488000000099],[-75.189163000000008,72.478317000000118],[-75.199158000000011,72.466933999999924],[-75.200287000000003,72.461929000000055],[-75.160277999999948,72.421097000000088],[-75.132492000000013,72.393600000000106],[-75.054169000000002,72.328873000000101],[-75.034164000000033,72.317490000000134],[-75,72.298369999999977],[-74.980559999999912,72.288315000000068],[-74.950835999999981,72.269989000000066],[-74.943603999999993,72.263321000000076],[-74.942490000000021,72.255829000000119],[-74.947494999999947,72.249710000000107],[-75.044997999999964,72.188308999999947],[-75.068068999999923,72.179152999999985],[-75.225280999999995,72.122482000000105],[-75.238326999999913,72.118317000000104],[-75.25306699999993,72.116378999999938],[-75.271666999999979,72.117203000000075],[-75.291381999999885,72.119431000000077],[-75.323623999999938,72.125534000000016],[-75.387511999999901,72.134430000000123],[-75.440552000000025,72.141098000000113],[-75.477782999999988,72.144714000000135],[-75.520003999999972,72.146102999999982],[-75.607498000000021,72.143326000000059],[-75.710006999999962,72.136658000000068],[-75.73332199999993,72.134155000000078],[-75.813889000000017,72.122482000000105],[-75.866652999999985,72.113876000000005],[-76.015015000000005,72.086655000000121],[-76.033324999999934,72.081100000000049],[-76.054717999999866,72.073043999999982],[-76.078063999999983,72.059417999999994],[-76.084166999999923,72.049713000000111],[-76.09973100000002,72.02887000000004],[-76.111938000000009,72.018050999999957],[-76.128052000000025,72.004166000000055],[-76.142226999999934,71.99331699999999],[-76.156386999999881,71.985260000000039],[-76.173614999999984,71.975540000000137],[-76.192490000000021,71.967758000000003],[-76.234726000000023,71.957488999999953],[-76.262511999999901,71.949707000000046],[-76.274445000000014,71.944427000000132],[-76.301665999999955,71.930542000000059],[-76.318344000000025,71.919983000000002],[-76.348052999999879,71.891662999999994],[-76.31082200000003,71.884720000000016],[-76.089721999999938,71.978867000000093],[-76.073058999999944,71.989425999999924],[-76.063323999999966,72],[-76.049727999999902,72.017761000000121],[-76.047501000000011,72.023604999999975],[-76.043609999999944,72.030272999999966],[-76.029448999999943,72.041091999999992],[-76.019729999999981,72.046097000000032],[-75.998610999999983,72.054152999999928],[-75.956115999999952,72.067215000000147],[-75.89445499999988,72.082214000000022],[-75.828338999999971,72.096939000000134],[-75.796660999999915,72.103591999999935],[-75.710555999999997,72.113312000000008],[-75.630554000000018,72.11970500000001],[-75.586120999999991,72.12164300000012],[-75.528335999999967,72.120818999999983],[-75.488051999999925,72.118866000000025],[-75.433060000000012,72.112761999999975],[-75.23332199999993,72.084152000000131],[-75.226105000000018,72.080276000000083],[-75.219451999999876,72.074432000000058],[-75.218886999999995,72.070267000000058],[-75.221114999999998,72.064696999999967],[-75.228881999999942,72.059143000000006],[-75.255279999999914,72.046097000000032],[-75.281676999999888,72.038589000000059],[-75.317504999999926,72.031661999999926],[-75.338332999999977,72.02887000000004],[-75.404174999999952,72.025543000000084],[-75.449432000000002,72.02526899999998],[-75.494155999999975,72.021378000000084],[-75.515015000000005,72.018326000000002],[-75.548049999999989,72.011107999999979],[-75.574172999999917,72.00360100000006],[-75.586670000000026,71.999146000000053],[-75.606383999999935,71.989425999999924],[-75.613892000000021,71.983871000000022],[-75.618880999999988,71.978592000000049],[-75.686661000000015,71.883040999999992],[-75.697495000000004,71.858322000000044],[-75.691375999999877,71.850266000000147],[-75.688048999999921,71.842758000000117],[-75.6875,71.839157000000057],[-75.692215000000033,71.833328000000051],[-75.802490000000034,71.750548999999978],[-75.830001999999979,71.736649000000114],[-75.872222999999906,71.721375000000023],[-75.898345999999947,71.714432000000045],[-75.934157999999968,71.711105000000089],[-75.953612999999962,71.710266000000104],[-75.997497999999894,71.709152000000131],[-76.040282999999931,71.709426999999948],[-76.067504999999869,71.706650000000081],[-76.079177999999956,71.704437000000098],[-76.090835999999911,71.702208999999982],[-76.096114999999998,71.697479000000101],[-76.095839999999953,71.693863000000079],[-76.085281000000009,71.691924999999912],[-75.901671999999962,71.701096000000064],[-75.880279999999971,71.70248400000014],[-75.846953999999982,71.708602999999982],[-75.819457999999941,71.716934000000094],[-75.794998000000021,71.725815000000011],[-75.787215999999944,71.730545000000063],[-75.675003000000004,71.810532000000023],[-75.654998999999975,71.826096000000121],[-75.580001999999865,71.906097000000045],[-75.570281999999963,71.917480000000012],[-75.565825999999959,71.929703000000075],[-75.567229999999938,71.937485000000038],[-75.570281999999963,71.941360000000032],[-75.574447999999961,71.953048999999965],[-75.571944999999971,71.958878000000141],[-75.569167999999991,71.963882000000126],[-75.558334000000002,71.97665400000011],[-75.538605000000018,71.986374000000012],[-75.513335999999924,71.995254999999986],[-75.498046999999929,71.999146000000053],[-75.476669000000015,72.000823999999966],[-75.414444000000003,71.999709999999993],[-75.371932999999899,71.997757000000036],[-75.349441999999897,71.998032000000023],[-75.327788999999939,71.999419999999986],[-75.24888599999997,72.012771999999984],[-75.197768999999937,72.023315000000139],[-75.174437999999952,72.031936999999971],[-75.158614999999941,72.041655999999932],[-75.150283999999942,72.0577550000001],[-75.135009999999966,72.080551000000071],[-75.129990000000021,72.086380000000133],[-75.119155999999862,72.096375000000023],[-75.109160999999858,72.101089000000002],[-75.093613000000005,72.10803199999998],[-75.081389999999942,72.11303700000002],[-75.051392000000021,72.121917999999937],[-75.035827999999924,72.125809000000004],[-75.012511999999958,72.12831100000011],[-75,72.128525000000025],[-74.98443599999996,72.127472000000125],[-74.951675000000023,72.123306000000071],[-74.835006999999962,72.10386699999998],[-74.801391999999964,72.098327999999981],[-74.764449999999954,72.094711000000018],[-74.65943900000002,72.091094999999939],[-74.625548999999921,72.091369999999984],[-74.535278000000005,72.089705999999978],[-74.316390999999953,72.082214000000022],[-74.297226000000023,72.080826000000116],[-74.260009999999966,72.076096000000064],[-74.244155999999862,72.073043999999982],[-74.233321999999987,72.067489999999964],[-74.218062999999972,72.058029000000033],[-74.177489999999921,72.031936999999971],[-74.122222999999963,71.983597000000088],[-74.117766999999958,71.969985999999949],[-74.119445999999982,71.955826000000059],[-74.166107000000011,71.874695000000088],[-74.171111999999937,71.868591000000038],[-74.184998000000007,71.855819999999937],[-74.229996000000028,71.822768999999994],[-74.243056999999965,71.818603999999993],[-74.263335999999981,71.815810999999997],[-74.403060999999923,71.80386400000009],[-74.43998699999986,71.801925999999924],[-74.460555999999997,71.802765000000079],[-74.477782999999931,71.804977000000122],[-74.50140399999998,71.809708000000057],[-74.513625999999874,71.818053999999961],[-74.570557000000008,71.809418000000051],[-74.604996000000028,71.784714000000122],[-74.678328999999962,71.745254999999986],[-74.696105999999929,71.738586000000112],[-74.71362299999987,71.735260000000096],[-74.885009999999909,71.708602999999982],[-75,71.711914000000036],[-75.046660999999915,71.716095000000109],[-75.090560999999923,71.718048000000067],[-75.136672999999973,71.716934000000094],[-75.158051,71.715271000000143],[-75.342772999999909,71.695815999999979],[-75.363892000000021,71.691360000000088],[-75.378600999999946,71.686920000000043],[-75.389998999999989,71.681091000000038],[-75.393889999999942,71.677475000000015],[-75.391953000000001,71.674698000000092],[-75.385009999999909,71.674423000000104],[-75.241942999999878,71.686096000000077],[-75.178329000000019,71.694138000000066],[-75.085007000000019,71.700821000000076],[-75.043610000000001,71.699707000000046],[-75.025008999999955,71.698029000000133],[-75.009170999999924,71.694977000000051],[-74.941101000000003,71.674698000000092],[-74.934158000000025,71.670822000000044],[-74.93360899999999,71.663879000000009],[-74.93638599999997,71.658035000000041],[-74.945540999999935,71.652481000000023],[-74.956115999999952,71.648331000000042],[-75.008895999999993,71.631927000000076],[-75.055557000000022,71.622481999999991],[-75.114166000000012,71.611098999999967],[-75.194152999999972,71.595535000000098],[-75.206954999999994,71.591934000000037],[-75.398345999999947,71.525269000000094],[-75.40972899999997,71.519714000000022],[-75.408339999999953,71.514708999999982],[-75.406386999999938,71.512207000000046],[-75.402221999999938,71.512497000000053],[-75.205276000000026,71.546371000000079],[-75,71.607238999999993],[-74.861114999999927,71.649429000000112],[-74.851668999999958,71.654984000000013],[-74.799437999999952,71.678863999999976],[-74.784163999999976,71.682755000000043],[-74.718337999999903,71.693588000000034],[-74.697768999999937,71.696365000000128],[-74.686661000000015,71.696365000000128],[-74.672774999999945,71.692474000000061],[-74.631942999999978,71.662491000000102],[-74.629714999999919,71.65277100000003],[-74.631942999999978,71.646378000000084],[-74.646392999999989,71.631927000000076],[-74.674437999999896,71.608322000000101],[-74.689712999999983,71.598038000000031],[-74.704726999999934,71.588042999999971],[-74.713057999999933,71.583878000000141],[-74.733886999999982,71.575546000000145],[-74.811934999999949,71.547760000000096],[-74.869720000000029,71.541656000000046],[-74.922500999999897,71.53776600000009],[-74.940276999999867,71.538040000000024],[-74.97084000000001,71.537201000000039],[-74.990279999999984,71.536652000000117],[-75,71.535583000000088],[-75.027221999999995,71.532486000000006],[-75.036666999999966,71.530548000000067],[-75.081389999999942,71.515273999999977],[-75.107773000000009,71.503052000000025],[-75.124709999999936,71.492477000000065],[-75.15194699999995,71.471649000000014],[-75.152221999999995,71.466094999999996],[-75.146117999999944,71.463608000000079],[-75.12777699999998,71.465820000000008],[-75.115554999999972,71.469986000000063],[-75.106110000000001,71.481934000000081],[-75.093886999999938,71.49275200000011],[-75.084731999999974,71.498322000000144],[-75.06138599999997,71.506378000000041],[-75.05082699999997,71.509720000000016],[-75.033324999999934,71.513046000000031],[-75,71.517899000000114],[-74.993056999999908,71.518875000000037],[-74.944153000000028,71.521652000000131],[-74.877486999999974,71.524155000000121],[-74.857223999999974,71.523605000000089],[-74.838332999999921,71.521926999999948],[-74.828338999999971,71.517211999999915],[-74.71665999999999,71.419144000000131],[-74.699431999999945,71.390823000000069],[-74.700561999999934,71.386658000000068],[-74.705565999999976,71.380814000000044],[-74.715285999999992,71.375809000000004],[-74.888335999999981,71.287201000000096],[-75.075012000000015,71.204437000000041],[-75.081389999999942,71.17942800000003],[-75.065001999999993,71.180817000000047],[-75,71.199341000000061],[-74.987503000000004,71.203873000000101],[-74.874160999999958,71.247756999999979],[-74.864440999999943,71.252487000000031],[-74.671660999999972,71.359985000000052],[-74.654448999999943,71.370254999999986],[-74.637511999999958,71.380538999999999],[-74.632216999999969,71.385818000000029],[-74.628051999999968,71.392487000000074],[-74.625823999999852,71.39888000000002],[-74.626098999999954,71.405822999999998],[-74.631103999999993,71.419433999999967],[-74.638061999999991,71.426651000000106],[-74.646956999999929,71.433044000000052],[-74.657227000000034,71.438583000000051],[-74.719726999999978,71.462494000000106],[-74.726944000000003,71.466094999999996],[-74.735549999999989,71.472487999999942],[-74.736388999999974,71.476654000000053],[-74.743057000000022,71.511932000000058],[-74.73611499999987,71.530548000000067],[-74.723891999999978,71.541931000000091],[-74.714172000000019,71.546646000000123],[-74.701675000000023,71.551086000000112],[-74.686385999999914,71.554977000000008],[-74.663895000000025,71.557204999999954],[-74.628875999999934,71.554703000000075],[-74.619995000000017,71.55802900000009],[-74.583618000000001,71.585815000000025],[-74.576401000000033,71.591370000000097],[-74.543883999999991,71.631362999999965],[-74.381942999999922,71.677199999999971],[-74.345550999999944,71.689423000000033],[-74.335555999999997,71.694138000000066],[-74.317779999999971,71.704437000000098],[-74.309432999999956,71.712204000000042],[-74.306945999999982,71.71775800000006],[-74.299437999999952,71.723877000000073],[-74.288604999999905,71.727478000000133],[-74.268341000000021,71.730270000000019],[-74.146956999999929,71.738875999999948],[-74.12470999999988,71.738875999999948],[-74.109160999999972,71.735809000000017],[-74.103058000000033,71.733321999999987],[-74.097777999999948,71.72886699999998],[-74.123885999999914,71.680817000000104],[-74.128875999999877,71.67164600000001],[-74.142226999999991,71.661652000000004],[-74.15055799999999,71.657486000000063],[-74.173049999999989,71.651093000000117],[-74.202788999999996,71.645828000000051],[-74.220276000000013,71.641663000000051],[-74.232773000000009,71.637496999999939],[-74.239440999999999,71.634155000000021],[-74.24888599999997,71.621643000000063],[-74.253066999999987,71.611649],[-74.254455999999948,71.60664399999996],[-74.254729999999995,71.603867000000093],[-74.252228000000002,71.58998100000008],[-74.249161000000015,71.582489000000123],[-74.243056999999965,71.569716999999969],[-74.218886999999938,71.556641000000013],[-74.180282999999974,71.538315000000011],[-74.168334999999956,71.533324999999991],[-74.156386999999995,71.532211000000018],[-74.150283999999886,71.533324999999991],[-74.148620999999935,71.537491000000045],[-74.151671999999962,71.544983000000002],[-74.165008999999998,71.555252000000053],[-74.146118000000001,71.637496999999939],[-74.039718999999934,71.722213999999951],[-74.019164999999987,71.73803700000002],[-74.014724999999942,71.741089000000102],[-73.996947999999975,71.751389000000017],[-73.977782999999931,71.759720000000129],[-73.964447000000007,71.763321000000019],[-73.928329000000019,71.769150000000025],[-73.748046999999929,71.776931999999988],[-73.718886999999938,71.776931999999988],[-73.61610399999995,71.773315000000025],[-73.604172000000005,71.772217000000126],[-73.593886999999995,71.769988999999953],[-73.589721999999995,71.763321000000019],[-73.589995999999985,71.756943000000035],[-73.591675000000009,71.751937999999996],[-73.598343,71.738312000000008],[-73.612503000000004,71.722213999999951],[-73.619995000000017,71.716095000000109],[-73.638061999999991,71.706375000000037],[-73.663329999999917,71.697204999999997],[-73.694442999999922,71.690262000000018],[-73.732772999999952,71.683868000000132],[-73.771117999999944,71.670822000000044],[-73.791381999999999,71.661102000000142],[-73.890839000000028,71.609421000000054],[-73.985549999999989,71.534149000000127],[-73.990279999999927,71.527480999999966],[-74.010833999999988,71.491363999999976],[-74.095275999999956,71.46276899999998],[-74.169997999999964,71.445816000000036],[-74.303878999999995,71.419433999999967],[-74.315826000000015,71.414429000000098],[-74.319167999999877,71.409424000000058],[-74.312209999999993,71.40554800000001],[-74.297226000000023,71.405822999999998],[-74.191665999999998,71.425537000000134],[-74.159163999999919,71.4327550000001],[-74.121384000000035,71.438583000000051],[-74.083617999999944,71.441086000000041],[-74.045836999999949,71.440810999999997],[-74.028610000000015,71.437759000000085],[-74.063889000000017,71.336929000000055],[-74.091675000000009,71.285537999999974],[-74.106383999999878,71.274704000000099],[-74.137787000000003,71.255828999999949],[-74.152221999999995,71.248032000000023],[-74.187774999999931,71.229430999999977],[-74.207503999999858,71.219711000000075],[-74.217223999999931,71.214996000000042],[-74.226669000000015,71.212203999999986],[-74.238327000000027,71.203873000000101],[-74.240829000000019,71.200821000000133],[-74.235000999999897,71.198317999999972],[-74.228881999999942,71.199416999999983],[-74.217772999999966,71.202209000000039],[-74.190825999999959,71.211104999999975],[-74.158339999999953,71.223877000000016],[-74.148055999999997,71.228592000000049],[-74.118332000000009,71.24331699999999],[-74.039444000000003,71.302199999999971],[-74.009444999999971,71.360809000000017],[-74.006957999999997,71.367203000000075],[-73.973327999999924,71.413605000000132],[-73.968612999999891,71.419433999999967],[-73.867767000000015,71.525818000000015],[-73.86221299999994,71.531096999999988],[-73.761672999999973,71.580826000000059],[-73.746947999999975,71.585266000000047],[-73.732772999999952,71.586928999999998],[-73.689162999999951,71.588042999999971],[-73.653610000000015,71.587493999999992],[-73.639724999999942,71.58638000000002],[-73.621932999999956,71.583328000000108],[-73.595000999999968,71.575272000000041],[-73.588608000000022,71.572220000000129],[-73.565001999999936,71.55192599999998],[-73.566665999999941,71.544144000000017],[-73.598343,71.528320000000122],[-73.615554999999915,71.520264000000054],[-73.619445999999982,71.515823000000125],[-73.630279999999971,71.456649999999911],[-73.635009999999909,71.359421000000111],[-73.622498000000007,71.356644000000017],[-73.61332699999997,71.355820000000051],[-73.594727000000034,71.35775799999999],[-73.540389999999945,71.37286400000005],[-73.518889999999942,71.379150000000038],[-73.517226999999934,71.379974000000004],[-73.516112999999962,71.385818000000029],[-73.515563999999927,71.39888000000002],[-73.513335999999981,71.413040000000137],[-73.50306699999993,71.424698000000149],[-73.496947999999918,71.428589000000045],[-73.477492999999924,71.436371000000008],[-73.446945000000028,71.440262000000075],[-73.428878999999995,71.435806000000127],[-73.384445000000028,71.391937000000041],[-73.380279999999914,71.385269000000051],[-73.385009999999966,71.381927000000132],[-73.500899999999945,71.337212000000022],[-73.590285999999935,71.304977000000065],[-73.615554999999915,71.296371000000136],[-73.623046999999872,71.291091999999992],[-73.635558999999944,71.279709000000139],[-73.663054999999986,71.254166000000055],[-73.678878999999995,71.238037000000077],[-73.712783999999999,71.177765000000136],[-73.717772999999966,71.164993000000095],[-73.718886999999938,71.159424000000115],[-73.716399999999965,71.14498900000001],[-73.713622999999984,71.137497000000053],[-73.713622999999984,71.130539000000056],[-73.71665999999999,71.118317000000104],[-73.728606999999954,71.098602000000085],[-73.735824999999977,71.093323000000112],[-73.745833999999888,71.088593000000117],[-73.760833999999932,71.084717000000012],[-73.77806099999998,71.0816650000001],[-73.797774999999945,71.078872999999987],[-73.842498999999918,71.074432000000115],[-73.87388599999997,71.069717000000082],[-73.890288999999996,71.064987000000031],[-73.898346000000004,71.057480000000112],[-73.895003999999972,71.052200000000028],[-73.886672999999973,71.049149],[-73.879439999999875,71.047759999999982],[-73.872771999999998,71.047484999999995],[-73.850554999999986,71.059981999999991],[-73.842223999999987,71.064148000000046],[-73.753066999999987,71.065810999999997],[-73.732772999999952,71.067764000000125],[-73.715835999999854,71.071655000000021],[-73.692764000000011,71.079436999999984],[-73.674438000000009,71.088318000000072],[-73.667220999999984,71.093597000000045],[-73.660552999999993,71.10386699999998],[-73.658339999999953,71.124985000000095],[-73.662505999999951,71.134995000000004],[-73.666655999999875,71.141662999999994],[-73.673614999999927,71.163039999999967],[-73.668883999999991,71.173035000000084],[-73.623610999999983,71.225540000000137],[-73.615829000000019,71.230270000000132],[-73.549164000000019,71.269989000000066],[-73.454726999999991,71.300262000000032],[-73.433884000000035,71.308594000000028],[-73.42860399999995,71.314423000000033],[-73.427779999999984,71.327208999999925],[-73.435271999999941,71.332214000000022],[-73.437774999999988,71.336380000000077],[-73.436110999999983,71.340545999999961],[-73.430282999999974,71.34165999999999],[-73.382216999999969,71.345260999999994],[-73.363051999999982,71.345824999999991],[-73.349730999999963,71.345260999999994],[-73.320847000000015,71.340820000000122],[-73.083617999999944,71.285812000000078],[-73.061110999999983,71.277481000000023],[-73.049437999999952,71.268325999999945],[-73.053878999999938,71.261658000000011],[-73.065001999999936,71.258331000000055],[-73.155562999999972,71.246643000000006],[-73.214721999999995,71.240814],[-73.230835000000013,71.238312000000121],[-73.249434999999949,71.233871000000022],[-73.266113000000018,71.224990999999989],[-73.271941999999854,71.220535000000041],[-73.263061999999991,71.205826000000002],[-73.252501999999936,71.195251000000098],[-73.244445999999982,71.188873000000115],[-73.235001000000011,71.173309000000017],[-73.235001000000011,71.162201000000039],[-73.238327000000027,71.157210999999961],[-73.247771999999998,71.144150000000025],[-73.256957999999884,71.133881000000031],[-73.294448999999929,71.092483999999956],[-73.311110999999926,71.080826000000116],[-73.327788999999996,71.072768999999994],[-73.379439999999988,71.05831900000004],[-73.426391999999908,71.047759999999982],[-73.446105999999986,71.041092000000049],[-73.450835999999924,71.035263000000043],[-73.451950000000011,71.029433999999981],[-73.446945000000028,71.024993999999992],[-73.377486999999917,70.980545000000006],[-73.369995000000017,70.985809000000017],[-73.17361499999987,71.156937000000028],[-73.168610000000001,71.170532000000094],[-73.177490000000034,71.185257000000036],[-73.183060000000012,71.191360000000032],[-73.188048999999978,71.199141999999938],[-73.185271999999998,71.205826000000002],[-73.180283000000031,71.211655000000007],[-73.172226000000023,71.216385000000059],[-73.142226999999934,71.224425999999937],[-73.115554999999915,71.230270000000132],[-73.101395000000025,71.231658999999979],[-73.079726999999991,71.231658999999979],[-73.067779999999857,71.230270000000132],[-73.045546999999885,71.225540000000137],[-73.027221999999881,71.227203000000031],[-73.011947999999961,71.234421000000054],[-73.004455999999948,71.239700000000028],[-72.99499499999996,71.249999999999943],[-72.981673999999941,71.267487000000017],[-72.952788999999996,71.311096000000077],[-72.951400999999976,71.316085999999984],[-72.959731999999974,71.355820000000051],[-72.963622999999927,71.362488000000042],[-72.970001000000025,71.369979999999998],[-72.978332999999907,71.376373000000115],[-72.989440999999999,71.391663000000108],[-72.993057000000022,71.397766000000047],[-72.993331999999953,71.401931999999931],[-72.988892000000021,71.40554800000001],[-72.975829999999917,71.40914900000007],[-72.897232000000031,71.416655999999989],[-72.858046999999942,71.413315000000125],[-72.836394999999925,71.413315000000125],[-72.765839000000028,71.423874000000012],[-72.759170999999924,71.426926000000094],[-72.757507000000032,71.431931000000134],[-72.758621000000005,71.437484999999981],[-72.764724999999942,71.451660000000061],[-72.76916499999993,71.459152000000017],[-72.679992999999911,71.524704000000042],[-72.649733999999967,71.536926000000051],[-72.61860699999994,71.559418000000107],[-72.61332699999997,71.565536000000066],[-72.610274999999888,71.571930000000123],[-72.608337000000006,71.583878000000141],[-72.61082499999992,71.595535000000098],[-72.608337000000006,71.60664399999996],[-72.593886999999995,71.642487000000017],[-72.583327999999881,71.651382000000069],[-72.580291999999929,71.653594999999996],[-72.573333999999932,71.656647000000135],[-72.557495000000017,71.660262999999986],[-72.538054999999929,71.660812000000135],[-72.523620999999991,71.65887500000008],[-72.503066999999874,71.65026899999998],[-72.474715999999944,71.642761000000121],[-72.444442999999978,71.636107999999979],[-72.301102000000014,71.612198000000149],[-72.152221999999938,71.58998100000008],[-71.847777999999948,71.546646000000123],[-71.689437999999996,71.524429000000055],[-71.670546999999999,71.522216999999955],[-71.635559000000001,71.517761000000064],[-71.58555599999994,71.509995000000004],[-71.554169000000002,71.503875999999991],[-71.455275999999913,71.473037999999974],[-71.444442999999922,71.468597000000045],[-71.435271999999998,71.463608000000079],[-71.295546999999942,71.384720000000129],[-71.241378999999995,71.349425999999994],[-71.12332200000003,71.271652000000017],[-71.119719999999973,71.264160000000061],[-71.122771999999998,71.257217000000082],[-71.128601000000003,71.251389000000131],[-71.147780999999952,71.241927999999973],[-71.169448999999986,71.233322000000044],[-71.206116000000009,71.220535000000041],[-71.221389999999985,71.216934000000037],[-71.234726000000023,71.212769000000037],[-71.324722000000008,71.177765000000136],[-71.340560999999866,71.170532000000094],[-71.342772999999909,71.166382000000112],[-71.346114999999941,71.155823000000055],[-71.349441999999897,71.149428999999998],[-71.415832999999907,71.093323000000112],[-71.452224999999999,71.068054000000132],[-71.46444699999995,71.062484999999981],[-71.470275999999956,71.061370999999951],[-71.48971599999993,71.0619200000001],[-71.551102000000014,71.064697000000024],[-71.608336999999949,71.068603999999993],[-71.640839000000028,71.073883000000137],[-71.714447000000007,71.088043000000084],[-71.812499999999943,71.104156000000103],[-71.848891999999921,71.108321999999987],[-71.868880999999874,71.109420999999998],[-71.890288999999882,71.109420999999998],[-71.910827999999924,71.107758000000047],[-72.069457999999997,71.075271999999984],[-72.08555599999994,71.070267000000115],[-72.09973100000002,71.063873000000058],[-72.110275000000001,71.052200000000028],[-72.113892000000021,71.047211000000061],[-72.114440999999999,71.043594000000098],[-72.113326999999913,71.037490999999989],[-72.107223999999974,71.030272999999966],[-72.09973100000002,71.020263999999941],[-72.101944000000003,71.016098000000056],[-72.165557999999919,70.968048000000067],[-72.179717999999923,70.962204000000042],[-72.200286999999946,70.961105000000032],[-72.235001000000011,70.961928999999998],[-72.261123999999995,70.959152000000131],[-72.27806099999998,70.955261000000064],[-72.290557999999976,70.951096000000064],[-72.297226000000023,70.947204999999997],[-72.317504999999983,70.930267000000072],[-72.319457999999997,70.925812000000064],[-72.317504999999983,70.918320000000108],[-72.31138599999997,70.911102000000085],[-72.313889000000017,70.899719000000061],[-72.320557000000008,70.888321000000076],[-72.325561999999877,70.882477000000051],[-72.334166999999979,70.878585999999984],[-72.514724999999999,70.844436999999971],[-72.534438999999907,70.841933999999981],[-72.653609999999958,70.82777400000009],[-72.654174999999896,70.820831000000112],[-72.511397999999872,70.827209000000039],[-72.476944000000003,70.833328000000051],[-72.401108000000022,70.849716000000114],[-72.356110000000001,70.860535000000027],[-72.302779999999927,70.867203000000018],[-72.264175000000023,70.866652999999985],[-72.25,70.863876000000062],[-72.184722999999963,70.844711000000075],[-72.172225999999966,70.840546000000074],[-72.16361999999998,70.83638000000002],[-72.162215999999887,70.829987000000017],[-72.363327000000027,70.686096000000134],[-72.381942999999978,70.677200000000028],[-72.459441999999967,70.65387000000004],[-72.475829999999917,70.649429000000112],[-72.499435000000005,70.646652000000017],[-72.542496000000028,70.644714000000079],[-72.578063999999983,70.641373000000044],[-72.597778000000005,70.63859599999995],[-72.609160999999972,70.636658000000011],[-72.615828999999962,70.633331000000055],[-72.623321999999973,70.628036000000009],[-72.569457999999884,70.609985000000052],[-72.551666000000012,70.608032000000094],[-72.503066999999874,70.629973999999947],[-72.490554999999972,70.634155000000021],[-72.371932999999956,70.654984000000013],[-72.342223999999931,70.662200999999925],[-72.326110999999912,70.667206000000022],[-72.306380999999988,70.677475000000015],[-72.277495999999871,70.698028999999963],[-72.264724999999942,70.70915199999996],[-72.248610999999983,70.726653999999996],[-72.245834000000002,70.733046999999999],[-72.236937999999896,70.743866000000025],[-72.229172000000005,70.749420000000043],[-72.210555999999997,70.758040999999935],[-72.185546999999929,70.76638800000012],[-72.155838000000017,70.773605000000032],[-72.136123999999995,70.776093000000003],[-72.004729999999995,70.786925999999994],[-71.896956999999929,70.80693100000002],[-71.818893000000003,70.823044000000039],[-71.689163000000008,70.850266000000147],[-71.543883999999991,70.872481999999991],[-71.354445999999939,70.882750999999985],[-71.287506000000008,70.906097000000045],[-71.289169000000015,70.908875000000023],[-71.289444000000003,70.913605000000075],[-71.208343999999954,71.004990000000078],[-71.185546999999872,71.019439999999975],[-71.162216000000001,71.028320000000008],[-70.895553999999947,71.099716000000058],[-70.836120999999935,71.114426000000037],[-70.799727999999959,71.118866000000025],[-70.771666999999979,71.118042000000059],[-70.755568999999923,71.11554000000001],[-70.724715999999944,71.10443099999992],[-70.635559000000001,71.072220000000016],[-70.613891999999964,71.062194999999917],[-70.604720999999927,71.056366000000082],[-70.601669000000015,71.053864000000033],[-70.591949,71.042480000000126],[-70.514724999999942,70.940536000000066],[-70.512511999999958,70.926085999999998],[-70.514450000000011,70.921097000000032],[-70.519729999999981,70.913879000000009],[-70.553604000000007,70.894989000000066],[-70.58944699999995,70.876083000000051],[-70.678878999999995,70.840546000000074],[-70.740828999999906,70.75471500000009],[-70.746947999999918,70.745529000000147],[-70.773330999999985,70.734420999999998],[-70.798888999999917,70.725540000000024],[-70.872498000000007,70.703872999999987],[-70.891112999999962,70.698868000000118],[-70.965835999999967,70.684143000000006],[-71.024445000000014,70.674987999999928],[-71.055267000000015,70.669144000000131],[-71.08277899999996,70.661652000000004],[-71.100554999999929,70.654984000000013],[-71.108611999999994,70.649993999999992],[-71.118056999999965,70.638885000000073],[-71.128051999999968,70.62052900000009],[-71.129439999999988,70.614151000000106],[-71.134445000000028,70.602767999999912],[-71.139998999999932,70.596374999999966],[-71.147780999999952,70.591095000000109],[-71.160277999999948,70.586928999999998],[-71.175277999999992,70.583602999999982],[-71.191665999999998,70.58248900000001],[-71.224715999999944,70.582214000000135],[-71.281676999999888,70.584152000000074],[-71.312499999999943,70.587204000000042],[-71.34584000000001,70.591660000000104],[-71.389724999999942,70.600540000000137],[-71.407501000000025,70.603043000000127],[-71.422775000000001,70.604980000000012],[-71.461944999999957,70.60775799999999],[-71.558608999999933,70.609421000000111],[-71.592772999999966,70.606934000000024],[-71.595550999999944,70.603867000000093],[-71.595839999999953,70.600540000000137],[-71.592498999999918,70.589706000000092],[-71.586670000000026,70.581665000000044],[-71.583892999999932,70.576096000000007],[-71.580291999999986,70.564697000000137],[-71.581954999999994,70.551376000000005],[-71.583618000000001,70.546371000000136],[-71.588057999999933,70.542755000000056],[-71.74360699999994,70.466933999999981],[-71.803054999999972,70.428314000000057],[-71.763061999999934,70.427200000000084],[-71.748046999999985,70.425811999999951],[-71.736389000000031,70.423035000000084],[-71.727218999999991,70.417479999999955],[-71.728058000000033,70.410538000000088],[-71.731673999999998,70.397217000000126],[-71.746384000000035,70.3477630000001],[-71.75556899999998,70.329162999999994],[-71.763061999999934,70.323318000000086],[-71.783065999999963,70.313873000000001],[-71.816665999999941,70.303040000000067],[-71.844161999999983,70.29664600000001],[-71.849730999999906,70.290817000000004],[-71.836944999999957,70.289978000000019],[-71.806945999999868,70.295822000000044],[-71.748046999999985,70.309708000000001],[-71.733611999999937,70.313873000000001],[-71.686385999999914,70.355820000000108],[-71.674712999999997,70.36970500000001],[-71.641678000000013,70.444977000000108],[-71.640288999999996,70.450546000000088],[-71.543335000000013,70.514708999999982],[-71.525283999999942,70.524704000000099],[-71.510009999999966,70.535812000000078],[-71.502501999999936,70.546096999999975],[-71.50167799999997,70.55304000000001],[-71.503341999999975,70.56053199999991],[-71.507506999999976,70.569153000000028],[-71.511672999999973,70.573318000000029],[-71.506957999999941,70.57638500000013],[-71.495543999999938,70.578873000000101],[-71.435271999999998,70.578598000000113],[-71.420273000000009,70.57748400000014],[-71.397781000000009,70.574432000000002],[-71.25306699999993,70.549713000000054],[-71.184998000000007,70.538040000000024],[-71.17582699999997,70.535812000000078],[-71.170272999999952,70.533324999999991],[-71.167769999999905,70.531937000000084],[-71.162506000000008,70.525269000000094],[-71.162216000000001,70.520537999999988],[-71.260558999999887,70.377762000000132],[-71.322509999999966,70.312759000000028],[-71.321670999999981,70.30664100000007],[-71.318343999999968,70.299988000000099],[-71.301101999999958,70.284987999999998],[-71.288894999999968,70.280822999999998],[-71.279998999999975,70.274993999999936],[-71.276947000000007,70.268326000000002],[-71.278335999999854,70.262771999999984],[-71.285278000000005,70.251388999999961],[-71.289169000000015,70.246094000000085],[-71.316955999999948,70.218596999999988],[-71.363051999999868,70.182204999999954],[-71.43472300000002,70.126923000000033],[-71.485275000000001,70.088318000000072],[-71.498046999999929,70.080551000000128],[-71.523055999999997,70.052200000000028],[-71.532776000000013,70.038589000000059],[-71.539168999999958,70.026382000000126],[-71.541107000000011,70.022217000000126],[-71.535827999999924,70.019714000000135],[-71.52806099999998,70.020263999999997],[-71.518065999999976,70.024993999999992],[-71.500290000000007,70.038315000000125],[-71.493606999999997,70.050537000000134],[-71.475829999999974,70.068054000000132],[-71.438048999999978,70.086655000000007],[-71.393616000000009,70.104430999999977],[-71.366652999999985,70.111923000000104],[-71.331680000000006,70.128585999999984],[-71.210555999999997,70.262206999999933],[-71.208892999999989,70.267761000000121],[-71.21305799999999,70.272491000000002],[-71.218886999999995,70.276382000000069],[-71.229720999999984,70.281097000000102],[-71.231948999999929,70.294983000000059],[-71.171660999999972,70.368042000000059],[-71.135833999999932,70.410538000000088],[-71.093062999999972,70.460541000000035],[-71.030563000000029,70.540543000000014],[-71.049987999999928,70.546371000000136],[-71.053054999999972,70.55304000000001],[-71.049438000000009,70.558868000000075],[-71.005843999999968,70.61692800000003],[-70.997222999999963,70.625808999999947],[-70.968886999999995,70.63220200000012],[-70.913054999999986,70.637771999999984],[-70.771117999999944,70.668869000000086],[-70.611937999999952,70.723602000000085],[-70.421660999999858,70.772217000000126],[-70.396956999999986,70.778320000000065],[-70.365279999999927,70.782486000000006],[-70.324721999999952,70.785812000000021],[-70.255004999999983,70.793868999999972],[-70.228881999999942,70.797211000000118],[-70.075012000000015,70.83027600000014],[-69.988051999999982,70.853592000000049],[-69.915833000000021,70.877472000000012],[-69.904723999999931,70.881363000000079],[-69.892775999999913,70.883331000000055],[-69.87388599999997,70.883331000000055],[-69.865279999999927,70.882477000000051],[-69.833618000000001,70.87692300000009],[-69.78443900000002,70.864700000000028],[-69.771117999999944,70.857483000000116],[-69.770554000000004,70.856094000000098],[-69.772506999999962,70.85054000000008],[-69.795837000000006,70.820541000000048],[-69.808884000000035,70.81109600000002],[-69.879439999999931,70.768051000000071],[-69.915557999999919,70.74914600000011],[-69.965285999999935,70.727767999999969],[-70.073897999999929,70.687484999999924],[-70.084732000000031,70.683594000000028],[-70.121658000000025,70.67164600000001],[-70.21055599999994,70.646103000000096],[-70.225554999999929,70.641936999999984],[-70.244995000000017,70.638321000000133],[-70.277221999999995,70.636107999999979],[-70.33805799999999,70.637496999999996],[-70.353332999999964,70.638885000000073],[-70.407775999999956,70.638885000000073],[-70.423324999999977,70.636932000000115],[-70.454726999999991,70.627762000000075],[-70.473052999999993,70.617203000000018],[-70.476943999999946,70.612197999999978],[-70.478881999999999,70.606644000000017],[-70.460555999999997,70.574158000000068],[-70.442764000000011,70.561920000000043],[-70.424164000000019,70.551926000000037],[-70.411391999999978,70.542205999999908],[-70.404723999999931,70.536377000000073],[-70.400283999999999,70.530273000000079],[-70.397507000000019,70.524155000000121],[-70.401672000000019,70.519150000000081],[-70.407775999999956,70.514160000000004],[-70.423324999999977,70.506943000000092],[-70.467223999999987,70.493866000000082],[-70.482223999999917,70.490540000000067],[-70.490829000000019,70.486649],[-70.494445999999982,70.484984999999995],[-70.49610899999999,70.479430999999977],[-70.488892000000021,70.476929000000098],[-70.477782999999988,70.47554000000008],[-70.459166999999979,70.47554000000008],[-70.441375999999934,70.477203000000031],[-70.309722999999963,70.498031999999967],[-70.316665999999998,70.528594999999939],[-70.320007000000032,70.536926000000051],[-70.331679999999949,70.548599000000081],[-70.348617999999931,70.559707999999944],[-70.371108999999933,70.573608000000036],[-70.344451999999933,70.613037000000134],[-70.158339999999953,70.615540000000124],[-70.092498999999975,70.612197999999978],[-70.023330999999985,70.610535000000084],[-69.99221799999998,70.645828000000051],[-69.987777999999935,70.649993999999992],[-69.978607000000011,70.653320000000008],[-69.875823999999909,70.677200000000028],[-69.775832999999977,70.682205000000067],[-69.651397999999972,70.725540000000024],[-69.649169999999913,70.731094000000041],[-69.644729999999981,70.741088999999931],[-69.638610999999969,70.746933000000126],[-69.619995000000017,70.758040999999935],[-69.569167999999934,70.771927000000119],[-69.53832999999986,70.778595000000109],[-69.469727000000034,70.790543000000127],[-69.451401000000033,70.791931000000034],[-69.242766999999958,70.782486000000006],[-69.226943999999946,70.77998400000007],[-69.215012000000002,70.776093000000003],[-69.190552000000025,70.766937000000041],[-69.131942999999978,70.737488000000099],[-68.958053999999947,70.688582999999994],[-68.928329000000019,70.681656000000089],[-68.664444000000003,70.626923000000147],[-68.61860699999994,70.62052900000009],[-68.582503999999972,70.617751999999996],[-68.549727999999959,70.613602000000014],[-68.515288999999996,70.609146000000067],[-68.484726000000023,70.604156000000046],[-68.390563999999983,70.582214000000135],[-68.325561999999934,70.566665999999941],[-68.313889000000017,70.563034000000016],[-68.293610000000001,70.551376000000005],[-68.284164000000033,70.540543000000014],[-68.279174999999952,70.531097000000045],[-68.279449,70.519440000000088],[-68.281386999999938,70.51249700000011],[-68.289718999999991,70.500000000000114],[-68.296111999999994,70.494141000000127],[-68.31361400000003,70.484711000000061],[-68.331680000000006,70.476379000000065],[-68.371932999999956,70.455826000000002],[-68.446654999999964,70.413040000000137],[-68.451400999999976,70.409424000000115],[-68.453613000000018,70.403870000000097],[-68.451950000000011,70.392212000000086],[-68.449158000000011,70.384155000000078],[-68.448607999999979,70.375259000000142],[-68.451675000000023,70.372482000000048],[-68.458618000000001,70.369431000000077],[-68.485000999999954,70.367752000000053],[-68.495270000000005,70.368590999999981],[-68.506393000000003,70.371093999999971],[-68.519454999999994,70.37414600000011],[-68.561385999999914,70.389709000000096],[-68.571121000000005,70.393326000000059],[-68.575835999999924,70.396102999999982],[-68.580840999999964,70.404160000000104],[-68.580565999999976,70.415817000000061],[-68.569732999999985,70.426376000000118],[-68.556106999999997,70.435257000000036],[-68.549987999999985,70.440811000000053],[-68.548049999999932,70.447754000000032],[-68.556945999999982,70.461929000000112],[-68.564712999999927,70.466385000000059],[-68.582503999999972,70.464432000000102],[-68.621657999999968,70.45277400000009],[-68.650833000000034,70.441925000000026],[-68.654174999999896,70.439148000000102],[-68.661666999999909,70.431090999999924],[-68.666655999999989,70.422211000000118],[-68.670273000000009,70.408874999999966],[-68.670836999999949,70.404160000000104],[-68.664444000000003,70.384994999999947],[-68.657226999999978,70.375809000000004],[-68.651947000000007,70.359420999999941],[-68.650557999999933,70.349991000000045],[-68.651107999999965,70.345824999999991],[-68.653884999999946,70.341369999999984],[-68.65695199999999,70.33859300000006],[-68.664169000000015,70.335541000000148],[-68.682495000000017,70.329437000000098],[-68.735549999999876,70.317764000000068],[-68.784164000000033,70.310256999999979],[-68.906951999999933,70.293869000000086],[-68.941375999999991,70.29304500000012],[-69.071945000000028,70.28804000000008],[-69.235001000000011,70.270264000000111],[-69.283889999999985,70.264709000000039],[-69.473891999999978,70.238876000000062],[-69.639998999999875,70.204712000000086],[-69.668059999999969,70.198593000000017],[-69.823897999999986,70.155823000000112],[-69.829453000000001,70.15415999999999],[-69.836120999999991,70.150543000000027],[-69.839721999999938,70.144150000000081],[-69.840835999999911,70.141937000000098],[-69.839721999999938,70.134430000000009],[-69.843062999999972,70.121917999999994],[-69.848891999999978,70.116088999999988],[-69.856948999999929,70.110809000000074],[-69.875823999999909,70.101929000000041],[-69.917769999999962,70.085541000000035],[-69.946655000000021,70.076385000000073],[-69.96833799999996,70.074706999999933],[-69.990279999999927,70.074432000000115],[-70.037780999999995,70.072220000000073],[-70.073059000000001,70.069153000000142],[-70.086120999999991,70.066666000000055],[-70.096953999999982,70.063309000000118],[-70.141387999999949,70.043319999999994],[-70.174438000000009,70.034987999999998],[-70.182769999999891,70.031096999999932],[-70.185546999999985,70.028046000000131],[-70.182769999999891,70.021378000000141],[-70.169997999999964,70.014434999999992],[-70.15449499999994,70.015160000000094],[-70.147506999999962,70.015488000000062],[-70.139502999999934,70.017159000000106],[-70.113327000000027,70.02388000000002],[-70.103058000000033,70.028595000000053],[-70.089995999999985,70.036102000000028],[-70.088897999999915,70.038315000000125],[-70.077498999999989,70.049712999999997],[-70.066955999999948,70.053589000000045],[-70.049987999999871,70.057205000000067],[-70.028610000000015,70.058868000000018],[-70.020279000000016,70.058594000000085],[-69.901107999999965,70.048325000000034],[-69.892226999999934,70.045822000000101],[-69.884734999999921,70.042755],[-69.853607000000011,70.029709000000025],[-69.83555599999994,70.020263999999997],[-69.827498999999989,70.014434999999992],[-69.820846999999958,70.008041000000105],[-69.813048999999921,69.99859600000002],[-69.812209999999993,69.991089000000102],[-69.815552000000025,69.984711000000118],[-69.822509999999909,69.981659000000036],[-69.837508999999955,69.978317000000118],[-69.851395000000025,69.978317000000118],[-69.897507000000019,69.983047000000113],[-69.93638599999997,69.98942599999998],[-69.963332999999977,69.991653000000042],[-69.981383999999991,69.991653000000042],[-70.00306699999993,69.989700000000084],[-70.057494999999903,69.981093999999985],[-70.098891999999921,69.973602000000085],[-70.164443999999889,69.961655000000121],[-70.218886999999938,69.941650000000095],[-70.223327999999981,69.938034000000016],[-70.223891999999978,69.929703000000131],[-70.218062999999972,69.925262000000032],[-70.216110000000015,69.92053199999998],[-70.220276000000013,69.915543000000014],[-70.228607000000011,69.911651999999947],[-70.291381999999999,69.889435000000105],[-70.384170999999981,69.860535000000027],[-70.401397999999972,69.859146000000067],[-70.422225999999966,69.860809000000131],[-70.432495000000017,69.862487999999985],[-70.443877999999927,69.860535000000027],[-70.450561999999991,69.857208000000071],[-70.467223999999987,69.844711000000132],[-70.468612999999948,69.842758000000003],[-70.460280999999952,69.841660000000104],[-70.436935000000005,69.839431999999931],[-70.412215999999944,69.837769000000037],[-70.396118000000001,69.837203999999986],[-70.384170999999981,69.837203999999986],[-70.372771999999884,69.838318000000129],[-70.355834999999956,69.841370000000097],[-70.343613000000005,69.845260999999937],[-70.255279999999914,69.879149999999981],[-70.192764000000011,69.907761000000107],[-70.136948000000018,69.933318999999983],[-70.126098999999954,69.940536000000122],[-70.098617999999988,69.953049000000021],[-70.076675000000023,69.958037999999988],[-70.059433000000013,69.959716999999955],[-69.978607000000011,69.964157],[-69.941939999999988,69.963043000000027],[-69.925003000000004,69.961105000000089],[-69.896956999999986,69.956100000000049],[-69.868057000000022,69.953323000000125],[-69.837508999999955,69.952773999999977],[-69.813109999999995,69.955429000000095],[-69.777221999999995,69.963608000000022],[-69.750838999999928,69.972488000000055],[-69.745543999999938,69.974701000000039],[-69.738051999999925,69.981369000000029],[-69.735549999999932,69.985535000000084],[-69.735275000000001,69.990539999999953],[-69.739440999999999,70.001389000000017],[-69.744155999999975,70.008041000000105],[-69.760009999999966,70.017487000000074],[-69.769454999999937,70.021378000000141],[-69.781112999999948,70.024993999999992],[-69.795546999999999,70.031661999999983],[-69.804717999999866,70.038879000000065],[-69.808884000000035,70.049712999999997],[-69.806945999999982,70.055251999999996],[-69.792770000000019,70.080826000000002],[-69.790282999999931,70.084991000000002],[-69.783889999999985,70.089432000000102],[-69.740829000000019,70.114151000000049],[-69.675826999999913,70.139708999999982],[-69.653335999999911,70.14498900000001],[-69.426101999999958,70.176086000000112],[-69.404175000000009,70.177765000000136],[-69.21945199999999,70.188309000000004],[-69.18249499999996,70.187195000000031],[-69.169997999999907,70.18609600000002],[-69.154723999999987,70.183318999999983],[-69.011123999999995,70.178314000000114],[-68.936934999999949,70.193039000000056],[-68.859160999999858,70.203048999999965],[-68.839172000000019,70.203598000000056],[-68.697220000000016,70.203873000000101],[-68.682770000000005,70.203598000000056],[-68.678329000000019,70.202484000000084],[-68.676391999999964,70.201660000000118],[-68.647507000000019,70.158324999999991],[-68.642501999999979,70.149429000000055],[-68.645003999999915,70.145264000000054],[-68.741378999999995,70.065262000000075],[-68.746658000000025,70.062484999999981],[-68.783066000000019,70.044433999999967],[-68.800551999999982,70.037490999999989],[-68.813323999999966,70.032760999999994],[-68.868056999999965,70.016937000000041],[-68.900283999999942,70.011658000000068],[-68.954453000000001,70.00471500000009],[-69.088608000000022,69.974991000000045],[-69.15306099999998,69.953049000000021],[-69.313109999999938,69.882294000000059],[-69.346114999999998,69.855545000000006],[-69.370543999999938,69.83998100000008],[-69.398055999999997,69.828598000000056],[-69.426940999999943,69.819716999999969],[-69.439712999999927,69.816376000000105],[-69.460555999999997,69.813309000000004],[-69.474716000000001,69.813599000000011],[-69.516953000000001,69.819992000000127],[-69.543335000000013,69.826934999999935],[-69.565826000000015,69.834152000000074],[-69.580841000000021,69.836928999999998],[-69.683884000000035,69.83998100000008],[-69.713897999999972,69.83998100000008],[-69.744995000000017,69.837769000000037],[-69.760009999999966,69.834991000000002],[-69.770844000000011,69.831940000000031],[-69.805832000000009,69.819992000000127],[-69.827788999999996,69.809418000000107],[-69.844161999999926,69.800261999999975],[-69.855834999999956,69.793593999999985],[-69.87249799999995,69.781096999999988],[-69.998046999999985,69.669983000000116],[-70,69.66415400000011],[-70.000838999999985,69.656097000000102],[-70.00140399999998,69.622757000000036],[-69.998885999999914,69.616089000000102],[-69.990554999999915,69.614990000000091],[-69.944442999999978,69.649719000000005],[-69.816956000000005,69.724426000000051],[-69.810821999999973,69.72886699999998],[-69.808334000000002,69.733046999999999],[-69.808334000000002,69.73803700000002],[-69.81471299999987,69.75471500000009],[-69.815001999999993,69.760269000000108],[-69.814163000000008,69.763884999999959],[-69.805557000000022,69.772491000000059],[-69.783066000000019,69.785812000000021],[-69.764724999999999,69.795531999999923],[-69.754455999999948,69.799712999999997],[-69.741942999999992,69.803589000000102],[-69.730835000000013,69.806090999999981],[-69.713333000000034,69.807479999999998],[-69.643065999999976,69.810806000000014],[-69.602782999999988,69.809708000000114],[-69.572783999999899,69.80442800000003],[-69.561110999999983,69.799988000000042],[-69.545273000000009,69.794434000000024],[-69.489989999999921,69.779709000000082],[-69.45666499999993,69.775818000000015],[-69.446655000000021,69.775543000000027],[-69.409163999999976,69.776381999999955],[-69.395844000000011,69.777771000000143],[-69.384734999999921,69.780823000000055],[-69.378051999999968,69.783875000000023],[-69.313889000000017,69.816376000000105],[-69.291381999999999,69.831099999999935],[-69.279448999999943,69.84248400000007],[-69.26916499999993,69.852768000000083],[-69.253066999999987,69.862198000000149],[-69.200561999999877,69.883606000000043],[-69.188048999999978,69.887771999999984],[-69.101943999999946,69.916091999999992],[-69.076674999999966,69.923874000000126],[-68.945540999999992,69.949997000000053],[-68.933884000000035,69.951096000000064],[-68.870270000000005,69.953049000000021],[-68.801940999999886,69.952208999999982],[-68.76666299999988,69.948868000000118],[-68.751953000000015,69.946639999999945],[-68.622817999999938,69.98240699999991],[-68.471664000000033,70.046646000000067],[-68.338333000000034,70.064148000000102],[-68.241378999999995,70.095825000000048],[-68.221389999999985,70.102768000000026],[-68.207229999999981,70.109420999999998],[-68.196380999999974,70.119431000000077],[-68.193603999999993,70.123596000000077],[-68.203338999999971,70.128860000000088],[-68.229445999999939,70.135269000000108],[-68.268616000000009,70.13749700000011],[-68.290832999999907,70.137207000000046],[-68.308333999999945,70.135269000000108],[-68.320557000000008,70.135543999999982],[-68.333618000000001,70.139160000000004],[-68.349166999999852,70.168045000000063],[-68.348617999999988,70.172760000000096],[-68.345275999999956,70.188034000000016],[-68.318618999999956,70.218596999999988],[-68.31361400000003,70.222214000000122],[-68.160004000000015,70.282761000000107],[-68.039443999999946,70.301376000000005],[-67.808043999999938,70.262496999999996],[-67.794723999999974,70.258881000000088],[-67.774170000000026,70.250549000000092],[-67.768065999999976,70.243866000000139],[-67.760009999999909,70.229706000000022],[-67.740554999999858,70.218872000000147],[-67.697219999999959,70.202209000000096],[-67.674437999999952,70.193587999999977],[-67.648055999999997,70.18609600000002],[-67.591674999999952,70.165267999999969],[-67.575561999999934,70.158324999999991],[-67.556945999999982,70.149155000000121],[-67.528335999999967,70.133881000000031],[-67.412215999999944,70.068878000000097],[-67.404723999999987,70.06442300000009],[-67.378052000000025,70.048035000000027],[-67.242492999999968,69.958327999999995],[-67.222778000000005,69.943863000000079],[-67.216949,69.937759000000028],[-67.152495999999985,69.817764000000011],[-67.148620999999991,69.810257000000092],[-67.127776999999867,69.726929000000041],[-67.193603999999993,69.721924000000001],[-67.371384000000035,69.714432000000045],[-67.391113000000018,69.713882000000012],[-67.406951999999876,69.714705999999978],[-67.436110999999926,69.719147000000078],[-67.499999999999943,69.731833999999992],[-67.602492999999924,69.750275000000101],[-67.761123999999995,69.778595000000109],[-67.77305599999994,69.779434000000094],[-67.81082200000003,69.778869999999927],[-67.99610899999999,69.774429000000055],[-68.013061999999991,69.771927000000119],[-68.087783999999999,69.756104000000107],[-68.208054000000004,69.715546000000018],[-68.216659999999933,69.71026599999999],[-68.222777999999948,69.704711999999972],[-68.228606999999897,69.691360000000145],[-68.230285999999978,69.684418000000051],[-68.24110399999995,69.674987999999985],[-68.31138599999997,69.633331000000112],[-68.323623999999995,69.628860000000032],[-68.329453000000001,69.627762000000132],[-68.352782999999988,69.626923000000147],[-68.496383999999978,69.625809000000004],[-68.518065999999919,69.626083000000108],[-68.620269999999891,69.637206999999989],[-68.64527899999996,69.641098000000056],[-68.839995999999985,69.616089000000102],[-68.980834999999956,69.589157],[-69.188599000000011,69.54193099999992],[-69.201110999999912,69.538040000000024],[-69.220001000000025,69.535812000000078],[-69.325012000000015,69.532486000000063],[-69.342772999999966,69.532486000000063],[-69.364165999999955,69.53776600000009],[-69.410277999999948,69.546097000000032],[-69.426940999999943,69.548035000000141],[-69.549438000000009,69.560531999999967],[-69.630829000000006,69.56721500000009],[-69.688889000000017,69.569443000000092],[-69.737777999999992,69.568329000000062],[-69.75111400000003,69.56721500000009],[-69.838608000000022,69.558868000000132],[-70.030837999999903,69.536102000000085],[-70.028610000000015,69.530823000000112],[-70.025283999999999,69.527481000000023],[-70.011123999999995,69.521103000000039],[-69.995543999999995,69.517211999999972],[-69.964721999999995,69.513885000000016],[-69.899444999999957,69.507217000000082],[-69.885833999999988,69.507217000000082],[-69.866942999999878,69.509430000000009],[-69.844161999999926,69.517487000000017],[-69.824448000000018,69.527205999999978],[-69.815826000000015,69.530548000000124],[-69.803878999999995,69.534988000000112],[-69.789443999999946,69.538589000000002],[-69.732773000000009,69.545258000000047],[-69.698607999999922,69.548324999999977],[-69.68499799999995,69.548874000000126],[-69.663329999999917,69.548324999999977],[-69.613891999999908,69.54304500000012],[-69.506957999999997,69.529433999999924],[-69.449996999999883,69.518875000000094],[-69.375823999999909,69.509720000000016],[-69.343062999999972,69.505828999999949],[-69.323333999999988,69.505264000000125],[-69.299987999999928,69.506103999999993],[-69.206664999999987,69.514998999999989],[-69.151671999999905,69.520264000000054],[-69.005844000000025,69.535812000000078],[-68.995270000000005,69.539703000000145],[-68.982223999999974,69.547211000000004],[-68.971389999999985,69.555817000000104],[-68.957229999999981,69.560531999999967],[-68.926101999999901,69.566665999999998],[-68.76945499999988,69.587494000000049],[-68.752501999999879,69.589431999999988],[-68.6683349999999,69.590820000000065],[-68.611938000000009,69.587494000000049],[-68.544723999999917,69.579987000000131],[-68.528060999999923,69.577208999999925],[-68.317229999999881,69.530273000000079],[-68.293334999999956,69.523604999999918],[-68.181945999999982,69.49832200000003],[-68.02555799999999,69.466095000000053],[-67.982223999999974,69.457489000000123],[-67.946105999999929,69.454712000000029],[-67.926392000000021,69.454163000000108],[-67.893340999999964,69.454437000000041],[-67.874161000000015,69.456649999999968],[-67.861937999999952,69.460266000000047],[-67.840835999999967,69.469436999999971],[-67.819457999999941,69.476929000000098],[-67.806945999999868,69.480819999999994],[-67.792220999999984,69.48414600000001],[-67.604996000000028,69.478043000000071],[-67.562209999999993,69.471924000000058],[-67.511672999999973,69.466095000000053],[-67.475829999999974,69.463042999999914],[-67.432770000000005,69.463318000000129],[-67.305266999999958,69.467209000000025],[-67.258347000000015,69.467484000000013],[-67.210006999999962,69.46138000000002],[-67.180832000000009,69.454712000000029],[-66.921111999999994,69.379150000000095],[-66.795546999999885,69.341094999999996],[-66.785277999999948,69.337204000000099],[-66.774444999999957,69.331940000000088],[-66.767226999999934,69.327484000000027],[-66.694992000000013,69.281661999999983],[-66.682769999999948,69.270264000000111],[-66.650283999999942,69.236374000000012],[-66.645844000000011,69.224991000000045],[-66.646666999999979,69.203598000000113],[-66.658614999999941,69.188309000000004],[-66.668335000000013,69.178314000000114],[-66.689437999999939,69.161926000000051],[-66.720001000000025,69.144150000000081],[-66.730559999999969,69.138885000000016],[-66.75306699999993,69.129424999999969],[-66.758620999999948,69.128036000000122],[-66.776107999999965,69.128860000000088],[-66.837219000000005,69.135818000000086],[-66.84944200000001,69.138321000000076],[-66.912780999999995,69.154984000000127],[-66.928328999999906,69.164153999999996],[-66.953339000000028,69.172211000000004],[-66.965285999999992,69.174423000000047],[-66.996947999999975,69.177764999999965],[-67.132767000000001,69.182479999999998],[-67.371932999999956,69.184417999999937],[-67.385558999999944,69.183868000000132],[-67.414718999999991,69.178314000000114],[-67.427215999999987,69.174423000000047],[-67.458892999999932,69.162491000000102],[-67.466109999999958,69.160812000000078],[-67.50556899999998,69.157486000000063],[-67.521117999999944,69.15776100000005],[-67.648620999999991,69.166931000000091],[-67.676391999999964,69.169434000000081],[-67.864166000000012,69.221924000000115],[-68.18447900000001,69.308014000000014],[-68.209732000000031,69.311370999999951],[-68.221663999999976,69.312194999999917],[-68.232772999999952,69.311370999999951],[-68.251953000000015,69.309708000000057],[-68.285278000000005,69.304428000000144],[-68.31082200000003,69.298598999999967],[-68.327498999999989,69.296097000000088],[-68.344161999999983,69.294708000000071],[-68.355835000000013,69.294144000000131],[-68.375548999999921,69.294708000000071],[-68.464721999999938,69.301651000000049],[-68.675277999999992,69.322220000000016],[-68.740279999999984,69.330551000000128],[-68.811935000000005,69.341933999999924],[-68.84445199999999,69.346100000000035],[-68.944716999999912,69.354980000000069],[-68.962783999999999,69.356369000000029],[-68.984436000000017,69.356934000000081],[-69.015015000000005,69.354980000000069],[-69.040282999999988,69.349716000000058],[-69.176665999999955,69.310806000000127],[-69.203063999999927,69.303040000000067],[-69.241378999999881,69.284149000000014],[-69.253890999999953,69.27526899999998],[-69.25778200000002,69.270264000000111],[-69.25167799999997,69.263610999999969],[-69.246947999999975,69.261107999999979],[-69.235001000000011,69.259720000000073],[-69.221938999999963,69.261658000000011],[-69.213057999999933,69.264709000000039],[-69.203339000000028,69.269989000000123],[-69.197768999999994,69.275542999999914],[-69.176392000000021,69.287490999999989],[-69.156386999999938,69.297484999999995],[-69.146118000000001,69.300537000000077],[-69.133330999999998,69.303314],[-69.013335999999981,69.327484000000027],[-68.956664999999873,69.331940000000088],[-68.941100999999946,69.332489000000066],[-68.921386999999868,69.331940000000088],[-68.658339999999896,69.300262000000089],[-68.537216000000001,69.285262999999986],[-68.504729999999995,69.280272999999966],[-68.330565999999919,69.27526899999998],[-68.251953000000015,69.27748100000008],[-68.230835000000013,69.277771000000087],[-68.198607999999979,69.274703999999986],[-68.172225999999966,69.269714000000079],[-68.159438999999963,69.266098000000056],[-68.14834599999989,69.261658000000011],[-68.139724999999885,69.257766999999944],[-68.088608000000022,69.228867000000093],[-68.083618000000001,69.225540000000137],[-68.077498999999875,69.21748400000007],[-68.081679999999949,69.211928999999998],[-68.091384999999946,69.205551000000071],[-68.103881999999999,69.202209000000096],[-68.129715000000033,69.197754000000089],[-68.163054999999929,69.199997000000053],[-68.263061999999991,69.211380000000077],[-68.410827999999924,69.221374999999966],[-68.549987999999985,69.226928999999984],[-68.643616000000009,69.229431000000034],[-68.664444000000003,69.228043000000127],[-68.689986999999917,69.223602000000028],[-68.839721999999938,69.214706000000092],[-68.923049999999989,69.220825000000104],[-68.967772999999966,69.221099999999979],[-68.948333999999875,69.214156999999943],[-68.93971299999987,69.211928999999998],[-68.913054999999986,69.20748900000001],[-68.862777999999992,69.201934999999992],[-68.80749499999996,69.198868000000061],[-68.788054999999986,69.198318000000029],[-68.767226999999991,69.199707000000046],[-68.737777999999992,69.203598000000113],[-68.704726999999991,69.209152000000074],[-68.65695199999999,69.210541000000092],[-68.618057000000022,69.209152000000074],[-68.515015000000005,69.20248400000014],[-68.502501999999993,69.198593000000074],[-68.505279999999914,69.195815999999979],[-68.513901000000033,69.191925000000083],[-68.690551999999968,69.141098],[-68.707229999999925,69.138321000000076],[-68.872771999999998,69.120529000000033],[-68.998046999999985,69.103591999999992],[-68.961670000000026,69.103867000000037],[-68.929717999999923,69.100266000000147],[-68.926940999999943,69.098328000000038],[-68.926666000000012,69.079987000000017],[-68.957779000000016,69.005264000000011],[-68.958892999999989,69.003052000000139],[-68.969161999999926,68.993591000000038],[-68.994155999999919,68.982483000000002],[-69.006118999999956,68.978317000000118],[-69.018889999999885,68.975815000000068],[-69.028885000000002,68.971375000000023],[-69.025833000000034,68.968597000000045],[-69.017501999999979,68.966385000000002],[-69.005568999999923,68.964705999999978],[-68.998046999999985,68.964995999999985],[-68.973052999999993,68.970824999999991],[-68.962783999999999,68.974701000000039],[-68.946380999999917,68.982483000000002],[-68.930557000000022,68.992752000000053],[-68.920272999999952,69.00277699999998],[-68.89416499999993,69.044982999999945],[-68.89416499999993,69.050537000000134],[-68.892226999999991,69.062194999999974],[-68.889724999999999,69.066376000000048],[-68.881942999999865,69.07777400000009],[-68.879165999999941,69.081374999999923],[-68.872497999999894,69.084991000000002],[-68.858336999999892,69.088318000000129],[-68.753615999999965,69.109711000000061],[-68.471114999999998,69.166381999999999],[-68.412780999999939,69.176926000000037],[-68.381377999999927,69.175262000000032],[-68.351394999999968,69.171646000000123],[-68.178329000000019,69.14665199999996],[-68.089447000000007,69.126082999999994],[-67.725280999999939,69.032211000000132],[-67.715012000000002,69.029160000000104],[-67.708054000000004,69.024704000000042],[-67.705840999999964,69.01638800000012],[-67.721114999999941,69.009720000000129],[-67.974715999999944,68.9727630000001],[-68.029448999999943,68.971375000000023],[-68.058884000000035,68.973602000000085],[-68.211120999999935,68.991928000000087],[-68.241378999999995,68.996933000000126],[-68.268065999999976,69.00277699999998],[-68.314162999999951,69.010544000000095],[-68.335007000000019,69.009155000000078],[-68.535552999999879,68.984146000000123],[-68.548614999999984,68.982208000000014],[-68.552779999999984,68.977203000000145],[-68.554717999999923,68.971100000000035],[-68.556106999999997,68.964157],[-68.545272999999952,68.959717000000012],[-68.440552000000025,68.9727630000001],[-68.337509000000011,68.985809000000074],[-68.320281999999963,68.986374000000069],[-68.303054999999972,68.985809000000074],[-68.290557999999976,68.982208000000014],[-68.285278000000005,68.977478000000133],[-68.28443900000002,68.974701000000039],[-68.264175000000023,68.964705999999978],[-68.196945000000028,68.94999700000011],[-68.186661000000015,68.947754000000145],[-68.169448999999986,68.946930000000009],[-68.152221999999938,68.946930000000009],[-68.116104000000007,68.94747899999993],[-68.081679999999949,68.94747899999993],[-68.064163000000008,68.946091000000024],[-68.048339999999996,68.943863000000079],[-68.039992999999981,68.941360000000088],[-67.974715999999944,68.865265000000079],[-67.972778000000005,68.859146000000067],[-67.977492999999981,68.855545000000006],[-67.986938000000009,68.854431000000034],[-68.006118999999899,68.854979999999955],[-68.082229999999981,68.862487999999985],[-68.129165999999998,68.867751999999996],[-68.18360899999999,68.878586000000041],[-68.242217999999866,68.889984000000027],[-68.256119000000012,68.892212000000029],[-68.289444000000003,68.894989000000123],[-68.37388599999997,68.897217000000069],[-68.475280999999995,68.899429000000112],[-68.489990000000034,68.897491000000002],[-68.491668999999945,68.896652000000017],[-68.488892000000021,68.893326000000002],[-68.48582499999992,68.89027400000009],[-68.477218999999934,68.886932000000115],[-68.463333000000034,68.885544000000039],[-68.43249499999996,68.883331000000055],[-68.373046999999929,68.88220200000012],[-68.353606999999954,68.88108799999992],[-68.293059999999969,68.874984999999981],[-68.266662999999994,68.869980000000112],[-68.179717999999923,68.851928999999984],[-68.133895999999936,68.837203999999986],[-68.008347000000015,68.816666000000112],[-67.972778000000005,68.811920000000043],[-67.955565999999976,68.810257000000092],[-67.916945999999939,68.808318999999983],[-67.886672999999917,68.808868000000075],[-67.861389000000031,68.805542000000059],[-67.778335999999911,68.786102000000085],[-67.771941999999967,68.78276100000005],[-67.771392999999932,68.781372000000033],[-67.774718999999948,68.77915999999999],[-67.803329000000019,68.774155000000121],[-67.820006999999976,68.772766000000104],[-67.857772999999952,68.771378000000027],[-67.872771999999998,68.771652000000131],[-67.915008999999998,68.774155000000121],[-67.944442999999922,68.778046000000018],[-68.076110999999969,68.80192599999998],[-68.170836999999892,68.814697000000081],[-68.352218999999934,68.832488999999953],[-68.426392000000021,68.839157000000114],[-68.546660999999972,68.84664900000007],[-68.565551999999968,68.847214000000122],[-68.58805799999999,68.846374999999966],[-68.606109999999887,68.842758000000003],[-68.610549999999989,68.839157000000114],[-68.611663999999962,68.835815000000025],[-68.604445999999939,68.83137499999998],[-68.593886999999995,68.827484000000084],[-68.557769999999948,68.821380999999974],[-68.52694699999995,68.795258000000047],[-68.602492999999924,68.794983000000002],[-68.678878999999938,68.796646000000123],[-68.795273000000009,68.799423000000047],[-68.807220000000029,68.800261999999975],[-68.900283999999942,68.80720500000001],[-68.967498999999918,68.814697000000081],[-68.995270000000005,68.819153000000028],[-69.00389100000001,68.822220000000129],[-69.015015000000005,68.827209000000096],[-69.105835000000013,68.848602000000028],[-69.25111400000003,68.872481999999991],[-69.28083799999996,68.875809000000118],[-69.323058999999944,68.876648000000102],[-69.361938000000009,68.874146000000053],[-69.378051999999968,68.871368000000018],[-69.389998999999989,68.867476999999951],[-69.398055999999997,68.862198000000149],[-69.394454999999994,68.85775799999999],[-69.379990000000021,68.854979999999955],[-69.36082499999992,68.854431000000034],[-69.331679999999949,68.856934000000024],[-69.279448999999943,68.855255],[-69.245543999999882,68.851379000000122],[-69.185546999999985,68.842209000000082],[-69.171111999999994,68.838882000000126],[-69.162215999999944,68.835815000000025],[-69.152221999999938,68.828048999999965],[-69.153884999999946,68.827209000000096],[-69.163054999999986,68.826096000000007],[-69.229996000000028,68.827209000000096],[-69.294158999999922,68.831940000000031],[-69.315001999999993,68.831664999999987],[-69.357773000000009,68.829163000000108],[-69.368606999999997,68.827209000000096],[-69.375548999999978,68.824997000000053],[-69.382767000000001,68.819153000000028],[-69.383895999999993,68.816376000000105],[-69.381377999999984,68.814986999999917],[-69.37110899999999,68.812759000000142],[-69.193603999999993,68.804153000000042],[-68.971114999999998,68.791931000000091],[-68.959166999999923,68.789703000000145],[-68.944992000000013,68.786926000000051],[-68.942490000000021,68.784988000000112],[-68.196380999999974,68.706940000000145],[-68.049437999999952,68.681655999999975],[-68.044998000000021,68.678314000000057],[-68.046111999999937,68.676376000000062],[-68.087508999999955,68.629425000000083],[-68.094451999999933,68.627762000000132],[-68.34445199999999,68.628586000000098],[-68.56220999999988,68.651931999999988],[-68.621933000000013,68.655823000000055],[-68.657776000000013,68.656372000000147],[-68.680283000000031,68.65554800000001],[-68.747771999999941,68.649155000000064],[-68.777785999999935,68.643051000000014],[-68.89416499999993,68.607208000000014],[-68.902495999999985,68.603592000000106],[-68.900283999999942,68.603043000000014],[-68.835830999999985,68.589157],[-68.804169000000002,68.589980999999966],[-68.757674999999949,68.600646999999981],[-68.749343999999951,68.602654000000143],[-68.735001000000011,68.607314999999971],[-68.711165999999992,68.621147000000121],[-68.679992999999911,68.630814000000044],[-68.647507000000019,68.635544000000095],[-68.62860099999989,68.635544000000095],[-68.594161999999926,68.633605999999986],[-68.563048999999921,68.629425000000083],[-68.533324999999991,68.624985000000038],[-68.481383999999935,68.614990000000148],[-68.475280999999995,68.61303700000002],[-68.470276000000013,68.609146000000123],[-68.46945199999999,68.606369000000029],[-68.483321999999987,68.596939000000134],[-68.50389100000001,68.589980999999966],[-68.519454999999994,68.585815000000082],[-68.533889999999928,68.583878000000027],[-68.605834999999956,68.578872999999987],[-68.648345999999947,68.577773999999977],[-68.660004000000015,68.578872999999987],[-68.682883999999945,68.575211000000024],[-68.69506100000001,68.574379000000135],[-68.707053999999971,68.57337200000012],[-68.712387000000035,68.572044000000005],[-68.716064000000017,68.569382000000019],[-68.716727999999932,68.568047000000035],[-68.707053999999971,68.5660400000001],[-68.696724000000017,68.565207999999984],[-68.656113000000005,68.559708000000001],[-68.460007000000019,68.562195000000088],[-68.447220000000016,68.563599000000067],[-68.435271999999941,68.567490000000134],[-68.427215999999987,68.571930000000009],[-68.422774999999945,68.576096000000064],[-68.420272999999895,68.579711999999915],[-68.419997999999964,68.585266000000104],[-68.416397000000018,68.591369999999984],[-68.396117999999944,68.593048000000067],[-68.337783999999999,68.593323000000112],[-68.244445999999982,68.588043000000027],[-68.215560999999866,68.585541000000148],[-68.136672999999973,68.572220000000016],[-68.06534599999992,68.545822000000044],[-67.920273000000009,68.534424000000001],[-67.866942999999992,68.509720000000073],[-67.809158000000025,68.531097000000102],[-67.673049999999932,68.561096000000077],[-67.664169000000015,68.562759000000028],[-67.643615999999952,68.562759000000028],[-67.539443999999946,68.550812000000064],[-67.52555799999999,68.548598999999911],[-67.500838999999928,68.538315000000068],[-67.492217999999923,68.527206000000035],[-67.493056999999965,68.523604999999975],[-67.502228000000002,68.514999000000046],[-67.510559000000001,68.511382999999967],[-67.51916499999993,68.509155000000021],[-67.543059999999912,68.506103999999993],[-67.607773000000009,68.503876000000048],[-67.621658000000025,68.5],[-67.628052000000025,68.496368000000018],[-67.634734999999921,68.486649],[-67.621383999999978,68.384429999999952],[-67.618606999999997,68.381088000000034],[-67.612502999999947,68.379424999999912],[-67.603332999999907,68.378860000000088],[-67.59445199999999,68.381363000000079],[-67.551102000000014,68.414428999999984],[-67.548339999999996,68.440262000000132],[-67.549437999999896,68.443863000000022],[-67.555832000000009,68.455261000000007],[-67.511123999999938,68.483322000000101],[-67.426102000000014,68.494430999999963],[-67.335555999999997,68.49693300000007],[-67.31639100000001,68.496094000000085],[-67.232497999999964,68.480545000000006],[-67.224166999999966,68.47665400000011],[-67.217498999999918,68.471924000000058],[-67.213622999999927,68.440811000000053],[-67.223052999999993,68.426086000000112],[-67.307770000000005,68.423309000000017],[-67.325835999999981,68.421371000000079],[-67.332779000000016,68.418869000000029],[-67.335830999999985,68.416092000000106],[-67.338608000000022,68.411926000000051],[-67.33805799999999,68.409988000000055],[-67.324448000000018,68.40776100000005],[-67.15695199999999,68.406372000000033],[-67.111938000000009,68.411926000000051],[-67.104996000000028,68.414153999999996],[-67.100554999999929,68.418320000000051],[-67.09722899999997,68.45138500000013],[-67.100280999999995,68.457214000000135],[-67.106658999999866,68.460541000000092],[-67.116652999999985,68.463607999999965],[-67.127212999999983,68.46804800000001],[-67.129990000000021,68.472763000000043],[-67.126937999999996,68.475540000000137],[-67.112777999999992,68.478867000000093],[-66.908050999999944,68.453873000000101],[-66.821395999999993,68.465271000000087],[-66.803054999999972,68.467209000000025],[-66.787506000000008,68.464996000000099],[-66.706954999999994,68.44470200000012],[-66.697768999999937,68.428039999999953],[-66.724166999999909,68.429153000000042],[-66.782775999999956,68.426086000000112],[-66.904998999999918,68.416382000000112],[-66.920546999999942,68.411102000000085],[-66.921660999999915,68.408324999999991],[-66.914168999999902,68.398880000000077],[-66.913054999999986,68.39498900000001],[-66.914444000000003,68.391937000000098],[-66.93638599999997,68.374420000000043],[-66.946654999999907,68.369980000000055],[-66.955001999999979,68.367477000000065],[-67.005843999999968,68.354430999999977],[-67.011123999999938,68.353591999999992],[-67.02416999999997,68.35386699999998],[-67.048889000000031,68.355820000000108],[-67.075561999999934,68.360535000000141],[-67.111388999999974,68.370255000000043],[-67.130279999999914,68.379700000000128],[-67.142226999999991,68.382750999999985],[-67.230559999999969,68.39498900000001],[-67.245543999999995,68.395827999999995],[-67.286391999999978,68.395827999999995],[-67.379715000000033,68.390823000000125],[-67.411117999999931,68.382750999999985],[-67.415557999999976,68.378036000000122],[-67.418883999999991,68.376373000000001],[-67.455565999999919,68.36775200000011],[-67.494719999999973,68.360809000000074],[-67.595276000000013,68.347762999999986],[-67.631667999999991,68.345261000000107],[-67.646117999999944,68.344711000000075],[-67.743880999999988,68.343322999999941],[-67.781386999999938,68.337204000000099],[-67.810546999999985,68.328598],[-67.832229999999925,68.320267000000115],[-67.849730999999963,68.309981999999991],[-67.865829000000019,68.29971299999994],[-67.87110899999999,68.292755],[-67.878326000000015,68.26527400000009],[-67.869720000000029,68.259995000000117],[-67.860001000000011,68.258331000000112],[-67.845551,68.258880999999974],[-67.833327999999938,68.261383000000023],[-67.826675000000023,68.264434999999935],[-67.820281999999906,68.268599999999935],[-67.818068999999923,68.274155000000064],[-67.821120999999948,68.284987999999998],[-67.820557000000008,68.289703000000031],[-67.815551999999968,68.292206000000022],[-67.752501999999993,68.318878000000097],[-67.745269999999891,68.320541000000048],[-67.597778000000005,68.323044000000039],[-67.583069000000023,68.308029000000033],[-67.572234999999978,68.273314999999968],[-67.576675000000023,68.268599999999935],[-67.583327999999995,68.265548999999965],[-67.591674999999952,68.263046000000145],[-67.616394000000014,68.258331000000112],[-67.646666999999979,68.25360100000006],[-67.662780999999995,68.252487000000087],[-67.689437999999996,68.24803200000008],[-67.695267000000001,68.242477000000008],[-67.694992000000013,68.241089000000102],[-67.690826000000015,68.239700000000084],[-67.679717999999923,68.238876000000118],[-67.666945999999996,68.239975000000129],[-67.579726999999934,68.251389000000017],[-67.570846999999901,68.253052000000139],[-67.551666000000012,68.258331000000112],[-67.546950999999979,68.260544000000095],[-67.539169000000015,68.265823000000069],[-67.533066000000019,68.271378000000141],[-67.531112999999948,68.278320000000065],[-67.535004000000015,68.285538000000031],[-67.541381999999999,68.288879000000065],[-67.546111999999937,68.294144000000131],[-67.544997999999964,68.296371000000022],[-67.540282999999931,68.29971299999994],[-67.523894999999982,68.308594000000085],[-67.494155999999975,68.321930000000009],[-67.401947000000007,68.352478000000019],[-67.394729999999981,68.354156000000103],[-67.385558999999944,68.354430999999977],[-67.243880999999988,68.358322000000044],[-67.232497999999964,68.357483000000059],[-67.182495000000017,68.349426000000108],[-67.130279999999914,68.340820000000008],[-67.078063999999927,68.331100000000106],[-67.016113000000018,68.318603999999993],[-67.011672999999917,68.316086000000041],[-67.018340999999964,68.311645999999996],[-67.032500999999968,68.309143000000006],[-67.152221999999995,68.299987999999985],[-67.235000999999954,68.291655999999989],[-67.303878999999938,68.258880999999974],[-67.319732999999985,68.249709999999993],[-67.327788999999939,68.243590999999981],[-67.333617999999944,68.237761999999975],[-67.337509000000011,68.232483000000002],[-67.338897999999915,68.227767999999969],[-67.33944699999995,68.221649000000127],[-67.33944699999995,68.205551000000071],[-67.335007000000019,68.200821000000019],[-67.327498999999932,68.18664600000011],[-67.327788999999939,68.181091000000038],[-67.338608000000022,68.171097000000032],[-67.34584000000001,68.166091999999992],[-67.37110899999999,68.153869999999984],[-67.387787000000003,68.146378000000084],[-67.398620999999878,68.143875000000094],[-67.412505999999951,68.143051000000128],[-67.430283000000031,68.144714000000079],[-67.456954999999994,68.149429000000112],[-67.477782999999988,68.154984000000013],[-67.513901000000033,68.162491000000102],[-67.528885000000002,68.165268000000026],[-67.567779999999971,68.169144000000074],[-67.581116000000009,68.168869000000086],[-67.598891999999978,68.164992999999981],[-67.598342999999943,68.162766000000147],[-67.575561999999934,68.154984000000013],[-67.544723999999917,68.14776599999999],[-67.480285999999978,68.134720000000016],[-67.466949,68.132202000000063],[-67.438048999999978,68.128036000000009],[-67.408050999999944,68.124984999999981],[-67.396956999999929,68.124694999999974],[-67.374161000000015,68.127472000000012],[-67.353881999999999,68.135268999999994],[-67.307770000000005,68.155548000000124],[-67.304168999999945,68.158600000000035],[-67.273894999999925,68.19081100000011],[-67.272781000000009,68.195525999999973],[-67.274718999999891,68.200546000000031],[-67.279175000000009,68.205261000000064],[-67.283614999999998,68.211929000000055],[-67.288894999999968,68.226379000000122],[-67.289444000000003,68.230820000000051],[-67.289444000000003,68.236374000000069],[-67.274718999999891,68.244141000000013],[-67.178878999999995,68.269989000000123],[-67.139724999999999,68.27998400000007],[-67.057769999999891,68.291092000000049],[-67.011397999999986,68.294983000000116],[-66.998336999999935,68.292480000000126],[-66.99110399999995,68.288879000000065],[-66.986114999999984,68.285538000000031],[-66.984160999999972,68.28054800000001],[-66.973617999999988,68.27388000000002],[-66.964721999999995,68.270263999999997],[-66.930572999999924,68.262482000000034],[-66.865828999999962,68.25],[-66.835830999999928,68.246368000000075],[-66.791672000000005,68.244705000000124],[-66.777495999999985,68.243317000000047],[-66.769729999999925,68.241089000000102],[-66.765839000000028,68.238586000000112],[-66.780288999999982,68.207764000000054],[-66.852218999999991,68.115265000000079],[-66.888900999999976,68.092758000000003],[-66.896666999999866,68.089432000000102],[-66.913894999999968,68.084152000000074],[-66.945830999999941,68.076096000000007],[-66.954452999999944,68.071930000000066],[-66.965560999999923,68.063873000000115],[-66.971114999999998,68.053314000000057],[-66.972777999999948,68.048599000000024],[-66.973327999999981,68.039428999999984],[-66.969727000000034,68.034149000000127],[-66.961120999999991,68.024994000000049],[-66.953612999999962,68.017212000000086],[-66.946654999999907,68.013611000000026],[-66.928054999999972,68.042755],[-66.921660999999915,68.049149000000057],[-66.836120999999935,68.095535000000041],[-66.748046999999985,68.131653000000142],[-66.709166999999923,68.141098],[-66.694442999999978,68.143051000000128],[-66.682769999999948,68.141373000000044],[-66.678878999999995,68.138885000000016],[-66.670837000000006,68.128860000000145],[-66.670272999999952,68.114151000000106],[-66.678054999999915,68.043320000000051],[-66.680557000000022,68.036925999999994],[-66.693053999999904,68.022217000000126],[-66.706389999999942,68.011658000000125],[-66.720839999999953,68.001663000000008],[-66.735000999999954,67.982208000000014],[-66.732773000000009,67.981934000000081],[-66.714721999999938,67.983597000000032],[-66.697219999999902,67.987488000000099],[-66.647232000000031,68.015548999999965],[-66.634734999999864,68.064147999999932],[-66.631942999999978,68.075821000000133],[-66.625548999999978,68.103317000000004],[-66.620270000000005,68.125809000000118],[-66.615554999999972,68.132477000000108],[-66.610549999999932,68.136932000000115],[-66.594726999999921,68.143051000000128],[-66.56138599999997,68.147490999999945],[-66.541945999999882,68.148330999999985],[-66.513625999999931,68.148330999999985],[-66.328887999999949,68.132202000000063],[-66.31527699999998,68.130264000000125],[-66.309432999999956,68.127472000000012],[-66.310546999999929,68.118591000000094],[-66.315001999999879,68.112487999999985],[-66.321121000000005,68.106934000000138],[-66.350280999999939,68.090271000000087],[-66.366394000000014,68.083328000000108],[-66.371657999999968,68.081664999999987],[-66.388610999999969,68.08137499999998],[-66.41361999999998,68.086104999999975],[-66.427779999999984,68.087493999999992],[-66.450561999999991,68.086928999999941],[-66.468612999999948,68.083054000000004],[-66.476104999999905,68.080551000000014],[-66.478606999999954,68.077209000000039],[-66.472228999999913,68.073044000000039],[-66.460555999999997,68.070541000000105],[-66.438048999999978,68.068054000000018],[-66.389998999999989,68.069443000000035],[-66.369445999999925,68.071655000000078],[-66.326110999999969,68.079163000000108],[-66.303878999999995,68.083878000000141],[-66.296660999999972,68.086104999999975],[-66.272780999999952,68.087769000000037],[-66.259170999999981,68.085814999999968],[-66.250838999999985,68.082214000000135],[-66.240279999999871,68.073317999999972],[-66.184157999999968,68.018875000000037],[-66.184433000000013,68.013321000000019],[-66.186385999999914,68.010818000000029],[-66.192764000000011,68.007217000000026],[-66.204177999999899,68.00471500000009],[-66.253066999999874,68.00221300000004],[-66.264175000000023,67.99971000000005],[-66.294448999999986,67.991653000000099],[-66.309722999999963,67.986099000000081],[-66.320846999999958,67.97886699999998],[-66.344451999999933,67.956650000000081],[-66.405838000000017,67.898041000000035],[-66.401397999999972,67.888596000000007],[-66.522232000000031,67.860809000000017],[-66.535278000000005,67.863602000000014],[-66.594161999999983,67.872482000000048],[-66.628601000000003,67.876648000000102],[-66.672501000000011,67.880264000000011],[-66.729445999999996,67.878859999999975],[-66.739715999999987,67.877762000000075],[-66.746947999999918,67.875259000000142],[-66.74499499999996,67.872757000000036],[-66.732223999999974,67.867203000000075],[-66.703063999999983,67.863602000000014],[-66.686934999999949,67.862761999999975],[-66.653885000000002,67.859421000000111],[-66.56138599999997,67.843048000000067],[-66.401397999999972,67.811096000000077],[-66.356658999999922,67.821381000000031],[-66.346389999999985,67.861099000000024],[-66.332779000000016,67.887772000000041],[-66.319457999999884,67.911102000000142],[-66.295837000000006,67.938309000000118],[-66.276672000000019,67.954436999999984],[-66.268615999999952,67.958037999999988],[-66.251952999999958,67.962494000000106],[-66.240554999999972,67.962768999999923],[-66.227492999999868,67.959991000000116],[-66.213897999999972,67.960815000000082],[-66.136948000000018,67.976089000000002],[-66.119995000000017,67.981369000000086],[-66.003219999999885,68.020492999999988],[-65.988723999999877,68.026145999999983],[-65.981383999999991,68.029984000000127],[-65.943603999999993,68.046097000000145],[-65.948607999999979,68.09248400000007],[-65.958617999999944,68.129424999999969],[-65.961945000000014,68.13749700000011],[-65.960555999999997,68.144440000000145],[-65.94749499999989,68.154160000000047],[-65.941665999999941,68.157211000000018],[-65.928329000000019,68.162201000000096],[-65.920837000000006,68.161926000000051],[-65.911941999999954,68.15887500000008],[-65.867492999999911,68.124694999999974],[-65.863892000000021,68.119431000000134],[-65.857773000000009,68.110260000000039],[-65.853607000000011,68.078048999999908],[-65.853607000000011,68.073317999999972],[-65.857773000000009,68.067215000000033],[-65.933837999999923,68.01226800000012],[-65.96032699999995,67.996429000000035],[-65.980835000000013,67.987267000000088],[-65.994330999999988,67.979767000000038],[-66.032226999999978,67.952484000000027],[-65.985824999999977,67.916655999999989],[-65.967223999999987,67.853317000000061],[-65.980835000000013,67.842758000000003],[-66.005004999999869,67.814986999999974],[-66.009734999999978,67.803314000000114],[-66.028884999999946,67.724426000000108],[-66.028884999999946,67.719436999999971],[-66.021941999999967,67.650269000000037],[-66.020003999999915,67.635269000000108],[-66.013061999999934,67.626923000000033],[-66.008621000000005,67.625534000000016],[-65.999724999999899,67.627472000000125],[-65.986663999999962,67.635269000000108],[-65.961394999999982,67.689697000000081],[-65.950286999999946,67.722487999999998],[-65.936935000000005,67.765549000000021],[-65.938598999999954,67.77609300000006],[-65.942490000000021,67.780823000000112],[-65.953888000000006,67.798324999999977],[-65.95666499999993,67.811920000000043],[-65.955840999999964,67.818329000000062],[-65.953338999999971,67.821381000000031],[-65.946105999999986,67.82638500000013],[-65.926391999999964,67.832763999999997],[-65.869155999999919,67.844147000000021],[-65.831679999999949,67.854431000000034],[-65.804169000000002,67.863602000000014],[-65.795272999999952,67.868042000000003],[-65.763625999999931,67.909987999999998],[-65.762222000000008,67.914703000000031],[-65.763901000000033,67.919708000000071],[-65.767226999999991,67.923035000000027],[-65.798889000000031,67.938309000000118],[-65.819732999999985,67.955551000000128],[-65.823623999999995,67.962768999999923],[-65.817779999999971,67.968048000000124],[-65.807769999999948,67.971100000000035],[-65.684433000000013,67.992477000000065],[-65.46305799999999,67.996368000000132],[-65.448607999999979,67.995529000000147],[-65.443603999999993,67.992203000000131],[-65.441939999999988,67.986923000000047],[-65.442490000000021,67.981369000000086],[-65.457503999999972,67.937194999999917],[-65.464447000000007,67.920822000000044],[-65.52027899999996,67.843048000000067],[-65.525833000000034,67.837769000000037],[-65.545273000000009,67.822220000000129],[-65.55860899999999,67.814423000000033],[-65.573623999999938,67.806931000000077],[-65.603881999999999,67.79693599999996],[-65.610549999999876,67.792755000000056],[-65.615829000000019,67.786102000000085],[-65.613891999999908,67.780823000000112],[-65.610001000000011,67.776382000000012],[-65.591948999999943,67.763046000000088],[-65.572509999999966,67.751663000000065],[-65.556945999999868,67.7452550000001],[-65.517501999999979,67.733047000000056],[-65.473617999999931,67.719711000000075],[-65.454726999999991,67.71276899999998],[-65.439712999999927,67.705551000000014],[-65.426391999999964,67.696365000000014],[-65.41361999999998,67.683593999999914],[-65.40695199999999,67.674988000000042],[-65.403609999999958,67.664703000000088],[-65.400283999999942,67.654434000000037],[-65.396392999999875,67.64498900000001],[-65.384734999999921,67.625809000000004],[-65.363892000000021,67.597488000000112],[-65.356658999999922,67.594711000000018],[-65.346389999999985,67.593323000000112],[-65.335281000000009,67.593597000000045],[-65.322784000000013,67.594986000000063],[-65.318344000000025,67.601089000000002],[-65.369155999999919,67.70277400000009],[-65.379165999999941,67.711655000000007],[-65.40264899999994,67.72322100000008],[-65.462508999999955,67.741928000000144],[-65.492492999999968,67.751663000000065],[-65.510833999999988,67.759155000000021],[-65.544448999999986,67.774155000000121],[-65.550551999999982,67.778320000000122],[-65.554442999999992,67.783051000000057],[-65.554442999999992,67.788040000000024],[-65.423614999999984,67.898041000000035],[-65.292495999999971,67.934143000000006],[-65.235275000000001,67.944702000000063],[-65.201401000000033,67.954436999999984],[-65.171660999999915,67.966094999999996],[-65.156386999999938,67.973602000000085],[-65.144164999999873,67.984145999999953],[-65.141387999999949,67.990265000000022],[-65.145553999999947,67.997208000000001],[-65.175827000000027,68.008881000000031],[-65.180831999999953,68.012207000000046],[-65.181106999999997,68.016662999999994],[-65.176665999999955,68.022491000000059],[-65.169158999999922,68.027206000000092],[-65.047775000000001,68.04942299999999],[-65.001113999999916,68.055542000000003],[-64.973052999999993,68.050261999999975],[-64.734160999999972,67.993866000000025],[-64.723617999999988,67.99054000000001],[-64.717498999999975,67.986374000000126],[-64.713622999999984,67.981659000000093],[-64.718063000000029,67.976654000000053],[-64.725554999999929,67.971648999999957],[-64.743332000000009,67.965819999999951],[-64.84722899999997,67.934981999999991],[-64.942490000000021,67.912490999999989],[-65.015288999999996,67.862488000000042],[-65.017775999999969,67.820830999999998],[-65.008347000000015,67.785262999999929],[-65.014175000000023,67.780273000000079],[-65.051101999999958,67.754439999999988],[-65.060546999999929,67.752213000000097],[-65.085280999999895,67.749145999999996],[-65.112212999999997,67.748032000000023],[-65.124434999999949,67.746368000000018],[-65.136123999999995,67.743591000000094],[-65.145553999999947,67.738876000000062],[-65.158339999999953,67.729706000000022],[-65.179992999999911,67.713608000000136],[-65.192489999999964,67.702209000000039],[-65.196380999999974,67.69720500000011],[-65.198607999999922,67.691649999999981],[-65.205001999999979,67.65914900000007],[-65.205565999999919,67.653595000000109],[-65.204178000000013,67.648331000000098],[-65.200286999999946,67.643875000000037],[-65.178328999999962,67.633605999999986],[-65.172500999999954,67.633605999999986],[-65.167220999999984,67.635818000000029],[-65.162780999999995,67.63888500000013],[-65.150283999999999,67.672211000000118],[-65.149733999999967,67.677765000000079],[-65.150283999999999,67.68193100000002],[-65.154174999999952,67.686646000000053],[-65.153335999999911,67.692200000000014],[-65.148894999999982,67.698317999999972],[-65.129715000000033,67.715820000000008],[-65.124161000000015,67.718047999999953],[-64.929717999999923,67.78776600000009],[-64.919723999999917,67.790817000000118],[-64.907227000000034,67.792205999999965],[-64.827224999999942,67.784714000000008],[-64.81639100000001,67.78137200000009],[-64.810546999999985,67.777205999999978],[-64.808884000000035,67.771927000000005],[-64.80749499999996,67.74275200000011],[-64.81610099999989,67.710541000000035],[-64.825835999999981,67.703049000000078],[-64.837509000000011,67.700271999999984],[-64.862777999999992,67.691649999999981],[-64.862502999999947,67.687484999999981],[-64.84944200000001,67.687194999999974],[-64.820557000000008,67.688308999999947],[-64.799728000000016,67.690811000000053],[-64.779448999999886,67.697754000000032],[-64.773055999999997,67.703598000000056],[-64.768616000000009,67.709427000000062],[-64.762221999999952,67.76249700000011],[-64.755843999999968,67.817764000000068],[-64.75,67.822769000000108],[-64.740829000000019,67.824707000000046],[-64.65306099999998,67.82887299999993],[-64.611938000000009,67.82638500000013],[-64.56806899999998,67.819992000000013],[-64.506957999999997,67.80720500000001],[-64.368880999999931,67.764160000000061],[-64.363327000000027,67.759430000000009],[-64.363891999999964,67.754439999999988],[-64.396117999999944,67.711929000000112],[-64.401397999999915,67.707764000000111],[-64.414718999999991,67.707214000000079],[-64.431380999999988,67.709717000000069],[-64.445266999999944,67.71138000000002],[-64.460006999999905,67.711655000000007],[-64.472503999999958,67.710266000000047],[-64.578338999999971,67.696930000000066],[-64.597228999999857,67.689697000000081],[-64.61721799999998,67.678589000000045],[-64.637221999999895,67.665267999999912],[-64.639175000000023,67.660538000000088],[-64.626389000000017,67.659714000000122],[-64.618332000000009,67.663040000000137],[-64.581389999999999,67.67442299999999],[-64.515839000000028,67.68609600000002],[-64.454177999999956,67.693314000000044],[-64.380828999999892,67.698029000000076],[-64.36250299999989,67.702484000000084],[-64.34722899999997,67.709991000000002],[-64.331389999999885,67.727203000000031],[-64.326400999999919,67.731094000000098],[-64.318068999999923,67.73414600000001],[-64.305557000000022,67.733597000000088],[-64.295273000000009,67.730270000000132],[-64.072784000000013,67.610260000000096],[-64.067779999999971,67.602477999999962],[-64.039718999999991,67.533600000000092],[-64.038604999999905,67.528595000000053],[-64.038895000000025,67.525818000000129],[-64.044998000000021,67.520828000000051],[-64.053054999999915,67.517487000000017],[-64.134734999999921,67.490265000000079],[-64.144729999999925,67.487197999999978],[-64.165282999999988,67.482482999999945],[-64.238601999999901,67.46748400000007],[-64.250838999999871,67.466095000000109],[-64.271941999999967,67.464996000000099],[-64.281113000000005,67.465546000000131],[-64.343886999999938,67.469985999999949],[-64.386948000000018,67.474425999999994],[-64.412216000000001,67.477478000000076],[-64.423049999999989,67.478043000000127],[-64.435546999999985,67.478592000000049],[-64.440552000000025,67.474991000000045],[-64.432220000000029,67.471099999999979],[-64.410004000000015,67.464156999999943],[-64.384734999999978,67.458328000000108],[-64.356948999999986,67.453873000000101],[-64.296660999999915,67.448029000000076],[-64.283614999999998,67.448029000000076],[-64.204452999999944,67.452209000000096],[-64.190551999999968,67.453323000000069],[-64.166945999999996,67.456940000000031],[-64.145003999999858,67.461655000000064],[-64.123321999999916,67.465271000000143],[-64.111114999999927,67.466660000000104],[-64.086394999999982,67.46748400000007],[-64.048049999999876,67.464156999999943],[-64.010833999999988,67.459717000000126],[-64.00111400000003,67.455826000000059],[-63.992653000000018,67.448624000000109],[-63.951110999999969,67.409988000000112],[-63.904166999999973,67.30581699999999],[-63.904166999999973,67.301651000000106],[-63.905829999999924,67.299712999999997],[-63.912773000000016,67.295532000000094],[-63.923889000000031,67.293320000000051],[-63.93721800000003,67.292755],[-64.022780999999952,67.30802900000009],[-64.055266999999958,67.311371000000008],[-64.084732000000031,67.313309000000118],[-64.181670999999938,67.312194999999974],[-64.217498999999975,67.313598999999954],[-64.339995999999985,67.319442999999978],[-64.530562999999916,67.33776899999998],[-64.740279999999984,67.356934000000138],[-64.757507000000032,67.358322000000044],[-64.788329999999917,67.35914600000001],[-64.797500999999954,67.356644000000131],[-64.80082699999997,67.352768000000026],[-64.798889000000031,67.350266000000147],[-64.788605000000018,67.34693900000002],[-64.73443599999996,67.333603000000096],[-64.721389999999928,67.331374999999923],[-64.687774999999988,67.327484000000027],[-64.441665999999998,67.303040000000124],[-64.402221999999995,67.299149000000057],[-64.372498000000007,67.297211000000118],[-64.344726999999921,67.297485000000052],[-64.283614999999998,67.299987999999985],[-64.258621000000005,67.299149000000057],[-64.24610899999999,67.298599000000024],[-64.23832699999997,67.296936000000073],[-64.231948999999986,67.293320000000051],[-64.233886999999868,67.288589000000115],[-64.248336999999992,67.279434000000037],[-64.306380999999988,67.262207000000046],[-64.325012000000015,67.257216999999969],[-64.356110000000001,67.250275000000045],[-64.392226999999991,67.24664300000012],[-64.419448999999929,67.247207999999944],[-64.509170999999981,67.254990000000078],[-64.536941999999954,67.256653000000028],[-64.550277999999992,67.25610400000005],[-64.668610000000001,67.238585999999941],[-64.724166999999966,67.22886699999998],[-64.779174999999952,67.218872000000033],[-64.790282999999931,67.21665999999999],[-64.799987999999928,67.213608000000079],[-64.80972300000002,67.210266000000104],[-64.81610099999989,67.206940000000088],[-64.813048999999978,67.201385000000016],[-64.808043999999995,67.198029000000133],[-64.801392000000021,67.195250999999985],[-64.783324999999934,67.190262000000018],[-64.772781000000009,67.189696999999967],[-64.758895999999993,67.19081099999994],[-64.71665999999999,67.200272000000098],[-64.655838000000017,67.217209000000139],[-64.46665999999999,67.229156000000046],[-64.425277999999935,67.228043000000014],[-64.350783999999976,67.234764000000098],[-64.287444999999991,67.238257999999973],[-64.267112999999995,67.241425000000049],[-64.232772999999952,67.251434000000017],[-64.169448999999986,67.260818000000029],[-64.158889999999928,67.262497000000053],[-64.114715999999987,67.267212000000086],[-64.010559000000001,67.275269000000037],[-63.976944000000003,67.277771000000087],[-63.969993999999986,67.27748100000008],[-63.965836000000024,67.275542999999971],[-63.962775999999963,67.272491000000059],[-63.962775999999963,67.270263999999997],[-63.975829999999917,67.251937999999996],[-63.993056999999965,67.228317000000118],[-63.998336999999935,67.221649000000127],[-64.013335999999981,67.212204000000042],[-64.021392999999989,67.208878000000027],[-64.045272999999952,67.204711999999972],[-64.05610699999994,67.204437000000098],[-64.088608000000022,67.207764000000054],[-64.220222000000035,67.201714000000038],[-64.467498999999918,67.167480000000069],[-64.501403999999923,67.161652000000004],[-64.545272999999952,67.152481000000023],[-64.575011999999958,67.144714000000079],[-64.584166999999923,67.142212000000029],[-64.611938000000009,67.132477000000108],[-64.658050999999944,67.113037000000134],[-64.680831999999953,67.09304800000001],[-64.686935000000005,67.087493999999992],[-64.689986999999917,67.083602999999925],[-64.692490000000021,67.078048999999965],[-64.700561999999991,67.018051000000071],[-64.701110999999912,67.012207000000046],[-64.700561999999991,67.008040999999992],[-64.696945000000028,67.003326000000129],[-64.691939999999988,67.000549000000035],[-64.683060000000012,67.000275000000101],[-64.660278000000005,67.003875999999991],[-64.638610999999969,67.008606000000043],[-64.628325999999959,67.012207000000046],[-64.623885999999914,67.018051000000071],[-64.619720000000029,67.028320000000122],[-64.618057000000022,67.039428999999984],[-64.618057000000022,67.044434000000081],[-64.619720000000029,67.049713000000054],[-64.618880999999988,67.055252000000053],[-64.615279999999927,67.066940000000045],[-64.609160999999972,67.081940000000031],[-64.604172000000005,67.088317999999958],[-64.597777999999892,67.093872000000147],[-64.583617999999888,67.103043000000127],[-64.547501000000011,67.118590999999924],[-64.527221999999881,67.124145999999996],[-64.506393000000003,67.129425000000026],[-64.474715999999944,67.13499500000006],[-64.229995999999971,67.164154000000053],[-64.087218999999948,67.179703000000131],[-64.008895999999993,67.178864000000033],[-63.995551999999975,67.179428000000144],[-63.971381999999949,67.182205000000067],[-63.96055599999994,67.184417999999994],[-63.929726000000016,67.192749000000106],[-63.919166999999959,67.196365000000128],[-63.912216000000001,67.200546000000031],[-63.86222099999992,67.225815000000011],[-63.80750299999994,67.239150999999993],[-63.797500999999954,67.240265000000136],[-63.561942999999985,67.236923000000047],[-63.546394000000021,67.235809000000074],[-63.469443999999953,67.228317000000118],[-63.458336000000031,67.226088999999945],[-63.450554000000011,67.222488000000112],[-63.449164999999994,67.219437000000084],[-63.449164999999994,67.214995999999985],[-63.450835999999981,67.179703000000131],[-63.453888000000006,67.169434000000138],[-63.529442000000017,67.104431000000034],[-63.53833800000001,67.100540000000137],[-63.604720999999984,67.075272000000041],[-63.613892000000021,67.072769000000051],[-63.648055999999883,67.066940000000045],[-63.672775000000001,67.063599000000011],[-63.712776000000019,67.054977000000008],[-63.722771000000023,67.05192599999998],[-63.731383999999991,67.048035000000084],[-63.744445999999982,67.041092000000106],[-63.779723999999987,67.017487000000131],[-63.795836999999949,67.006653000000085],[-63.806389000000024,66.99581900000004],[-63.807219999999973,66.988037000000077],[-63.801392000000021,66.979705999999965],[-63.781386999999938,66.963608000000136],[-63.772498999999868,66.958878000000084],[-63.769447000000014,66.97137500000008],[-63.768889999999942,66.976929000000041],[-63.771111000000019,66.980819999999937],[-63.772498999999868,66.986098999999911],[-63.773613000000012,66.991088999999988],[-63.773330999999985,66.996094000000028],[-63.770836000000031,67.001389000000074],[-63.767219999999952,67.006104000000107],[-63.756950000000018,67.014160000000004],[-63.750557000000015,67.017487000000131],[-63.734443999999939,67.024155000000121],[-63.698607999999979,67.038878999999952],[-63.680000000000007,67.045821999999987],[-63.650832999999977,67.052475000000129],[-63.638335999999981,67.054428000000087],[-63.600837999999953,67.057479999999998],[-63.565552000000025,67.062485000000038],[-63.535277999999948,67.070831000000112],[-63.497222999999963,67.085266000000047],[-63.40277900000001,67.144440000000145],[-63.396392999999989,67.152206000000035],[-63.39416499999993,67.156936999999971],[-63.393889999999942,67.161652000000004],[-63.398055999999997,67.165817000000004],[-63.416945999999882,67.180267000000072],[-63.419997999999964,67.185806000000071],[-63.421943999999883,67.194702000000007],[-63.420836999999949,67.200272000000098],[-63.417777999999998,67.206100000000049],[-63.409163999999919,67.21665999999999],[-63.351669000000015,67.268051000000014],[-63.340553,67.276657000000114],[-63.332503999999972,67.281937000000028],[-63.298888999999974,67.297760000000039],[-63.280555999999933,67.306366000000139],[-63.272498999999982,67.309418000000051],[-63.160277999999948,67.328323000000012],[-63.137222000000008,67.331100000000106],[-63.110282999999868,67.329987000000017],[-63.03972599999986,67.306090999999924],[-63.022498999999925,67.298035000000084],[-63.015006999999969,67.293593999999985],[-62.997779999999977,67.281372000000147],[-62.992774999999995,67.276382000000126],[-62.973884999999882,67.235535000000141],[-62.970832999999971,67.225815000000011],[-62.970832999999971,67.221375000000023],[-63.023055999999997,67.179428000000144],[-63.035834999999963,67.171097000000032],[-63.04472399999986,67.167205999999965],[-63.075561999999934,67.15887500000008],[-63.100554999999986,67.155548000000124],[-63.134170999999981,67.15277100000003],[-63.170279999999991,67.147217000000069],[-63.19027699999998,67.143326000000002],[-63.232497999999964,67.132202000000063],[-63.242500000000007,67.129149999999981],[-63.268889999999942,67.117477000000122],[-63.275832999999977,67.113312000000121],[-63.284447,67.105255],[-63.285278000000005,67.099716000000001],[-63.283614999999998,67.094986000000119],[-63.278052999999943,67.090820000000065],[-63.268607999999972,67.082488999999953],[-63.260833999999988,67.074158000000068],[-63.25389100000001,67.064697000000081],[-63.224716000000001,67.024704000000042],[-63.220276000000013,67.016937000000098],[-63.220276000000013,67.006104000000107],[-63.220832999999971,66.989699999999971],[-63.221381999999949,66.984984999999938],[-63.223884999999996,66.979430999999977],[-63.227776000000006,66.972762999999986],[-63.240836999999999,66.961655000000007],[-63.27777900000001,66.949706999999933],[-63.320557000000008,66.940262000000075],[-63.356109999999944,66.934708000000057],[-63.36860699999994,66.934708000000057],[-63.43638599999997,66.925537000000134],[-63.469993999999986,66.920532000000094],[-63.514724999999999,66.912490999999989],[-63.526138000000003,66.909271000000047],[-63.545554999999865,66.903595000000053],[-63.554442999999935,66.899719000000005],[-63.565552000000025,66.892487000000074],[-63.565552000000025,66.888046000000145],[-63.563613999999973,66.883605999999929],[-63.557502999999997,66.875809000000004],[-63.554717999999866,66.870254999999986],[-63.551392000000021,66.860535000000084],[-63.555557000000022,66.848877000000073],[-63.571944999999971,66.837494000000049],[-63.593329999999924,66.831665000000044],[-63.615004999999996,66.827208999999982],[-63.638892999999882,66.824432000000058],[-63.652221999999881,66.82388300000008],[-63.698607999999979,66.822495000000004],[-63.725273000000016,66.823043999999982],[-63.775832999999921,66.825821000000019],[-63.771384999999952,66.811096000000077],[-63.653053,66.802475000000015],[-63.624442999999928,66.801926000000037],[-63.598334999999906,66.80304000000001],[-63.587776000000019,66.804428000000144],[-63.548889000000031,66.812485000000095],[-63.539443999999946,66.814697000000137],[-63.535277999999948,66.81581100000011],[-63.488891999999964,66.828323000000125],[-63.478881999999942,66.835815000000082],[-63.476386999999932,66.839157],[-63.475272999999959,66.842484000000127],[-63.476944000000003,66.846939000000134],[-63.487220999999977,66.858871000000079],[-63.494719999999973,66.865539999999953],[-63.496947999999861,66.880814000000044],[-63.487220999999977,66.896942000000081],[-63.480826999999977,66.90248100000008],[-63.474441999999954,66.906096999999932],[-63.456107999999972,66.910811999999964],[-63.441665999999998,66.908325000000104],[-63.427223000000026,66.901382000000126],[-63.407218999999998,66.814423000000033],[-63.407776000000013,66.809708000000001],[-63.410278000000005,66.799988000000099],[-63.414718999999991,66.783325000000048],[-63.417777999999998,66.773040999999978],[-63.436110999999926,66.728043000000071],[-63.449439999999925,66.716095000000053],[-63.453056000000004,66.711655000000064],[-63.451941999999917,66.70637499999998],[-63.441939999999931,66.703048999999965],[-63.420279999999934,66.698868000000061],[-63.415276000000006,66.700546000000145],[-63.408332999999914,66.704437000000041],[-63.40277900000001,66.708878000000141],[-63.376663000000008,66.734146000000067],[-63.32028200000002,66.814148000000046],[-63.319450000000018,66.819992000000013],[-63.224716000000001,66.899428999999998],[-62.973884999999882,66.961104999999975],[-62.962501999999972,66.963882000000069],[-62.939994999999954,66.966660000000047],[-62.87222300000002,66.964432000000102],[-62.846946999999943,66.961929000000112],[-62.837776000000019,66.957764000000111],[-62.821114000000023,66.830276000000083],[-62.820557000000008,66.813599000000067],[-62.827498999999932,66.78804000000008],[-62.829726999999991,66.783325000000048],[-62.837501999999972,66.771927000000005],[-62.84332999999998,66.769149999999911],[-62.864448999999979,66.746094000000085],[-62.869995000000017,66.739700000000028],[-62.873055000000022,66.733597000000088],[-62.91194200000001,66.652771000000143],[-62.914444000000003,66.647216999999955],[-62.908050999999944,66.63998400000014],[-62.903052999999943,66.637207000000046],[-62.899726999999984,66.636658000000125],[-62.859169000000009,66.653045999999961],[-62.850280999999939,66.656937000000028],[-62.835274000000027,66.666382000000112],[-62.819999999999936,66.684418000000107],[-62.734168999999952,66.790816999999947],[-62.735831999999959,66.801651000000049],[-62.743331999999953,66.809982000000105],[-62.751113999999916,66.818054000000075],[-62.768058999999937,66.830551000000071],[-62.774170000000026,66.840546000000018],[-62.768332999999984,66.907760999999994],[-62.764449999999954,66.925262000000089],[-62.761115999999959,66.929152999999985],[-62.743057000000022,66.941924999999969],[-62.725273000000016,66.947478999999987],[-62.634170999999981,66.951385000000073],[-62.607779999999991,66.952209000000039],[-62.592223999999931,66.950821000000133],[-62.578612999999962,66.947754000000032],[-62.568892999999889,66.944138000000123],[-62.549994999999967,66.931655999999975],[-62.519996999999933,66.911102000000028],[-62.40277900000001,66.809417999999994],[-62.401389999999935,66.804977000000065],[-62.40193899999997,66.789154000000053],[-62.398613000000012,66.780272999999909],[-62.393332999999984,66.775818000000072],[-62.326950000000011,66.730270000000132],[-62.319450000000018,66.726379000000065],[-62.313332000000003,66.726929000000098],[-62.299171000000001,66.733047000000056],[-62.291388999999924,66.756378000000097],[-62.292777999999998,66.761658000000011],[-62.295837000000006,66.766388000000006],[-62.362220999999977,66.818329000000119],[-62.419448999999986,66.843323000000055],[-62.424720999999977,66.847488000000055],[-62.426948999999865,66.851378999999952],[-62.436942999999985,66.884430000000123],[-62.427222999999969,66.921097000000088],[-62.418891999999971,66.926651000000106],[-62.407501000000025,66.92942800000003],[-62.394721999999945,66.929152999999985],[-62.346946999999886,66.933594000000085],[-62.284728999999913,66.946091000000081],[-62.271666999999979,66.960815000000139],[-62.279723999999931,66.979156000000103],[-62.291388999999924,67.005829000000119],[-62.294448999999986,67.021378000000027],[-62.293616999999983,67.026382000000012],[-62.290282999999988,67.032486000000006],[-62.285277999999948,67.036102000000085],[-62.278609999999958,67.039428999999984],[-62.262504999999976,67.045258000000047],[-62.101394999999968,67.054703000000075],[-62.054442999999878,67.049149000000114],[-62.03194400000001,67.045258000000047],[-62.019721999999945,67.042206000000078],[-62.005561999999941,67.0352630000001],[-62.006950000000018,67.031937000000084],[-62.04999499999991,66.987198000000092],[-62.106110000000001,66.917206000000022],[-62.102225999999916,66.913040000000137],[-62.072226999999998,66.907486000000119],[-62.029723999999987,66.901657000000114],[-62.018889999999942,66.901657000000114],[-62.018607999999972,66.908035000000098],[-62.015006999999912,66.91415400000011],[-61.95666499999993,66.963882000000069],[-61.949722000000008,66.967208999999968],[-61.938605999999993,66.969436999999971],[-61.913329999999974,66.970825000000048],[-61.865554999999972,66.970825000000048],[-61.851395000000025,66.970535000000041],[-61.83805099999995,66.968597000000102],[-61.749725000000012,66.94802900000002],[-61.737220999999977,66.941086000000041],[-61.731941000000006,66.93691999999993],[-61.728881999999942,66.932205000000067],[-61.730826999999863,66.923874000000012],[-61.612777999999992,66.870818999999926],[-61.314163000000008,66.687195000000031],[-61.294723999999917,66.67442299999999],[-61.289443999999946,66.669983000000002],[-61.281386999999995,66.661102000000028],[-61.262504999999976,66.629425000000083],[-61.266662999999937,66.622756999999922],[-61.300277999999935,66.593597000000045],[-61.341667000000029,66.571930000000009],[-61.348052999999936,66.570541000000048],[-61.356666999999959,66.571106000000043],[-61.388335999999981,66.578598],[-61.400275999999963,66.577208999999982],[-61.409720999999934,66.572768999999994],[-61.425003000000004,66.559708000000057],[-61.447776999999974,66.538315000000125],[-61.46166999999997,66.543319999999994],[-61.54861499999987,66.547484999999995],[-61.584723999999994,66.547760000000039],[-61.598609999999951,66.550262000000089],[-61.618056999999965,66.557205000000067],[-61.623885999999914,66.566939999999988],[-61.631942999999978,66.586654999999951],[-61.638610999999969,66.595534999999984],[-61.643889999999999,66.599991000000102],[-61.669166999999959,66.616378999999995],[-61.691382999999973,66.62831100000011],[-61.72582999999986,66.643051000000071],[-61.734443999999996,66.645827999999995],[-61.950554000000011,66.67692599999998],[-62.015555999999947,66.671371000000079],[-62.12388599999997,66.626373000000001],[-62.050551999999982,66.624985000000095],[-62.018607999999972,66.640823000000125],[-61.990836999999999,66.648041000000092],[-61.979995999999971,66.648041000000092],[-61.950554000000011,66.646102999999982],[-61.830284000000006,66.621368000000132],[-61.796950999999979,66.611923000000047],[-61.788895000000025,66.608597000000032],[-61.75389100000001,66.588593000000117],[-61.576667999999984,66.487198000000035],[-61.575279000000023,66.48275799999999],[-61.576392999999996,66.477203000000088],[-61.583327999999938,66.471649000000127],[-61.59194199999996,66.46775800000006],[-61.614166000000012,66.463043000000027],[-61.635001999999929,66.459991000000059],[-61.731383999999935,66.451096000000064],[-61.844161999999926,66.446091000000024],[-61.857779999999934,66.447204999999997],[-61.869720000000029,66.445815999999979],[-61.956947000000014,66.424149000000114],[-61.976943999999946,66.417480000000069],[-61.985832000000016,66.413605000000075],[-61.986945999999932,66.410262999999986],[-61.978049999999996,66.403869999999984],[-61.96416499999998,66.401382000000012],[-61.934165999999891,66.400818000000072],[-61.755004999999983,66.407486000000063],[-61.578612999999905,66.415268000000026],[-61.569449999999904,66.415543000000014],[-61.557266000000027,66.413680999999997],[-61.545279999999991,66.409988000000112],[-61.466942000000017,66.371918000000051],[-61.462501999999972,66.369141000000127],[-61.463614999999891,66.365814],[-61.665276000000006,66.324996999999996],[-61.877494999999954,66.283324999999934],[-61.928885999999977,66.283874999999966],[-62.198883000000023,66.314148000000102],[-62.207503999999915,66.316666000000112],[-62.212218999999948,66.319442999999978],[-62.218055999999933,66.331939999999975],[-62.231941000000006,66.366089000000045],[-62.232215999999937,66.369705000000067],[-62.229439000000013,66.375259000000085],[-62.224998000000028,66.380264000000125],[-62.218604999999968,66.392487000000017],[-62.218329999999867,66.396652000000017],[-62.223610000000008,66.401093000000117],[-62.229996000000028,66.40415999999999],[-62.255279999999914,66.408324999999991],[-62.268889999999999,66.409424000000001],[-62.418610000000001,66.421097000000032],[-62.456107999999915,66.423874000000126],[-62.565833999999995,66.42804000000001],[-62.626662999999894,66.426085999999998],[-62.698883000000023,66.41276600000009],[-62.709723999999994,66.410537999999974],[-62.716110000000015,66.407211000000018],[-62.710281000000009,66.403594999999996],[-62.673614999999984,66.393600000000049],[-62.629996999999946,66.387771999999984],[-62.478049999999996,66.369980000000112],[-62.337501999999972,66.315811000000053],[-62.32028200000002,66.308319000000097],[-62.316108999999983,66.304977000000008],[-62.320556999999951,66.299712999999997],[-62.323616000000015,66.298035000000084],[-62.388892999999939,66.276093000000003],[-62.398338000000024,66.273041000000092],[-62.621940999999993,66.221375000000023],[-62.643615999999952,66.216933999999924],[-62.666945999999939,66.214432000000045],[-62.680832000000009,66.216933999999924],[-62.751944999999921,66.241088999999931],[-62.757225000000005,66.245255000000043],[-62.780555999999933,66.277771000000143],[-62.782218999999884,66.282486000000006],[-62.782218999999884,66.288879000000122],[-62.773330999999985,66.296936000000073],[-62.774170000000026,66.302765000000136],[-62.77944199999996,66.307205000000124],[-62.797225999999966,66.313873000000115],[-62.816665999999941,66.320831000000112],[-62.826110999999912,66.324158000000011],[-62.858894000000021,66.334152000000074],[-62.868057000000022,66.336104999999975],[-62.881110999999976,66.335815000000139],[-62.889998999999989,66.333328000000108],[-62.895003999999915,66.329712000000029],[-62.809440999999993,66.240814000000114],[-62.801391999999964,66.235259999999926],[-62.715003999999908,66.201660000000061],[-62.706107999999972,66.199707000000103],[-62.681389000000024,66.196930000000009],[-62.647223999999994,66.199707000000103],[-62.603614999999991,66.205261000000121],[-62.488051999999925,66.200271999999927],[-62.366660999999965,66.174987999999985],[-62.180557000000022,66.148604999999975],[-62.037505999999951,66.100815000000011],[-61.961112999999898,66.033875000000023],[-61.955001999999979,66.024155000000121],[-61.954445000000021,66.019150000000081],[-61.955832999999927,66.014998999999989],[-61.960280999999895,66.011932000000058],[-61.975554999999986,66.010543999999982],[-62.088889999999935,66.000274999999931],[-62.133614000000023,66.000000000000114],[-62.148055999999997,66.001389000000131],[-62.166388999999981,66.00749200000007],[-62.172501000000011,66.010543999999982],[-62.188889000000017,66.012207000000103],[-62.196663000000001,66.011108000000092],[-62.291672000000005,65.980270000000132],[-62.307776999999987,65.973876999999959],[-62.391669999999863,66.011383000000137],[-62.404715999999894,66.014708999999982],[-62.525276000000019,66.034149000000127],[-62.541388999999981,66.035537999999974],[-62.695549000000028,66.042205999999965],[-62.74111199999993,66.038315000000068],[-62.759726999999884,66.033051000000057],[-62.778885000000002,66.033324999999991],[-62.799995000000024,66.039703000000145],[-62.809165999999891,66.043869000000029],[-62.831672999999967,66.055542000000059],[-62.842223999999987,66.064147999999989],[-62.846946999999943,66.069153000000028],[-62.855003000000011,66.083054000000004],[-62.856667000000016,66.087494000000049],[-62.860001000000011,66.103043000000127],[-62.8663939999999,66.112761999999975],[-62.873329000000012,66.121368000000075],[-62.884170999999867,66.129973999999947],[-62.90555599999999,66.140823000000012],[-62.930557000000022,66.146942000000081],[-62.946945000000028,66.148604999999975],[-62.95944199999991,66.14888000000002],[-62.970551,66.148041000000035],[-63.013618000000008,66.138885000000073],[-63.041672000000005,66.130264000000011],[-63.061942999999928,66.120819000000097],[-63.060279999999977,66.116379000000109],[-63.039443999999889,66.113312000000008],[-63.006393000000003,66.11692800000003],[-62.892226999999934,66.076660000000004],[-62.889998999999989,66.066375999999934],[-62.885833999999988,66.056366000000025],[-62.875,66.047760000000096],[-62.862220999999863,66.039429000000041],[-62.841942000000017,66.027480999999966],[-62.826667999999927,66.020264000000054],[-62.815833999999938,66.016098],[-62.793616999999983,66.010818000000086],[-62.778885000000002,66.009720000000016],[-62.768332999999984,66.009720000000016],[-62.755561999999884,66.00999500000006],[-62.743889000000024,66.011383000000137],[-62.67472099999992,66.015549000000021],[-62.523055999999997,66.002213000000097],[-62.517219999999952,66.000549000000092],[-62.4183349999999,65.970535000000041],[-62.405555999999933,65.963043000000084],[-62.395003999999915,65.949996999999996],[-62.386664999999994,65.936646000000053],[-62.321114000000023,65.831100000000049],[-62.317222999999956,65.808029000000033],[-62.441665999999941,65.793594000000098],[-62.478881999999999,65.790817000000004],[-62.505279999999971,65.790817000000004],[-62.521384999999952,65.792480000000126],[-62.604171999999892,65.801085999999998],[-62.619995000000017,65.803040000000067],[-62.684440999999936,65.816375999999991],[-62.717773000000022,65.825272000000098],[-62.727218999999991,65.828598],[-62.729996000000028,65.831940000000088],[-62.75278499999996,65.853591999999935],[-62.80750299999994,65.88998400000014],[-62.829445000000021,65.899994000000049],[-62.857506000000001,65.911102000000028],[-62.864166000000012,65.911102000000028],[-62.870551999999918,65.90554800000001],[-62.871940999999936,65.901382000000126],[-62.87471800000003,65.887497000000053],[-62.87471800000003,65.883041000000105],[-62.760001999999986,65.816665999999998],[-62.746391000000017,65.809708000000001],[-62.736945999999932,65.80831900000004],[-62.719993999999929,65.809708000000001],[-62.658889999999985,65.791930999999977],[-62.597778000000005,65.771927000000062],[-62.582221999999888,65.765549000000078],[-62.575004999999976,65.761658000000011],[-62.569449999999961,65.757492000000127],[-62.568610999999919,65.752212999999927],[-62.569725000000005,65.746643000000063],[-62.579444999999964,65.728317000000061],[-62.583610999999962,65.723312000000021],[-62.587775999999963,65.720260999999994],[-62.59027900000001,65.719147000000021],[-62.59944200000001,65.718872000000147],[-62.612777999999992,65.72164900000007],[-62.621940999999993,65.725540000000137],[-62.67472099999992,65.735809000000017],[-62.823891000000003,65.761383000000023],[-62.833442999999875,65.752991000000009],[-62.833777999999882,65.74999200000002],[-62.828780999999879,65.744492000000093],[-62.799170999999887,65.711928999999998],[-62.788054999999929,65.708328000000108],[-62.726386999999988,65.71138000000002],[-62.698883000000023,65.710266000000047],[-62.681670999999994,65.708038000000101],[-62.662772999999902,65.701096000000007],[-62.59944200000001,65.675812000000008],[-62.59194199999996,65.671920999999941],[-62.589721999999938,65.668594000000041],[-62.595832999999857,65.652205999999978],[-62.602225999999973,65.640273999999977],[-62.611670999999944,65.624145999999939],[-62.617499999999893,65.614990000000034],[-62.628051999999968,65.601929000000098],[-62.645279000000016,65.587203999999929],[-62.653053,65.586104999999975],[-62.751113999999916,65.58526599999999],[-62.767220000000009,65.587493999999936],[-62.78472899999997,65.59137000000004],[-62.803054999999972,65.59887700000013],[-62.859726000000023,65.634720000000016],[-62.861389000000031,65.639160000000004],[-62.858611999999937,65.65525800000006],[-62.862503000000004,65.685257000000092],[-62.882998999999984,65.724152000000061],[-62.885001999999986,65.726973999999927],[-62.887999999999863,65.729652000000044],[-62.904167000000029,65.746368000000018],[-62.922500999999954,65.752212999999927],[-62.936110999999926,65.754990000000021],[-62.949439999999925,65.755263999999954],[-62.95944199999991,65.753876000000048],[-62.962219000000005,65.748322000000087],[-62.943610999999919,65.743042000000003],[-62.93472300000002,65.738876000000118],[-62.925277999999992,65.731093999999985],[-62.916663999999912,65.722214000000122],[-62.914444000000003,65.718323000000055],[-62.892226999999934,65.641937000000098],[-62.89166999999992,65.638321000000076],[-62.895836000000031,65.633040999999992],[-62.901389999999935,65.628036000000122],[-62.953330999999991,65.586929000000112],[-62.961670000000026,65.583054000000118],[-62.972220999999934,65.580826000000002],[-63.005004999999926,65.624985000000095],[-63.016113000000018,65.632750999999985],[-63.027495999999928,65.635818000000086],[-63.040282999999931,65.63749700000011],[-63.137779000000023,65.644150000000081],[-63.162498000000028,65.632477000000051],[-63.162406999999973,65.628868000000068],[-63.164443999999946,65.625534000000073],[-63.178611999999987,65.627472000000012],[-63.200279000000023,65.633330999999998],[-63.211945000000014,65.640549000000021],[-63.293891999999971,65.708878000000141],[-63.43638599999997,65.84526100000005],[-63.443054000000018,65.854705999999908],[-63.474167000000023,65.833054000000061],[-63.379165999999998,65.720260999999994],[-63.368332000000009,65.693863000000022],[-63.368332000000009,65.669434000000081],[-63.399726999999984,65.676375999999948],[-63.412215999999944,65.67804000000001],[-63.448607999999922,65.680817000000047],[-63.461944999999957,65.681090999999981],[-63.704720000000009,65.68220500000001],[-63.717216000000008,65.681656000000032],[-63.723609999999894,65.680267000000015],[-63.728607000000011,65.675812000000008],[-63.728881999999999,65.673035000000141],[-63.723609999999894,65.668869000000029],[-63.700553999999954,65.655823000000112],[-63.68360899999999,65.650818000000072],[-63.671669000000009,65.648330999999985],[-63.504723000000013,65.6308140000001],[-63.453330999999991,65.629700000000128],[-63.432502999999997,65.631927000000019],[-63.399726999999984,65.634155000000135],[-63.375,65.632202000000007],[-63.36860699999994,65.629150000000095],[-63.351669000000015,65.61775200000011],[-63.326667999999984,65.600815000000068],[-63.319999999999936,65.593322999999998],[-63.336661999999933,65.556930999999963],[-63.34332999999998,65.548325000000091],[-63.355003000000011,65.537766000000033],[-63.359726000000023,65.536102000000028],[-63.373610999999983,65.533874999999966],[-63.463332999999977,65.522766000000047],[-63.474715999999887,65.523605000000032],[-63.482215999999937,65.525269000000037],[-63.488608999999997,65.528320000000065],[-63.501396,65.536377000000016],[-63.523055999999997,65.550812000000121],[-63.532775999999899,65.558594000000085],[-63.541114999999934,65.570267000000115],[-63.541388999999867,65.574158000000011],[-63.546669000000009,65.581100000000106],[-63.561278999999956,65.585372999999947],[-63.567943999999954,65.590042000000096],[-63.572449000000006,65.591209000000049],[-63.581279999999992,65.591873000000078],[-63.589943000000005,65.591209000000049],[-63.595778999999993,65.589035000000081],[-63.608894000000021,65.589981000000023],[-63.618331999999953,65.541931000000034],[-63.616660999999908,65.537490999999989],[-63.612777999999878,65.533325000000104],[-63.601395000000025,65.530273000000022],[-63.530280999999945,65.512206999999989],[-63.43277699999993,65.484421000000111],[-63.391945000000021,65.472488000000112],[-63.362503000000004,65.463318000000015],[-63.309165999999948,65.445525999999973],[-63.301665999999898,65.441650000000095],[-63.295279999999991,65.436371000000122],[-63.290839999999946,65.431656000000089],[-63.292777999999998,65.428863999999976],[-63.393889999999942,65.425262000000032],[-63.409995999999921,65.426651000000049],[-63.468886999999938,65.439697000000137],[-63.495276999999987,65.450272000000098],[-63.502785000000017,65.454162999999994],[-63.521666999999979,65.461105000000089],[-63.532775999999899,65.464705999999978],[-63.553329000000019,65.468872000000033],[-63.568892999999946,65.471649000000127],[-63.583327999999995,65.4727630000001],[-63.64305899999988,65.473602000000085],[-63.65444199999996,65.472213999999951],[-63.655555999999933,65.470824999999991],[-63.654716000000008,65.464995999999985],[-63.627494999999954,65.455826000000116],[-63.563613999999973,65.435806000000071],[-63.483611999999994,65.404984000000013],[-63.335555999999997,65.30053700000002],[-63.335830999999985,65.295531999999923],[-63.424720999999977,65.229430999999977],[-63.472220999999934,65.196365000000014],[-63.418892000000028,65.145263999999997],[-63.376944999999978,65.110809000000017],[-63.424445999999932,65.049149000000114],[-63.464721999999938,65.018051000000128],[-63.527221999999995,64.971924000000058],[-63.528335999999967,64.967758000000003],[-63.546950999999979,64.887207000000046],[-63.653885000000002,64.911652000000061],[-63.659720999999934,64.939697000000081],[-63.747779999999977,64.962203999999986],[-63.824172999999973,64.984711000000061],[-63.828339000000028,65.010817999999915],[-63.825561999999877,65.012771999999984],[-63.720276000000013,65.030823000000112],[-63.669723999999917,65.034988000000112],[-63.659995999999978,65.03637700000013],[-63.655272999999966,65.03804000000008],[-63.658051,65.041091999999992],[-63.664718999999934,65.043594000000041],[-63.685554999999965,65.047759999999982],[-63.697776999999974,65.049423000000047],[-63.732215999999994,65.048874000000126],[-63.751944999999978,65.045258000000047],[-63.782218999999941,65.034149000000014],[-63.801940999999999,65.030273000000079],[-63.824447999999961,65.027481000000023],[-63.849723999999924,65.030273000000079],[-63.861114999999984,65.033325000000048],[-63.870551999999918,65.040816999999947],[-63.873885999999914,65.04553199999998],[-63.875556999999958,65.050262000000032],[-63.885559000000001,65.079987000000131],[-63.886116000000015,65.085815000000025],[-63.881667999999934,65.096939000000134],[-63.948607999999979,65.100540000000024],[-64.121108999999933,65.043869000000086],[-64.132491999999957,65.044434000000081],[-64.140839000000028,65.047211000000004],[-64.267226999999991,65.094147000000021],[-64.275833000000034,65.098877000000073],[-64.271118000000001,65.103317000000061],[-64.22193900000002,65.146942000000081],[-64.208892999999989,65.155258000000003],[-64.18582200000003,65.163879000000065],[-64.167220999999927,65.170532000000037],[-64.131103999999937,65.182480000000112],[-64.129715000000033,65.193588000000091],[-64.203613000000018,65.199707000000103],[-64.211944999999901,65.199996999999939],[-64.231383999999991,65.196930000000009],[-64.301940999999999,65.163040000000137],[-64.30999799999995,65.15914900000007],[-64.314712999999983,65.15248100000008],[-64.339172000000019,65.161377000000016],[-64.37332200000003,65.177200000000028],[-64.380828999999892,65.181091000000094],[-64.395844000000011,65.207214000000079],[-64.407227000000034,65.275818000000015],[-64.405272999999909,65.285537999999917],[-64.402785999999935,65.291092000000106],[-64.398620999999935,65.29693600000013],[-64.389724999999999,65.304428000000087],[-64.355835000000013,65.324996999999996],[-64.333327999999995,65.337203999999986],[-64.30999799999995,65.349990999999989],[-64.300551999999982,65.355819999999994],[-64.25556899999998,65.386382999999967],[-64.250838999999871,65.390823000000012],[-64.236389000000031,65.421920999999998],[-64.234160999999972,65.427199999999971],[-64.237212999999997,65.429977000000065],[-64.248885999999914,65.430542000000116],[-64.272781000000009,65.428588999999988],[-64.291107000000011,65.422484999999938],[-64.431380999999988,65.326934999999992],[-64.461670000000026,65.294983000000002],[-64.471664000000033,65.283324999999991],[-64.474715999999944,65.272491000000116],[-64.468886999999938,65.263885000000016],[-64.463897999999972,65.258881000000031],[-64.456954999999994,65.249420000000043],[-64.452498999999989,65.241653000000099],[-64.455565999999976,65.207214000000079],[-64.462218999999948,65.190810999999997],[-64.468337999999903,65.180267000000129],[-64.509734999999921,65.12052900000009],[-64.521117999999944,65.109146000000123],[-64.535004000000015,65.097214000000122],[-64.549987999999985,65.09275800000006],[-64.555556999999965,65.092209000000082],[-64.561934999999949,65.094986000000006],[-64.567504999999926,65.115814000000057],[-64.567504999999926,65.119979999999998],[-64.569457999999941,65.124419999999986],[-64.580001999999922,65.128860000000032],[-64.611389000000031,65.141937000000041],[-64.641112999999962,65.149993999999992],[-64.655272999999966,65.166092000000049],[-64.718338000000017,65.222487999999942],[-64.760284000000013,65.25221300000004],[-64.765014999999948,65.247756999999979],[-64.778335999999967,65.238585999999998],[-64.788329999999917,65.23414600000001],[-64.801102000000014,65.230820000000108],[-64.814712999999983,65.235259999999982],[-64.864440999999999,65.256653000000085],[-64.883895999999993,65.265273999999977],[-64.891113000000018,65.269150000000081],[-64.896666999999979,65.273315000000082],[-64.898346000000004,65.275818000000015],[-64.910552999999993,65.29942299999999],[-64.910827999999981,65.303589000000102],[-64.910004000000015,65.304977000000008],[-64.855887999999936,65.314545000000123],[-64.834228999999937,65.319046000000014],[-64.823387000000025,65.318214000000125],[-64.796111999999937,65.31860400000005],[-64.793883999999991,65.314697000000081],[-64.786391999999978,65.310806000000014],[-64.777221999999995,65.30914300000012],[-64.757171999999912,65.313095000000033],[-64.752173999999911,65.314255000000117],[-64.696105999999872,65.329712000000029],[-64.691101000000003,65.331940000000031],[-64.687209999999936,65.334991000000059],[-64.685271999999998,65.337493999999992],[-64.684433000000013,65.341095000000053],[-64.689162999999951,65.341660000000104],[-64.799728000000016,65.346939000000077],[-64.813613999999973,65.347214000000065],[-64.868056999999965,65.339706000000092],[-64.897780999999952,65.334152000000074],[-64.909163999999976,65.334717000000126],[-64.912216000000001,65.338042999999971],[-64.910552999999993,65.33998100000008],[-64.904723999999987,65.343596999999932],[-64.609160999999972,65.426376000000005],[-64.591110000000015,65.429703000000131],[-64.583892999999989,65.430267000000072],[-64.508347000000015,65.425812000000064],[-64.477218999999991,65.421097000000032],[-64.466400000000021,65.417480000000069],[-64.458343999999954,65.416656000000103],[-64.448607999999979,65.418319999999937],[-64.441939999999931,65.420258000000103],[-64.433608999999933,65.429153000000099],[-64.429992999999968,65.434417999999994],[-64.40943900000002,65.473877000000073],[-64.412780999999939,65.478592000000106],[-64.418335000000013,65.482758000000047],[-64.434432999999899,65.484146000000123],[-64.551940999999999,65.457764000000054],[-64.695267000000001,65.427765000000022],[-64.795273000000009,65.415268000000026],[-64.806655999999919,65.413879000000009],[-64.82417299999986,65.413315000000068],[-64.833618000000001,65.414429000000041],[-64.843886999999938,65.417205999999965],[-64.845550999999944,65.419434000000138],[-64.854996000000028,65.422759999999982],[-64.863891999999964,65.424698000000092],[-64.869719999999973,65.423874000000126],[-64.974166999999966,65.404708999999968],[-64.981110000000001,65.401932000000102],[-64.987502999999947,65.39776599999999],[-64.990279999999927,65.393875000000094],[-64.988602000000014,65.379424999999969],[-64.98582499999992,65.371368000000018],[-64.989715999999987,65.36831699999999],[-65.001113999999916,65.366652999999985],[-65.016112999999962,65.367203000000018],[-65.058883999999978,65.376648000000102],[-65.075012000000015,65.383041000000048],[-65.136123999999995,65.422484999999938],[-65.144164999999873,65.427765000000022],[-65.149993999999992,65.434143000000006],[-65.168883999999991,65.482758000000047],[-65.168059999999969,65.483871000000079],[-65.160003999999958,65.48803700000002],[-65.149445000000014,65.493042000000059],[-65.142501999999922,65.495818999999983],[-65.129990000000021,65.49859600000002],[-65.110274999999945,65.497482000000048],[-65.082503999999972,65.500548999999978],[-64.929717999999923,65.524703999999986],[-64.854445999999996,65.583603000000096],[-64.836944999999957,65.605819999999937],[-64.767226999999991,65.63998399999997],[-64.741669000000002,65.641662999999994],[-64.723052999999993,65.643600000000049],[-64.711944999999957,65.647217000000012],[-64.70944199999991,65.650543000000027],[-64.710007000000019,65.652205999999978],[-64.71444699999995,65.653320000000122],[-64.768340999999964,65.659988000000112],[-64.794723999999974,65.661926000000051],[-64.818618999999956,65.661926000000051],[-64.828063999999927,65.661102000000085],[-64.843886999999938,65.658034999999984],[-64.853333000000021,65.654709000000139],[-64.872222999999963,65.64498900000001],[-64.888901000000033,65.629150000000095],[-64.899993999999936,65.616378999999995],[-64.952498999999875,65.56442300000009],[-64.974166999999966,65.551376000000062],[-64.993606999999884,65.548035000000027],[-65.110274999999945,65.541092000000049],[-65.15306099999998,65.53915400000011],[-65.311110999999983,65.548874000000012],[-65.318344000000025,65.550537000000134],[-65.326400999999976,65.556366000000139],[-65.333327999999995,65.563599000000124],[-65.338607999999965,65.575546000000088],[-65.308334000000002,65.621094000000028],[-65.303328999999962,65.62831099999994],[-65.299987999999928,65.6308140000001],[-65.295837000000006,65.631653000000085],[-65.275283999999942,65.631363000000079],[-65.252228000000002,65.629974000000061],[-65.217772999999966,65.629974000000061],[-65.188599000000011,65.629974000000061],[-65.153884999999946,65.630264000000068],[-65.125823999999966,65.633330999999998],[-65.112503000000004,65.637207000000103],[-65.105835000000013,65.639435000000049],[-65.103881999999999,65.642487000000131],[-65.103881999999999,65.651932000000045],[-65.109436000000017,65.658875000000023],[-65.106948999999986,65.667205999999908],[-65.105835000000013,65.668594000000041],[-65.09973100000002,65.671920999999941],[-64.994445999999925,65.70138500000013],[-64.981383999999991,65.704712000000086],[-64.969726999999978,65.706650000000025],[-64.942215000000033,65.709152000000074],[-64.922501000000011,65.709427000000119],[-64.902495999999985,65.708602999999982],[-64.814712999999983,65.712769000000037],[-64.803328999999962,65.714157000000114],[-64.798339999999996,65.716385000000116],[-64.793609999999887,65.719985999999949],[-64.791381999999999,65.723312000000021],[-64.794997999999964,65.728043000000127],[-64.801940999999886,65.730270000000019],[-64.815552000000025,65.730545000000006],[-64.90695199999999,65.728867000000093],[-64.973052999999993,65.723602000000028],[-64.996947999999918,65.721374999999966],[-65.024719000000005,65.716934000000037],[-65.057219999999973,65.710266000000047],[-65.076110999999912,65.705551000000014],[-65.103058000000033,65.694427000000132],[-65.11610399999995,65.685257000000092],[-65.138610999999969,65.671096999999975],[-65.144454999999994,65.667480000000012],[-65.164168999999958,65.656937000000084],[-65.168334999999956,65.656097000000045],[-65.369994999999903,65.661102000000085],[-65.431380999999931,65.669144000000074],[-65.441665999999884,65.671646000000123],[-65.449996999999883,65.674988000000042],[-65.454452999999887,65.678314000000114],[-65.456954999999937,65.68220500000001],[-65.456389999999999,65.68553199999991],[-65.452498999999932,65.69081100000011],[-65.447768999999994,65.695251000000098],[-65.460281000000009,65.74136400000009],[-65.490279999999927,65.735809000000017],[-65.497771999999941,65.737487999999985],[-65.50556899999998,65.74331699999999],[-65.505004999999983,65.751663000000121],[-65.498885999999857,65.763046000000088],[-65.455276000000026,65.832489000000066],[-65.449158000000011,65.841094999999939],[-65.439437999999996,65.8477630000001],[-65.357223999999974,65.902480999999909],[-65.152221999999938,65.957764000000111],[-65.137787000000003,65.961104999999975],[-65.050277999999992,65.98054500000012],[-64.963897999999972,65.998596000000134],[-64.946105999999986,66.001389000000131],[-64.934722999999906,66.002213000000097],[-64.923049999999989,66.001389000000131],[-64.898346000000004,65.996933000000013],[-64.880828999999949,65.989975000000015],[-64.851104999999961,65.98054500000012],[-64.842223999999931,65.978043000000071],[-64.801392000000021,65.969436999999971],[-64.772506999999962,65.966095000000053],[-64.755004999999926,65.966095000000053],[-64.743332000000009,65.967484000000013],[-64.735001000000011,65.969436999999971],[-64.733886999999925,65.97554000000008],[-64.738601999999958,65.978867000000037],[-64.765014999999948,65.988037000000077],[-64.821670999999981,66.044708000000014],[-64.750838999999928,66.185532000000023],[-64.721663999999976,66.217483999999956],[-64.712219000000005,66.223602000000085],[-64.605834999999956,66.259155000000135],[-64.480559999999969,66.296371000000079],[-64.451950000000011,66.303589000000102],[-64.405563000000029,66.315811000000053],[-64.388610999999912,66.321655000000078],[-64.375548999999921,66.327209000000039],[-64.365829000000019,66.333053999999947],[-64.356383999999935,66.340546000000074],[-64.354172000000005,66.348038000000031],[-64.356383999999935,66.349715999999944],[-64.366104000000007,66.350815000000125],[-64.377486999999974,66.349990999999989],[-64.443877999999984,66.344711000000075],[-64.464721999999938,66.34304800000001],[-64.71444699999995,66.274994000000049],[-64.718886999999995,66.273315000000025],[-64.789168999999958,66.236374000000126],[-64.796111999999937,66.231659000000093],[-64.839995999999985,66.193313999999987],[-64.858046999999942,66.149993999999992],[-64.856658999999979,66.139984000000084],[-64.851944000000003,66.124984999999981],[-64.849730999999963,66.12052900000009],[-64.854171999999949,66.109711000000118],[-64.858886999999982,66.106093999999985],[-64.933884000000035,66.080276000000026],[-64.948607999999979,66.076934999999992],[-65.126098999999954,66.03776600000009],[-65.381942999999922,65.975815000000125],[-65.398055999999997,65.974700999999925],[-65.827788999999996,65.953049000000078],[-65.876389000000017,65.94802900000002],[-65.916106999999954,65.95109599999995],[-65.928054999999972,65.953873000000044],[-65.935546999999929,65.958328000000051],[-65.939712999999927,65.962493999999992],[-65.96305799999999,66.034424000000001],[-65.963897999999915,66.043869000000029],[-65.918883999999935,66.086105000000032],[-65.911666999999852,66.091660000000104],[-65.904175000000009,66.094437000000028],[-65.786117999999988,66.126373000000115],[-65.674712999999997,66.157486000000119],[-65.65055799999999,66.164429000000098],[-65.640838999999914,66.168319999999994],[-65.634170999999924,66.172484999999995],[-65.564162999999951,66.226929000000041],[-65.545546999999942,66.243317000000104],[-65.471114999999941,66.342484000000013],[-65.471663999999919,66.383606000000043],[-65.473617999999931,66.385817999999915],[-65.475829999999974,66.387771999999984],[-65.479172000000005,66.388046000000088],[-65.482773000000009,66.387771999999984],[-65.489715999999987,66.385817999999915],[-65.501677999999913,66.376373000000058],[-65.553878999999938,66.32777400000009],[-65.555831999999953,66.325272000000041],[-65.559433000000013,66.320541000000105],[-65.561660999999901,66.314423000000147],[-65.564437999999996,66.293593999999985],[-65.562774999999988,66.288315000000011],[-65.562774999999988,66.283324999999934],[-65.571670999999981,66.268326000000059],[-65.598891999999921,66.244979999999998],[-65.610549999999876,66.235809000000074],[-65.696944999999971,66.180542000000116],[-65.702498999999989,66.177475000000015],[-65.844161999999926,66.135817999999972],[-65.926940999999999,66.114700000000084],[-65.951950000000011,66.108871000000079],[-65.96833799999996,66.108032000000094],[-66.073623999999995,66.12052900000009],[-66.139174999999966,66.131362999999965],[-66.145003999999972,66.1336060000001],[-66.147232000000031,66.135269000000051],[-66.200835999999981,66.194977000000051],[-66.191100999999946,66.239974999999959],[-66.25111400000003,66.242203000000131],[-66.371384000000035,66.22526600000009],[-66.401947000000007,66.200821000000076],[-66.478333000000021,66.201660000000061],[-66.489715999999873,66.202774000000034],[-66.496947999999975,66.20498699999996],[-66.505004999999926,66.208878000000027],[-66.524445000000014,66.224152000000117],[-66.529998999999918,66.229156000000103],[-66.534164000000033,66.233046999999999],[-66.540832999999964,66.241653000000099],[-66.542770000000019,66.24664300000012],[-66.577498999999989,66.354430999999977],[-66.576110999999969,66.35914600000001],[-66.570007000000032,66.365540000000067],[-66.564162999999951,66.369141000000127],[-66.53694200000001,66.378035999999952],[-66.500564999999995,66.388046000000088],[-66.454726999999991,66.398041000000148],[-66.445267000000001,66.401382000000012],[-66.438323999999909,66.40415999999999],[-66.434433000000013,66.407211000000018],[-66.437209999999936,66.413315000000068],[-66.441939999999988,66.414429000000041],[-66.466109999999901,66.414992999999981],[-66.473617999999988,66.414429000000041],[-66.481383999999991,66.413040000000024],[-66.597778000000005,66.386932000000115],[-66.604996000000028,66.376373000000058],[-66.610001000000011,66.371368000000018],[-66.617492999999911,66.368591000000094],[-66.629990000000021,66.36775200000011],[-66.713897999999972,66.368866000000082],[-66.724166999999909,66.369431000000134],[-66.730834999999956,66.369980000000112],[-66.743057000000022,66.372756999999979],[-66.767775999999913,66.380539000000113],[-66.821670999999924,66.458037999999931],[-66.821670999999924,66.460815000000025],[-66.806380999999931,66.531936999999971],[-66.851943999999946,66.583328000000051],[-66.972228999999913,66.628860000000088],[-66.999724999999955,66.638321000000019],[-67.023055999999997,66.643326000000059],[-67.036117999999931,66.644714000000022],[-67.048889000000031,66.644714000000022],[-67.058884000000035,66.642761000000064],[-67.060546999999985,66.640273999999977],[-67.05610699999994,66.633605999999986],[-67.043334999999956,66.625809000000061],[-67.016662999999937,66.615265000000022],[-66.950561999999877,66.592209000000139],[-66.908339999999953,66.578049000000078],[-66.887511999999901,66.569442999999978],[-66.884170999999867,66.566086000000041],[-66.889450000000011,66.561096000000134],[-67.105559999999969,66.485809000000017],[-67.118331999999953,66.484985000000052],[-67.133620999999948,66.485809000000017],[-67.176940999999943,66.489700000000084],[-67.189712999999927,66.491653000000042],[-67.198607999999979,66.494141000000013],[-67.202224999999999,66.497208000000114],[-67.203887999999949,66.505264000000011],[-67.192215000000033,66.51527400000009],[-67.186110999999983,66.524428999999941],[-67.19027699999998,66.529160000000104],[-67.327224999999999,66.595825000000048],[-67.338332999999977,66.597762999999986],[-67.34584000000001,66.597214000000008],[-67.398620999999878,66.589157000000057],[-67.410003999999958,66.585540999999978],[-67.463622999999984,66.578873000000044],[-67.515015000000005,66.573607999999979],[-67.581116000000009,66.575271999999984],[-67.639724999999999,66.580551000000128],[-67.726943999999889,66.576660000000061],[-67.737212999999997,66.574158000000011],[-67.740828999999962,66.571106000000043],[-67.742767000000015,66.568328999999949],[-67.741942999999935,66.564148000000046],[-67.735001000000011,66.561371000000008],[-67.722777999999892,66.558029000000033],[-67.701110999999855,66.55581699999999],[-67.499999999999943,66.544838000000027],[-67.426102000000014,66.541367000000037],[-67.407776000000013,66.542206000000022],[-67.395843999999954,66.544708000000071],[-67.380553999999904,66.545822000000044],[-67.373885999999914,66.545822000000044],[-67.365829000000019,66.544434000000138],[-67.296386999999925,66.526093000000003],[-67.281676999999945,66.51887499999998],[-67.148620999999991,66.443863000000022],[-67.143889999999999,66.437759000000028],[-67.143615999999952,66.435531999999967],[-67.138061999999991,66.382202000000063],[-67.139724999999999,66.376648000000046],[-67.160827999999981,66.365540000000067],[-67.172501000000011,66.363876000000062],[-67.185271999999941,66.363602000000128],[-67.197768999999994,66.365814],[-67.291671999999892,66.399429000000055],[-67.337509000000011,66.418869000000086],[-67.338988999999913,66.422852000000091],[-67.343063000000029,66.426650999999993],[-67.350280999999939,66.428863999999976],[-67.365829000000019,66.429703000000131],[-67.389724999999942,66.430817000000104],[-67.406386999999995,66.429703000000131],[-67.410552999999993,66.425262000000032],[-67.410003999999958,66.420821999999987],[-67.383330999999998,66.401932000000045],[-67.378326000000015,66.398604999999918],[-67.36860699999994,66.394714000000022],[-67.31361400000003,66.376373000000058],[-67.288604999999961,66.368866000000082],[-67.240828999999962,66.358871000000022],[-67.195830999999998,66.354980000000126],[-67.188598999999954,66.352203000000031],[-67.133057000000008,66.313873000000115],[-67.125274999999988,66.30693100000002],[-67.126099000000011,66.305542000000003],[-67.129165999999941,66.303589000000102],[-67.139449999999954,66.301376000000118],[-67.162216000000001,66.298874000000069],[-67.183884000000035,66.297485000000052],[-67.194153000000028,66.297760000000039],[-67.208618000000001,66.299988000000042],[-67.226944000000003,66.304153000000042],[-67.240828999999962,66.304153000000042],[-67.254181000000017,66.302765000000136],[-67.261672999999973,66.299149000000057],[-67.282226999999978,66.275269000000037],[-67.297501000000011,66.276093000000003],[-67.399170000000026,66.292480000000012],[-67.413895000000025,66.296646000000067],[-67.450287000000003,66.316666000000112],[-67.453063999999927,66.320541000000105],[-67.453339000000028,66.322495000000117],[-67.494719999999973,66.356934000000138],[-67.526108000000022,66.382202000000063],[-67.5625,66.407486000000063],[-67.566665999999998,66.409424000000001],[-67.603057999999976,66.418594000000041],[-67.634170999999981,66.424698000000092],[-67.690826000000015,66.435256999999922],[-67.71305799999999,66.436096000000077],[-67.730285999999978,66.439971999999955],[-67.812499999999943,66.463043000000027],[-67.825286999999946,66.46775800000006],[-67.828612999999905,66.470824999999934],[-67.834732000000031,66.48332199999993],[-67.838607999999908,66.491653000000042],[-67.923614999999927,66.516098000000056],[-67.952498999999989,66.514709000000039],[-67.985824999999863,66.509720000000073],[-67.992767000000015,66.506943000000035],[-67.992767000000015,66.503876000000105],[-67.944716999999855,66.478867000000093],[-67.929169000000002,66.473038000000088],[-67.906113000000005,66.468048000000067],[-67.886948000000018,66.461928999999998],[-67.870269999999948,66.454712000000086],[-67.760558999999944,66.358032000000037],[-67.756392999999946,66.353317000000004],[-67.711120999999935,66.296936000000073],[-67.701401000000033,66.284714000000122],[-67.701674999999966,66.278320000000065],[-67.705565999999976,66.275269000000037],[-67.724716000000001,66.260818000000029],[-67.672225999999966,66.228317000000118],[-67.570556999999951,66.184143000000006],[-67.454453000000001,66.144714000000079],[-67.399993999999992,66.126373000000115],[-67.281386999999938,66.083054000000004],[-67.165008999999998,66.036926000000051],[-67.162506000000008,66.035262999999929],[-67.243522999999925,65.978301999999985],[-67.173049999999876,65.918593999999985],[-67.185821999999973,65.912200999999982],[-67.194442999999978,65.909714000000122],[-67.201674999999966,65.90914900000007],[-67.429992999999911,65.90554800000001],[-67.740554999999858,65.894150000000025],[-67.795273000000009,65.877197000000137],[-67.824172999999973,65.880814000000044],[-67.86471599999993,65.887772000000041],[-67.914444000000003,65.899155000000064],[-67.938599000000011,65.908035000000098],[-68.02694699999995,65.99275200000011],[-68.030563000000029,65.998032000000023],[-68.031386999999995,66.002213000000097],[-68.027221999999995,66.060806000000071],[-68.025832999999977,66.06581100000011],[-68.130828999999949,66.126648000000102],[-68.244720000000029,66.1827550000001],[-68.340285999999992,66.196930000000009],[-68.538054999999929,66.200821000000076],[-68.712783999999942,66.19859300000013],[-68.808334000000002,66.195816000000036],[-68.842498999999975,66.193313999999987],[-68.851394999999968,66.189972000000012],[-68.846389999999928,66.186645999999996],[-68.835281000000009,66.184981999999991],[-68.668610000000001,66.178864000000033],[-68.568343999999968,66.178588999999988],[-68.414718999999991,66.159424000000058],[-68.403610000000015,66.146378000000084],[-68.391113000000018,66.135269000000051],[-68.383330999999941,66.131087999999977],[-68.300277999999878,66.092758000000003],[-68.27806099999998,66.083602999999982],[-68.244155999999975,66.071105999999986],[-68.237777999999935,66.069992000000013],[-68.225554999999986,66.069992000000013],[-68.220551,66.073044000000095],[-68.218886999999995,66.081375000000037],[-68.22193900000002,66.085266000000104],[-68.229720999999984,66.092209000000082],[-68.244155999999975,66.099991000000045],[-68.246947999999975,66.112761999999975],[-68.220000999999968,66.128586000000041],[-68.202498999999932,66.128859999999975],[-68.194716999999969,66.127472000000068],[-68.157501000000025,66.117477000000008],[-68.134170999999981,66.109985000000052],[-68.118880999999988,66.103592000000106],[-68.047226000000023,66.064986999999974],[-68.048889000000031,66.00749200000007],[-68.051940999999943,65.996643000000006],[-68.05360399999995,65.991088999999988],[-68.064437999999939,65.984421000000054],[-68.12388599999997,65.963043000000084],[-68.134170999999981,65.963318000000129],[-68.173614999999984,65.969436999999971],[-68.196945000000028,65.973876999999959],[-68.210555999999997,65.979430999999977],[-68.27806099999998,66.014160000000061],[-68.304442999999878,66.028046000000018],[-68.323897999999929,66.003875999999991],[-68.333618000000001,65.93193100000002],[-68.332229999999925,65.92886400000009],[-68.325835999999981,65.916382000000112],[-68.321670999999981,65.911925999999994],[-68.304748999999958,65.908661000000052],[-68.287780999999995,65.907760999999994],[-68.260009999999909,65.911377000000016],[-68.194153000000028,65.921097000000145],[-68.156113000000005,65.929703000000018],[-68.150283999999999,65.930542000000003],[-68.142775999999969,65.929152999999985],[-68.139998999999989,65.927475000000072],[-68.136123999999995,65.922760000000039],[-68.134734999999921,65.913605000000018],[-68.13290399999994,65.834885000000043],[-68.139175000000023,65.817215000000147],[-68.147231999999974,65.798325000000034],[-68.033324999999934,65.776382000000069],[-68.023894999999868,65.77526899999998],[-68.003066999999987,65.778320000000008],[-67.923614999999927,65.793869000000086],[-67.886123999999882,65.804977000000065],[-67.821120999999948,65.768050999999957],[-67.870269999999948,65.689422999999977],[-67.942489999999964,65.618042000000116],[-67.989165999999898,65.61914100000007],[-68.058884000000035,65.568053999999961],[-68.027221999999995,65.558319000000097],[-68.012512000000015,65.557754999999929],[-68.011672999999973,65.558868000000018],[-67.998610999999983,65.566939999999988],[-67.98721299999994,65.571381000000088],[-67.971114999999998,65.575271999999984],[-67.956664999999987,65.571655000000021],[-67.951675000000023,65.568329000000006],[-67.953063999999927,65.557205000000124],[-67.955001999999979,65.55386400000009],[-68.020844000000011,65.49803200000008],[-68.027785999999935,65.491653000000042],[-68.030288999999982,65.487761999999975],[-68.030563000000029,65.484421000000111],[-68.025832999999977,65.481093999999985],[-68.022507000000019,65.480545000000063],[-68.00778200000002,65.485535000000084],[-67.941939999999931,65.525269000000037],[-67.922500999999954,65.538040000000137],[-67.860274999999945,65.584427000000062],[-67.730285999999978,65.636383000000137],[-67.712219000000005,65.640823000000125],[-67.652495999999985,65.651382000000012],[-67.466109999999958,65.674149000000114],[-67.428604000000007,65.676650999999993],[-67.402495999999928,65.677475000000129],[-67.396118000000001,65.676650999999993],[-67.382216999999912,65.673874000000069],[-67.328063999999983,65.662491000000045],[-67.319457999999941,65.659423999999944],[-67.280562999999972,65.642487000000131],[-67.275283999999999,65.637772000000098],[-67.256667999999991,65.615265000000022],[-67.25389100000001,65.611649],[-67.251677999999856,65.606934000000138],[-67.253341999999975,65.601654000000053],[-67.256667999999991,65.599152000000004],[-67.272781000000009,65.595261000000107],[-67.320557000000008,65.586929000000112],[-67.333327999999938,65.582489000000066],[-67.336120999999935,65.580826000000002],[-67.456664999999987,65.501937999999996],[-67.458892999999932,65.49803200000008],[-67.451400999999919,65.493590999999981],[-67.347504000000015,65.458602999999982],[-67.221389999999985,65.456375000000037],[-67.189986999999974,65.458037999999988],[-67.180832000000009,65.459152000000131],[-67.169158999999979,65.461380000000077],[-67.155563000000029,65.466934000000094],[-67.142226999999991,65.469147000000078],[-67.081679999999949,65.462494000000049],[-67.065552000000025,65.458602999999982],[-67.058608999999933,65.453597999999943],[-67.058043999999995,65.451385000000016],[-67.058334000000002,65.426651000000049],[-67.062774999999931,65.417480000000069],[-67.078339000000028,65.392211999999972],[-67.111114999999984,65.364700000000028],[-67.118056999999965,65.361922999999933],[-67.12388599999997,65.360535000000027],[-67.134445000000028,65.359711000000061],[-67.218063000000029,65.358597000000088],[-67.255568999999923,65.360535000000027],[-67.316101000000003,65.358597000000088],[-67.400833000000034,65.350266000000033],[-67.408889999999985,65.348328000000095],[-67.413619999999923,65.345825000000104],[-67.417770000000019,65.342209000000025],[-67.416107000000011,65.339157000000114],[-67.40943900000002,65.333328000000108],[-67.399993999999992,65.329712000000029],[-67.391113000000018,65.327209000000096],[-67.33666999999997,65.31721500000009],[-67.326674999999966,65.316940000000045],[-67.319167999999934,65.318054000000018],[-67.315826000000015,65.320541000000105],[-67.306655999999862,65.330276000000026],[-67.306106999999997,65.333602999999925],[-67.306945999999982,65.338042999999971],[-67.303878999999938,65.34248400000007],[-67.297501000000011,65.347487999999998],[-67.291381999999942,65.349716000000001],[-67.283614999999998,65.351089000000059],[-67.269164999999987,65.352203000000031],[-67.125548999999978,65.311919999999986],[-67.119995000000017,65.309982000000048],[-67.077788999999996,65.250275000000101],[-67.063889000000017,65.218322999999941],[-66.93472300000002,65.233871000000136],[-66.933060000000012,65.233597000000032],[-66.928878999999938,65.229705999999965],[-66.948883000000023,65.125259000000142],[-66.950835999999981,65.11692800000003],[-66.953339000000028,65.113036999999963],[-66.959166999999979,65.106644000000017],[-66.967498999999975,65.103866999999923],[-67.025283999999886,65.10832199999993],[-67.044158999999922,65.107483000000002],[-67.055557000000022,65.105255000000056],[-67.066665999999998,65.100815000000011],[-67.072234999999978,65.097214000000122],[-67.106110000000001,65.064147999999989],[-67.108611999999994,65.060256999999922],[-67.107773000000009,65.058868000000132],[-67.096114999999998,65.056091000000038],[-67.085830999999985,65.056366000000082],[-67.075012000000015,65.058029000000147],[-66.890563999999983,65.103317000000061],[-66.835555999999997,65.137206999999989],[-66.756393000000003,65.177200000000028],[-66.74749799999995,65.180542000000003],[-66.730285999999921,65.181366000000139],[-66.726105000000018,65.180267000000129],[-66.725554999999986,65.178040000000067],[-66.753341999999975,65.113312000000008],[-66.801666000000012,65.060806000000071],[-66.767501999999979,65.024429000000112],[-66.743057000000022,64.963042999999971],[-66.726944000000003,64.913879000000122],[-66.727492999999924,64.90525800000006],[-66.728057999999976,64.901657],[-66.733063000000016,64.888321000000019],[-66.739165999999955,64.859985000000108],[-66.735000999999954,64.824707000000103],[-66.734160999999915,64.820541000000048],[-66.698043999999868,64.761931999999945],[-66.694716999999912,64.761383000000023],[-66.687774999999988,64.762206999999989],[-66.654175000000009,64.771103000000096],[-66.641113000000018,64.775818000000129],[-66.632492000000013,64.781372000000147],[-66.638061999999991,64.785538000000031],[-66.676101999999901,64.876082999999994],[-66.696944999999971,65.03276100000005],[-66.694152999999972,65.037201000000096],[-66.688660000000027,65.038772999999935],[-66.673324999999977,65.038589000000002],[-66.660827999999981,65.037201000000096],[-66.618056999999965,65.030273000000079],[-66.535278000000005,65.010817999999915],[-66.530563000000029,65.00749200000007],[-66.49610899999999,64.983047000000056],[-66.488891999999908,64.957489000000123],[-66.496658000000025,64.945526000000086],[-66.495543999999995,64.938873000000115],[-66.491378999999995,64.934982000000048],[-66.486664000000019,64.932205000000124],[-66.478606999999954,64.929153000000042],[-66.388610999999969,64.913315000000011],[-66.379165999999998,64.912201000000039],[-66.368057000000022,64.913605000000018],[-66.363892000000021,64.917480000000012],[-66.361938000000009,64.923599000000024],[-66.36361699999992,64.928589000000102],[-66.334732000000031,64.934708000000114],[-66.177779999999927,64.880264000000068],[-66.148346000000004,64.868866000000025],[-66.177215999999987,64.796371000000022],[-66.18472300000002,64.784424000000058],[-66.191939999999931,64.77887000000004],[-66.199431999999945,64.774993999999992],[-66.203339000000028,64.77388000000002],[-66.213333000000034,64.75610400000005],[-66.219161999999983,64.726089000000115],[-66.218886999999938,64.69081100000011],[-66.212218999999948,64.685531999999967],[-66.18472300000002,64.681656000000032],[-66.166945999999939,64.681091000000038],[-66.161117999999931,64.682479999999998],[-66.15834000000001,64.68414300000012],[-66.151947000000007,64.689147999999989],[-66.147781000000009,64.695815999999979],[-66.147232000000031,64.70138500000013],[-66.147232000000031,64.704162999999937],[-66.150283999999942,64.71748400000007],[-66.14973399999991,64.733597000000145],[-66.145554000000004,64.740265000000136],[-66.136397999999986,64.754166000000112],[-66.116942999999992,64.781372000000147],[-66.091675000000009,64.809708000000057],[-66.080841000000021,64.819153000000085],[-66.058333999999945,64.832764000000054],[-66.037215999999944,64.844986000000063],[-66.020843999999954,64.849716000000058],[-66.011397999999986,64.848327999999981],[-66.011123999999995,64.846375000000023],[-66.008621000000005,64.78915400000011],[-66.009170999999867,64.778046000000074],[-66.012511999999901,64.699417000000039],[-65.899993999999992,64.673309000000074],[-65.846664000000033,64.676085999999998],[-65.852218999999991,64.680267000000072],[-65.861389000000031,64.689147999999989],[-65.889449999999954,64.719711000000132],[-65.899170000000026,64.73275799999999],[-65.958617999999944,64.877761999999962],[-65.95666499999993,64.886108000000092],[-65.953338999999971,64.888321000000019],[-65.941939999999988,64.890548999999965],[-65.931380999999931,64.89137299999993],[-65.92471299999994,64.89137299999993],[-65.838608000000022,64.882476999999994],[-65.727218999999934,64.843597000000045],[-65.717772999999966,64.84027100000003],[-65.674438000000009,64.818054000000132],[-65.664168999999958,64.80831900000004],[-65.661666999999966,64.804428000000144],[-65.660278000000005,64.799149],[-65.665008999999998,64.796936000000017],[-65.683318999999926,64.792206000000022],[-65.698333999999988,64.784714000000065],[-65.720275999999956,64.766663000000108],[-65.736114999999984,64.750275000000045],[-65.742492999999911,64.741089000000102],[-65.742766999999958,64.735260000000039],[-65.736938000000009,64.726089000000115],[-65.726944000000003,64.711380000000077],[-65.710830999999985,64.693039000000056],[-65.704726999999934,64.687485000000095],[-65.703063999999927,64.692200000000128],[-65.709441999999967,64.712769000000037],[-65.71055599999994,64.718596999999988],[-65.710007000000019,64.732208000000128],[-65.708618000000001,64.736099000000024],[-65.684157999999968,64.761107999999979],[-65.676102000000014,64.765548999999908],[-65.665282999999931,64.771378000000141],[-65.648055999999997,64.774993999999992],[-65.642776000000026,64.774993999999992],[-65.627212999999927,64.771103000000096],[-65.598891999999921,64.756377999999984],[-65.56639100000001,64.737488000000042],[-65.561110999999869,64.733047000000113],[-65.557495000000017,64.728317000000061],[-65.555831999999953,64.723312000000021],[-65.556380999999931,64.717758000000003],[-65.572234999999921,64.664153999999996],[-65.576675000000023,64.652481000000023],[-65.583327999999938,64.642761000000121],[-65.586394999999925,64.640274000000034],[-65.654723999999987,64.602478000000019],[-65.662505999999951,64.598328000000038],[-65.714172000000019,64.570541000000048],[-65.730835000000013,64.517761000000007],[-65.732223999999974,64.508040999999935],[-65.725554999999929,64.498031999999967],[-65.721664000000033,64.49414100000007],[-65.708344000000011,64.486649000000114],[-65.695540999999992,64.485809000000074],[-65.665008999999998,64.492203000000131],[-65.643340999999964,64.494979999999998],[-65.573333999999988,64.498596000000077],[-65.524718999999948,64.49971000000005],[-65.518065999999976,64.49971000000005],[-65.506392999999946,64.497482000000105],[-65.504181000000017,64.495818999999983],[-65.50556899999998,64.468872000000033],[-65.396117999999944,64.52137799999997],[-65.384170999999981,64.524155000000064],[-65.365828999999906,64.526931999999988],[-65.210555999999883,64.536102000000028],[-65.203888000000006,64.533874999999966],[-65.144454999999994,64.51138300000008],[-65.085006999999962,64.479705999999965],[-65.077788999999939,64.475815000000068],[-65.075835999999981,64.471375000000023],[-65.074172999999973,64.461929000000055],[-65.071670999999981,64.440810999999997],[-65.071945000000028,64.43081699999999],[-65.073623999999938,64.426086000000055],[-65.194991999999957,64.310257000000092],[-65.202498999999989,64.306366000000025],[-65.210830999999985,64.303863999999976],[-65.284728999999913,64.291656000000103],[-65.295272999999895,64.290267999999969],[-65.309433000000013,64.29136699999998],[-65.343337999999903,64.294983000000002],[-65.377212999999983,64.303314000000114],[-65.386397999999929,64.30664100000007],[-65.408889999999928,64.312485000000038],[-65.451674999999966,64.319992000000013],[-65.498885999999857,64.322769000000108],[-65.525008999999898,64.323318000000029],[-65.554168999999945,64.323318000000029],[-65.563323999999909,64.322494999999947],[-65.65583799999996,64.308868000000075],[-65.661666999999966,64.307479999999998],[-65.658339999999953,64.302765000000136],[-65.654449,64.300812000000008],[-65.61860699999994,64.293045000000063],[-65.601943999999946,64.293594000000041],[-65.591948999999943,64.296096999999975],[-65.572234999999921,64.298599000000081],[-65.505844000000025,64.302475000000129],[-65.465835999999967,64.30304000000001],[-65.434158000000025,64.299149000000114],[-65.422774999999945,64.296371000000136],[-65.250564999999995,64.208328000000051],[-65.24610899999999,64.204987000000017],[-65.242766999999958,64.200271999999984],[-65.265015000000005,64.17886400000009],[-65.16194200000001,64.138046000000145],[-65.049438000000009,64.072220000000016],[-65.053878999999938,64.067764000000068],[-65.060546999999929,64.064986999999974],[-65.093886999999995,64.052199999999971],[-65.103881999999999,64.049149],[-65.136672999999917,64.041367000000037],[-65.158339999999953,64.038315000000068],[-65.196105999999929,64.040268000000026],[-65.206115999999952,64.040268000000026],[-65.21665999999999,64.038589000000002],[-65.221389999999928,64.03637700000013],[-65.225554999999929,64.032761000000107],[-65.221938999999963,64.028594999999996],[-65.214172000000019,64.025543000000084],[-65.189986999999917,64.020264000000111],[-65.096663999999976,64.009155000000021],[-65.08805799999999,64.009430000000066],[-64.949158000000011,64.014999000000046],[-64.800551999999982,64.02777100000003],[-64.68638599999997,64.039154000000053],[-64.676940999999999,64.036652000000004],[-64.668059999999969,64.033051000000114],[-64.661117999999988,64.028594999999996],[-64.630554000000018,63.978324999999984],[-64.631377999999984,63.974709000000132],[-64.632766999999944,63.972763000000043],[-64.638335999999981,63.96915400000006],[-64.64805599999994,63.966934000000037],[-64.658889999999985,63.965546000000131],[-64.669998000000021,63.966385000000059],[-64.689437999999996,63.966103000000032],[-64.700561999999991,63.963882000000126],[-64.817504999999983,63.923607000000004],[-64.875274999999988,63.901100000000099],[-64.888901000000033,63.894996999999989],[-64.974715999999944,63.851936000000137],[-64.985000999999954,63.829163000000051],[-64.987502999999947,63.823051000000078],[-64.984160999999915,63.813881000000038],[-64.954177999999956,63.776382000000126],[-64.94888299999991,63.774437000000091],[-64.77806099999998,63.747772000000055],[-64.68360899999999,63.746383999999978],[-64.584441999999854,63.704711999999915],[-64.559432999999956,63.694153000000085],[-64.540282999999988,63.684433000000013],[-64.527495999999985,63.676941000000056],[-64.522507000000019,63.672768000000076],[-64.508347000000015,63.650826000000052],[-64.506667999999991,63.636940000000038],[-64.507506999999976,63.630821000000026],[-64.515015000000005,63.620270000000119],[-64.52194199999991,63.611938000000123],[-64.536666999999966,63.581108000000086],[-64.529449,63.534996000000035],[-64.522507000000019,63.514717000000076],[-64.50167799999997,63.443878000000097],[-64.49888599999997,63.429161000000079],[-64.495543999999938,63.327773999999977],[-64.510833999999988,63.307770000000062],[-64.588897999999858,63.321938000000102],[-64.608337000000006,63.32388300000008],[-64.61999499999996,63.323326000000009],[-64.62222300000002,63.322219999999959],[-64.624709999999993,63.318054000000075],[-64.61999499999996,63.313324000000023],[-64.614715999999987,63.30971500000004],[-64.587783999999942,63.299721000000034],[-64.577224999999999,63.296660999999972],[-64.566390999999953,63.293884000000048],[-64.525557999999933,63.290550000000053],[-64.500838999999985,63.289992999999981],[-64.488892000000021,63.288330000000087],[-64.482773000000009,63.285827999999981],[-64.481948999999872,63.282211000000018],[-64.531112999999948,63.249718000000087],[-64.538054999999929,63.248329000000069],[-64.658339999999953,63.249161000000015],[-64.767501999999922,63.32388300000008],[-64.826950000000011,63.45249199999995],[-64.850554999999929,63.510826000000009],[-64.942490000000021,63.632210000000043],[-64.955001999999922,63.640274000000034],[-64.973052999999993,63.646942000000024],[-64.99499499999996,63.652488999999946],[-65.046386999999925,63.662209000000075],[-65.06361400000003,63.668053000000043],[-65.070847000000015,63.671936000000017],[-65.166945999999996,63.747772000000055],[-65.166397000000018,63.773323000000119],[-65.153335999999911,63.771102999999925],[-65.150833000000034,63.772217000000126],[-65.154174999999952,63.776939000000027],[-65.15943900000002,63.781105000000082],[-65.204726999999934,63.80332199999998],[-65.293609999999944,63.812767000000065],[-65.298614999999927,63.81249200000002],[-65.301392000000021,63.81082200000003],[-65.303878999999995,63.806938000000002],[-65.300277999999935,63.799995000000024],[-65.281677000000002,63.788887000000045],[-65.215560999999923,63.75471500000009],[-65.15566999999993,63.725326999999993],[-65.135284000000013,63.715271000000143],[-65.053054999999972,63.638046000000088],[-65.039169000000015,63.574165000000107],[-65.069732999999985,63.568886000000134],[-65.085830999999928,63.563881000000094],[-65.091948999999943,63.559714999999983],[-65.099990999999932,63.547217999999987],[-65.102218999999991,63.541664000000026],[-65.102218999999991,63.536658999999929],[-65.099441999999897,63.526381999999955],[-65.026947000000007,63.399162000000103],[-64.965011999999945,63.369438000000059],[-64.952498999999875,63.362212999999997],[-64.942490000000021,63.353049999999996],[-64.909163999999976,63.280548000000124],[-64.901108000000022,63.237495000000024],[-64.908614999999941,63.235550000000046],[-64.921386999999925,63.235825000000034],[-65.046386999999925,63.248329000000069],[-65.068893000000003,63.252494999999954],[-65.082503999999972,63.260826000000066],[-65.103332999999964,63.27777100000003],[-65.114166000000012,63.284996000000092],[-65.123321999999973,63.288330000000087],[-65.136123999999995,63.290833000000021],[-65.141953000000001,63.28943600000008],[-65.148620999999991,63.286110000000065],[-65.146956999999873,63.281380000000013],[-65.083327999999938,63.20388000000014],[-65.057770000000005,63.174712999999997],[-65.054992999999911,63.172217999999987],[-65.046111999999994,63.171104000000014],[-65.016524999999945,63.171515999999997],[-64.998610999999926,63.176102000000014],[-64.944716999999912,63.183327000000077],[-64.920272999999952,63.184158000000082],[-64.911391999999921,63.180824000000086],[-64.811660999999958,63.137497000000053],[-64.797500999999954,63.130547000000035],[-64.783889999999985,63.12221500000004],[-64.755004999999926,63.099158999999986],[-64.753341999999918,63.096657000000107],[-64.762511999999958,63.0472180000001],[-64.771392999999989,62.98333000000008],[-64.703338999999971,62.953323000000069],[-64.696105999999872,62.952217000000076],[-64.676392000000021,62.941658000000018],[-64.645553999999947,62.921660999999972],[-64.634444999999971,62.912491000000102],[-64.627212999999983,62.90415999999999],[-64.626937999999939,62.899994000000106],[-64.629989999999964,62.897491000000116],[-64.638335999999981,62.894440000000088],[-64.733611999999994,62.878875999999991],[-64.769454999999937,62.862213000000111],[-64.855269999999962,62.865273000000002],[-64.881942999999865,62.867493000000024],[-64.903885000000002,62.872490000000084],[-64.923324999999977,62.878875999999991],[-65.005004999999983,62.90776800000009],[-65.162215999999944,62.943047000000035],[-65.225280999999995,62.954993999999942],[-65.236114999999984,62.957771000000037],[-65.243056999999965,62.961662000000103],[-65.248336999999935,62.965828000000045],[-65.25140399999998,62.970543000000077],[-65.255004999999926,62.979713000000118],[-65.254729999999995,62.985268000000019],[-65.26916499999993,62.959991000000059],[-65.194442999999922,62.878875999999991],[-65.190276999999924,62.875267000000008],[-65.175002999999947,62.862495000000024],[-65.153884999999946,62.84693900000002],[-65.14805599999994,62.843322999999998],[-65.129165999999998,62.83638000000002],[-65.115279999999984,62.828880000000083],[-64.984726000000023,62.714157],[-64.978332999999964,62.704711999999972],[-64.94888299999991,62.648604999999975],[-64.964721999999995,62.6336060000001],[-64.980834999999956,62.623604000000114],[-65.062774999999988,62.587494000000049],[-65.071120999999948,62.584435000000042],[-65.087219000000005,62.57888000000014],[-65.114715999999987,62.571663000000058],[-65.145003999999915,62.565826000000072],[-65.187499999999943,62.56221000000005],[-65.19776899999988,62.563048999999978],[-65.205001999999979,62.566101000000117],[-65.212219000000005,62.569992000000013],[-65.22084000000001,62.578331000000048],[-65.288605000000018,62.659987999999998],[-65.294997999999964,62.669441000000006],[-65.296660999999972,62.674163999999962],[-65.290558000000033,62.678878999999995],[-65.273894999999982,62.685265000000129],[-65.267776000000026,62.690269000000058],[-65.266952999999944,62.694434999999999],[-65.279175000000009,62.696654999999964],[-65.321121000000005,62.694434999999999],[-65.327498999999989,62.691658000000075],[-65.329726999999934,62.685546999999985],[-65.328063999999983,62.666100000000142],[-65.337218999999948,62.666664000000083],[-65.346953999999869,62.675827000000083],[-65.353881999999942,62.684433000000013],[-65.356658999999922,62.69499200000007],[-65.339721999999938,62.837493999999992],[-65.391952999999944,62.843605000000025],[-65.436661000000015,62.819442999999978],[-65.566665999999941,62.811661000000015],[-65.579178000000013,62.811934999999949],[-65.601943999999946,62.817772000000105],[-65.60943599999996,62.820831000000055],[-65.61610399999995,62.824715000000083],[-65.746947999999861,62.917770000000075],[-65.909438999999963,62.925827000000027],[-65.933318999999983,62.955826000000059],[-65.910278000000005,62.967765999999983],[-65.839721999999995,63.020828000000051],[-65.834731999999974,63.026382000000069],[-65.833327999999995,63.03138000000007],[-65.838333000000034,63.033333000000027],[-65.84973100000002,63.032767999999976],[-65.866394000000014,63.028602999999976],[-65.926101999999958,63.008331000000112],[-65.949722000000008,62.997772000000055],[-65.955001999999979,62.994155999999975],[-65.955565999999862,62.990829000000076],[-65.946380999999974,62.983047000000113],[-65.945830999999941,62.978874000000133],[-65.950561999999991,62.975822000000051],[-65.960830999999928,62.974433999999974],[-65.973891999999864,62.973877000000073],[-65.987212999999997,62.974709000000132],[-66.014450000000011,62.978874000000133],[-66.031386999999938,62.984717999999987],[-66.039718999999991,62.988602000000014],[-66.052215999999987,62.996658000000082],[-66.14973399999991,63.059990000000084],[-66.155563000000029,63.081383000000017],[-66.162780999999939,63.089989000000116],[-66.174438000000009,63.096382000000062],[-66.266952999999944,63.130820999999969],[-66.275832999999977,63.133881000000031],[-66.282501000000025,63.133330999999998],[-66.287780999999995,63.12971500000009],[-66.291945999999996,63.125267000000122],[-66.293335000000013,63.120543999999995],[-66.291381999999999,63.116104000000121],[-66.206954999999994,63.040833000000077],[-66.196654999999964,63.031661999999983],[-66.182769999999891,63.023604999999975],[-66.121658000000025,63.00110600000005],[-66.105559999999969,62.993880999999988],[-66.098343,62.990273000000059],[-66.091385000000002,62.983604000000014],[-66.089721999999881,62.978600000000029],[-66.097777999999948,62.952492000000063],[-66.103058000000033,62.946655000000135],[-66.107772999999952,62.943878000000041],[-66.11610399999995,62.940544000000045],[-66.135833999999932,62.936652999999978],[-66.147232000000031,62.936104],[-66.159163999999976,62.936652999999978],[-66.168883999999991,62.938881000000094],[-66.192215000000033,62.954437000000041],[-66.220839999999953,62.969437000000028],[-66.284728999999913,62.990273000000059],[-66.293883999999878,62.992767000000015],[-66.345000999999968,62.999161000000015],[-66.351668999999958,62.998603999999943],[-66.366104000000007,62.992493000000081],[-66.37860099999989,62.992493000000081],[-66.392775999999969,62.994995000000131],[-66.408889999999928,63.001938000000109],[-66.444442999999865,63.020546000000024],[-66.46444699999995,63.032211000000075],[-66.518340999999964,63.065269000000058],[-66.525283999999999,63.074715000000026],[-66.551940999999999,63.17943600000001],[-66.626388999999961,63.252220000000136],[-66.646666999999979,63.326384999999959],[-66.638335999999981,63.340271000000143],[-66.637512000000015,63.349998000000085],[-66.636948000000018,63.35833000000008],[-66.637786999999946,63.362770000000069],[-66.642776000000026,63.372489999999971],[-66.650832999999977,63.374992000000077],[-66.657500999999968,63.374435000000005],[-66.664169000000015,63.371658000000082],[-66.735549999999989,63.299438000000066],[-66.738602000000014,63.294159000000093],[-66.740828999999962,63.288048000000003],[-66.740279999999927,63.283607000000075],[-66.731110000000001,63.274712000000022],[-66.720550999999944,63.266388000000006],[-66.685546999999985,63.248046999999985],[-66.671386999999868,63.242767000000129],[-66.646956999999929,63.239159000000029],[-66.639174999999966,63.236107000000118],[-66.607498000000021,63.21027400000014],[-66.602492999999981,63.205269000000101],[-66.600280999999995,63.200829000000113],[-66.558334000000002,63.087212000000022],[-66.537780999999882,62.998047000000042],[-66.540282999999931,62.994155999999975],[-66.546660999999915,62.991379000000109],[-66.557220000000029,62.99193600000001],[-66.673049999999989,63.023048000000074],[-66.682220000000029,63.026382000000069],[-66.763061999999934,63.083054000000061],[-66.768065999999919,63.087768999999923],[-66.773894999999925,63.096382000000062],[-66.774444999999957,63.100548000000003],[-66.778885000000002,63.143607999999972],[-66.789169000000015,63.21138000000002],[-66.806655999999975,63.272491000000116],[-66.807495000000017,63.273323000000062],[-66.811661000000015,63.274437000000034],[-66.82028200000002,63.273323000000062],[-66.829177999999956,63.271660000000111],[-66.837783999999942,63.267769000000044],[-66.846953999999926,63.25750000000005],[-66.849166999999966,63.251389000000131],[-66.849166999999966,63.245544000000052],[-66.846114999999941,63.229713000000061],[-66.844727000000034,63.22665400000011],[-66.837219000000005,63.21804800000001],[-66.828338999999971,63.209159999999997],[-66.819457999999941,63.200272000000041],[-66.813888999999961,63.196098000000006],[-66.803878999999938,63.186378000000104],[-66.801391999999964,63.182495000000131],[-66.799727999999959,63.177490000000091],[-66.799437999999952,63.172492999999974],[-66.801666000000012,63.166382000000112],[-66.806655999999975,63.160545000000127],[-66.818343999999968,63.154159999999933],[-66.835555999999997,63.149161999999933],[-66.844161999999926,63.147217000000126],[-66.855270000000019,63.147217000000126],[-66.868332000000009,63.148880000000077],[-66.87777699999998,63.151931999999988],[-67.018340999999964,63.238883999999985],[-67.023894999999982,63.243050000000096],[-67.025008999999955,63.246658000000025],[-67.024445000000014,63.250274999999988],[-67.023055999999997,63.252777000000037],[-67.006393000000003,63.262215000000083],[-66.971114999999998,63.389717000000019],[-66.972777999999948,63.394997000000103],[-66.977782999999988,63.399719000000005],[-66.988891999999964,63.402489000000003],[-67.011123999999938,63.399993999999992],[-67.017226999999991,63.397217000000069],[-67.040832999999964,63.33554799999996],[-67.039168999999958,63.330551000000071],[-67.035827999999924,63.325272000000098],[-67.025008999999955,63.311104000000057],[-67.016113000000018,63.296660999999972],[-67.014174999999966,63.286385000000053],[-67.017226999999991,63.281105000000025],[-67.033324999999934,63.275268999999923],[-67.051940999999943,63.273323000000062],[-67.171111999999994,63.273880000000133],[-67.179717999999923,63.275551000000007],[-67.203887999999949,63.28527100000008],[-67.431670999999994,63.412765999999976],[-67.499999999999943,63.442764000000125],[-67.621658000000025,63.548881999999992],[-67.683318999999983,63.619438000000002],[-67.838897999999915,63.729713000000118],[-67.897506999999962,63.753052000000139],[-67.914718999999991,63.759438000000046],[-67.92332499999992,63.761108000000036],[-67.926102000000014,63.759163000000058],[-67.925277999999935,63.75471500000009],[-67.921386999999982,63.744438000000059],[-67.918059999999855,63.739159000000086],[-67.820006999999976,63.596382000000006],[-67.710555999999997,63.458603000000039],[-67.683318999999983,63.431664000000069],[-67.675003000000004,63.4180530000001],[-67.67193599999996,63.412490999999989],[-67.667769999999962,63.403046000000074],[-67.666396999999961,63.394439999999975],[-67.666655999999989,63.388046000000145],[-67.678329000000019,63.373047000000099],[-67.685271999999998,63.368880999999988],[-67.694442999999978,63.366385999999977],[-67.716659999999933,63.363884000000098],[-67.724166999999966,63.364159000000086],[-67.737212999999997,63.366385999999977],[-67.746384000000035,63.369438000000059],[-67.820557000000008,63.400269000000037],[-67.827224999999999,63.405266000000097],[-67.837509000000011,63.424164000000019],[-67.854445999999996,63.452774000000034],[-67.858046999999999,63.457497000000046],[-67.871658000000025,63.464714000000129],[-67.950835999999981,63.506660000000124],[-68.025283999999942,63.540832999999964],[-68.033324999999934,63.543883999999991],[-68.041381999999999,63.546104000000014],[-68.053054999999915,63.545273000000009],[-68.061661000000015,63.54332700000009],[-68.075561999999991,63.544159000000036],[-68.365829000000019,63.64527099999998],[-68.388610999999855,63.655548000000124],[-68.400283999999942,63.663879000000009],[-68.405563000000029,63.668602000000021],[-68.428328999999962,63.696381000000031],[-68.542769999999962,63.732490999999925],[-68.645843999999897,63.747490000000028],[-68.713622999999984,63.742493000000081],[-68.709732000000031,63.738045000000113],[-68.711394999999925,63.734717999999987],[-68.716109999999958,63.732207999999957],[-68.723617999999988,63.729713000000118],[-68.795546999999999,63.728600000000085],[-68.804442999999935,63.730270000000019],[-68.876099000000011,63.744713000000104],[-68.915833000000021,63.757216999999969],[-68.924437999999952,63.758888000000013],[-68.962508999999955,63.759163000000058],[-68.994720000000029,63.755554000000018],[-68.996947999999918,63.75360900000004],[-68.998336999999992,63.745270000000005],[-68.995270000000005,63.741379000000109],[-68.989715999999987,63.737495000000081],[-68.977782999999931,63.729713000000118],[-68.933059999999955,63.711936999999978],[-68.919448999999986,63.704993999999999],[-68.824722000000008,63.643883000000073],[-68.813048999999978,63.635551000000078],[-68.809433000000013,63.630821000000026],[-68.807220000000029,63.625824000000136],[-68.809433000000013,63.621658000000025],[-68.793334999999956,63.589157000000114],[-68.766113000000018,63.556656000000032],[-68.754729999999995,63.548607000000004],[-68.717772999999909,63.528603000000089],[-68.557769999999948,63.45249199999995],[-68.495833999999945,63.421378999999945],[-68.35943599999996,63.344710999999961],[-68.288605000000018,63.298332000000016],[-68.270553999999947,63.284996000000092],[-68.206389999999999,63.227211000000011],[-68.202498999999932,63.216933999999981],[-68.206389999999999,63.212493999999992],[-68.18638599999997,63.188324000000136],[-68.156113000000005,63.158324999999934],[-68.146118000000001,63.150269000000037],[-68.139175000000023,63.148605000000032],[-68.128601000000003,63.148048000000131],[-68.115554999999972,63.15248900000006],[-68.082779000000016,63.163605000000018],[-68.063888999999961,63.163605000000018],[-67.952224999999942,63.145546000000081],[-67.926392000000021,63.141106000000036],[-67.917495999999971,63.137214999999969],[-67.916655999999932,63.133049000000085],[-67.92332499999992,63.129433000000063],[-67.912780999999939,63.083327999999995],[-67.646117999999944,63.100272999999959],[-67.632767000000001,63.09887700000013],[-67.610275000000001,63.094154000000117],[-67.604996000000028,63.089989000000116],[-67.599990999999989,63.084434999999928],[-67.599990999999989,63.078880000000026],[-67.601944000000003,63.073326000000066],[-67.61500499999994,63.063605999999993],[-67.624160999999958,63.061104000000057],[-67.636123999999995,63.059715000000097],[-67.682219999999916,63.057770000000119],[-67.689712999999927,63.058044000000052],[-67.709166999999923,63.056655999999919],[-67.719451999999933,63.054993000000024],[-67.727492999999924,63.051659000000029],[-67.77305599999994,63.025826000000052],[-67.772507000000019,62.962212000000136],[-67.769729999999981,62.958327999999938],[-67.763625999999988,62.955551000000071],[-67.748046999999985,62.953049000000135],[-67.738602000000014,62.953323000000069],[-67.728058000000033,62.954993999999942],[-67.721831999999949,62.96265800000009],[-67.718841999999995,62.964493000000061],[-67.718169999999986,62.967327000000068],[-67.719329999999957,62.970490000000098],[-67.72444200000001,62.984161000000086],[-67.729995999999971,62.98832700000014],[-67.736938000000009,62.995544000000109],[-67.733886999999982,63.000832000000116],[-67.698043999999925,63.020828000000051],[-67.686934999999949,63.026657000000114],[-67.659438999999963,63.034164000000033],[-67.56527699999998,63.049438000000123],[-67.553054999999915,63.048607000000118],[-67.529998999999975,63.03694200000001],[-67.510559000000001,63.024712000000079],[-67.499999999999943,63.015549000000078],[-67.499724999999955,63.007773999999984],[-67.509170999999924,63.001938000000109],[-67.531386999999995,62.995269999999948],[-67.550551999999982,62.99193600000001],[-67.573333999999988,62.990273000000059],[-67.593613000000005,62.987495000000081],[-67.630828999999949,62.976379000000122],[-67.651397999999915,62.967490999999939],[-67.670997999999997,62.944323999999995],[-67.671829000000002,62.941322000000127],[-67.672667999999987,62.937996000000055],[-67.672775000000001,62.923324999999977],[-67.665833000000021,62.918884000000048],[-67.659164000000033,62.916664000000026],[-67.654921999999999,62.917282],[-67.648894999999925,62.921104000000071],[-67.646666999999979,62.925270000000125],[-67.638335999999981,62.931938000000116],[-67.572509999999909,62.963882000000126],[-67.566956000000005,62.965546000000131],[-67.470275999999956,62.985268000000019],[-67.462783999999999,62.985268000000019],[-67.39805599999994,62.967209000000082],[-67.194716999999912,62.870270000000062],[-67.048339999999996,62.771378000000141],[-67.012221999999952,62.73443600000013],[-66.95777899999996,62.681106999999997],[-66.913329999999917,62.669991000000039],[-66.824722000000008,62.679161000000079],[-66.813323999999852,62.679992999999968],[-66.741104000000007,62.673882000000106],[-66.733063000000016,62.671661000000029],[-66.726944000000003,62.668602000000021],[-66.728881999999942,62.666100000000142],[-66.735275000000001,62.662490999999932],[-66.744445999999925,62.660271000000137],[-66.752791999999999,62.656936999999971],[-66.760559000000001,62.653602999999976],[-66.768065999999919,62.648879999999963],[-66.773055999999883,62.643050999999957],[-66.775009000000011,62.636940000000095],[-66.773055999999883,62.632492000000127],[-66.606948999999986,62.604996000000085],[-66.425002999999947,62.445267000000115],[-66.359436000000017,62.447487000000137],[-66.351668999999958,62.444992000000127],[-66.349166999999966,62.441376000000048],[-66.327498999999932,62.384438000000046],[-66.330565999999976,62.379158000000018],[-66.337783999999886,62.374992000000077],[-66.426391999999964,62.349433999999974],[-66.435546999999929,62.349158999999986],[-66.458617999999944,62.35193600000008],[-66.469161999999983,62.35193600000008],[-66.475829999999974,62.348602000000085],[-66.478881999999999,62.343323000000112],[-66.478881999999999,62.338325999999995],[-66.476943999999946,62.335823000000005],[-66.470000999999968,62.332214000000022],[-66.374709999999993,62.286110000000065],[-66.329177999999956,62.267494000000056],[-66.318619000000012,62.264717000000132],[-66.355834999999956,62.307770000000062],[-66.359160999999972,62.312492000000134],[-66.363892000000021,62.323051000000021],[-66.361389000000031,62.326942000000088],[-66.355559999999855,62.331940000000088],[-66.351944000000003,62.334991000000116],[-66.332779000000016,62.341934000000094],[-66.3125,62.344993999999986],[-66.294158999999979,62.344711000000018],[-66.285552999999993,62.343605000000139],[-66.208343999999897,62.332214000000022],[-66.165282999999931,62.291381999999999],[-66.160277999999892,62.271378000000084],[-66.167220999999984,62.254439999999988],[-66.201950000000011,62.260551000000078],[-66.256667999999991,62.266105999999979],[-66.261397999999872,62.263054000000068],[-66.257232999999871,62.259720000000073],[-66.241104000000007,62.253326000000015],[-66.212508999999898,62.245270000000119],[-66.166397000000018,62.235267999999962],[-66.081680000000006,62.226379000000065],[-66.058608999999876,62.2241590000001],[-66.051940999999999,62.224709000000132],[-66.045836999999949,62.227485999999999],[-66.043610000000001,62.233604000000128],[-66.038895000000025,62.239432999999963],[-66.033889999999985,62.244995000000131],[-66.028610000000015,62.248604000000114],[-66.025008999999955,62.249718000000087],[-66.015014999999948,62.251389000000131],[-66,62.247771999999998],[-65.993057000000022,62.244155999999975],[-65.939437999999996,62.208602999999925],[-65.933059999999955,62.204163000000108],[-65.929168999999888,62.198044000000095],[-65.930556999999965,62.193321000000083],[-65.934432999999956,62.191657999999961],[-65.952788999999939,62.189156000000082],[-65.963332999999977,62.186935000000005],[-65.969161999999926,62.184714999999983],[-66.043610000000001,62.151657],[-66.050827000000027,62.147774000000084],[-66.132492000000013,62.089432000000045],[-66.110001000000011,62.017494000000113],[-66.041945999999996,61.958046000000081],[-66.035827999999924,61.952773999999977],[-66.033066000000019,61.95249200000012],[-66.019454999999994,61.954993999999999],[-66.003066999999987,61.962212000000022],[-65.999434999999949,61.963051000000121],[-65.992217999999866,61.962769000000094],[-65.988602000000014,61.958885000000066],[-65.949432000000002,61.912491000000102],[-65.946655000000021,61.906936999999914],[-65.946655000000021,61.899162000000047],[-65.948882999999967,61.89527099999998],[-65.955001999999979,61.890274000000034],[-65.961945000000014,61.886383000000137],[-65.97084000000001,61.883881000000088],[-66.057770000000005,61.869713000000047],[-66.066101000000003,61.868599000000074],[-66.275832999999977,61.858330000000024],[-66.287780999999995,61.858330000000024],[-66.395003999999858,61.87082700000002],[-66.404449,61.872765000000129],[-66.521666999999923,61.896942000000024],[-66.543334999999956,61.898880000000133],[-66.555557000000022,61.901382000000012],[-66.626099000000011,61.917213000000004],[-66.632767000000001,61.918884000000048],[-66.659163999999976,61.933601000000067],[-66.665282999999931,61.941375999999991],[-66.662216000000001,61.946655000000135],[-66.746947999999918,62.00777400000004],[-66.755568999999923,62.011108000000036],[-66.781386999999881,62.015549000000135],[-66.803329000000019,62.016937000000041],[-66.812774999999988,62.016663000000108],[-66.825835999999924,62.011940000000095],[-67.091949,62.030822999999998],[-67.104720999999984,62.032211000000132],[-67.254729999999938,62.078049000000078],[-67.345275999999899,62.119437999999946],[-67.463057999999933,62.139435000000049],[-67.499999999999943,62.138657000000137],[-67.731658999999922,62.158356000000026],[-67.757232999999928,62.160544999999956],[-67.798339999999939,62.166100000000085],[-68.003066999999987,62.213882000000126],[-68.113892000000021,62.216103000000032],[-68.233062999999902,62.219711000000132],[-68.256957999999997,62.220825000000104],[-68.269164999999873,62.223045000000127],[-68.299438000000009,62.232208000000128],[-68.325286999999946,62.234993000000145],[-68.401671999999962,62.239432999999963],[-68.46945199999999,62.242767000000129],[-68.519729999999925,62.244713000000047],[-68.548049999999932,62.248604000000114],[-68.564712999999927,62.251938000000109],[-68.615828999999962,62.263885000000073],[-68.722228999999913,62.302216000000044],[-68.725554999999872,62.30471],[-68.726943999999946,62.307770000000062],[-68.759170999999924,62.328049000000021],[-68.882216999999969,62.360550000000103],[-68.922501000000011,62.365547000000049],[-68.995833999999945,62.373322000000087],[-69.039000999999985,62.381355000000042],[-69.121384000000035,62.410820000000115],[-69.160003999999958,62.425270000000069],[-69.193054000000018,62.438042000000053],[-69.231673999999884,62.455269000000101],[-69.270554000000004,62.478325000000098],[-69.36082499999992,62.536385000000053],[-69.40834000000001,62.569992000000013],[-69.430556999999965,62.584160000000054],[-69.426666000000012,62.55443600000001],[-69.428329000000019,62.548332000000016],[-69.442215000000033,62.547493000000031],[-69.449721999999952,62.551102000000014],[-69.519164999999987,62.602493000000095],[-69.583892999999989,62.651932000000102],[-69.597228999999913,62.662490999999932],[-69.597504000000015,62.665268000000026],[-69.565551999999968,62.718048000000067],[-69.557219999999973,62.726379000000009],[-69.543335000000013,62.732765000000086],[-69.525557999999933,62.738044999999943],[-69.50389100000001,62.741378999999938],[-69.482497999999964,62.763611000000026],[-69.727492999999981,62.779991000000109],[-69.906386999999881,62.768599999999992],[-70.121932999999956,62.748878000000104],[-70.217498999999862,62.747772000000111],[-70.229171999999949,62.748878000000104],[-70.240279999999984,62.751389000000074],[-70.354995999999915,62.788329999999974],[-70.360000999999954,62.790276000000063],[-70.367767000000015,62.793883999999991],[-70.477782999999988,62.848328000000038],[-70.499434999999949,62.864441000000056],[-70.508056999999951,62.865828999999962],[-70.665558000000033,62.880547000000092],[-70.830291999999929,62.896660000000111],[-70.853332999999964,62.899994000000106],[-70.885558999999944,62.907211000000018],[-70.896118000000001,62.91443600000008],[-70.893065999999976,62.917770000000075],[-70.885833999999988,62.920546999999999],[-70.871384000000035,62.924713000000054],[-70.863616999999977,62.925552000000039],[-70.848343,62.924713000000054],[-70.847777999999892,62.947212000000036],[-70.974837999999977,62.989437000000009],[-70.977341000000024,62.983768000000055],[-71.013061999999991,62.989990000000091],[-71.060271999999941,62.981102000000078],[-71.071670999999981,62.979431000000034],[-71.120833999999945,62.979431000000034],[-71.135833999999932,62.980820000000051],[-71.152221999999995,62.985268000000019],[-71.156661999999983,62.989159000000086],[-71.156661999999983,62.999434999999949],[-71.136672999999973,63.028602999999976],[-71.118103000000019,63.032219000000055],[-71.091384999999946,63.029991000000052],[-71.020888999999954,63.044270000000097],[-71.013724999999965,63.043602000000021],[-71.007384999999942,63.043437999999981],[-71.003219999999942,63.044768999999974],[-70.863892000000021,63.112213000000054],[-70.856383999999991,63.139434999999992],[-70.908889999999985,63.17083000000008],[-70.920546999999942,63.168883999999991],[-70.952498999999989,63.162766000000033],[-70.971389999999928,63.158882000000006],[-70.976943999999946,63.15665400000006],[-70.990279999999984,63.148048000000131],[-70.997498000000007,63.141662999999937],[-71.001953000000015,63.128044000000045],[-71.002791999999999,63.123322000000144],[-71.00140399999998,63.118881000000044],[-70.993332000000009,63.112770000000125],[-70.990829000000019,63.108330000000137],[-70.989989999999977,63.102492999999981],[-70.993606999999997,63.098045000000013],[-71.029723999999987,63.071937999999989],[-71.041672000000005,63.069442999999922],[-71.127212999999983,63.071663000000115],[-71.138610999999912,63.073326000000066],[-71.195266999999944,63.031661999999983],[-71.195830999999998,63.026657000000114],[-71.198607999999979,63.019989000000123],[-71.208618000000001,63.01166500000005],[-71.232773000000009,63.001938000000109],[-71.243880999999988,63.00110600000005],[-71.255844000000025,63.001938000000109],[-71.262512000000015,63.004166000000112],[-71.40055799999999,63.051659000000029],[-71.408339999999953,63.055267000000129],[-71.413895000000025,63.060546999999985],[-71.421386999999982,63.071663000000115],[-71.454726999999934,63.10193600000008],[-71.465012000000002,63.103325000000098],[-71.605834999999956,63.134995000000004],[-71.624999999999943,63.140831000000048],[-71.70666499999993,63.174995000000081],[-71.713897999999972,63.179161000000136],[-71.770003999999915,63.25638600000002],[-71.794998000000021,63.326660000000004],[-71.795546999999942,63.384720000000073],[-71.805831999999953,63.382767000000001],[-72.009170999999981,63.391106000000036],[-72.063048999999921,63.396385000000009],[-72.076400999999976,63.398048000000074],[-72.083069000000023,63.400542999999971],[-72.141678000000013,63.436104000000114],[-72.146118000000001,63.439987000000031],[-72.145554000000004,63.44609800000012],[-72.126662999999951,63.450271999999984],[-72.023055999999997,63.448043999999982],[-71.933318999999926,63.443321000000026],[-71.825835999999981,63.435265000000129],[-71.785278000000005,63.431938000000002],[-71.748046999999985,63.428047000000106],[-71.711120999999935,63.422768000000133],[-71.683059999999955,63.419716000000051],[-71.634734999999921,63.419716000000051],[-71.61500499999994,63.422493000000145],[-71.59944200000001,63.42582700000014],[-71.411666999999909,63.485824999999977],[-71.316955999999948,63.530823000000055],[-71.227492999999924,63.598877000000016],[-71.229720999999984,63.604713000000061],[-71.234726000000023,63.608047000000056],[-71.245620999999971,63.610939000000087],[-71.261123999999995,63.612495000000024],[-71.295273000000009,63.612495000000024],[-71.306945999999982,63.611381999999935],[-71.323623999999938,63.605270000000132],[-71.328063999999983,63.602218999999934],[-71.331680000000006,63.598328000000038],[-71.333069000000023,63.583603000000096],[-71.332503999999972,63.581664999999987],[-71.328063999999983,63.576942000000031],[-71.325561999999991,63.571938000000046],[-71.326110999999912,63.570549000000028],[-71.331680000000006,63.565543999999989],[-71.335280999999895,63.564437999999996],[-71.379990000000021,63.565543999999989],[-71.407501000000025,63.567771999999934],[-71.414168999999958,63.570549000000028],[-71.416397000000018,63.572769000000051],[-71.378052000000025,63.595268000000033],[-71.367492999999968,63.601935999999966],[-71.363616999999977,63.607216000000051],[-71.362503000000004,63.61332700000014],[-71.377486999999974,63.632767000000115],[-71.396666999999923,63.635826000000066],[-71.407776000000013,63.635551000000078],[-71.411391999999978,63.634437999999989],[-71.418059999999969,63.629990000000021],[-71.452498999999989,63.604439000000127],[-71.441101000000003,63.590827999999988],[-71.439437999999996,63.588042999999971],[-71.446944999999914,63.580826000000002],[-71.455841000000021,63.57888000000014],[-71.470275999999956,63.578049000000135],[-71.561661000000015,63.580275999999969],[-71.576950000000011,63.581664999999987],[-71.580565999999976,63.583878000000141],[-71.581389999999942,63.59304800000001],[-71.583618000000001,63.649719000000118],[-71.569457999999997,63.675552000000039],[-71.562209999999993,63.685546999999985],[-71.581116000000009,63.714995999999985],[-71.585007000000019,63.71665999999999],[-71.615828999999906,63.722213999999951],[-71.629165999999941,63.723877000000073],[-71.638061999999877,63.721099999999979],[-71.660004000000015,63.706940000000088],[-71.664718999999877,63.703049000000021],[-71.667220999999927,63.697212000000036],[-71.700561999999991,63.696381000000031],[-71.823897999999872,63.78054800000001],[-71.830001999999979,63.784439000000077],[-71.891113000000018,63.80832700000002],[-71.904449,63.809989999999971],[-71.915558000000033,63.810271999999998],[-71.938599000000011,63.808044000000052],[-71.958344000000011,63.802490000000034],[-71.970550999999944,63.795830000000024],[-71.985549999999932,63.781937000000028],[-72.000564999999995,63.761383000000023],[-72.004181000000017,63.752776999999924],[-71.999725000000012,63.748328999999956],[-71.991104000000007,63.74610100000001],[-71.972778000000005,63.748047000000099],[-71.966949,63.75110600000005],[-71.954726999999934,63.76527400000009],[-71.946654999999964,63.770271000000037],[-71.939162999999951,63.772491000000059],[-71.934433000000013,63.772766000000047],[-71.853881999999999,63.761383000000023],[-71.848617999999988,63.759438000000046],[-71.843886999999995,63.755554000000018],[-71.879439999999988,63.681937999999946],[-71.882766999999944,63.678047000000049],[-71.920273000000009,63.655548000000124],[-71.933884000000035,63.649437000000034],[-71.963622999999984,63.649162000000047],[-72.051940999999943,63.67860399999995],[-72.154175000000009,63.735550000000103],[-72.169448999999986,63.748604],[-72.21305799999999,63.683876000000112],[-72.212783999999942,63.680550000000039],[-72.213897999999915,63.677772999999945],[-72.218886999999995,63.673882000000049],[-72.223891999999864,63.672218000000044],[-72.234160999999972,63.670273000000066],[-72.245269999999948,63.669715999999994],[-72.28694200000001,63.671660999999972],[-72.317504999999983,63.674164000000133],[-72.324172999999973,63.676658999999972],[-72.327498999999989,63.67971799999998],[-72.363891999999964,63.749435000000005],[-72.363616999999977,63.754440000000045],[-72.357772999999952,63.761383000000023],[-72.352782999999988,63.76527400000009],[-72.342498999999975,63.771378000000141],[-72.324722000000008,63.776939000000027],[-72.317779999999914,63.777771000000087],[-72.302779999999927,63.776657000000114],[-72.291381999999942,63.773605000000032],[-72.270003999999915,63.787216000000001],[-72.215012000000002,63.867767000000072],[-72.209732000000031,63.893051000000071],[-72.223052999999993,63.92943600000001],[-72.232772999999895,63.948325999999952],[-72.238892000000021,63.952492000000063],[-72.246384000000035,63.950272000000041],[-72.250564999999938,63.947769000000051],[-72.36471599999993,63.845543000000134],[-72.383056999999951,63.815543999999932],[-72.376388999999961,63.812209999999936],[-72.371658000000025,63.809158000000025],[-72.366942999999992,63.804710000000057],[-72.365554999999915,63.800270000000069],[-72.363051999999925,63.791107000000068],[-72.368056999999965,63.782494000000099],[-72.372771999999998,63.778603000000032],[-72.436110999999926,63.781661999999983],[-72.515838999999971,63.786384999999996],[-72.526397999999915,63.787773000000072],[-72.531386999999995,63.791107000000068],[-72.532227000000034,63.796661000000029],[-72.531386999999995,63.799438000000123],[-72.519729999999925,63.804710000000057],[-72.496658000000025,63.803604000000064],[-72.474166999999909,63.804710000000057],[-72.463897999999972,63.806655999999975],[-72.459731999999974,63.809158000000025],[-72.456116000000009,63.814438000000109],[-72.456954999999994,63.815826000000015],[-72.465011999999945,63.819160000000011],[-72.521117999999944,63.84027100000003],[-72.537216000000001,63.844154000000003],[-72.585555999999997,63.852776000000006],[-72.634734999999978,63.852493000000038],[-72.637512000000015,63.873604000000057],[-72.641112999999962,63.904434000000094],[-72.611663999999962,63.943046999999979],[-72.592772999999852,64.018051000000128],[-72.592772999999852,64.022217000000069],[-72.658339999999896,64.076660000000004],[-72.664718999999934,64.080551000000071],[-72.67471299999994,64.083327999999995],[-72.682495000000017,64.079711999999972],[-72.685546999999929,64.076385000000016],[-72.688048999999978,64.070540999999992],[-72.704726999999991,64.015549000000078],[-72.705841000000021,64.009155000000021],[-72.702498999999932,64.005553999999961],[-72.696945000000028,64.003052000000082],[-72.668335000000013,63.996101000000124],[-72.660004000000015,63.992493000000024],[-72.658614999999998,63.987770000000069],[-72.666396999999961,63.980545000000006],[-72.678878999999938,63.972488000000055],[-72.692490000000021,63.966660000000104],[-72.699722000000008,63.964439000000027],[-72.720000999999968,63.961105000000032],[-72.753341999999918,64.000274999999988],[-72.758346999999958,64.004166000000055],[-72.779449,64.010544000000039],[-72.836120999999991,64.019714000000079],[-72.931380999999988,64.052475000000015],[-72.94027699999998,64.058594000000028],[-72.941375999999991,64.063599000000067],[-72.93971299999987,64.067764000000068],[-72.933318999999983,64.076385000000016],[-72.925551999999868,64.084152000000131],[-72.919723999999917,64.086929000000055],[-72.911117999999931,64.08859300000006],[-72.888061999999991,64.086105000000089],[-72.878326000000015,64.086655000000121],[-72.874435000000005,64.08859300000006],[-72.870833999999945,64.093872000000033],[-72.868880999999931,64.099152000000117],[-72.868332000000009,64.108321999999987],[-72.897232000000031,64.156937000000028],[-72.905272999999909,64.164993000000095],[-72.911666999999966,64.168868999999972],[-73.223891999999921,64.31164600000011],[-73.271117999999888,64.283875000000023],[-73.267226999999991,64.273880000000133],[-73.270003999999972,64.265823000000125],[-73.273055999999997,64.26249700000011],[-73.279174999999952,64.258606000000043],[-73.339721999999938,64.258040999999992],[-73.365829000000019,64.261932000000058],[-73.380554000000018,64.268600000000049],[-73.384170999999981,64.272491000000116],[-73.386947999999904,64.277480999999966],[-73.417769999999905,64.371093999999914],[-73.415558000000033,64.445816000000036],[-73.326950000000011,64.476089000000002],[-73.167770000000019,64.576660000000118],[-73.164718999999934,64.579712000000029],[-73.164718999999934,64.60554499999995],[-73.165557999999976,64.607483000000116],[-73.169448999999872,64.609984999999995],[-73.296950999999922,64.656937000000084],[-73.302779999999927,64.658875000000023],[-73.309433000000013,64.658600000000035],[-73.342223999999931,64.644150000000081],[-73.346664000000033,64.641098],[-73.347504000000015,64.63499500000006],[-73.341110000000015,64.626083000000051],[-73.326110999999969,64.609984999999995],[-73.314437999999939,64.598038000000031],[-73.308043999999995,64.593322999999998],[-73.302215999999987,64.583878000000084],[-73.298614999999927,64.559418000000107],[-73.299163999999962,64.544982999999945],[-73.303328999999962,64.538315000000011],[-73.30749499999996,64.535812000000021],[-73.315276999999924,64.532211000000132],[-73.32417299999986,64.52998400000007],[-73.424164000000019,64.509995000000004],[-73.463333000000034,64.502486999999974],[-73.47222899999997,64.504440000000102],[-73.475829999999917,64.508040999999935],[-73.477218999999991,64.512207000000046],[-73.473052999999993,64.553589000000045],[-73.448714999999936,64.565422000000012],[-73.467223999999987,64.612762000000089],[-73.595000999999968,64.629699999999957],[-73.655563000000029,64.631653000000085],[-73.655563000000029,64.623596000000134],[-73.667496000000028,64.577209000000039],[-73.750289999999893,64.536377000000073],[-73.75389100000001,64.535263000000043],[-73.764450000000011,64.537491000000045],[-73.787780999999939,64.548035000000084],[-73.803054999999915,64.555251999999996],[-73.821121000000005,64.567490000000078],[-73.837783999999999,64.579712000000029],[-73.84944200000001,64.587493999999992],[-73.861388999999974,64.594436999999971],[-73.876662999999951,64.600815000000125],[-73.886947999999961,64.603592000000049],[-73.910277999999948,64.605819999999994],[-73.920272999999952,64.605255000000113],[-73.929442999999992,64.602203000000031],[-73.932495000000017,64.593597000000102],[-73.931106999999997,64.583878000000084],[-73.844726999999978,64.501937999999996],[-73.925551999999925,64.460265999999933],[-73.972777999999892,64.430267000000129],[-73.999434999999892,64.328048999999965],[-74.062774999999988,64.334427000000119],[-74.102218999999877,64.367476999999951],[-74.128051999999911,64.533051],[-74.127486999999974,64.534424000000115],[-74.105835000000013,64.535812000000021],[-74.082229999999925,64.534988000000055],[-74.065276999999924,64.533051],[-74.055557000000022,64.610535000000027],[-74.050551999999982,64.724991000000045],[-74.053878999999938,64.728592000000106],[-74.060546999999985,64.733322000000101],[-74.089721999999995,64.751099000000011],[-74.096114999999941,64.751389000000017],[-74.114440999999943,64.745819000000097],[-74.120543999999995,64.74192800000003],[-74.195266999999888,64.663040000000024],[-74.208892999999932,64.614151000000049],[-74.212783999999999,64.602768000000083],[-74.224715999999944,64.592484000000013],[-74.240279999999984,64.58027600000014],[-74.381942999999922,64.569992000000127],[-74.390288999999996,64.569716999999912],[-74.397507000000019,64.572220000000073],[-74.535278000000005,64.622208000000057],[-74.657500999999968,64.700272000000098],[-74.701675000000023,64.732483000000002],[-74.704177999999899,64.735535000000084],[-74.700835999999867,64.740265000000136],[-74.683318999999926,64.758331000000112],[-74.567504999999983,64.832764000000054],[-74.501113999999973,64.833603000000039],[-74.487777999999935,64.834152000000017],[-74.478881999999999,64.835815000000082],[-74.476395000000025,64.838882000000012],[-74.476943999999946,64.84165999999999],[-74.540557999999976,64.889160000000004],[-74.545836999999949,64.892212000000086],[-74.561110999999926,64.896102999999982],[-74.621932999999956,64.903869999999927],[-74.639998999999932,64.903595000000109],[-74.648620999999935,64.901382000000126],[-74.660277999999892,64.896378000000027],[-74.732773000000009,64.854705999999965],[-74.741378999999938,64.847488000000112],[-74.743057000000022,64.842209000000139],[-74.741942999999992,64.835815000000082],[-74.738892000000021,64.831375000000094],[-74.72222899999997,64.822220000000016],[-74.714721999999938,64.815535999999952],[-74.710007000000019,64.810532000000023],[-74.706664999999987,64.800537000000077],[-74.706664999999987,64.794983000000116],[-74.710830999999985,64.782761000000107],[-74.718886999999938,64.773604999999975],[-74.726394999999968,64.770828000000108],[-74.837219000000005,64.778595000000053],[-74.868332000000009,64.781936999999971],[-74.893341000000021,64.784714000000065],[-74.902221999999938,64.78804000000008],[-74.909164000000033,64.791367000000037],[-74.915833000000021,64.795822000000044],[-74.924438000000009,64.799149],[-74.944153000000028,64.803589000000045],[-74.955001999999979,64.804428000000144],[-74.975554999999872,64.801376000000062],[-74.985274999999945,64.795822000000044],[-74.985549999999876,64.790268000000083],[-74.982498000000021,64.785263000000043],[-74.978881999999999,64.781372000000147],[-74.963332999999977,64.773604999999975],[-74.834732000000031,64.716385000000116],[-74.733321999999987,64.685531999999967],[-74.694442999999978,64.676376000000005],[-74.675551999999982,64.670258000000047],[-74.660003999999958,64.663879000000009],[-74.613051999999925,64.640274000000034],[-74.545273000000009,64.602203000000031],[-74.512787000000003,64.583603000000096],[-74.475280999999939,64.561371000000008],[-74.470000999999968,64.557479999999941],[-74.47084000000001,64.555542000000003],[-74.513625999999874,64.533325000000104],[-74.520279000000016,64.532211000000132],[-74.585830999999985,64.480270000000075],[-74.685546999999985,64.391936999999984],[-74.685821999999973,64.371093999999914],[-74.797774999999945,64.380813999999987],[-74.974716000000001,64.416091999999992],[-74.985274999999945,64.418869000000086],[-75.010558999999944,64.429977000000122],[-75.056380999999988,64.452208999999982],[-75.142501999999979,64.483321999999987],[-75.174712999999997,64.492752000000053],[-75.182769999999948,64.492477000000065],[-75.188598999999954,64.489426000000037],[-75.188888999999904,64.483321999999987],[-75.187209999999993,64.473602000000085],[-75.182495000000017,64.468323000000112],[-75.177215999999987,64.464705999999978],[-75.151397999999915,64.460265999999933],[-75.146117999999944,64.457214000000022],[-75.14416499999993,64.453049000000021],[-75.15055799999999,64.447204999999997],[-75.154448999999943,64.444702000000063],[-75.199721999999952,64.428040000000067],[-75.207779000000016,64.427765000000022],[-75.21556099999998,64.428864000000033],[-75.224166999999909,64.432205000000067],[-75.295272999999952,64.46665999999999],[-75.323897999999986,64.481934000000081],[-75.332503999999972,64.490814000000114],[-75.344161999999926,64.49914600000011],[-75.34973100000002,64.50221300000004],[-75.381667999999991,64.513611000000026],[-75.409164000000033,64.522766000000104],[-75.479720999999927,64.53915399999994],[-75.490829000000019,64.539703000000088],[-75.566100999999946,64.549988000000042],[-75.666396999999961,64.563873000000115],[-75.693329000000006,64.569992000000127],[-75.703887999999949,64.572769000000051],[-75.721389999999985,64.579163000000051],[-75.736938000000009,64.586104999999975],[-75.74722300000002,64.594436999999971],[-75.763625999999988,64.604980000000126],[-75.773894999999925,64.608322000000044],[-75.796951000000035,64.612198000000149],[-75.824172999999973,64.611649],[-75.843063000000029,64.607758000000103],[-75.847228999999913,64.604430999999977],[-75.837219000000005,64.561371000000008],[-75.823623999999938,64.535812000000021],[-75.818893000000003,64.530823000000055],[-75.807495000000017,64.525269000000037],[-75.729172000000005,64.503051999999968],[-75.644729999999925,64.468872000000033],[-75.639449999999954,64.46527100000003],[-75.630554000000018,64.457214000000022],[-75.631667999999991,64.453598],[-75.636123999999938,64.449142000000052],[-75.641388000000006,64.448028999999963],[-75.696655000000021,64.43942300000009],[-75.708343999999954,64.437759000000028],[-75.727782999999931,64.442474000000061],[-75.746947999999975,64.453049000000021],[-75.765839000000028,64.46527100000003],[-75.77305599999994,64.467484000000127],[-75.874709999999993,64.486923000000047],[-75.895279000000016,64.48803700000002],[-75.908339999999953,64.487198000000035],[-75.920273000000009,64.484420999999998],[-75.922500999999954,64.481094000000041],[-75.910552999999993,64.478317000000118],[-75.875274999999988,64.47387700000013],[-75.857772999999952,64.468048000000067],[-75.720839999999953,64.383331000000055],[-75.717223999999987,64.379700000000014],[-75.718886999999995,64.374419999999986],[-75.723327999999924,64.369705000000124],[-75.726944000000003,64.367203000000018],[-75.83805799999999,64.369141000000013],[-75.861664000000019,64.371093999999914],[-75.950561999999934,64.399155000000007],[-76.043883999999991,64.368317000000047],[-76.253615999999965,64.35775799999999],[-76.264450000000011,64.319153000000028],[-76.214721999999995,64.314986999999974],[-76.205565999999976,64.313309000000004],[-76.196655000000021,64.310806000000071],[-76.188323999999852,64.306931000000077],[-76.189712999999927,64.301376000000005],[-76.197219999999959,64.29693600000013],[-76.205840999999964,64.294708000000014],[-76.300551999999982,64.278869999999984],[-76.484725999999966,64.266662999999994],[-76.493606999999997,64.268600000000049],[-76.503066999999987,64.275269000000094],[-76.506957999999941,64.284424000000001],[-76.505568999999923,64.289153999999996],[-76.503615999999909,64.291091999999935],[-76.502501999999936,64.295258000000047],[-76.506667999999934,64.297485000000108],[-76.541381999999999,64.304703000000075],[-76.591949,64.31053199999991],[-76.705840999999964,64.300812000000008],[-76.719451999999933,64.296646000000123],[-76.733886999999868,64.290543000000014],[-76.736664000000019,64.285812000000078],[-76.738892000000021,64.276382000000012],[-76.721663999999976,64.238312000000064],[-76.714721999999995,64.233870999999965],[-76.706115999999952,64.231369000000086],[-76.684722999999963,64.227768000000026],[-76.674438000000009,64.224990999999932],[-76.667220999999927,64.221924000000058],[-76.660278000000005,64.218322999999998],[-76.654723999999931,64.209152000000017],[-76.654723999999931,64.196640000000059],[-76.65834000000001,64.189972000000068],[-76.662215999999944,64.186646000000053],[-76.670546999999942,64.184143000000063],[-76.84722899999997,64.23054500000012],[-76.968337999999903,64.259720000000016],[-77.138335999999981,64.289429000000041],[-77.276108000000022,64.256378000000097],[-77.296111999999937,64.251938000000052],[-77.327498999999989,64.246367999999961],[-77.351944000000003,64.243866000000082],[-77.366104000000007,64.243866000000082],[-77.379990000000021,64.2452550000001],[-77.381377999999984,64.246643000000006],[-77.382216999999969,64.2494200000001],[-77.381377999999984,64.253601000000003],[-77.378875999999934,64.256943000000092],[-77.434158000000025,64.320267000000001],[-77.588332999999977,64.368317000000047],[-77.652221999999938,64.388046000000088],[-77.660278000000005,64.386383000000023],[-77.664444000000003,64.3836060000001],[-77.665832999999907,64.376923000000147],[-77.664718999999991,64.374146000000053],[-77.658889999999985,64.364990000000091],[-77.67971799999998,64.321105999999986],[-77.747222999999963,64.337769000000037],[-77.831389999999942,64.412490999999989],[-77.970276000000013,64.454436999999928],[-78.178054999999972,64.567490000000078],[-78.183318999999926,64.572495000000117],[-78.168578999999966,64.626197999999931],[-78.160552999999993,64.690536000000066],[-78.184433000000013,64.731093999999985],[-78.073623999999938,64.813599000000124],[-78.064437999999996,64.849426000000051],[-78.065276999999867,64.853591999999992],[-78.06639100000001,64.855820000000108],[-78.073623999999938,64.859420999999998],[-78.102492999999981,64.868866000000025],[-78.117217999999923,64.876082999999994],[-78.120834000000002,64.881088000000034],[-78.129715000000033,64.893875000000037],[-78.146118000000001,64.938309000000004],[-78.148055999999997,64.943862999999965],[-78.149733999999967,64.952209000000039],[-78.145279000000016,64.957489000000123],[-77.973052999999993,65.04136699999998],[-77.67971799999998,65.123306000000014],[-77.543610000000001,65.139709000000096],[-77.50306699999993,65.138596000000007],[-77.488326999999913,65.139434999999935],[-77.479720999999984,65.141098000000056],[-77.344726999999978,65.173309000000131],[-77.328612999999962,65.178864000000033],[-77.322783999999956,65.18331900000004],[-77.315825999999959,65.190536000000009],[-77.313048999999978,65.195816000000036],[-77.315552000000025,65.199417000000096],[-77.3824919999999,65.247482000000105],[-77.397232000000031,65.254990000000134],[-77.422774999999945,65.264435000000049],[-77.444716999999912,65.275543000000027],[-77.498046999999985,65.306641000000013],[-77.513061999999934,65.318877999999984],[-77.515015000000005,65.325820999999962],[-77.512222000000008,65.330551000000014],[-77.471114999999998,65.371368000000018],[-77.466949,65.375259000000085],[-77.461120999999878,65.379149999999981],[-77.452498999999875,65.380813999999987],[-77.438048999999921,65.379700000000014],[-77.41361999999998,65.371643000000063],[-77.402495999999985,65.369141000000127],[-77.345839999999896,65.358597000000088],[-77.337783999999999,65.357483000000116],[-77.323058999999944,65.357757999999933],[-77.30610699999994,65.359711000000061],[-77.295546999999999,65.361922999999933],[-77.291945999999939,65.363876000000062],[-77.287505999999951,65.367751999999996],[-77.287216000000001,65.375259000000085],[-77.289992999999924,65.378860000000145],[-77.295273000000009,65.383331000000055],[-77.319457999999997,65.393326000000002],[-77.326950000000011,65.395538000000045],[-77.341949,65.401657000000057],[-77.367492999999911,65.412491000000102],[-77.398620999999935,65.426651000000049],[-77.420272999999952,65.439972000000012],[-77.428329000000019,65.447754000000145],[-77.434432999999956,65.456940000000088],[-77.430556999999908,65.458878000000027],[-77.421660999999972,65.461380000000077],[-77.385559000000001,65.468048000000067],[-77.336670000000026,65.471375000000023],[-77.265288999999882,65.471923999999944],[-77.238051999999925,65.469437000000084],[-77.154449,65.445815999999979],[-77.134734999999978,65.439423000000033],[-77.124434999999892,65.434143000000006],[-77.115828999999962,65.429703000000131],[-77.111663999999962,65.426085999999998],[-77.111114999999927,65.421371000000136],[-77.106383999999991,65.413605000000075],[-77.09944200000001,65.409149000000014],[-77.08666999999997,65.407211000000075],[-76.962783999999999,65.407211000000075],[-76.956954999999994,65.410537999999974],[-76.952498999999989,65.414993000000038],[-76.956116000000009,65.421371000000136],[-76.955565999999976,65.422759999999982],[-76.951675000000023,65.425262000000032],[-76.944442999999978,65.427765000000022],[-76.920837000000006,65.429428000000144],[-76.849990999999989,65.428313999999943],[-76.824722000000008,65.425262000000032],[-76.626937999999939,65.398880000000133],[-76.361937999999952,65.342209000000025],[-76.235001000000011,65.312759000000142],[-76.164444000000003,65.296097000000145],[-76.072509999999909,65.277205999999921],[-75.96665999999999,65.255829000000119],[-75.953888000000006,65.255264000000068],[-75.925277999999935,65.257217000000026],[-75.920273000000009,65.258330999999998],[-75.912215999999944,65.257217000000026],[-75.898345999999947,65.253875999999991],[-75.805556999999965,65.229705999999965],[-75.785552999999936,65.224426000000108],[-75.769164999999987,65.21887200000009],[-75.765014999999892,65.216660000000047],[-75.760009999999909,65.210815000000139],[-75.741378999999995,65.173874000000012],[-75.739989999999921,65.168319999999994],[-75.570847000000015,65.120818999999926],[-75.528610000000015,65.108871000000079],[-75.475006000000008,65.086105000000089],[-75.46665999999999,65.082214000000022],[-75.457229999999925,65.074707000000046],[-75.446945000000028,65.06581100000011],[-75.428054999999972,65.048324999999977],[-75.424438000000009,65.043869000000086],[-75.410552999999936,65.024704000000099],[-75.415557999999976,64.977478000000076],[-75.420273000000009,64.972214000000065],[-75.428054999999972,64.968322999999998],[-75.496947999999975,64.940536000000066],[-75.507232999999985,64.938309000000004],[-75.51916499999993,64.936919999999986],[-75.533614999999941,64.936919999999986],[-75.557220000000029,64.940262000000132],[-75.634734999999921,64.94720500000011],[-75.654448999999943,64.946365000000071],[-75.663054999999929,64.945251000000098],[-75.667496000000028,64.940811000000053],[-75.601944000000003,64.867752000000053],[-75.594161999999983,64.860259999999926],[-75.587508999999898,64.856644000000074],[-75.56806899999998,64.850540000000024],[-75.555557000000022,64.848602000000085],[-75.461394999999925,64.811645999999996],[-75.389175000000023,64.736099000000024],[-75.373046999999985,64.714996000000099],[-75.316665999999941,64.719437000000028],[-75.308333999999888,64.721099999999979],[-75.298186999999984,64.725769000000128],[-75.294723999999974,64.728043000000127],[-75.291381999999885,64.733871000000079],[-75.289444000000003,64.739975000000072],[-75.291381999999885,64.74443100000002],[-75.30221599999993,64.751099000000011],[-75.310546999999929,64.754990000000078],[-75.329726999999991,64.761107999999979],[-75.333892999999989,64.763321000000133],[-75.344161999999926,64.772217000000069],[-75.373885999999914,64.833054000000118],[-75.357223999999917,64.897766000000104],[-75.422775000000001,64.890273999999977],[-75.451675000000023,64.875259000000028],[-75.460830999999985,64.87164300000012],[-75.469727000000034,64.869431000000077],[-75.55749499999996,64.87414600000011],[-75.563323999999966,64.877197000000137],[-75.565552000000025,64.879425000000083],[-75.567504999999983,64.883605999999986],[-75.56527699999998,64.886932000000058],[-75.473891999999921,64.935806000000014],[-75.390288999999996,64.979430999999977],[-75.384734999999978,64.981934000000138],[-75.376098999999897,64.983322000000044],[-75.363051999999982,64.98414600000001],[-75.353332999999964,64.983597000000088],[-75.344161999999926,64.981094000000098],[-75.335555999999997,64.977768000000083],[-75.264175000000023,64.966095000000053],[-75.196105999999986,65.068604000000107],[-75.189163000000008,65.079712000000086],[-75.185546999999872,65.091369999999927],[-75.186934999999949,65.101653999999996],[-75.192490000000021,65.105545000000063],[-75.196655000000021,65.107207999999957],[-75.212508999999955,65.109421000000111],[-75.225554999999986,65.109421000000111],[-75.240828999999962,65.10832199999993],[-75.259170999999981,65.102203000000088],[-75.263625999999988,65.0977630000001],[-75.265563999999927,65.09165999999999],[-75.262512000000015,65.080551000000071],[-75.260009999999852,65.072769000000108],[-75.261123999999995,65.059142999999949],[-75.263061999999934,65.052199999999971],[-75.279998999999975,65.035262999999986],[-75.299727999999959,65.024704000000099],[-75.348617999999931,65.003876000000048],[-75.360001000000011,65.003876000000048],[-75.367492999999968,65.006378000000097],[-75.373046999999985,65.009430000000009],[-75.378875999999991,65.016663000000051],[-75.379165999999998,65.021378000000084],[-75.381103999999937,65.025818000000072],[-75.402495999999871,65.055817000000104],[-75.410003999999958,65.063873000000001],[-75.425551999999982,65.077208999999925],[-75.441375999999991,65.089157],[-75.448043999999982,65.094147000000021],[-75.516402999999855,65.138596000000007],[-75.728058000000033,65.224151999999947],[-75.761947999999961,65.237762000000032],[-75.781676999999945,65.243042000000116],[-75.835555999999997,65.255264000000068],[-75.864166000000012,65.258330999999998],[-75.890563999999983,65.269150000000081],[-75.939712999999983,65.292480000000012],[-75.943877999999984,65.29525799999999],[-75.950835999999981,65.316376000000105],[-75.950287000000003,65.318329000000062],[-75.941101000000003,65.321380999999974],[-75.931106999999884,65.322220000000129],[-75.904449,65.322220000000129],[-75.873885999999914,65.320541000000105],[-75.857772999999952,65.319153000000028],[-75.603057999999976,65.295531999999923],[-75.592223999999931,65.287201000000039],[-75.575561999999934,65.278046000000018],[-75.566390999999896,65.274994000000049],[-75.555267000000015,65.273605000000089],[-75.495834000000002,65.269150000000081],[-75.48443599999996,65.268326000000116],[-75.211945000000014,65.250549000000035],[-75.186661000000015,65.251938000000052],[-75.153885000000002,65.256943000000092],[-75.114440999999999,65.266387999999949],[-75.101669000000015,65.271378000000027],[-75.093886999999938,65.274994000000049],[-75.083618000000001,65.286102000000085],[-75.081679999999892,65.292206000000078],[-75.070847000000015,65.330276000000026],[-75.090835999999911,65.355545000000006],[-75.109160999999858,65.379974000000118],[-75.110824999999977,65.384720000000073],[-75.111114999999984,65.388885000000073],[-75.110549999999932,65.391098],[-75.108046999999942,65.393051000000128],[-75.097778000000005,65.394989000000066],[-75.08277899999996,65.394989000000066],[-74.823623999999938,65.377472000000068],[-74.660552999999993,65.346374999999966],[-74.645844000000011,65.341370000000097],[-74.635009999999966,65.338593000000003],[-74.624161000000015,65.336655000000064],[-74.58944699999995,65.332489000000123],[-74.546660999999915,65.33137499999998],[-74.524445000000014,65.333328000000108],[-74.508621000000005,65.336655000000064],[-74.496947999999975,65.340820000000065],[-74.357773000000009,65.398604999999975],[-74.347838999999965,65.407181000000037],[-74.323897999999986,65.437759000000028],[-74.318892999999946,65.447204999999997],[-74.31527699999998,65.458037999999988],[-74.311385999999914,65.463882000000012],[-74.182770000000005,65.525269000000037],[-74.105835000000013,65.534988000000055],[-73.845276000000013,65.532211000000132],[-73.791381999999999,65.524428999999998],[-73.767776000000026,65.520828000000108],[-73.747222999999963,65.517487000000074],[-73.736937999999952,65.514709000000096],[-73.732772999999952,65.511932000000002],[-73.731383999999935,65.506943000000035],[-73.730835000000013,65.504166000000112],[-73.735001000000011,65.501662999999951],[-73.740279999999984,65.496933000000126],[-73.740829000000019,65.490814000000114],[-73.736937999999952,65.487761999999975],[-73.711670000000026,65.471099999999979],[-73.703063999999927,65.466934000000094],[-73.694152999999915,65.464432000000045],[-73.663895000000025,65.456940000000088],[-73.651397999999972,65.454711999999915],[-73.641113000000018,65.455261000000064],[-73.559997999999894,65.462494000000049],[-73.500564999999938,65.474426000000051],[-73.56361400000003,65.562194999999974],[-73.618332000000009,65.619705000000067],[-73.662215999999944,65.658599999999979],[-73.684157999999911,65.715271000000087],[-73.68499799999995,65.730545000000006],[-73.704726999999934,65.758041000000048],[-73.709731999999917,65.762496999999996],[-73.720550999999887,65.769440000000145],[-73.810821999999973,65.811096000000134],[-73.841110000000015,65.81999200000007],[-73.884170999999981,65.821930000000009],[-73.886123999999995,65.821381000000031],[-73.923614999999984,65.824432000000058],[-73.931670999999938,65.825546000000031],[-73.942490000000021,65.828323000000125],[-74.011947999999961,65.854705999999908],[-74.029174999999952,65.861923000000047],[-74.058043999999938,65.875534000000016],[-74.129439999999988,65.924697999999978],[-74.258895999999993,66.001663000000065],[-74.296950999999979,66.018326000000116],[-74.337783999999999,66.036652000000117],[-74.37388599999997,66.053863999999976],[-74.388061999999934,66.06164600000011],[-74.425551999999925,66.084717000000126],[-74.444992000000013,66.096939000000077],[-74.455565999999862,66.105820000000051],[-74.471389999999985,66.127197000000081],[-74.472777999999948,66.133041000000048],[-74.472504000000015,66.139160000000118],[-74.470000999999968,66.145828000000051],[-74.466110000000015,66.151932000000102],[-74.446655000000021,66.168594000000098],[-74.434432999999956,66.178314],[-74.406113000000005,66.195816000000036],[-74.366652999999928,66.214157000000057],[-74.342223999999987,66.22526600000009],[-74.316390999999953,66.235259999999926],[-74.306655999999975,66.238876000000005],[-74.187209999999993,66.269713999999965],[-74.077788999999939,66.300812000000008],[-73.86082499999992,66.388321000000076],[-73.744995000000017,66.437759000000028],[-73.666107000000011,66.471924000000115],[-73.606658999999979,66.495254999999986],[-73.529998999999975,66.522766000000047],[-73.460555999999997,66.544434000000138],[-73.444153000000028,66.551086000000055],[-73.430556999999908,66.55831900000004],[-73.420272999999952,66.571655000000021],[-73.418335000000013,66.579711999999972],[-73.418335000000013,66.584717000000012],[-73.416396999999961,66.589981000000023],[-73.400283999999942,66.611649000000114],[-73.396956999999986,66.61554000000001],[-73.379714999999976,66.632477000000051],[-73.351944000000003,66.649994000000049],[-73.328339000000028,66.6602630000001],[-73.296386999999982,66.665817000000061],[-73.267226999999991,66.672760000000096],[-73.108611999999937,66.723311999999964],[-73.00111400000003,66.815536000000122],[-72.87388599999997,66.931930999999963],[-72.852492999999981,66.968597000000102],[-72.837783999999999,66.998031999999967],[-72.831389999999885,67.013321000000076],[-72.831115999999952,67.018326000000116],[-72.828063999999927,67.024994000000049],[-72.824172999999973,67.029434000000094],[-72.806655999999919,67.037201000000039],[-72.791671999999949,67.043320000000051],[-72.738891999999908,67.063034000000016],[-72.716659999999933,67.06860400000005],[-72.68499799999995,67.076096000000007],[-72.626099000000011,67.084717000000126],[-72.550827000000027,67.082763999999997],[-72.525832999999977,67.083328000000108],[-72.464172000000019,67.08998100000008],[-72.43110699999994,67.096099999999922],[-72.399445000000014,67.103592000000049],[-72.368606999999997,67.112487999999985],[-72.351394999999968,67.119705000000124],[-72.337783999999999,67.126373000000058],[-72.315552000000025,67.139435000000105],[-72.282501000000025,67.161102000000142],[-72.276108000000022,67.166930999999977],[-72.258346999999901,67.24803199999991],[-72.28694200000001,67.290817000000061],[-72.363616999999977,67.353317000000004],[-72.436385999999914,67.472214000000122],[-72.481110000000001,67.609711000000004],[-72.48582499999992,67.623031999999967],[-72.490829000000019,67.62831100000011],[-72.49749799999995,67.633040999999935],[-72.508895999999993,67.63638300000008],[-72.597778000000005,67.639709000000096],[-72.666396999999961,67.684143000000063],[-72.676391999999964,67.693862999999965],[-72.677779999999984,67.699416999999983],[-72.675002999999947,67.70526099999995],[-72.668883999999935,67.710541000000035],[-72.661666999999909,67.714706000000035],[-72.613892000000021,67.735259999999982],[-72.596953999999926,67.740814],[-72.591948999999886,67.74331699999999],[-72.583327999999881,67.750274999999988],[-72.608886999999982,67.785812000000078],[-72.612503000000004,67.790268000000026],[-72.619445999999925,67.794708000000014],[-72.735001000000011,67.841659999999933],[-72.820007000000032,67.851089000000115],[-72.833327999999995,67.849991000000045],[-72.843886999999938,67.850815000000011],[-72.848052999999936,67.853592000000106],[-72.942215000000033,67.925262000000089],[-72.944442999999978,67.928040000000067],[-72.944992000000013,67.93081699999999],[-72.94387799999987,67.937759000000085],[-72.942490000000021,67.941085999999984],[-72.929992999999968,67.948867999999948],[-72.922774999999945,67.952774000000034],[-72.904175000000009,67.959717000000012],[-72.902495999999928,67.963882000000012],[-72.896117999999944,68.014160000000004],[-72.910552999999993,68.054153000000042],[-72.913895000000025,68.060806000000014],[-72.941100999999946,68.078323000000069],[-72.956954999999994,68.094986000000119],[-72.981110000000001,68.139160000000061],[-72.992767000000015,68.198593000000074],[-72.993880999999988,68.212204000000042],[-73.161117999999988,68.228866999999923],[-73.190276999999924,68.248871000000065],[-73.189437999999996,68.254715000000033],[-73.189986999999917,68.259430000000066],[-73.194716999999969,68.26527400000009],[-73.200835999999981,68.269714000000135],[-73.215560999999923,68.272766000000047],[-73.271117999999888,68.281936999999971],[-73.303328999999962,68.278434999999945],[-73.314499000000012,68.278434999999945],[-73.336670000000026,68.275604000000044],[-73.355186000000003,68.267830000000004],[-73.395554000000004,68.258605999999929],[-73.496108999999933,68.275542999999971],[-73.410004000000015,68.310806000000127],[-73.39916999999997,68.314987000000031],[-73.354674999999929,68.329215999999974]],[[-124.43055699999996,73.878586000000098],[-124.45028699999995,73.878586000000098],[-124.46721600000001,73.8808140000001],[-124.515289,73.89498900000001],[-124.53666699999991,73.902480999999909],[-124.54611199999999,73.906647000000021],[-124.55055199999998,73.912201000000039],[-124.55277999999993,73.916931000000034],[-124.53056299999997,73.917480000000012],[-124.5133439999999,73.916656000000046],[-124.43250299999994,73.912766000000033],[-124.42027300000001,73.90914900000007],[-124.41583300000002,73.90498400000007],[-124.40888999999993,73.900269000000037],[-124.40943899999996,73.893326000000059],[-124.42027300000001,73.882476999999994],[-124.43055699999996,73.878586000000098]],[[-99.804557999999929,73.889099000000101],[-99.732773000000009,73.849991000000102],[-99.71362299999987,73.846375000000023],[-99.589721999999881,73.837769000000094],[-99.531386999999938,73.831940000000088],[-99.493880999999988,73.825821000000076],[-99.480285999999978,73.821930000000009],[-99.235000999999897,73.737761999999918],[-99.115004999999996,73.74859600000002],[-98.97193900000002,73.750548999999921],[-98.829177999999956,73.751663000000121],[-98.756393000000003,73.75610400000005],[-98.71665999999999,73.766663000000051],[-98.688323999999966,73.772018000000116],[-98.641953000000001,73.777206000000035],[-98.514449999999954,73.787490999999989],[-98.424437999999952,73.793594000000098],[-98.290832999999964,73.801651000000049],[-98.207229999999925,73.80525200000011],[-98.190552000000025,73.803588999999988],[-98.179992999999911,73.804152999999928],[-98.134170999999867,73.809708000000057],[-98.095000999999968,73.815536000000122],[-98.071670999999924,73.819443000000092],[-97.976944000000003,73.84275800000006],[-97.960281000000009,73.846938999999963],[-97.948333999999988,73.851653999999996],[-97.943053999999904,73.856934000000081],[-97.942763999999954,73.862762000000032],[-97.941375999999991,73.868042000000059],[-97.936385999999914,73.87831100000011],[-97.918335000000013,73.890273999999977],[-97.90834000000001,73.894714000000135],[-97.887512000000015,73.899428999999998],[-97.805267000000015,73.911102000000028],[-97.788054999999986,73.912766000000033],[-97.761948000000018,73.911925999999994],[-97.581954999999937,73.893875000000037],[-97.562774999999988,73.890823000000069],[-97.544723999999917,73.886108000000036],[-97.529175000000009,73.879700000000071],[-97.520844000000011,73.873871000000065],[-97.514175000000023,73.867752000000053],[-97.50028999999995,73.861923000000047],[-97.471389999999985,73.857758000000047],[-97.456954999999994,73.857758000000047],[-97.39973399999991,73.858871000000136],[-97.357772999999952,73.862488000000099],[-97.34584000000001,73.864990000000148],[-97.327498999999989,73.865814000000114],[-97.260284000000013,73.860260000000096],[-97.223617999999931,73.856369000000029],[-96.972504000000015,73.744141000000013],[-96.962218999999891,73.738586000000112],[-96.955841000000021,73.732482999999945],[-96.937209999999993,73.703598000000113],[-96.932770000000005,73.692200000000071],[-96.93472300000002,73.686920000000043],[-96.963897999999972,73.63998399999997],[-96.968613000000005,73.633330999999998],[-96.988891999999964,73.624695000000088],[-97.001953000000015,73.6202550000001],[-97.184998000000007,73.562194999999974],[-97.202498999999932,73.557205000000124],[-97.436110999999926,73.525542999999971],[-97.623885999999857,73.538879000000122],[-97.638061999999934,73.538589000000115],[-97.641112999999962,73.533599999999922],[-97.668335000000013,73.483321999999987],[-97.667496000000028,73.479431000000091],[-97.663054999999929,73.4727630000001],[-97.654723999999931,73.466934000000094],[-97.638335999999981,73.460266000000104],[-97.623321999999973,73.456375000000037],[-97.607223999999974,73.454711999999972],[-97.579453000000001,73.454987000000131],[-97.562774999999988,73.459152000000131],[-97.534163999999976,73.473877000000073],[-97.522232000000031,73.478592000000106],[-97.50389100000001,73.483046999999942],[-97.437209999999993,73.491928000000087],[-97.417220999999984,73.493317000000047],[-97.401947000000007,73.493042000000059],[-97.232223999999917,73.474426000000051],[-97.197219999999959,73.469711000000018],[-97.183059999999955,73.464995999999985],[-97.172225999999966,73.460266000000104],[-97.166106999999954,73.454162999999994],[-97.157226999999921,73.395538000000045],[-97.150283999999999,73.389984000000027],[-97.169448999999986,73.35664399999996],[-97.17193599999996,73.352768000000083],[-97.183883999999921,73.350540000000137],[-97.207503999999972,73.348328000000095],[-97.236937999999896,73.348602000000028],[-97.243057000000022,73.354706000000022],[-97.375548999999921,73.347214000000122],[-97.645003999999858,73.318054000000018],[-97.660278000000005,73.316086000000098],[-97.708617999999944,73.304703000000075],[-97.841384999999889,73.273315000000082],[-97.84445199999999,73.268326000000116],[-97.848052999999936,73.254440000000102],[-97.847778000000005,73.249420000000043],[-97.848617999999988,73.244980000000055],[-97.86250299999989,73.233871000000136],[-97.983611999999994,73.181091000000094],[-98.029175000000009,73.165268000000083],[-98.076674999999966,73.151382000000126],[-98.112503000000004,73.142487000000074],[-98.151672000000019,73.131087999999977],[-98.202788999999996,73.110535000000084],[-98.222777999999948,73.099991000000045],[-98.229996000000028,73.090820000000122],[-98.231383999999878,73.085541000000148],[-98.235001000000011,73.079711999999915],[-98.240829000000019,73.075272000000098],[-98.319457999999997,73.050537000000077],[-98.365829000000019,73.037766000000147],[-98.450287000000003,73.020264000000111],[-98.459166999999923,72.99331699999999],[-98.453613000000018,72.898605000000089],[-98.450561999999991,72.874985000000095],[-98.445830999999998,72.865814000000114],[-98.438598999999954,72.860535000000141],[-98.428054999999915,72.856094000000041],[-98.419998000000021,72.858597000000032],[-98.413329999999974,72.864151000000049],[-98.403335999999967,72.881363000000022],[-98.403335999999967,72.887207000000046],[-98.405838000000017,72.891662999999994],[-98.402221999999995,72.897491000000059],[-98.397780999999952,72.902771000000143],[-98.388061999999991,72.908034999999927],[-98.266402999999855,72.972763000000043],[-98.255004999999926,72.977478000000076],[-98.227218999999877,72.987487999999985],[-98.176940999999999,72.998596000000134],[-97.99499499999996,73.037491000000102],[-97.980559999999969,73.039702999999975],[-97.864166000000012,73.047485000000108],[-97.846953999999982,73.048598999999911],[-97.684433000000013,73.033051000000114],[-97.668335000000013,73.03137200000009],[-97.527495999999985,73.011383000000137],[-97.442489999999964,72.999145999999996],[-97.299728000000016,72.969711000000132],[-97.283324999999991,72.963882000000069],[-97.229720999999984,72.943038999999999],[-97.225006000000008,72.939972000000125],[-97.258056999999951,72.883605999999986],[-97.266402999999968,72.878585999999984],[-97.265288999999996,72.84887700000013],[-97.203613000000018,72.825821000000076],[-97.081679999999949,72.77998400000007],[-97.030288999999982,72.74136400000009],[-97.023055999999997,72.732208000000128],[-97.023055999999997,72.727203000000088],[-97.029723999999987,72.716659999999933],[-97.079453000000001,72.701934999999992],[-97.105834999999956,72.696365000000128],[-97.134444999999914,72.688309000000061],[-97.161117999999988,72.67804000000001],[-97.170546999999885,72.673599000000081],[-97.179442999999992,72.667480000000069],[-97.183059999999955,72.661926000000051],[-97.19027699999998,72.640549000000021],[-97.198333999999932,72.609984999999995],[-97.196655000000021,72.604430999999977],[-97.185271999999998,72.601929000000098],[-97.165557999999919,72.60165400000011],[-97.09056099999998,72.605254999999943],[-97.081008999999938,72.605927000000122],[-97.07028200000002,72.608597000000088],[-97.042770000000019,72.623306000000127],[-97.035827999999981,72.628860000000145],[-97.005568999999866,72.644714000000022],[-96.982223999999974,72.655258000000117],[-96.968886999999938,72.660262999999986],[-96.915558000000033,72.678588999999988],[-96.611938000000009,72.74693300000007],[-96.517501999999922,72.714706000000092],[-96.52194199999991,72.674423000000047],[-96.459731999999917,72.607758000000103],[-96.405272999999966,72.559418000000107],[-96.374709999999993,72.534424000000115],[-96.336945000000014,72.500824000000023],[-96.325561999999991,72.488312000000064],[-96.30221599999993,72.433868000000018],[-96.297501000000011,72.42164600000001],[-96.298339999999939,72.415817000000004],[-96.538605000000018,72.343323000000055],[-96.668335000000013,72.309708000000001],[-96.696945000000028,72.310531999999967],[-96.738892000000021,72.321105999999986],[-96.776397999999972,72.323318000000029],[-96.831389999999999,72.323608000000036],[-96.868332000000009,72.321930000000123],[-96.871932999999956,72.321105999999986],[-96.864440999999943,72.317764000000068],[-96.771118000000001,72.298874000000069],[-96.668883999999878,72.27915999999999],[-96.578339000000028,72.278594999999996],[-96.561110999999983,72.275543000000027],[-96.554169000000002,72.263885000000016],[-96.487212999999883,72.136108000000036],[-96.485001000000011,72.129974000000004],[-96.483062999999959,72.11303700000002],[-96.487503000000004,72.101653999999996],[-96.498336999999935,72.090270999999973],[-96.508346999999958,72.084991000000116],[-96.521117999999944,72.079987000000131],[-96.537216000000001,72.07499700000011],[-96.557220000000029,72.071930000000009],[-96.721663999999919,72.052765000000022],[-96.77305599999994,72.053040000000067],[-96.789444000000003,72.052200000000028],[-96.866942999999992,72.041091999999992],[-96.853881999999999,72.036376999999959],[-96.828888000000006,72.030822999999998],[-96.672501000000011,72.012771999999984],[-96.635009999999966,72.013885000000073],[-96.618057000000022,72.018326000000002],[-96.609160999999915,72.024155000000007],[-96.600554999999986,72.02777100000003],[-96.567779999999971,72.033600000000092],[-96.521117999999944,72.038879000000065],[-96.501953000000015,72.038589000000059],[-96.488601999999958,72.034987999999998],[-96.489990000000034,72.018326000000002],[-96.490829000000019,72.012206999999989],[-96.493056999999965,72.001098999999954],[-96.502228000000002,71.975540000000137],[-96.505843999999968,71.969711000000132],[-96.512786999999889,71.964431999999988],[-96.522506999999962,71.959152000000074],[-96.554442999999935,71.949141999999995],[-96.565552000000025,71.946930000000123],[-96.573897999999986,71.948318000000029],[-96.589447000000007,71.954437000000041],[-96.602782999999988,71.958038000000101],[-96.617492999999911,71.959991000000059],[-96.638335999999981,71.957488999999953],[-96.73332199999993,71.928863999999976],[-96.749160999999958,71.923874000000069],[-96.761947999999961,71.918594000000041],[-96.764450000000011,71.914992999999981],[-96.761397999999929,71.909714000000008],[-96.749725000000012,71.903046000000018],[-96.736389000000031,71.899429000000055],[-96.724166999999966,71.898605000000089],[-96.700835999999924,71.899994000000106],[-96.64527899999996,71.917480000000012],[-96.607223999999974,71.92692599999998],[-96.565552000000025,71.93220500000001],[-96.522781000000009,71.934418000000107],[-96.509170999999924,71.933044000000109],[-96.503890999999953,71.931656000000032],[-96.491668999999888,71.926085999999941],[-96.49110399999995,71.919434000000081],[-96.493056999999965,71.914153999999996],[-96.525832999999977,71.868866000000082],[-96.557769999999948,71.829436999999984],[-96.570846999999901,71.819442999999978],[-96.579726999999934,71.814987000000031],[-96.591949,71.810805999999957],[-96.613327000000027,71.807205000000124],[-96.726668999999958,71.793593999999928],[-96.744720000000029,71.792206000000022],[-96.738051999999982,71.824996999999996],[-96.791381999999942,71.827774000000034],[-96.983611999999994,71.775817999999958],[-97.013061999999991,71.749146000000053],[-97.084166999999923,71.700272000000098],[-97.165008999999941,71.675537000000077],[-97.210006999999962,71.663605000000075],[-97.434433000000013,71.617751999999996],[-97.470550999999944,71.612487999999985],[-97.505004999999983,71.611649],[-97.656386999999938,71.614700000000028],[-97.696655000000021,71.619705000000067],[-97.713332999999977,71.623871000000008],[-97.726395000000025,71.628310999999997],[-97.787215999999944,71.644149999999968],[-97.974715999999944,71.660812000000135],[-97.988051999999982,71.661926000000108],[-98.035277999999948,71.653320000000008],[-98.053329000000019,71.648331000000042],[-98.072784000000013,71.641663000000051],[-98.112777999999935,71.636932000000115],[-98.131103999999937,71.638046000000088],[-98.178878999999938,71.641663000000051],[-98.196654999999907,71.643600000000106],[-98.207503999999972,71.646103000000039],[-98.218063000000029,71.649719000000118],[-98.240829000000019,71.659714000000008],[-98.252791999999886,71.666091999999992],[-98.331116000000009,71.708327999999995],[-98.349166999999909,71.718597000000045],[-98.3558349999999,71.7227630000001],[-98.359725999999966,71.728043000000014],[-98.359436000000017,71.733871000000079],[-98.333327999999995,71.787490999999989],[-98.325561999999934,71.798325000000091],[-98.321395999999936,71.803314000000057],[-98.315276999999924,71.809143000000063],[-98.279174999999952,71.834717000000069],[-98.259170999999924,71.844711000000075],[-98.228881999999999,71.862198000000092],[-98.211944999999957,71.878585999999984],[-98.208617999999944,71.884430000000009],[-98.209166999999979,71.889160000000004],[-98.221938999999963,71.89498900000001],[-98.255279999999971,71.902480999999966],[-98.267226999999991,71.90415999999999],[-98.282776000000013,71.899155000000121],[-98.291381999999999,71.894714000000022],[-98.450561999999991,71.79414399999996],[-98.462508999999955,71.783874999999966],[-98.477782999999931,71.767212000000086],[-98.488892000000021,71.749419999999986],[-98.49749799999995,71.733321999999987],[-98.49749799999995,71.721649000000127],[-98.493880999999988,71.713882000000012],[-98.381377999999984,71.653594999999996],[-98.367492999999911,71.647491000000002],[-98.179992999999911,71.571930000000123],[-98.041381999999885,71.530823000000055],[-98.037506000000008,71.526657],[-98.120543999999995,71.460540999999978],[-98.180831999999953,71.423598999999967],[-98.198043999999982,71.414703000000031],[-98.466110000000015,71.313309000000061],[-98.505568999999923,71.299149000000114],[-98.541381999999942,71.289429000000041],[-98.55471799999998,71.287201000000096],[-98.701675000000023,71.271927000000005],[-98.72084000000001,71.269989000000066],[-98.729720999999927,71.270538000000045],[-98.75111400000003,71.274154999999951],[-98.816390999999953,71.289154000000053],[-98.829453000000001,71.293869000000086],[-98.844726999999978,71.305542000000116],[-98.882216999999969,71.333878000000027],[-98.938323999999852,71.369141000000013],[-98.960281000000009,71.379974000000004],[-98.978881999999999,71.382476999999994],[-98.995543999999995,71.382751000000098],[-99.014724999999942,71.381653000000028],[-99.034438999999963,71.378860000000032],[-99.042770000000019,71.374419999999986],[-99.045546999999942,71.368590999999981],[-99.051392000000021,71.363036999999963],[-99.05972300000002,71.358597000000145],[-99.077498999999989,71.353592000000106],[-99.115829000000019,71.350540000000024],[-99.220839999999896,71.342209000000082],[-99.238051999999982,71.344986000000006],[-99.288054999999872,71.402771000000087],[-99.313323999999966,71.43942300000009],[-99.462783999999942,71.59304800000001],[-99.529723999999987,71.605255],[-99.558608999999876,71.613037000000134],[-99.574172999999973,71.619705000000067],[-99.578888000000006,71.622757000000036],[-99.591675000000009,71.635268999999994],[-99.676392000000021,71.72526600000009],[-99.677779999999927,71.729156000000046],[-99.677215999999987,71.736923000000047],[-99.674437999999896,71.742752000000053],[-99.673049999999989,71.749146000000053],[-99.673889000000031,71.753876000000105],[-99.676392000000021,71.758605999999986],[-99.678328999999962,71.760544000000095],[-99.842223999999987,71.834991000000002],[-99.959166999999979,71.854155999999932],[-99.977218999999991,71.855819999999937],[-100.05110200000001,71.865814],[-100.067497,71.870529000000033],[-100.10193599999997,71.884720000000016],[-100.31471299999993,71.979979999999955],[-100.32195299999989,71.984985000000052],[-100.33222999999998,71.997208000000057],[-100.33583099999993,72.006653000000142],[-100.579453,72.154434000000037],[-100.63445299999995,72.18553200000008],[-100.64417300000002,72.188308999999947],[-100.72000099999997,72.201660000000118],[-100.88527699999997,72.207764000000111],[-100.88999899999988,72.207489000000123],[-100.92388900000003,72.199416999999983],[-100.95140099999992,72.171097000000145],[-100.96777299999997,72.174149000000057],[-101.01334399999996,72.191086000000041],[-101.02084400000001,72.196365000000014],[-101.054169,72.231658999999922],[-101.05555700000002,72.236649],[-101.11776700000001,72.284424000000001],[-101.19444299999998,72.324432000000002],[-101.20861799999994,72.329712000000086],[-101.220551,72.332214000000135],[-101.23889200000002,72.33387799999997],[-101.27667200000002,72.328323000000069],[-101.32528699999995,72.314986999999974],[-101.395554,72.286926000000051],[-101.40416699999997,72.281372000000033],[-101.40972899999986,72.275543000000027],[-101.46945199999999,72.265549000000021],[-101.50917099999998,72.283051000000057],[-101.58556399999998,72.301376000000005],[-101.63474299999996,72.306931000000077],[-101.65638699999994,72.305252000000053],[-101.66416900000002,72.301650999999993],[-101.672234,72.292755000000056],[-101.68499799999989,72.28776600000009],[-101.69444299999986,72.288040000000024],[-101.77694700000001,72.299713000000054],[-101.83056599999992,72.319153000000028],[-101.84472699999992,72.324432000000002],[-101.88834399999996,72.358597000000145],[-101.94167299999987,72.451935000000049],[-101.98131599999999,72.478111000000126],[-102.08033799999993,72.516006000000118],[-102.22222899999991,72.542206000000078],[-102.25862100000001,72.549149000000057],[-102.37721299999998,72.577484000000084],[-102.46584299999995,72.604706000000022],[-102.6219329999999,72.664703000000145],[-102.73638899999992,72.719986000000006],[-102.74166899999989,72.724152000000061],[-102.75583599999993,72.761383000000023],[-102.76471699999996,72.784987999999998],[-102.76306199999999,72.790817000000004],[-102.75306699999999,72.811096000000134],[-102.74944299999999,72.817214999999976],[-102.74305699999996,72.82249500000006],[-102.73500100000001,72.826096000000121],[-102.69860799999992,72.836654999999951],[-102.66361999999992,72.853316999999947],[-102.64666699999992,72.864426000000037],[-102.61277799999993,72.896652000000131],[-102.59722899999991,72.913605000000018],[-102.59361299999995,72.919983000000002],[-102.59166699999997,72.925536999999963],[-102.59306300000003,72.931656000000032],[-102.59416199999998,72.942748999999992],[-102.593887,72.949141999999995],[-102.59166699999997,72.954987000000074],[-102.576683,72.979706000000022],[-102.56304899999998,72.991089000000045],[-102.51306199999993,73.026093000000117],[-102.50110599999994,73.030548000000124],[-102.38806199999999,73.062759000000028],[-102.36805699999996,73.067490000000134],[-102.27610800000002,73.08248900000001],[-102.24694799999997,73.083878000000027],[-102.13722199999989,73.086929000000055],[-102.08444199999985,73.084152000000131],[-102.014183,73.079711999999915],[-101.97083999999995,73.070540999999992],[-101.88417099999992,73.024704000000099],[-101.81777999999991,72.966660000000104],[-101.810272,72.960541000000035],[-101.75527999999997,72.930542000000059],[-101.74109599999991,72.924149000000057],[-101.67527799999999,72.909714000000122],[-101.59528399999994,72.902205999999921],[-101.52166699999998,72.87831100000011],[-101.50974299999996,72.871642999999949],[-101.40444899999989,72.782486000000119],[-101.41332999999997,72.748322000000087],[-101.37249800000001,72.727203000000088],[-101.36665299999999,72.725266000000033],[-101.29750099999995,72.709991000000059],[-101.03333299999997,72.689697000000137],[-100.91583299999996,72.688034000000016],[-100.88221699999991,72.689697000000137],[-100.82778899999994,72.705826000000059],[-100.81945799999994,72.710266000000104],[-100.81220999999994,72.715545999999961],[-100.81194299999999,72.719710999999961],[-100.79833999999994,72.743590999999981],[-100.70722999999998,72.755829000000006],[-100.53307299999994,72.751389000000017],[-100.50917099999992,72.749146000000053],[-100.49833699999994,72.74803200000008],[-100.47582999999997,72.742751999999996],[-100.44803599999995,72.735535000000084],[-100.43443300000001,72.73692299999999],[-100.41221599999994,72.74192800000003],[-100.34973100000002,72.770538000000101],[-100.34084300000001,72.774993999999992],[-100.33168000000001,72.78054800000001],[-100.314438,72.796371000000022],[-100.31555199999997,72.801376000000062],[-100.35077699999994,72.851326000000086],[-100.35160799999994,72.853660999999988],[-100.35711699999996,72.859154000000103],[-100.46916199999998,72.950272000000041],[-100.48638899999992,72.949141999999995],[-100.49889399999995,72.950546000000145],[-100.49973299999999,72.95637499999998],[-100.46305799999993,73.014709000000039],[-100.45194999999995,73.020538000000045],[-100.421944,73.034987999999942],[-100.36776700000001,73.046936000000017],[-100.35637700000001,73.049423000000047],[-100.34221600000001,73.044144000000074],[-100.31667299999992,73.034149000000014],[-100.30943299999996,73.028046000000074],[-100.31555199999997,73.022490999999945],[-100.34306300000003,73.013885000000073],[-100.3577729999999,73.010544000000039],[-100.38137799999998,72.949141999999995],[-100.32899499999991,72.891372999999987],[-100.31732899999992,72.888869999999997],[-100.28527800000001,72.873596000000077],[-100.21721599999995,72.876647999999989],[-100.196663,72.877762000000018],[-100.09638999999993,72.88638300000008],[-100.06722999999994,72.902205999999921],[-100.031387,72.934982000000048],[-100.04750099999995,72.957214000000135],[-100.11277799999999,73.025818000000072],[-100.16972399999992,73.078598000000113],[-100.23222399999997,73.134430000000123],[-100.24445299999996,73.136932000000002],[-100.25446299999999,73.137206999999989],[-100.28888699999993,73.135818000000029],[-100.32362399999994,73.133331000000112],[-100.345551,73.130264000000011],[-100.38249200000001,73.122757000000092],[-100.39138799999995,73.118317000000047],[-100.41443600000002,73.104706000000078],[-100.44275699999997,73.087204000000042],[-100.51862299999993,73.0977630000001],[-100.58667000000003,73.132751000000098],[-100.60193599999997,73.140823000000069],[-100.60777300000001,73.146378000000141],[-100.58612099999999,73.167480000000126],[-100.58000199999987,73.173035000000027],[-100.49082900000002,73.230819999999937],[-100.40666199999987,73.280273000000079],[-100.39778100000001,73.284713999999951],[-100.37832600000002,73.289978000000133],[-100.36110699999995,73.290267999999969],[-100.28138699999994,73.27915999999999],[-100.1347429999999,73.221100000000035],[-100.05332899999996,73.186371000000008],[-100.03751399999999,73.183868000000018],[-100.021118,73.183044000000052],[-100.00418099999996,73.183319000000097],[-99.841110000000015,73.191360000000145],[-99.801666000000012,73.195526000000029],[-99.771666999999979,73.201096000000121],[-99.77027899999996,73.203873000000044],[-99.771666999999979,73.208038000000045],[-99.786391999999921,73.212493999999936],[-99.811934999999949,73.215546000000074],[-99.84944200000001,73.21527100000003],[-99.886123999999995,73.213318000000072],[-99.925827000000027,73.214996000000042],[-99.945267000000001,73.216660000000047],[-99.96444699999995,73.219436999999971],[-100.07749899999999,73.251389000000074],[-100.09500100000002,73.257217000000026],[-100.15915699999994,73.289428999999984],[-100.19943199999994,73.31860400000005],[-100.27223199999992,73.358597000000088],[-100.32362399999994,73.3836060000001],[-100.33332799999994,73.388321000000133],[-100.358047,73.393326000000002],[-100.37389399999995,73.395828000000051],[-100.38417099999987,73.396378000000084],[-100.38806199999993,73.395538000000045],[-100.4058379999999,73.361374000000012],[-100.387787,73.338593000000003],[-100.56166099999996,73.286652000000117],[-100.583618,73.283599999999979],[-100.823059,73.260818000000086],[-100.84056099999992,73.259720000000016],[-100.88945000000001,73.264435000000049],[-100.97749299999998,73.280273000000079],[-101.30499299999991,73.361649000000057],[-101.31276700000001,73.371094000000085],[-101.31139400000001,73.382751000000042],[-101.31054699999999,73.392487000000017],[-101.31139400000001,73.398331000000042],[-101.31723,73.401657000000057],[-101.47055099999994,73.436096000000134],[-101.55832700000002,73.446640000000002],[-101.58084099999996,73.450272000000098],[-101.61665299999993,73.485260000000096],[-101.62138400000003,73.490265000000136],[-101.44055200000003,73.549149000000057],[-101.42748999999992,73.552200000000084],[-101.40083299999992,73.553589000000045],[-101.31582599999996,73.550811999999951],[-101.2808379999999,73.552475000000072],[-101.26888999999994,73.556090999999924],[-101.25974300000001,73.561646000000053],[-101.25527999999997,73.567763999999954],[-101.25222799999995,73.578873000000044],[-101.25306699999993,73.584991000000002],[-101.25110599999994,73.589706000000035],[-101.24194299999994,73.595261000000107],[-101.23082699999998,73.600266000000147],[-101.21721600000001,73.604155999999932],[-101.199432,73.60554500000012],[-100.92639200000002,73.600266000000147],[-100.90943900000002,73.599716000000114],[-100.890289,73.596100000000092],[-100.87748699999997,73.59027100000003],[-100.77084400000001,73.539978000000076],[-100.71749899999992,73.509155000000078],[-100.70667299999997,73.499420000000043],[-100.70221699999996,73.494431000000077],[-100.70140100000003,73.488585999999941],[-100.69721999999996,73.482483000000002],[-100.69110099999995,73.476929000000041],[-100.67278299999998,73.464432000000045],[-100.51834099999996,73.416930999999977],[-100.49973299999999,73.412490999999932],[-100.46472199999988,73.407211000000075],[-100.44444299999992,73.40637200000009],[-100.43055700000002,73.406936999999971],[-100.41722099999998,73.413315000000068],[-100.41500899999994,73.41804500000012],[-100.42971799999998,73.430267000000072],[-100.45500199999998,73.441924999999969],[-100.484734,73.451935000000049],[-100.50279199999989,73.45748900000001],[-100.531387,73.466094999999939],[-100.58389299999993,73.482208000000014],[-100.59221599999995,73.486374000000069],[-100.59861799999999,73.491089000000102],[-100.60611,73.497207999999944],[-100.61000099999995,73.503052000000139],[-100.610817,73.509155000000078],[-100.60804699999994,73.514999000000103],[-100.60388199999994,73.521102999999982],[-100.55915799999997,73.546097000000088],[-100.54387700000001,73.556366000000139],[-100.541382,73.562194999999974],[-100.54277000000002,73.573883000000023],[-100.54998799999993,73.594711000000075],[-100.55166600000001,73.598876999999959],[-100.573624,73.596649000000014],[-100.628601,73.593322999999998],[-100.76750199999998,73.603867000000037],[-100.89167799999996,73.619980000000055],[-100.91139199999998,73.622756999999979],[-100.91194200000001,73.625259000000028],[-100.91139199999998,73.630539000000113],[-100.87943999999999,73.635818000000086],[-100.86472300000003,73.641662999999994],[-100.86110699999995,73.645827999999995],[-100.85360699999995,73.662201000000039],[-100.858047,73.667205999999908],[-100.97444199999995,73.679153000000042],[-100.99194299999999,73.678863999999976],[-101.03333299999997,73.671371000000136],[-101.04695099999998,73.673035000000141],[-101.057503,73.676650999999993],[-101.11833199999995,73.723312000000021],[-101.120003,73.727203000000088],[-101.01390100000003,73.797211000000061],[-100.99749799999989,73.802475000000015],[-100.98222399999997,73.80581699999999],[-100.95973199999997,73.809143000000006],[-100.93804899999998,73.810256999999979],[-100.82861300000002,73.815536000000122],[-100.79527300000001,73.812484999999924],[-100.77583300000003,73.812195000000088],[-100.754997,73.812484999999924],[-100.73416099999997,73.815262000000018],[-100.71444700000001,73.820267000000058],[-100.69915800000001,73.826096000000064],[-100.66416900000002,73.844986000000063],[-100.64835399999993,73.848327999999981],[-100.554169,73.854705999999965],[-100.52999899999998,73.853591999999935],[-100.41777000000002,73.845534999999984],[-100.39555399999995,73.840820000000122],[-100.38945000000001,73.83859300000006],[-100.370003,73.828049000000021],[-100.34999099999993,73.818603999999993],[-100.33612099999993,73.814697000000024],[-100.06304899999998,73.764999000000046],[-99.865828999999962,73.837769000000094],[-99.857773000000009,73.84275800000006],[-99.870109999999954,73.861541999999986],[-99.869109999999921,73.867370999999991],[-99.869780999999932,73.870201000000009],[-99.877105999999912,73.876541000000032],[-99.886771999999951,73.8822100000001],[-99.892440999999963,73.883536999999933],[-99.961944999999957,73.873306000000071],[-99.971663999999976,73.868042000000059],[-99.988051999999925,73.856934000000081],[-99.990829000000019,73.851089000000002],[-99.997498000000007,73.845534999999984],[-100.00834699999996,73.841369999999984],[-100.02639799999997,73.836929000000055],[-100.04943800000001,73.832764000000054],[-100.13667299999997,73.827484000000027],[-100.175003,73.828049000000021],[-100.24944299999993,73.833878000000027],[-100.26139799999993,73.838318000000072],[-100.29972799999996,73.860260000000096],[-100.29695100000004,73.865814000000114],[-100.29222099999993,73.872208000000001],[-100.27860999999996,73.888596000000007],[-100.26583900000003,73.899994000000049],[-100.252792,73.905258000000003],[-100.24305700000002,73.907486000000006],[-100.14306599999992,73.929977000000008],[-100.12721299999993,73.933319000000097],[-100.104446,73.936371000000008],[-100.03751399999999,73.942473999999947],[-99.981109999999944,73.945816000000093],[-99.938599000000011,73.946091000000081],[-99.896956999999986,73.944138000000009],[-99.856109999999887,73.940811000000053],[-99.816100999999946,73.93609600000002],[-99.800827000000027,73.931655999999975],[-99.800551999999925,73.925812000000008],[-99.813323999999966,73.921371000000079],[-99.806220999999937,73.902100000000019],[-99.810058999999967,73.898766000000023],[-99.810889999999972,73.894928000000107],[-99.808227999999986,73.891937000000041],[-99.804557999999929,73.889099000000101]],[[-89.988892000000021,73.988312000000121],[-90.007781999999963,73.984984999999995],[-90.058043999999938,73.992477000000122],[-90.158614999999998,74.001389000000131],[-90.217772999999966,74.004439999999988],[-90.250290000000007,74.00999500000006],[-90.265015000000005,74.014708999999982],[-90.281112999999891,74.02165199999996],[-90.284728999999913,74.024994000000106],[-90.285003999999958,74.029709000000139],[-90.276397999999858,74.038589000000002],[-90.271117999999944,74.043320000000108],[-90.240554999999972,74.053863999999976],[-90.206115999999952,74.057755000000043],[-89.991942999999935,74.066665999999998],[-89.97193900000002,74.064697000000137],[-89.941375999999991,74.057479999999998],[-89.914443999999946,74.047485000000108],[-89.90194699999995,74.03776600000009],[-89.903885000000002,74.03137200000009],[-89.918609999999944,74.010543999999982],[-89.928329000000019,74.005554000000132],[-89.988892000000021,73.988312000000121]],[[-98.918610000000001,73.806091000000094],[-98.96166999999997,73.80525200000011],[-99.104172000000005,73.81442300000009],[-99.140838999999914,73.818054000000132],[-99.36361699999992,73.864426000000037],[-99.381942999999922,73.86914100000007],[-99.429717999999923,73.891662999999937],[-99.437499999999943,73.89694199999991],[-99.43638599999997,73.902206000000092],[-99.429717999999923,73.908035000000098],[-99.422501000000011,73.911102000000028],[-99.406113000000005,73.915267999999912],[-99.282500999999968,73.936919999999986],[-99.223891999999978,73.940262000000075],[-99.092772999999909,73.952209000000039],[-99.020279000000016,73.979706000000022],[-98.938048999999921,73.998596000000134],[-98.801666000000012,74.018051000000128],[-98.66194200000001,74.03137200000009],[-98.575835999999981,74.03137200000009],[-98.532501000000025,74.032211000000018],[-98.491942999999935,74.034148999999957],[-98.425277999999992,74.043869000000029],[-98.3558349999999,74.057479999999998],[-98.275832999999921,74.07388300000008],[-98.255004999999926,74.078598000000113],[-98.230285999999978,74.083327999999938],[-98.170836999999949,74.09248400000007],[-98.039992999999981,74.105820000000051],[-97.994445999999925,74.109421000000111],[-97.806106999999884,74.11943100000002],[-97.758346999999958,74.118590999999981],[-97.737212999999997,74.117477000000008],[-97.703613000000018,74.113876000000118],[-97.690826000000015,74.111374000000069],[-97.653609999999958,74.099991000000045],[-97.64805599999994,74.0977630000001],[-97.642226999999934,74.087204000000042],[-97.637787000000003,74.075546000000031],[-97.638335999999981,74.063873000000001],[-97.649444999999957,74.052474999999959],[-97.656661999999983,74.04693599999996],[-97.673324999999863,74.035537999999974],[-97.717223999999987,74.009720000000016],[-97.728058000000033,74.004166000000055],[-97.763625999999931,73.988312000000121],[-97.823058999999887,73.968597000000102],[-98.124161000000015,73.878586000000098],[-98.145003999999915,73.873596000000077],[-98.168334999999956,73.870818999999983],[-98.392776000000026,73.84526100000005],[-98.478881999999999,73.837494000000106],[-98.777221999999995,73.813599000000124],[-98.918610000000001,73.806091000000094]],[[-92.638061999999877,74.103043000000127],[-92.36860699999994,74.041091999999992],[-92.356948999999986,74.038040000000024],[-92.33444199999991,74.03137200000009],[-92.31138599999997,74.02165199999996],[-92.296951000000035,74.014435000000049],[-92.289444000000003,74.009155000000021],[-92.282775999999956,74.003325999999959],[-92.273620999999991,73.990540000000067],[-92.272781000000009,73.984421000000054],[-92.28195199999999,73.974990999999989],[-92.291107000000011,73.969711000000075],[-92.310546999999929,73.961104999999975],[-92.327788999999939,73.951385000000073],[-92.330001999999979,73.945526000000086],[-92.329726999999991,73.942473999999947],[-92.309433000000013,73.940811000000053],[-92.1324919999999,73.946365000000014],[-92.118606999999997,73.949142000000109],[-92.116652999999985,73.95109599999995],[-92.113327000000027,73.95637499999998],[-92.110000999999897,73.964706000000035],[-92.113051999999982,73.974426000000108],[-92.114440999999999,73.976654000000053],[-92.113051999999982,73.981368999999916],[-92.107773000000009,73.984711000000061],[-92.094161999999983,73.989151000000049],[-91.925551999999982,74.012771999999927],[-91.877212999999983,74.016936999999928],[-91.838332999999977,74.018875000000094],[-91.570847000000015,74.025818000000072],[-91.528335999999911,74.024429000000055],[-91.139998999999932,74.00999500000006],[-91.097504000000015,74.008331000000055],[-91.065001999999993,74.006103999999993],[-91.046951000000035,74.004166000000055],[-90.735549999999932,73.968322999999998],[-90.660003999999958,73.953873000000044],[-90.633056999999951,73.948317999999972],[-90.441375999999934,73.919708000000128],[-90.406661999999983,73.914703000000088],[-90.364440999999999,73.911652000000061],[-90.354720999999984,73.912201000000039],[-90.344955000000027,73.914368000000081],[-90.341674999999952,73.917206000000078],[-90.339721999999938,73.920532000000094],[-90.341110000000015,73.924149000000057],[-90.33555599999994,73.925812000000008],[-90.317779999999971,73.925261999999975],[-90.225006000000008,73.908599999999979],[-90.195830999999998,73.901931999999988],[-90.194442999999922,73.899719000000005],[-90.204178000000013,73.888321000000019],[-90.230285999999978,73.862198000000035],[-90.241942999999992,73.851929000000041],[-90.25140399999998,73.846649000000127],[-90.264450000000011,73.84165999999999],[-90.275283999999942,73.83859300000006],[-90.283066000000019,73.838318000000072],[-90.360000999999954,73.800812000000121],[-90.474716000000001,73.72164900000007],[-90.581389999999999,73.65776100000005],[-90.724715999999944,73.583054000000118],[-90.84973100000002,73.540268000000083],[-90.921386999999925,73.495255000000043],[-90.930283000000031,73.483871000000079],[-90.932219999999973,73.481934000000081],[-91.089172000000019,73.384155000000021],[-91.152221999999995,73.361099000000024],[-91.171386999999982,73.351089000000059],[-91.180557000000022,73.345825000000104],[-91.186385999999914,73.340271000000087],[-91.238602000000014,73.279984000000127],[-91.253066999999874,73.269150000000081],[-91.262222000000008,73.263885000000016],[-91.367767000000015,73.200821000000133],[-91.569457999999997,73.063309000000061],[-91.642776000000026,73.021103000000039],[-91.647506999999962,73.016663000000051],[-91.645003999999972,72.998032000000023],[-91.770844000000011,72.913040000000024],[-91.799727999999959,72.897216999999955],[-91.808333999999888,72.891937000000098],[-91.812774999999988,72.885818000000086],[-91.813048999999921,72.880264000000068],[-91.81138599999997,72.868042000000116],[-91.818893000000003,72.862198000000092],[-91.84973100000002,72.846100000000035],[-92.06610099999989,72.752487000000087],[-92.095839999999896,72.743042000000003],[-92.127486999999917,72.734421000000111],[-92.166396999999961,72.725539999999967],[-92.232223999999974,72.713043000000027],[-92.274718999999891,72.70748900000001],[-92.314437999999996,72.704987000000131],[-92.335280999999952,72.704437000000098],[-92.393340999999907,72.707213999999965],[-92.431106999999997,72.710541000000092],[-92.524719000000005,72.720534999999927],[-92.745269999999891,72.739975000000129],[-92.898346000000004,72.750275000000045],[-93.077498999999875,72.769439999999975],[-93.248885999999914,72.789703000000031],[-93.337783999999999,72.8077550000001],[-93.349166999999852,72.802475000000072],[-93.366652999999985,72.797760000000039],[-93.391952999999944,72.794144000000131],[-93.412216000000001,72.792206000000022],[-93.580001999999922,72.778046000000074],[-93.679992999999911,72.779709000000025],[-93.726104999999905,72.781097000000102],[-93.764450000000011,72.781372000000147],[-93.932769999999948,72.774155000000007],[-94.038604999999961,72.766388000000063],[-94.099166999999966,72.764160000000118],[-94.132492000000013,72.764709000000039],[-94.170546999999942,72.767487000000074],[-94.18249499999996,72.769439999999975],[-94.24610899999999,72.77388000000002],[-94.262786999999889,72.774155000000007],[-94.298049999999989,72.770263999999941],[-94.315552000000025,72.763046000000145],[-94.321944999999971,72.759430000000066],[-94.327498999999989,72.754440000000045],[-94.334441999999967,72.738036999999963],[-94.332779000000016,72.731934000000024],[-94.327498999999989,72.721649000000127],[-94.319457999999997,72.717484000000127],[-94.3125,72.715545999999961],[-94.297501000000011,72.713318000000015],[-94.26916499999993,72.719147000000021],[-94.265288999999939,72.723877000000073],[-94.263901000000033,72.729980000000012],[-94.258346999999958,72.732483000000002],[-94.236388999999917,72.734985000000052],[-94.160278000000005,72.729431000000034],[-94.103606999999897,72.718596999999988],[-94.09333799999996,72.714995999999928],[-94.001403999999923,72.704162999999994],[-93.985000999999954,72.70387299999993],[-93.886672999999973,72.704712000000086],[-93.839447000000007,72.717209000000082],[-93.798339999999996,72.702208999999925],[-93.823058999999887,72.653046000000018],[-93.817229999999938,72.642211999999972],[-93.801665999999955,72.634430000000009],[-93.786117999999931,72.629149999999981],[-93.76945499999988,72.624984999999981],[-93.75778200000002,72.623032000000023],[-93.686660999999901,72.622208000000057],[-93.674438000000009,72.618866000000082],[-93.589721999999995,72.58137499999998],[-93.568619000000012,72.570831000000112],[-93.49888599999997,72.521927000000119],[-93.463333000000034,72.462204000000099],[-93.466110000000015,72.451385000000016],[-93.46945199999999,72.439697000000024],[-93.628052000000025,72.341934000000037],[-93.64527899999996,72.337204000000042],[-93.666397000000018,72.333602999999982],[-93.688323999999909,72.331099999999992],[-93.748610999999983,72.329712000000086],[-93.767226999999991,72.327209000000096],[-93.787216000000001,72.322769000000108],[-93.801392000000021,72.317764000000068],[-93.819732999999928,72.30720500000001],[-93.827498999999989,72.301926000000037],[-93.913329999999974,72.241652999999928],[-93.925277999999935,72.233047000000056],[-94.014175000000023,72.163879000000122],[-94.036666999999852,72.142212000000086],[-94.040282999999988,72.137497000000053],[-94.043610000000001,72.131363000000022],[-94.045546999999885,72.126922999999977],[-94.044723999999974,72.115814000000114],[-94.042220999999927,72.106644000000074],[-94.043883999999935,72.096939000000134],[-94.048339999999939,72.091094999999939],[-94.054717999999923,72.085265999999933],[-94.066665999999941,72.076660000000004],[-94.080840999999964,72.066939999999931],[-94.091675000000009,72.061645999999996],[-94.127685999999926,72.056366000000082],[-94.143341000000021,72.057480000000055],[-94.172500999999954,72.0577550000001],[-94.186660999999958,72.055816999999934],[-94.198883000000023,72.052765000000022],[-94.188720999999987,72.045258000000103],[-94.19505300000003,72.042091000000084],[-94.198387000000025,72.03910100000013],[-94.199546999999995,72.036438000000032],[-94.196053000000006,72.032432999999969],[-94.188384999999982,72.030930000000126],[-94.172042999999917,72.029594000000088],[-94.149886999999921,72.029433999999981],[-94.137382999999886,72.031769000000111],[-94.130554000000018,72.033104000000037],[-94.125214000000028,72.035095000000126],[-94.091385000000002,72.037766000000147],[-94.06082200000003,72.035262999999986],[-94.029723999999931,71.999419999999986],[-94.063048999999921,71.978317000000061],[-94.082229999999981,71.976089000000115],[-94.191719000000035,71.994316000000083],[-94.353881999999942,72.018050999999957],[-94.371933000000013,72.019440000000145],[-94.418059999999912,72.02276599999999],[-94.449721999999952,72.023315000000139],[-94.743880999999931,72.011383000000023],[-94.780288999999982,72.006103999999993],[-94.825561999999991,71.997481999999991],[-94.902221999999881,71.989151000000106],[-95.121932999999956,71.966095000000053],[-95.161117999999931,71.964706000000092],[-95.17582699999997,71.966934000000037],[-95.20777899999996,71.988876000000118],[-95.213333000000034,71.99443100000002],[-95.206664999999987,72.097488000000112],[-95.204453000000001,72.102767999999969],[-95.196654999999964,72.106644000000074],[-95.039444000000003,72.131363000000022],[-94.981673999999998,72.139434999999992],[-94.929717999999923,72.143599999999992],[-94.899993999999992,72.144440000000031],[-94.868057000000022,72.145538000000101],[-94.752228000000002,72.153320000000065],[-94.760833999999932,72.15498400000007],[-94.80610699999994,72.15914900000007],[-94.839171999999905,72.158599999999979],[-94.961394999999982,72.155258000000003],[-95.027495999999985,72.14498900000001],[-95.12110899999999,72.136658000000068],[-95.139998999999932,72.135544000000095],[-95.158889999999985,72.135818000000029],[-95.171111999999937,72.139159999999947],[-95.206664999999987,72.180817000000047],[-95.211670000000026,72.187194999999974],[-95.213622999999984,72.193313999999987],[-95.214721999999938,72.200271999999984],[-95.214721999999938,72.20526099999995],[-95.203887999999893,72.221924000000058],[-95.191375999999991,72.2452550000001],[-95.171111999999937,72.283324999999991],[-95.133330999999885,72.46026599999999],[-95.200287000000003,72.524428999999998],[-95.226394999999968,72.53166200000004],[-95.283065999999906,72.535538000000088],[-95.316100999999946,72.539703000000088],[-95.321395999999993,72.546097000000145],[-95.344451999999933,72.58137499999998],[-95.346664000000033,72.587493999999992],[-95.345551,72.593322999999998],[-95.331679999999949,72.598328000000038],[-95.313323999999966,72.601089000000059],[-95.315826000000015,72.606368999999916],[-95.355559999999969,72.637771999999984],[-95.364440999999886,72.643326000000116],[-95.458617999999944,72.68220500000001],[-95.475554999999986,72.686371000000122],[-95.492766999999901,72.688034000000016],[-95.50556899999998,72.686371000000122],[-95.52555799999999,72.681656000000089],[-95.535827999999924,72.681366000000025],[-95.548614999999927,72.68220500000001],[-95.576110999999969,72.689971999999955],[-95.590560999999923,72.695525999999973],[-95.602218999999934,72.702208999999925],[-95.666106999999897,72.801376000000062],[-95.673614999999984,72.813873000000058],[-95.675551999999982,72.82499700000011],[-95.675277999999935,72.841094999999996],[-95.671936000000017,72.852478000000019],[-95.653885000000002,72.876923000000033],[-95.645844000000011,72.91276600000009],[-95.655563000000029,73.019989000000066],[-95.683318999999983,73.075821000000019],[-95.582503999999972,73.127762000000132],[-95.575012000000015,73.164993000000095],[-95.600540000000024,73.283905000000004],[-95.650832999999977,73.325272000000041],[-95.646666999999979,73.330826000000059],[-95.613616999999977,73.342758000000003],[-95.623610999999983,73.361099000000024],[-95.653610000000015,73.412490999999932],[-95.681670999999994,73.444138000000066],[-95.683884000000035,73.450272000000098],[-95.700287000000003,73.55386400000009],[-95.668364999999937,73.581787000000077],[-95.612563999999963,73.610976999999991],[-95.656059000000027,73.631866000000116],[-95.676085999999998,73.665061999999978],[-95.681945999999982,73.711928999999998],[-95.673049999999989,73.723312000000021],[-95.658889999999985,73.732482999999945],[-95.645844000000011,73.735535000000084],[-95.450835999999981,73.771103000000096],[-95.428329000000019,73.77276599999999],[-95.299727999999959,73.771103000000096],[-95.283614999999941,73.769149999999968],[-95.266402999999912,73.764160000000118],[-95.236938000000009,73.752212999999983],[-95.160278000000005,73.713042999999971],[-95.154723999999987,73.706940000000031],[-95.138335999999924,73.700821000000019],[-95.106948999999986,73.691925000000083],[-95.076401000000033,73.683318999999983],[-95.024170000000026,73.671646000000123],[-94.95666499999993,73.659149000000127],[-94.890563999999927,73.649155000000121],[-94.845550999999944,73.644150000000081],[-94.828613000000018,73.643051000000071],[-94.812209999999993,73.643326000000116],[-94.652221999999995,73.648605000000089],[-94.634170999999924,73.649429000000055],[-94.618056999999908,73.651382000000012],[-94.619155999999975,73.654434000000094],[-94.638061999999991,73.665817000000118],[-94.649445000000014,73.670821999999987],[-94.676392000000021,73.676650999999993],[-94.732773000000009,73.681366000000025],[-94.773055999999997,73.679977000000008],[-94.81471299999987,73.680817000000104],[-94.866104000000007,73.687195000000031],[-94.883330999999998,73.692200000000071],[-95.075561999999877,73.773315000000139],[-95.089172000000019,73.783325000000048],[-95.111937999999952,73.801086000000055],[-95.11610399999995,73.806641000000127],[-95.108046999999999,73.812195000000088],[-95.070847000000015,73.822768999999994],[-95.036666999999909,73.829436999999928],[-95.00556899999998,73.832489000000066],[-94.976668999999958,73.831100000000049],[-94.958054000000004,73.831940000000088],[-94.963332999999977,73.838318000000072],[-94.982497999999964,73.845534999999984],[-95.005004999999983,73.852767999999969],[-95.024445000000014,73.855255000000056],[-95.045546999999942,73.855545000000063],[-95.076675000000023,73.852477999999962],[-95.109160999999972,73.843597000000045],[-95.116393999999957,73.839157],[-95.127212999999927,73.825821000000076],[-95.136123999999938,73.823608000000092],[-95.154174999999952,73.823608000000092],[-95.263061999999991,73.862762000000032],[-95.304169000000002,73.8808140000001],[-95.311385999999914,73.885269000000108],[-95.323333999999932,73.89694199999991],[-95.327788999999882,73.90914900000007],[-95.329726999999991,73.919982999999945],[-95.326110999999969,73.944138000000009],[-95.324721999999952,73.952484000000084],[-95.319167999999877,73.964157000000114],[-95.298339999999996,73.980819999999994],[-95.245270000000005,74.010268999999994],[-95.227782999999988,74.014160000000061],[-95.220001000000025,74.014708999999982],[-95.192489999999964,74.008881000000088],[-95.174438000000009,74.008881000000088],[-95.040833000000021,74.026382000000012],[-94.90695199999999,74.047485000000108],[-94.850280999999995,74.058868000000132],[-94.80610699999994,74.068054000000075],[-94.787506000000008,74.072769000000108],[-94.755279999999914,74.087204000000042],[-94.745833999999945,74.092209000000082],[-94.732223999999974,74.095260999999994],[-94.618332000000009,74.090271000000143],[-94.460281000000009,74.094437000000028],[-94.436934999999949,74.095824999999934],[-94.42721599999993,74.100815000000011],[-94.421111999999994,74.105820000000051],[-94.412780999999995,74.115265000000136],[-94.406112999999948,74.118865999999969],[-94.392226999999991,74.121918000000107],[-94.217498999999975,74.131652999999972],[-94.177779999999927,74.1336060000001],[-94.093063000000029,74.136383000000023],[-93.992492999999911,74.138596000000007],[-93.951950000000011,74.138885000000073],[-93.914169000000015,74.136107999999979],[-93.90194699999995,74.133331000000112],[-93.758346999999958,74.096939000000134],[-93.761397999999986,74.129150000000038],[-93.759445000000028,74.139160000000118],[-93.754456000000005,74.144714000000079],[-93.730835000000013,74.154160000000047],[-93.690551999999968,74.162200999999982],[-93.641112999999962,74.167754999999943],[-93.583617999999888,74.170822000000044],[-93.515015000000005,74.173035000000027],[-93.431670999999994,74.172211000000061],[-93.327498999999989,74.169983000000116],[-93.243880999999988,74.164993000000038],[-93.028885000000002,74.149993999999992],[-92.979445999999996,74.145828000000108],[-92.796386999999982,74.124985000000038],[-92.638061999999877,74.103043000000127]],[[-98.657226999999978,74.29942299999999],[-98.746947999999975,74.298035000000084],[-98.810271999999941,74.298325000000091],[-98.831679999999949,74.299149000000057],[-98.859436000000017,74.301376000000118],[-98.86221299999994,74.302475000000129],[-98.864715999999987,74.304703000000075],[-98.863051999999982,74.307479999999998],[-98.857223999999974,74.311371000000065],[-98.752501999999936,74.334152000000074],[-98.718338000000017,74.336655000000007],[-98.630829000000006,74.34248400000007],[-98.616652999999985,74.341934000000037],[-98.585830999999985,74.338593000000003],[-98.573623999999938,74.334991000000002],[-98.535278000000005,74.328873000000101],[-98.521666999999979,74.324706999999989],[-98.511123999999995,74.318329000000006],[-98.515563999999927,74.314147999999932],[-98.525009000000011,74.31053200000008],[-98.568618999999899,74.304703000000075],[-98.657226999999978,74.29942299999999]],[[-120.14998600000001,74.272491000000059],[-119.86472300000003,74.237762000000032],[-119.84528399999999,74.235809000000074],[-119.79527299999995,74.234420999999998],[-119.72501399999993,74.233871000000136],[-119.60916099999997,74.233321999999987],[-119.63971699999996,74.193039000000113],[-119.65139799999997,74.181655999999919],[-119.67250099999995,74.165817000000004],[-119.69082599999996,74.156936999999971],[-119.70249899999999,74.153046000000074],[-119.72305299999994,74.144714000000079],[-119.79415899999998,74.115265000000136],[-119.80332900000002,74.110535000000084],[-119.82417299999992,74.094711000000132],[-119.833618,74.082763999999997],[-119.83612099999999,74.075821000000019],[-119.83277900000002,74.064147999999989],[-119.82721699999991,74.05914300000012],[-119.77916699999997,74.033875000000023],[-119.76806599999986,74.030273000000079],[-119.74481199999997,74.025513000000046],[-119.72860699999995,74.02915999999999],[-119.72609699999992,74.035812000000078],[-119.72638699999993,74.041931000000091],[-119.73777799999999,74.058029000000147],[-119.650284,74.118590999999981],[-119.51000999999991,74.209152000000017],[-119.50083899999998,74.213882000000012],[-119.48916599999995,74.217483999999956],[-119.46528599999994,74.221100000000035],[-119.44972199999995,74.221924000000001],[-119.25723299999999,74.218323000000112],[-119.18472300000002,74.216933999999924],[-119.16528299999987,74.214995999999985],[-119.14862099999999,74.212204000000099],[-119.137787,74.208603000000039],[-119.12110899999993,74.199707000000103],[-119.11554699999999,74.194977000000051],[-119.10193600000002,74.179428000000144],[-119.09638999999999,74.168319999999994],[-119.09084300000001,74.156936999999971],[-119.07055700000001,74.114700000000084],[-119.06527699999998,74.103317000000061],[-119.07084699999996,74.089980999999966],[-119.08084099999996,74.077773999999977],[-119.08805799999999,74.072769000000108],[-119.10166900000002,74.069716999999969],[-119.11972000000003,74.068054000000075],[-119.14723199999997,74.062195000000031],[-119.15222199999994,74.056091000000038],[-119.18720999999999,73.994141000000127],[-119.18720999999999,73.987762000000089],[-119.16750299999995,73.987198000000149],[-118.98889200000002,73.998032000000023],[-118.97305299999999,74.000274999999988],[-118.96362299999993,74.004990000000021],[-118.80777,74.090546000000131],[-118.80055199999998,74.095824999999934],[-118.79028299999993,74.10775799999999],[-118.78751399999999,74.114700000000084],[-118.79277000000002,74.125809000000004],[-118.79804999999999,74.130814000000044],[-118.80695299999996,74.133880999999974],[-118.82333399999999,74.136383000000023],[-118.83693699999992,74.139435000000105],[-118.84805299999994,74.143326000000002],[-118.86721799999998,74.151382000000069],[-118.88333099999994,74.166382000000056],[-118.88612399999994,74.171921000000054],[-118.88110399999999,74.178040000000067],[-118.84388699999994,74.188309000000118],[-118.72000100000002,74.212768999999923],[-118.67388899999997,74.219986000000063],[-118.60722399999997,74.228317000000118],[-118.50583599999999,74.239974999999959],[-118.17999299999991,74.272217000000126],[-118.12249799999995,74.275818000000015],[-118.10193600000002,74.276382000000126],[-118.031387,74.275269000000094],[-117.97361799999999,74.269150000000025],[-117.91860999999989,74.262207000000046],[-117.62832599999996,74.244980000000055],[-117.51251199999996,74.238585999999998],[-117.43859900000001,74.22943099999992],[-117.422234,74.226929000000041],[-117.37609899999995,74.218323000000112],[-117.28943599999997,74.199707000000103],[-117.15722700000003,74.167754999999943],[-116.82833899999997,74.072495000000004],[-116.78500400000001,74.059708000000001],[-116.735817,74.039703000000145],[-116.62249799999989,73.990814],[-116.52806099999998,73.949706999999989],[-116.441101,73.913605000000018],[-116.34805299999999,73.875534000000016],[-116.33805799999999,73.87164300000012],[-116.32778899999988,73.867752000000053],[-116.31471299999993,73.864426000000037],[-116.29888900000003,73.861649000000114],[-116.20805399999995,73.838318000000072],[-116.05583199999995,73.792755000000113],[-116.00556899999998,73.773315000000139],[-115.97638699999999,73.755554000000018],[-115.91443599999997,73.726379000000122],[-115.89444699999996,73.718596999999988],[-115.817497,73.698318000000029],[-115.603882,73.652205999999978],[-115.40222199999999,73.568329000000006],[-115.36694299999999,73.545822000000101],[-115.34889199999998,73.531937000000028],[-115.33194700000001,73.511658000000068],[-115.31500199999999,73.479705999999908],[-115.32305899999994,73.474426000000051],[-115.449432,73.426651000000049],[-115.46140300000002,73.42303499999997],[-115.69943199999989,73.368866000000139],[-115.83473199999997,73.33998100000008],[-115.862213,73.334427000000119],[-116.26750199999998,73.273041000000148],[-116.33556399999998,73.267211999999915],[-116.37249800000001,73.265549000000021],[-116.42500299999995,73.261658000000125],[-116.45612299999993,73.257492000000013],[-116.46945199999999,73.254715000000147],[-116.69304699999992,73.203873000000044],[-116.80943299999996,73.168045000000006],[-116.94803599999995,73.124985000000038],[-117.02639799999997,73.106934000000024],[-117.16915899999998,73.081940000000088],[-117.39388999999994,73.048598999999911],[-117.42639200000002,73.044983000000059],[-117.46610999999996,73.03637700000013],[-117.708054,72.977768000000083],[-117.83667000000003,72.938583000000108],[-117.891953,72.919983000000002],[-117.925003,72.908875000000023],[-117.97501399999993,72.896378000000027],[-118.01611300000002,72.888321000000019],[-118.11527999999993,72.870818999999983],[-118.21806300000003,72.854705999999965],[-118.27362099999999,72.844436999999914],[-118.314438,72.836104999999918],[-118.36609599999997,72.824432000000115],[-118.38999899999993,72.817764000000125],[-118.44444299999998,72.798874000000012],[-118.45333900000003,72.794434000000138],[-118.46000700000002,72.78915400000011],[-118.46472199999994,72.783325000000104],[-118.48528299999992,72.767487000000074],[-118.49610899999999,72.763610999999969],[-118.53472899999991,72.754715000000033],[-118.54943799999995,72.752487000000087],[-118.58528100000001,72.750275000000045],[-118.65805099999994,72.74803200000008],[-118.70861799999994,72.743590999999981],[-118.75306699999999,72.73692299999999],[-118.77861000000001,72.731093999999985],[-119.11444099999994,72.639435000000049],[-119.1375119999999,72.632477000000051],[-119.15888999999999,72.624984999999981],[-119.16750299999995,72.620529000000033],[-119.30943300000001,72.438873000000058],[-119.3163909999999,72.425812000000121],[-119.33000199999987,72.394149999999968],[-119.33249699999999,72.387206999999989],[-119.33000199999987,72.381653000000142],[-119.32501200000002,72.376648000000102],[-119.30999800000001,72.368042000000003],[-119.30277999999993,72.363037000000134],[-119.30248999999998,72.356644000000017],[-119.31111099999993,72.352203000000088],[-119.40444899999994,72.325545999999974],[-119.429169,72.319716999999969],[-119.51555599999989,72.305817000000104],[-119.62666300000001,72.278320000000122],[-119.65750099999991,72.267211999999972],[-119.67804699999999,72.259430000000009],[-119.760559,72.228867000000037],[-119.80139200000002,72.22137500000008],[-119.837784,72.219711000000075],[-119.97250399999996,72.221100000000092],[-120.12372599999998,72.232597000000112],[-120.13405599999999,72.233756999999969],[-120.13871799999998,72.236420000000066],[-120.13621499999994,72.239929000000132],[-120.12888299999992,72.241928000000144],[-120.14362299999993,72.2494200000001],[-120.12943999999999,72.251663000000065],[-120.12721299999993,72.258606000000043],[-120.12999000000002,72.264160000000061],[-120.13999899999993,72.267761000000064],[-120.15750099999997,72.269714000000022],[-120.17582699999997,72.268875000000094],[-120.24109599999997,72.26249700000011],[-120.25110599999999,72.258606000000043],[-120.25945299999995,72.246643000000006],[-120.26139799999987,72.239700000000028],[-120.25862099999995,72.23414600000001],[-120.23144500000001,72.214812999999992],[-120.225281,72.212479000000144],[-120.21028899999999,72.20881700000001],[-120.19810499999994,72.204322999999988],[-120.18894999999998,72.199150000000088],[-120.18578299999996,72.196151999999984],[-120.14527900000002,72.149994000000049],[-120.14499699999993,72.143599999999992],[-120.17582699999997,72.094437000000084],[-120.19415299999997,72.078323000000125],[-120.30526699999996,72.013046000000088],[-120.329453,71.999146000000053],[-120.34750399999996,71.990814000000057],[-120.38362100000001,71.981658999999979],[-120.41332999999986,71.971374999999966],[-120.423317,71.96748400000007],[-120.43916299999989,71.958328000000108],[-120.445267,71.953048999999965],[-120.4491579999999,71.946930000000123],[-120.45278899999994,71.934707999999944],[-120.45249899999993,71.927765000000136],[-120.44972200000001,71.922210999999947],[-120.439438,71.912201000000039],[-120.43167099999994,71.908034999999984],[-120.391953,71.893051000000071],[-120.38445300000001,71.888885000000016],[-120.37917299999998,71.883881000000031],[-120.38082900000001,71.87831099999994],[-120.41500899999994,71.776382000000126],[-120.42278299999998,71.764160000000118],[-120.42471299999994,71.757216999999969],[-120.42639199999996,71.74443100000002],[-120.423607,71.738875999999948],[-120.41332999999986,71.72886699999998],[-120.40805099999994,71.723877000000073],[-120.40055799999993,71.719437000000084],[-120.37998999999996,71.699707000000046],[-120.37748699999992,71.694138000000066],[-120.37693799999994,71.688034000000073],[-120.38082900000001,71.681931000000077],[-120.43611099999998,71.611922999999933],[-120.47305299999999,71.565536000000066],[-120.49665799999997,71.544144000000017],[-120.54332699999992,71.516662999999994],[-120.60166900000002,71.493591000000038],[-120.63639799999999,71.485535000000141],[-120.78028899999998,71.457214000000079],[-120.80750299999988,71.452484000000027],[-120.87721299999998,71.441360000000145],[-120.921944,71.435532000000023],[-121.13333099999994,71.409424000000058],[-121.33249699999993,71.386932000000002],[-121.39444700000001,71.380264000000011],[-121.42916899999994,71.378311000000053],[-121.44833399999999,71.379425000000026],[-121.59056099999998,71.396378000000141],[-121.60305799999998,71.399428999999998],[-121.59137699999991,71.402771000000087],[-121.57611099999997,71.404434000000037],[-121.54915599999993,71.40914900000007],[-121.53751399999999,71.412490999999989],[-121.53195199999993,71.417755],[-121.52861000000001,71.423874000000012],[-121.531677,71.429427999999973],[-121.53694200000001,71.434418000000051],[-121.54998799999993,71.443588000000091],[-121.56973299999999,71.451660000000061],[-121.59638999999999,71.456940000000145],[-121.63027999999991,71.460540999999978],[-121.66860999999994,71.46276899999998],[-121.70361300000002,71.460815000000139],[-121.74388099999999,71.453323000000012],[-121.75556899999998,71.450271999999984],[-121.77639799999997,71.443038999999942],[-121.81220999999994,71.426651000000106],[-121.82917800000001,71.418319999999994],[-121.84612299999998,71.409714000000065],[-121.90194700000001,71.378586000000098],[-121.96528599999999,71.34275800000006],[-122.07501199999996,71.286926000000051],[-122.12165799999991,71.267211999999972],[-122.14417300000002,71.260817999999915],[-122.21056399999986,71.24832200000003],[-122.25446299999999,71.242477000000122],[-122.29833999999994,71.236374000000012],[-122.35526999999996,71.227768000000083],[-122.43028299999997,71.214157000000114],[-122.50556899999992,71.197754000000032],[-122.593887,71.178040000000124],[-122.60500299999995,71.174988000000042],[-122.61638600000003,71.171646000000067],[-122.64584400000001,71.160538000000088],[-122.66221599999994,71.151931999999988],[-122.67832900000002,71.143326000000059],[-122.7069469999999,71.124420000000043],[-122.74249299999997,71.101089000000002],[-122.76999699999988,71.089157000000057],[-122.781113,71.086104999999918],[-122.79611199999988,71.084152000000017],[-122.84944199999995,71.0816650000001],[-123.07611099999986,71.079163000000051],[-123.09500099999997,71.079987000000017],[-123.1260989999999,71.083878000000084],[-123.162781,71.092758000000117],[-123.22332799999998,71.114150999999993],[-123.25945300000001,71.129700000000128],[-123.29305999999985,71.146102999999982],[-123.31696299999999,71.158599999999979],[-123.37027,71.188873000000115],[-123.3952789999999,71.207763999999941],[-123.42999299999997,71.236923000000104],[-123.44860799999998,71.257767000000115],[-123.46640000000002,71.285537999999974],[-123.51390099999998,71.349152000000061],[-123.56696299999993,71.406096999999932],[-123.63417099999992,71.472487999999942],[-123.66583299999996,71.496368000000132],[-123.67971799999998,71.505264000000068],[-123.84388699999994,71.583328000000108],[-123.88722200000001,71.623595999999964],[-123.89917000000003,71.633041000000048],[-123.94888299999997,71.658325000000048],[-123.97582999999997,71.670258000000103],[-124.01334400000002,71.685806000000071],[-124.02390300000002,71.689148000000046],[-124.07055700000001,71.701935000000049],[-124.11138900000003,71.709991000000116],[-124.13694800000002,71.714432000000045],[-124.38474299999996,71.75471500000009],[-124.458054,71.76638800000012],[-124.609734,71.788040000000137],[-124.65278599999994,71.79525799999999],[-124.67887899999999,71.800812000000121],[-124.700287,71.806366000000139],[-124.83194700000001,71.840820000000008],[-124.86665299999993,71.85054000000008],[-125.07694999999995,71.909149000000127],[-125.16000400000001,71.924683000000073],[-125.23638900000003,71.941910000000064],[-125.24722300000002,71.945511000000124],[-125.25361599999997,71.950255999999968],[-125.24472000000003,71.954422000000079],[-125.04804999999999,71.955536000000052],[-124.98029300000002,71.943587999999977],[-124.96945199999999,71.939972000000125],[-124.95388800000001,71.938034000000016],[-124.94275699999997,71.939972000000125],[-124.93804899999998,71.945525999999916],[-124.93554699999999,71.951659999999947],[-124.93971299999998,71.956940000000031],[-124.94833399999999,71.961105000000032],[-124.98777799999999,71.969711000000132],[-125.02278100000001,71.972504000000129],[-125.23277300000001,71.975524999999948],[-125.35221899999999,71.97468600000002],[-125.41639700000002,71.974135999999987],[-125.47833300000002,71.972763000000043],[-125.59111000000001,71.966385000000116],[-125.62666299999995,71.963608000000022],[-125.68639399999995,71.954987000000074],[-125.72165699999994,71.952209000000096],[-125.76139799999993,71.950821000000019],[-125.80139199999996,71.952209000000096],[-125.93582199999992,71.958602999999982],[-125.97361799999999,71.960541000000092],[-125.984444,71.963882000000126],[-125.99333200000001,71.96804800000001],[-125.997772,71.973602000000028],[-125.99333200000001,71.978867000000093],[-125.97778299999999,71.979706000000022],[-125.966949,71.976379000000122],[-125.90055799999999,71.962494000000049],[-125.88054699999992,71.963318000000015],[-125.84973099999991,71.967209000000082],[-125.80999799999995,71.975540000000137],[-125.787781,71.982208000000128],[-125.77887699999991,71.986374000000012],[-125.765289,71.996094000000085],[-125.75418100000002,72.006103999999993],[-125.74082899999996,72.022751000000028],[-125.73388699999998,72.034133999999995],[-125.724716,72.051926000000094],[-125.71777299999985,72.070540999999992],[-125.71528599999994,72.083603000000039],[-125.71528599999994,72.090270999999973],[-125.71749899999992,72.096375000000023],[-125.72165699999994,72.101929000000041],[-125.72833299999996,72.106644000000074],[-125.73944099999989,72.110260000000096],[-125.71444700000001,72.157485999999949],[-125.57389799999993,72.247467000000142],[-125.51445000000001,72.291076999999973],[-125.46777299999997,72.351074000000096],[-125.43221999999997,72.403580000000034],[-125.43666099999996,72.409134000000051],[-125.30055199999993,72.483307000000025],[-125.29110699999995,72.487183000000073],[-125.27971600000001,72.490524000000107],[-125.25787399999996,72.495125000000144],[-125.247772,72.49523899999997],[-125.17194399999994,72.513596000000064],[-125.1394499999999,72.524138999999991],[-125.02806099999998,72.566071000000079],[-125,72.605254999999943],[-124.94055199999997,72.70248400000014],[-124.97193899999991,72.755829000000006],[-125.02610800000002,72.821091000000081],[-124.95916699999998,72.856369000000086],[-124.89334100000002,72.873871000000122],[-124.87917299999998,72.876373000000001],[-124.801941,72.887497000000053],[-124.76695299999994,72.890823000000125],[-124.72749299999987,72.888596000000064],[-124.68804899999986,72.887497000000053],[-124.66944899999993,72.888884999999959],[-124.63667299999997,72.892761000000064],[-124.60611,72.897216999999955],[-124.591949,72.899994000000049],[-124.49722300000002,72.919707999999957],[-124.48554999999999,72.923035000000084],[-124.47582999999997,72.927200000000084],[-124.47305299999999,72.933318999999926],[-124.49305700000002,72.97164900000007],[-124.49722300000002,72.977203000000031],[-124.62138399999992,73.001389000000131],[-124.71250899999995,73.003876000000048],[-124.72609699999998,73.006653000000142],[-124.73777799999999,73.010268999999994],[-124.76972999999992,73.021378000000084],[-124.82417299999992,73.046097000000032],[-124.83332799999994,73.050262000000032],[-124.84916699999997,73.059417999999994],[-124.862503,73.068878000000041],[-124.86694299999994,73.074432000000058],[-124.86888099999999,73.080551000000071],[-124.86389200000002,73.086105000000089],[-124.79472399999992,73.134720000000129],[-124.78500400000001,73.13888500000013],[-124.71362299999987,73.149428999999998],[-124.59916699999985,73.227768000000026],[-124.58640299999996,73.238037000000077],[-124.57389799999993,73.248321999999973],[-124.56360599999988,73.259155000000135],[-124.50805699999995,73.32638500000013],[-124.44583099999994,73.411102000000142],[-124.44055199999997,73.416655999999932],[-124.43306000000001,73.421370999999965],[-124.40556299999997,73.434143000000006],[-124.30555699999991,73.478592000000106],[-124.29332699999998,73.481659000000036],[-124.252228,73.483596999999975],[-124.22833300000002,73.483321999999987],[-124.20916699999998,73.481659000000036],[-124.18998699999997,73.481659000000036],[-124.17304999999999,73.483596999999975],[-124.16055299999999,73.486923000000047],[-124.07000699999998,73.546097000000088],[-124.041946,73.582214000000079],[-124.03888699999993,73.586929000000112],[-124.07167099999998,73.61775200000011],[-124.0786129999999,73.622756999999979],[-124.07611099999991,73.643051000000071],[-124.073059,73.649155000000121],[-124.06777999999991,73.654709000000139],[-124.05526700000001,73.658034999999984],[-123.94554099999993,73.681656000000032],[-123.86138899999997,73.695815999999979],[-123.83389299999999,73.700272000000041],[-123.774719,73.764435000000105],[-123.80471799999987,73.796936000000017],[-123.83833300000003,73.821106000000043],[-123.84777800000001,73.825271999999927],[-123.93639399999995,73.840546000000018],[-123.95834399999995,73.841369999999984],[-123.98055999999991,73.840820000000122],[-124.01999699999999,73.838318000000072],[-124.06639100000001,73.839432000000045],[-124.08583099999998,73.841094999999996],[-124.13417099999992,73.848327999999981],[-124.16306299999985,73.854156000000103],[-124.19860799999992,73.864699999999971],[-124.21749899999986,73.872757000000092],[-124.36860699999988,74.014435000000049],[-124.41166699999991,74.056366000000025],[-124.42666600000001,74.109711000000118],[-124.43415800000002,74.134430000000066],[-124.600281,74.268326000000059],[-124.61805699999996,74.26638800000012],[-124.66082799999992,74.264708999999925],[-124.68083200000001,74.266098000000113],[-124.69304699999986,74.269440000000031],[-124.77500900000001,74.319152999999972],[-124.78415699999999,74.329987000000074],[-124.781387,74.336104999999975],[-124.77084400000001,74.340271000000087],[-124.75556899999992,74.342758000000003],[-124.69722000000002,74.347214000000065],[-124.40471600000001,74.369141000000127],[-124.10861199999999,74.392761000000121],[-123.89527899999996,74.396378000000084],[-123.85694899999987,74.399429000000112],[-123.676941,74.418320000000108],[-123.63834399999996,74.421371000000136],[-123.57444800000002,74.424149000000114],[-123.41887700000001,74.428314000000114],[-123.20584100000002,74.443039000000056],[-123.02250700000002,74.444702000000007],[-122.68998699999992,74.453872999999987],[-122.43804899999998,74.464995999999928],[-122.33750900000001,74.471099999999979],[-122.118607,74.49192800000003],[-122.06610099999995,74.49803200000008],[-121.93859900000001,74.518326000000002],[-121.76666299999999,74.539703000000031],[-121.73000299999995,74.543319999999994],[-121.65194699999995,74.548598999999967],[-121.61028299999992,74.550537000000134],[-121.56416300000001,74.551086000000055],[-121.51862299999993,74.548874000000012],[-121.31082200000003,74.531661999999983],[-121.25361599999997,74.525818000000129],[-121.13612399999994,74.506943000000035],[-121.08389299999993,74.493590999999981],[-121.05777,74.486649000000057],[-121.01112399999988,74.472214000000122],[-121.00222799999995,74.46775800000006],[-120.98998999999998,74.458037999999988],[-120.98055999999991,74.447479000000101],[-120.97693599999991,74.441925000000083],[-120.97556299999991,74.429703000000131],[-120.90638699999994,74.415268000000026],[-120.70584100000002,74.373596000000134],[-120.48166700000002,74.329987000000074],[-120.21721599999989,74.282486000000006],[-120.14998600000001,74.272491000000059]],[[-97.652785999999992,74.455826000000059],[-97.675551999999982,74.454987000000131],[-97.691939999999988,74.455261000000064],[-97.708892999999989,74.457214000000022],[-97.777221999999995,74.476379000000122],[-97.789444000000003,74.479980000000012],[-97.792495999999915,74.485809000000017],[-97.781386999999995,74.497208000000114],[-97.768616000000009,74.508041000000105],[-97.761672999999917,74.512496999999996],[-97.753890999999953,74.515548999999965],[-97.618057000000022,74.552200000000028],[-97.532227000000034,74.606369000000086],[-97.513625999999988,74.611374000000126],[-97.470001000000025,74.621094000000028],[-97.445830999999998,74.626082999999994],[-97.422774999999945,74.629424999999912],[-97.406951999999933,74.62831100000011],[-97.389724999999999,74.626373000000001],[-97.368056999999965,74.622756999999979],[-97.357772999999952,74.621368000000132],[-97.291381999999942,74.605255000000113],[-97.267226999999934,74.597214000000008],[-97.261672999999917,74.594711000000075],[-97.256957999999997,74.590546000000074],[-97.261948000000018,74.583878000000084],[-97.299987999999871,74.551376000000062],[-97.376098999999954,74.511658000000068],[-97.387511999999958,74.506377999999984],[-97.606383999999991,74.461929000000055],[-97.652785999999992,74.455826000000059]],[[-95.311110999999983,74.497757000000092],[-95.331389999999999,74.496093999999971],[-95.353332999999964,74.496368000000075],[-95.458892999999989,74.49859600000002],[-95.480559999999912,74.5],[-95.522781000000009,74.504990000000078],[-95.603057999999919,74.515548999999965],[-95.661666999999966,74.523605000000032],[-95.697768999999937,74.529709000000025],[-95.71665999999999,74.533874999999966],[-95.809432999999956,74.554427999999973],[-95.845000999999968,74.563873000000058],[-95.862212999999997,74.56999200000007],[-95.866394000000014,74.574158000000011],[-95.860549999999989,74.579163000000051],[-95.857497999999964,74.580551000000128],[-95.682495000000017,74.634995000000004],[-95.653885000000002,74.642211999999915],[-95.638061999999991,74.643326000000116],[-95.624161000000015,74.641662999999994],[-95.628601000000003,74.640823000000125],[-95.517501999999922,74.630264000000068],[-95.497498000000007,74.627197000000137],[-95.441101000000003,74.613876000000005],[-95.403609999999958,74.603316999999947],[-95.334441999999967,74.580825999999945],[-95.317779999999971,74.573883000000137],[-95.291945999999939,74.560257000000036],[-95.260283999999956,74.540543000000071],[-95.25111400000003,74.53414900000007],[-95.244995000000017,74.527771000000087],[-95.246383999999978,74.521652000000074],[-95.25111400000003,74.516098000000056],[-95.259170999999981,74.510544000000095],[-95.271117999999944,74.505554000000018],[-95.289443999999946,74.501389000000017],[-95.311110999999983,74.497757000000092]],[[-97.175827000000027,75.24414100000007],[-97.194442999999978,75.242752000000053],[-97.216110000000015,75.24470500000001],[-97.225006000000008,75.24803199999991],[-97.231948999999929,75.254440000000045],[-97.27806099999998,75.343597000000102],[-97.275283999999999,75.347487999999998],[-97.258056999999951,75.349426000000108],[-97.208617999999944,75.342209000000025],[-97.190551999999968,75.33526599999999],[-97.161666999999852,75.322220000000073],[-97.153060999999923,75.315262000000075],[-97.148894999999925,75.297760000000039],[-97.146956999999986,75.27998400000007],[-97.147507000000019,75.273880000000077],[-97.155838000000017,75.255264000000011],[-97.161666999999852,75.250000000000057],[-97.175827000000027,75.24414100000007]],[[-103.9175029999999,75.054977000000008],[-104.22917199999995,75.018051000000071],[-104.261124,75.018326000000116],[-104.45944199999991,75.028869999999984],[-104.662216,75.062485000000038],[-104.84722899999991,75.109146000000067],[-104.85722399999992,75.164703000000031],[-104.82000699999998,75.177765000000022],[-104.79998799999998,75.189423000000033],[-104.79305999999997,75.194702000000063],[-104.74472000000003,75.246093999999971],[-104.76862299999999,75.281937000000028],[-104.71083099999993,75.322220000000073],[-104.68222000000003,75.33776899999998],[-104.67360699999995,75.341660000000047],[-104.49722299999996,75.406372000000033],[-104.42804699999994,75.420821999999987],[-104.37777699999998,75.42804000000001],[-104.33000199999992,75.433043999999938],[-104.18222000000003,75.435531999999967],[-104.15177900000003,75.434555000000103],[-104.11416600000001,75.430267000000072],[-103.97112299999998,75.404434000000094],[-103.953056,75.399994000000106],[-103.935272,75.394989000000066],[-103.84805299999999,75.364990000000034],[-103.81054699999993,75.348602000000142],[-103.74166899999994,75.286102000000028],[-103.587219,75.169983000000059],[-103.58306899999997,75.164703000000031],[-103.59028599999999,75.159424000000058],[-103.60888699999992,75.149155000000007],[-103.7302929999999,75.099990999999989],[-103.76390100000003,75.088882000000126],[-103.79943799999995,75.077484000000084],[-103.81777999999997,75.072494999999947],[-103.88999899999999,75.058318999999983],[-103.9175029999999,75.054977000000008]],[[-100.17223399999995,75.601379000000009],[-100.15722700000003,75.589432000000045],[-100.15778399999994,75.584991000000116],[-100.17639200000002,75.57998699999996],[-100.23332199999993,75.569153000000085],[-100.383331,75.553588999999988],[-100.45417800000001,75.546371000000022],[-100.47972099999993,75.545822000000044],[-100.47556299999997,75.549987999999985],[-100.45749699999999,75.554152999999985],[-100.43195299999991,75.55831900000004],[-100.40666199999987,75.561370999999951],[-100.36110699999995,75.565535999999952],[-100.31777999999986,75.573043999999982],[-100.30332900000002,75.577484000000027],[-100.29361,75.584427000000005],[-100.30332900000002,75.58859300000006],[-100.31973299999999,75.590820000000122],[-100.33917199999996,75.591369999999984],[-100.36332699999997,75.59027100000003],[-100.52778599999994,75.577208999999982],[-100.74973299999994,75.558029000000033],[-100.86527999999998,75.547211000000061],[-100.88555899999994,75.545822000000044],[-100.90862300000003,75.546371000000022],[-100.950287,75.549713000000111],[-100.99445300000002,75.554977000000122],[-101.02333099999993,75.559981999999991],[-101.03333299999997,75.563034000000073],[-101.03943600000002,75.567215000000147],[-101.02583299999998,75.570540999999992],[-100.84277299999991,75.586929000000055],[-100.70249899999993,75.588882000000012],[-100.68055699999996,75.589432000000045],[-100.65583800000002,75.59165999999999],[-100.64167800000001,75.596100000000035],[-100.62027,75.606094000000041],[-100.59861799999999,75.610259999999926],[-100.51112399999994,75.61914100000007],[-100.39444700000001,75.623031999999967],[-100.27639799999997,75.623031999999967],[-100.23500099999995,75.623031999999967],[-100.21777299999997,75.621917999999994],[-100.204453,75.617477000000065],[-100.19499200000001,75.613312000000064],[-100.17223399999995,75.601379000000009]],[[-94.363892000000021,75.590820000000122],[-94.326950000000011,75.579711999999972],[-94.243880999999931,75.549713000000111],[-94.205275999999913,75.529709000000025],[-94.010283999999956,75.442200000000071],[-93.989715999999987,75.434982000000105],[-93.839721999999938,75.388046000000031],[-93.742492999999968,75.364426000000094],[-93.499160999999958,75.264709000000096],[-93.487502999999947,75.256653000000028],[-93.493331999999953,75.247207999999944],[-93.529175000000009,75.176376000000062],[-93.488892000000021,75.072494999999947],[-93.434157999999968,74.966385000000002],[-93.406386999999995,74.883605999999986],[-93.458053999999947,74.714996000000099],[-93.462508999999955,74.708602999999925],[-93.467772999999966,74.703048999999965],[-93.484726000000023,74.687759000000142],[-93.49610899999999,74.68193100000002],[-93.530563000000029,74.667755000000056],[-93.563323999999966,74.659424000000115],[-93.691665999999941,74.63998400000014],[-93.717223999999874,74.636932000000058],[-93.741378999999995,74.635543999999982],[-94.040282999999988,74.640823000000125],[-94.249999999999886,74.646378000000027],[-94.388061999999991,74.635269000000108],[-94.471114999999884,74.626648000000046],[-94.511947999999961,74.623306000000071],[-94.547500999999897,74.621368000000132],[-94.643340999999964,74.623596000000077],[-94.687774999999931,74.62831100000011],[-95.024718999999948,74.673035000000084],[-95.080001999999979,74.680817000000047],[-95.085830999999985,74.687195000000031],[-95.076949999999954,74.697479000000044],[-95.072783999999956,74.702209000000096],[-95.104445999999996,74.744141000000127],[-95.266402999999912,74.793319999999937],[-95.283324999999991,74.79803499999997],[-95.298339999999996,74.800262000000032],[-95.403335999999911,74.803863999999976],[-95.434158000000025,74.801376000000005],[-95.457503999999972,74.798324999999977],[-95.479172000000005,74.78804000000008],[-95.483062999999902,74.783325000000048],[-95.482772999999952,74.779433999999981],[-95.475554999999986,74.769989000000066],[-95.462219000000005,74.756653000000142],[-95.547226000000023,74.761107999999979],[-95.625823999999909,74.807480000000055],[-95.705565999999976,74.829987000000131],[-95.740828999999906,74.82388300000008],[-95.771392999999932,74.823608000000092],[-95.864166000000012,74.826096000000064],[-95.959473000000003,74.856369000000029],[-96.002501999999879,74.872757000000092],[-96.006667999999934,74.876923000000147],[-96.077224999999942,74.902771000000087],[-96.135283999999899,74.951096000000121],[-96.141678000000013,74.957214000000079],[-96.136948000000018,74.963043000000084],[-96.124709999999936,74.975815000000068],[-96.094726999999978,74.991364000000033],[-96.070847000000015,75.001938000000052],[-96.056380999999988,75.010268999999937],[-96.055557000000022,75.016097999999943],[-96.060546999999985,75.019440000000088],[-96.07417299999986,75.023605000000089],[-96.083068999999966,75.024429000000055],[-96.142226999999991,75.017761000000064],[-96.147507000000019,75.013611000000083],[-96.200835999999924,74.954712000000029],[-96.203339000000028,74.951660000000061],[-96.20666499999993,74.943038999999999],[-96.203887999999949,74.93691999999993],[-96.205840999999964,74.92025799999999],[-96.209732000000031,74.915543000000127],[-96.221389999999985,74.910263000000043],[-96.247771999999884,74.90554800000001],[-96.268341000000021,74.903870000000097],[-96.31527699999998,74.90248100000008],[-96.337219000000005,74.903595000000053],[-96.357497999999964,74.906647000000021],[-96.373610999999983,74.910263000000043],[-96.387221999999952,74.914703000000088],[-96.396666999999923,74.919708000000128],[-96.40306099999998,74.925812000000121],[-96.386123999999995,74.97387700000013],[-96.357497999999964,74.97137500000008],[-96.341385000000002,74.972487999999998],[-96.328063999999983,74.974701000000096],[-96.320557000000008,74.979430999999977],[-96.318343999999968,74.982208000000071],[-96.322234999999864,75.001389000000074],[-96.331115999999895,75.004715000000147],[-96.476669000000015,75.004440000000102],[-96.500838999999928,75.002777000000037],[-96.523055999999997,74.999145999999939],[-96.533889999999985,74.994705000000067],[-96.55972300000002,74.986098999999967],[-96.580291999999986,74.98414600000001],[-96.599990999999989,74.983322000000044],[-96.614165999999955,74.984984999999938],[-96.616942999999992,74.991088999999988],[-96.604720999999984,75.063309000000004],[-96.571395999999936,75.101089000000115],[-96.463057999999933,75.19331399999993],[-96.456389999999999,75.196930000000009],[-96.378600999999946,75.21665999999999],[-96.077788999999996,75.272491000000059],[-95.948043999999982,75.283325000000104],[-95.922500999999954,75.286102000000028],[-95.903335999999911,75.289978000000076],[-95.910552999999936,75.29525799999999],[-95.934433000000013,75.297211000000118],[-95.978058000000033,75.298874000000012],[-96.026671999999962,75.299149000000057],[-96.049987999999928,75.296936000000073],[-96.061935000000005,75.315262000000075],[-96.003615999999965,75.343047999999953],[-95.932494999999903,75.353043000000071],[-95.934714999999983,75.350173999999981],[-95.93472300000002,75.347762999999986],[-95.919998000000021,75.34693900000002],[-95.890288999999996,75.349152000000004],[-95.887443999999959,75.360268000000133],[-95.83677699999987,75.369926000000021],[-95.830780000000004,75.371429000000035],[-95.829781000000025,75.372589000000119],[-95.83061199999986,75.374428000000023],[-95.832786999999939,75.375923000000114],[-95.848274000000004,75.378432999999973],[-95.906775999999979,75.387428000000057],[-95.927779999999871,75.398041000000148],[-96.033324999999934,75.40109300000006],[-96.055267000000015,75.400818000000072],[-96.078887999999893,75.396103000000039],[-96.079178000000013,75.391098],[-96.083618000000001,75.385543999999982],[-96.099730999999963,75.380264000000125],[-96.126099000000011,75.37692300000009],[-96.151108000000022,75.374984999999924],[-96.175277999999992,75.379424999999969],[-96.178878999999995,75.384430000000009],[-96.161941999999954,75.395537999999988],[-96.14973399999991,75.400818000000072],[-96.135009999999966,75.406372000000033],[-96.095839999999896,75.417755000000056],[-96.0625,75.424988000000099],[-95.974166999999966,75.436096000000077],[-95.958344000000011,75.436371000000065],[-95.93638599999997,75.43414300000012],[-95.874160999999958,75.423874000000069],[-95.831046999999955,75.41531400000008],[-95.832549999999969,75.413651000000129],[-95.83322099999998,75.409988000000112],[-95.831046999999955,75.406982000000085],[-95.825881999999979,75.403320000000122],[-95.814383999999961,75.400322000000074],[-95.769553999999857,75.400322000000074],[-95.691100999999946,75.40525800000006],[-95.682495000000017,75.408324999999991],[-95.676102000000014,75.415817000000118],[-95.678328999999962,75.421920999999998],[-95.68472300000002,75.428314000000114],[-95.691665999999998,75.429703000000131],[-95.715835999999911,75.429153000000099],[-95.734160999999915,75.426085999999998],[-95.758620999999948,75.42553700000002],[-95.781677000000002,75.42804000000001],[-95.800551999999925,75.431656000000032],[-95.825011999999958,75.439972000000125],[-95.830001999999922,75.4433140000001],[-95.836945000000014,75.453598000000113],[-95.83805799999999,75.459152000000074],[-95.835555999999997,75.464431999999988],[-95.832229999999981,75.470535000000098],[-95.824172999999973,75.477767999999912],[-95.800551999999925,75.49136400000009],[-95.762222000000008,75.508041000000048],[-95.749725000000012,75.513321000000133],[-95.470000999999968,75.566939999999988],[-95.275283999999942,75.599426000000051],[-95.264175000000023,75.59387200000009],[-95.234436000000017,75.584717000000012],[-95.212783999999999,75.582489000000066],[-95.178604000000007,75.584427000000005],[-95.12470999999988,75.59526100000005],[-95.104172000000005,75.60026600000009],[-95.093338000000017,75.603591999999992],[-95.085830999999985,75.607208000000014],[-95.084166999999979,75.609146000000123],[-95.075286999999946,75.614426000000037],[-95.063323999999909,75.618866000000025],[-95.044448999999872,75.62164300000012],[-94.917769999999962,75.637207000000046],[-94.901672000000019,75.637497000000053],[-94.741378999999938,75.62414600000011],[-94.559722999999963,75.612488000000099],[-94.511123999999995,75.611099000000081],[-94.46556099999998,75.608321999999987],[-94.404175000000009,75.599152000000117],[-94.363892000000021,75.590820000000122]],[[-95.910003999999901,75.560256999999979],[-95.911117999999988,75.554152999999985],[-95.93472300000002,75.540543000000071],[-96.170837000000006,75.458038000000101],[-96.220276000000013,75.455551000000071],[-96.238892000000021,75.456650000000025],[-96.255004999999983,75.461380000000077],[-96.399170000000026,75.516388000000063],[-96.417220999999984,75.523315000000139],[-96.42471299999994,75.528595000000053],[-96.450995999999975,75.529991000000052],[-96.441161999999963,75.535987999999975],[-96.415832999999907,75.543648000000132],[-96.412659000000019,75.546150000000011],[-96.411666999999909,75.548819999999978],[-96.417992000000027,75.552658000000065],[-96.431167999999957,75.555489000000023],[-96.441832999999974,75.555664000000093],[-96.450995999999975,75.553154000000063],[-96.503837999999917,75.535156000000029],[-96.507995999999935,75.532982000000118],[-96.518165999999951,75.526320999999996],[-96.525161999999909,75.519325000000038],[-96.553603999999893,75.508880999999917],[-96.552215999999987,75.503326000000015],[-96.549437999999896,75.497208000000114],[-96.545546999999999,75.492203000000075],[-96.541107000000011,75.488037000000134],[-96.533324999999934,75.48275799999999],[-96.517501999999922,75.478043000000127],[-96.503341999999975,75.471374999999966],[-96.500564999999995,75.464996000000099],[-96.50418099999996,75.460266000000104],[-96.511948000000018,75.455826000000059],[-96.65834000000001,75.388596000000064],[-96.833617999999944,75.352478000000019],[-96.851104999999905,75.350266000000147],[-96.862212999999997,75.350815000000125],[-96.876098999999954,75.353591999999992],[-96.93249499999996,75.376082999999994],[-97.030838000000017,75.454437000000041],[-97.053054999999915,75.492203000000075],[-97.053054999999915,75.497208000000114],[-97.006957999999941,75.508331000000112],[-96.940825999999959,75.521652000000017],[-96.913619999999923,75.526382000000069],[-96.891677999999956,75.529160000000047],[-96.666945999999996,75.552765000000022],[-96.469382999999993,75.588425000000029],[-96.466552999999919,75.591933999999924],[-96.467727999999909,75.599091000000044],[-96.470054999999888,75.602264000000048],[-96.422500999999954,75.623596000000077],[-96.424438000000009,75.635544000000095],[-96.415008999999941,75.646941999999967],[-96.396392999999989,75.649994000000049],[-96.379715000000033,75.651093000000003],[-96.347228999999913,75.651382000000126],[-96.335555999999997,75.650818000000015],[-96.314437999999996,75.647766000000104],[-96.241104000000007,75.629974000000061],[-96.133330999999941,75.606644000000074],[-96.115829000000019,75.60386699999998],[-96.101944000000003,75.603591999999992],[-96.025436000000013,75.602844000000061],[-95.95777899999996,75.583603000000039],[-95.938889000000017,75.577484000000027],[-95.923888999999974,75.571655000000021],[-95.916397000000018,75.566375999999991],[-95.910003999999901,75.560256999999979]],[[-96.954453000000001,75.595534999999984],[-96.975005999999894,75.594711000000018],[-96.996658000000025,75.597762999999929],[-97.005004999999983,75.604431000000091],[-97.001953000000015,75.610809000000074],[-96.988601999999958,75.618042000000059],[-96.978607000000011,75.623031999999967],[-96.960830999999985,75.627472000000125],[-96.779449,75.6602630000001],[-96.751952999999958,75.664703000000088],[-96.729720999999984,75.665267999999969],[-96.720551,75.66415399999994],[-96.715835999999967,75.659988000000055],[-96.718886999999995,75.653870000000097],[-96.722305000000006,75.652954000000022],[-96.740279999999927,75.646941999999967],[-96.849166999999966,75.613312000000064],[-96.954453000000001,75.595534999999984]],[[-96.579177999999899,75.736923000000104],[-96.696655000000021,75.730819999999994],[-96.710555999999997,75.733597000000088],[-96.717223999999987,75.739700000000028],[-96.67860399999995,75.777481000000023],[-96.666945999999996,75.786652000000117],[-96.660827999999981,75.789429000000041],[-96.541107000000011,75.822219999999959],[-96.525283999999942,75.826384999999959],[-96.507506999999976,75.828323000000125],[-96.48443599999996,75.827208999999925],[-96.468062999999916,75.822495000000004],[-96.455841000000021,75.817764000000068],[-96.457503999999972,75.801085999999998],[-96.459166999999979,75.789429000000041],[-96.539718999999991,75.74331699999999],[-96.553603999999893,75.738586000000055],[-96.579177999999899,75.736923000000104]],[[-111.79998799999998,75.839157],[-111.823624,75.83859300000006],[-111.86582899999996,75.840545999999961],[-111.900284,75.843596999999988],[-111.91722099999993,75.846939000000134],[-111.92250100000001,75.852767999999969],[-111.91972399999997,75.85775799999999],[-111.90139799999997,75.863876000000118],[-111.85665899999992,75.867751999999996],[-111.79972799999996,75.871093999999971],[-111.61305199999993,75.881927000000132],[-111.59528399999999,75.882751000000098],[-111.58306899999991,75.881927000000132],[-111.5786129999999,75.879974000000004],[-111.58194699999996,75.876083000000108],[-111.59306300000003,75.87303200000008],[-111.62917299999992,75.856934000000024],[-111.64806399999998,75.851928999999984],[-111.75695799999994,75.841659999999933],[-111.79998799999998,75.839157]],[[-122.34084300000001,75.862761999999975],[-122.36277799999999,75.858032000000094],[-122.39862099999993,75.859421000000111],[-122.66471899999993,75.89387499999998],[-122.69167299999998,75.900269000000037],[-122.69360399999999,75.902206000000035],[-122.69554099999993,75.908035000000041],[-122.68277,75.911652000000004],[-122.633331,75.919708000000071],[-122.58222999999998,75.921921000000054],[-122.53751399999993,75.922484999999995],[-122.37917299999992,75.915817000000004],[-122.35305800000003,75.914429000000098],[-122.337784,75.911377000000016],[-122.32833900000003,75.905822999999998],[-122.32417299999997,75.899719000000005],[-122.33473200000003,75.869141000000013],[-122.34084300000001,75.862761999999975]],[[-121.09306299999997,75.726089000000059],[-121.1100009999999,75.724700999999982],[-121.14306599999992,75.725815000000125],[-121.27555799999993,75.747481999999991],[-121.28832999999997,75.752777000000037],[-121.28582799999998,75.758881000000088],[-121.27194199999997,75.770537999999988],[-121.26306199999993,75.774154999999951],[-121.11694299999999,75.795821999999987],[-121.04332699999992,75.808868000000132],[-121.02944899999989,75.811371000000122],[-121.01917299999997,75.818054000000075],[-121.01500699999997,75.824707000000046],[-121.00083899999993,75.856644000000017],[-120.99833699999988,75.867751999999996],[-121.00695799999988,75.879700000000071],[-121.01363399999997,75.884720000000073],[-121.04222099999998,75.894149999999968],[-121.04750099999995,75.899993999999992],[-121.04250299999995,75.90554800000001],[-121.03859699999998,75.908325000000104],[-120.997772,75.926376000000062],[-120.98000300000001,75.929427999999973],[-120.87777699999998,75.936096000000134],[-120.86776700000001,75.924698000000149],[-120.86776700000001,75.913315000000125],[-120.86972000000003,75.881087999999977],[-120.87110899999993,75.87553400000013],[-120.88474300000001,75.844986000000006],[-120.89835399999998,75.825821000000019],[-120.92111199999999,75.803314000000114],[-120.93804899999998,75.790543000000014],[-120.99388099999993,75.757767000000115],[-121.01862299999993,75.744431000000134],[-121.03278399999994,75.737762000000089],[-121.05248999999992,75.732758000000103],[-121.09306299999997,75.726089000000059]],[[-95.792769999999962,75.899719000000005],[-95.809432999999956,75.894714000000135],[-95.818893000000003,75.907211000000075],[-95.825561999999991,75.913315000000125],[-95.847777999999892,75.929427999999973],[-95.862503000000004,75.936096000000134],[-95.882492000000013,75.941086000000041],[-95.896956999999986,75.947753999999975],[-95.899993999999992,75.953873000000044],[-95.890839000000028,75.959427000000005],[-95.860001000000011,75.966660000000047],[-95.796660999999972,75.973312000000078],[-95.770554000000004,75.974991000000102],[-95.746947999999918,75.97387700000013],[-95.73582499999992,75.968323000000112],[-95.736938000000009,75.962494000000106],[-95.751952999999958,75.927475000000072],[-95.761947999999961,75.916092000000049],[-95.779723999999931,75.90498400000007],[-95.792769999999962,75.899719000000005]],[[-94.405563000000029,75.75082400000008],[-94.582778999999903,75.74581900000004],[-94.629165999999998,75.746094000000085],[-94.676102000000014,75.747756999999979],[-94.72084000000001,75.753876000000048],[-94.739440999999999,75.75749200000007],[-94.777495999999928,75.768600000000049],[-94.795272999999952,75.775818000000072],[-94.809157999999968,75.782486000000063],[-94.822234999999978,75.794144000000074],[-94.898894999999925,75.912765999999976],[-94.902785999999992,75.919434000000138],[-94.905272999999966,75.925537000000077],[-94.906112999999948,75.93081699999999],[-94.904449,75.9369200000001],[-94.89527899999996,75.942200000000014],[-94.879989999999964,75.945526000000029],[-94.865554999999972,75.947478999999987],[-94.813613999999973,75.950546000000088],[-94.737777999999992,75.952208999999982],[-94.699722000000008,75.955551000000128],[-94.53832999999986,75.986099000000081],[-94.481948999999929,75.974426000000051],[-94.466948999999886,75.968597000000045],[-94.453338999999914,75.961929000000112],[-94.449721999999952,75.955261000000121],[-94.443603999999993,75.938309000000118],[-94.420272999999952,75.868590999999981],[-94.410277999999948,75.86192299999999],[-94.370833999999945,75.842209000000082],[-94.322234999999978,75.814986999999974],[-94.305557000000022,75.80304000000001],[-94.287780999999939,75.783875000000023],[-94.288054999999986,75.777481000000023],[-94.291381999999999,75.772217000000012],[-94.296950999999979,75.766388000000006],[-94.310271999999941,75.761383000000137],[-94.326400999999976,75.757217000000082],[-94.353881999999942,75.753876000000048],[-94.405563000000029,75.75082400000008]],[[-103.137787,75.74275200000011],[-103.20667300000002,75.74275200000011],[-103.3011019999999,75.744705000000067],[-103.32389799999999,75.747208000000057],[-103.36888099999999,75.753876000000048],[-103.38082899999995,75.759430000000009],[-103.382767,75.765549000000021],[-103.31139399999995,75.805252000000053],[-103.07749899999999,75.890823000000069],[-103.05943300000001,75.896378000000141],[-103.03751399999993,75.901657000000114],[-103.01194799999996,75.906097000000102],[-102.98693800000001,75.909424000000058],[-102.69611399999997,75.946640000000002],[-102.59889199999986,75.953598],[-102.52278099999995,75.958038000000045],[-102.43360899999999,75.964157000000057],[-102.291382,75.977203000000145],[-102.21749899999998,75.985535000000141],[-102.19138299999997,75.989699999999971],[-102.16471899999993,75.99054000000001],[-102.07861300000002,75.97137500000008],[-101.98916599999995,75.950821000000076],[-101.98332199999987,75.945816000000036],[-101.98860200000001,75.934418000000051],[-102.020554,75.925537000000077],[-102.09472700000003,75.911652000000004],[-102.14639299999993,75.903320000000008],[-102.19638099999997,75.899719000000005],[-102.29638699999998,75.894989000000123],[-102.31916799999999,75.893051000000014],[-102.34665699999999,75.889434999999935],[-102.39417299999997,75.880814000000044],[-102.43055699999991,75.869979999999998],[-102.44082600000002,75.86442599999998],[-102.44943199999994,75.85832199999993],[-102.45584099999996,75.852478000000133],[-102.46000699999996,75.847214000000122],[-102.47165699999988,75.818329000000062],[-102.48277300000001,75.806366000000025],[-102.49694799999992,75.79553199999998],[-102.50917099999998,75.789429000000041],[-102.54527300000001,75.779709000000139],[-102.59028599999994,75.770537999999988],[-102.61165599999998,75.767211999999972],[-102.636124,75.764708999999982],[-102.86638599999998,75.753601000000003],[-103.015289,75.747208000000057],[-103.137787,75.74275200000011]],[[-122.81916799999999,76.06053200000008],[-122.78056300000003,76.057205000000124],[-122.68776700000001,76.059982000000048],[-122.66194200000001,76.05693100000002],[-122.64277599999997,76.052475000000129],[-122.63082900000001,76.046646000000123],[-122.72501399999987,76.023605000000089],[-122.88194299999998,76.011108000000092],[-122.89250199999998,76.013611000000026],[-122.89611799999994,76.026931999999988],[-122.89222699999999,76.031096999999988],[-122.85082999999997,76.057205000000124],[-122.81916799999999,76.06053200000008]],[[-102.38999899999993,76.083603000000096],[-102.37554899999998,76.079163000000108],[-102.37138399999998,76.079163000000108],[-102.36805699999996,76.077209000000096],[-102.3563769999999,76.075820999999962],[-102.35333300000002,76.073883000000023],[-102.33889799999997,76.069443000000035],[-102.33249699999999,76.065536000000066],[-102.32167099999998,76.053589000000102],[-102.31639100000001,76.036925999999994],[-102.31889299999989,76.031096999999988],[-102.319458,76.024704000000042],[-102.32972699999993,76.015823000000125],[-102.34388699999994,76.010269000000108],[-102.36582900000002,76.005829000000119],[-102.41665599999999,76.000275000000101],[-102.51722699999993,75.991088999999988],[-102.56777999999991,75.985535000000141],[-102.695267,75.973312000000078],[-102.71472199999988,75.97026100000005],[-102.73972299999997,75.968048000000124],[-102.79055800000003,75.961380000000133],[-102.81139399999995,75.959990999999945],[-102.93611099999998,75.94802900000002],[-103.01027699999997,75.943038999999942],[-103.08528099999995,75.935806000000127],[-103.15695199999993,75.925812000000121],[-103.21888699999994,75.920258000000103],[-103.26500699999997,75.914429000000098],[-103.28943600000002,75.913040000000137],[-103.33944700000001,75.908035000000041],[-103.37998999999996,75.906097000000102],[-103.39639299999993,75.904434000000037],[-103.43305999999995,75.903320000000008],[-103.45333899999997,75.901657000000114],[-103.52443699999998,75.89888000000002],[-103.59277299999997,75.897217000000069],[-103.61332700000003,75.895538000000101],[-103.63474300000001,75.891098000000056],[-103.65556300000003,75.888596000000007],[-103.69972199999989,75.887496999999996],[-103.72332799999987,75.889160000000118],[-103.77111799999994,75.896378000000141],[-103.81166100000002,75.899428999999941],[-103.88806199999993,75.898041000000035],[-103.90194700000001,75.898604999999975],[-103.91471899999993,75.90248100000008],[-103.91500899999994,75.907760999999937],[-103.91722099999993,75.913605000000132],[-103.92555199999998,75.919144000000131],[-103.93611099999998,75.924149],[-103.96472199999999,75.934418000000051],[-103.97165699999994,75.938309000000118],[-103.94220699999994,75.942749000000106],[-103.90194700000001,75.943862999999908],[-103.82556199999999,75.950821000000076],[-103.80248999999998,75.953873000000044],[-103.78527799999995,75.957489000000066],[-103.77139299999988,75.963043000000084],[-103.75834700000001,75.966660000000047],[-103.7083439999999,75.972488000000112],[-103.68776699999989,75.97387700000013],[-103.598343,75.977203000000145],[-103.57444799999996,75.976654000000053],[-103.55471799999998,75.975266000000147],[-103.52250699999991,75.97554000000008],[-103.49694799999997,75.979980000000069],[-103.474716,75.985259999999982],[-103.45694700000001,75.990814000000114],[-103.41306299999997,76.001663000000008],[-103.39138800000001,76.006104000000107],[-103.36582899999996,76.009429999999952],[-103.34028599999988,76.013884999999959],[-103.31500199999999,76.017212000000086],[-103.29028299999999,76.018599999999992],[-103.26363399999997,76.019440000000088],[-103.22138999999993,76.019150000000025],[-103.196663,76.020537999999988],[-103.17887899999999,76.024994000000049],[-103.15666199999993,76.036652000000061],[-103.13667299999992,76.041656000000046],[-103.120003,76.043320000000051],[-103.05110200000001,76.043593999999985],[-103.00639299999995,76.044707999999957],[-102.98110999999989,76.04693600000013],[-102.95556599999998,76.050261999999975],[-102.91555800000003,76.060257000000092],[-102.88971700000002,76.064423000000147],[-102.86833199999995,76.066940000000045],[-102.86028299999992,76.066666000000112],[-102.85582699999992,76.067764000000011],[-102.75666799999993,76.073044000000095],[-102.708618,76.077484000000084],[-102.68138099999999,76.079163000000108],[-102.65805099999994,76.082214000000135],[-102.60777299999995,76.085814999999968],[-102.53138699999994,76.089431999999931],[-102.46806300000003,76.090271000000087],[-102.42804699999999,76.089431999999931],[-102.40416699999997,76.087769000000037],[-102.39639299999999,76.086655000000064],[-102.38999899999993,76.083603000000096]],[[-118.31639100000001,75.57249500000006],[-118.35472099999993,75.558868000000018],[-118.58306900000002,75.499419999999986],[-118.60472099999998,75.496368000000075],[-118.7036129999999,75.503052000000082],[-118.72250400000001,75.504440000000045],[-118.82749899999999,75.532761000000107],[-118.87361099999998,75.547484999999995],[-118.87777699999998,75.553314],[-118.92804699999999,75.562759000000085],[-118.95305599999995,75.564697000000024],[-119.08194700000001,75.567764000000125],[-119.13082900000001,75.566939999999988],[-119.19695299999995,75.562484999999924],[-119.22250400000001,75.565262000000018],[-119.34028599999999,75.579436999999928],[-119.36749299999991,75.58415199999996],[-119.38333099999994,75.589157000000057],[-119.39527899999996,75.594711000000018],[-119.40583800000002,75.600540000000024],[-119.408051,75.605820000000108],[-119.40471600000001,75.611923000000047],[-119.39750700000002,75.618317000000104],[-119.37554899999998,75.631088000000034],[-119.27528399999994,75.674698000000035],[-119.18831599999987,75.702484000000084],[-119.11389200000002,75.720535000000041],[-118.95472699999999,75.778594999999996],[-118.78888699999999,75.843048000000067],[-118.762787,75.856934000000024],[-118.75834699999996,75.862198000000035],[-118.75334199999992,75.866379000000109],[-118.71694899999994,75.882751000000098],[-118.61916399999996,75.915543000000071],[-118.58139,75.924987999999985],[-118.56388899999996,75.928589000000045],[-118.40444899999994,75.960815000000082],[-118.36776699999996,75.966385000000002],[-118.34028599999999,75.967484000000013],[-118.19415300000003,75.967484000000013],[-118.16832699999998,75.968323000000112],[-118.15222199999994,75.97137500000008],[-118.13751200000002,75.979705999999965],[-118.13137799999998,75.985535000000141],[-118.13137799999998,75.991363999999976],[-118.12748699999992,75.997482000000105],[-118.10500299999995,76.023880000000077],[-118.08860800000002,76.029434000000094],[-118.07140400000003,76.034149000000127],[-118.03751399999987,76.038315000000011],[-117.99804699999993,76.039978000000133],[-117.95722999999992,76.043045000000063],[-117.93360899999993,76.047485000000052],[-117.89972699999998,76.057479999999998],[-117.88971699999996,76.060806000000014],[-117.88500999999997,76.066086000000098],[-117.89138799999995,76.072220000000129],[-117.89277600000003,76.077484000000084],[-117.88612399999988,76.079712000000029],[-117.77887699999991,76.108597000000088],[-117.72609699999998,76.115540000000067],[-117.70694700000001,76.117203000000018],[-117.662216,76.117751999999939],[-117.64111299999996,76.116652999999985],[-117.62304699999999,76.114426000000094],[-117.51944700000001,76.099716000000001],[-117.49166899999989,76.094986000000119],[-117.47138999999993,76.088882000000069],[-117.46389799999997,76.083054000000004],[-117.48916600000001,76.04693600000013],[-117.57305899999994,75.981934000000081],[-117.681107,75.921097000000088],[-117.70445299999989,75.916930999999977],[-117.74694799999997,75.910812000000135],[-117.77555799999993,75.89888000000002],[-117.83833299999998,75.859985000000052],[-117.93720999999999,75.785262999999986],[-117.94499199999996,75.77915999999999],[-117.95221700000002,75.771927000000005],[-117.95638999999994,75.765822999999955],[-117.95638999999994,75.75999500000006],[-117.97138999999993,75.728867000000037],[-118.01583899999997,75.699416999999983],[-118.06220999999999,75.685806000000014],[-118.096947,75.678589000000102],[-118.11389200000002,75.673874000000069],[-118.14277599999997,75.663879000000122],[-118.22193900000002,75.633881000000031],[-118.26363400000002,75.616928000000087],[-118.2675089999999,75.61285399999997],[-118.266953,75.609985000000108],[-118.26834099999991,75.59165999999999],[-118.31639100000001,75.57249500000006]],[[-78.926391999999964,75.875809000000004],[-78.914169000000015,75.87303200000008],[-78.904174999999896,75.867203000000075],[-78.881377999999984,75.853317000000061],[-78.876663000000008,75.849152000000061],[-78.879439999999931,75.844147000000021],[-78.897781000000009,75.839706000000092],[-78.921111999999994,75.837494000000049],[-79.048889000000031,75.836928999999998],[-79.067779999999971,75.840271000000143],[-79.072783999999956,75.844437000000028],[-79.068618999999956,75.848328000000095],[-79.05749499999996,75.853317000000061],[-79.042495999999915,75.858032000000094],[-79.021666999999923,75.867477000000008],[-79.031676999999945,75.870819000000097],[-79.05471799999998,75.872757000000036],[-79.268889999999999,75.875259000000142],[-79.319457999999941,75.87359600000002],[-79.343063000000029,75.871093999999971],[-79.361389000000031,75.86692800000003],[-79.408339999999953,75.852767999999969],[-79.420273000000009,75.848038000000088],[-79.428054999999972,75.842484000000127],[-79.458617999999944,75.810806000000071],[-79.598052999999936,75.861374000000069],[-79.620270000000005,75.862761999999975],[-79.705840999999964,75.860535000000084],[-79.726944000000003,75.861099000000024],[-79.739990000000034,75.86442599999998],[-79.752227999999889,75.878586000000098],[-79.580001999999979,75.945251000000042],[-79.567504999999983,75.949142000000109],[-79.396956999999986,76.001938000000052],[-79.375,76.005554000000075],[-79.272780999999952,76.028045999999961],[-79.137786999999946,76.077209000000096],[-79.129714999999976,76.082763999999997],[-79.121932999999956,76.088593000000003],[-79.113051999999925,76.100540000000137],[-79.091384999999889,76.114426000000094],[-79.081954999999994,76.116379000000052],[-78.923888999999974,76.121094000000085],[-78.904174999999896,76.119705000000067],[-78.893065999999976,76.115540000000067],[-78.821670999999924,76.098328000000038],[-78.805832000000009,76.09304800000001],[-78.798049999999876,76.08638000000002],[-78.799164000000019,76.079987000000074],[-78.825835999999924,76.05802900000009],[-78.833892999999989,76.052475000000129],[-78.845551,76.047485000000052],[-78.861389000000031,76.043320000000051],[-78.921660999999915,76.031937000000028],[-78.998610999999983,76.014998999999989],[-79.069732999999928,75.998322000000144],[-79.085007000000019,75.993866000000082],[-79.144729999999981,75.975266000000147],[-79.156112999999948,75.969986000000063],[-79.166655999999932,75.964157000000057],[-79.171936000000017,75.958878000000084],[-79.176392000000021,75.952774000000034],[-79.176940999999943,75.946365000000014],[-79.174437999999952,75.93942300000009],[-79.168335000000013,75.931931000000134],[-79.140288999999939,75.918868999999972],[-79.111938000000009,75.910263000000043],[-79.029449,75.888321000000133],[-79.010284000000013,75.884720000000073],[-78.989440999999943,75.881927000000132],[-78.943603999999993,75.878036000000066],[-78.926391999999964,75.875809000000004]],[[-94.843613000000005,76.122208000000057],[-94.831116000000009,76.09664900000007],[-94.870270000000005,76.068877999999984],[-94.889175000000023,76.05802900000009],[-94.905562999999916,76.05386400000009],[-94.92860399999995,76.051086000000112],[-95.006667999999991,76.047485000000052],[-95.027221999999938,76.047760000000096],[-95.048888999999974,76.050812000000008],[-95.062499999999943,76.056090999999981],[-95.086394999999925,76.068054000000018],[-95.101943999999946,76.07777400000009],[-95.139724999999999,76.107757999999933],[-95.14416499999993,76.111922999999933],[-95.147232000000031,76.116927999999973],[-95.146392999999989,76.118042000000003],[-95.12110899999999,76.118591000000094],[-95.09445199999999,76.113602000000128],[-95.076949999999954,76.108322000000101],[-95.060546999999985,76.105819999999994],[-95.030562999999972,76.104706000000022],[-95.013061999999934,76.105819999999994],[-94.992767000000015,76.109421000000054],[-94.854445999999996,76.136658000000011],[-94.843613000000005,76.122208000000057]],[[-81.327788999999996,76.147217000000012],[-81.338607999999965,76.146378000000084],[-81.452498999999875,76.155822999999941],[-81.462508999999955,76.15887500000008],[-81.456954999999994,76.163605000000075],[-81.415833000000021,76.176926000000037],[-81.378051999999968,76.184417999999994],[-81.348891999999978,76.187485000000095],[-81.294448999999929,76.187759000000028],[-81.267226999999991,76.187759000000028],[-81.221663999999976,76.185531999999967],[-81.203338999999971,76.181091000000038],[-81.201401000000033,76.177765000000022],[-81.208617999999944,76.172211000000004],[-81.306106999999884,76.151093000000117],[-81.327788999999996,76.147217000000012]],[[-102.53083800000002,76.223312000000021],[-102.52722199999994,76.216934000000094],[-102.53138699999994,76.211655000000121],[-102.58056599999986,76.152481000000023],[-102.636124,76.125534000000073],[-102.65055799999999,76.119980000000112],[-102.67138699999998,76.114151000000106],[-102.73665599999998,76.098601999999971],[-102.78056300000003,76.089706000000035],[-102.80638099999999,76.085541000000035],[-102.85777300000001,76.078873000000101],[-102.93360899999999,76.070831000000112],[-103.34221599999995,76.036652000000061],[-103.36472300000003,76.035812000000021],[-103.67999299999997,76.034149000000127],[-103.82000700000003,76.031372000000033],[-103.86638600000003,76.030823000000055],[-103.91443599999997,76.03166200000004],[-103.962219,76.034714000000122],[-103.97277799999995,76.039703000000088],[-103.92388899999997,76.040817000000061],[-103.87832599999996,76.043869000000029],[-103.86945299999996,76.047485000000052],[-103.88861099999997,76.049712999999997],[-103.98332199999999,76.057205000000124],[-104.06054699999999,76.062195000000031],[-104.08677699999998,76.06053200000008],[-104.08743999999996,76.05819699999995],[-104.13082899999989,76.056366000000025],[-104.39111300000002,76.078323000000069],[-104.40833999999995,76.082214000000135],[-104.47833300000002,76.135817999999972],[-104.48277299999995,76.142211999999972],[-104.46389799999992,76.15887500000008],[-104.45417800000001,76.164429000000041],[-104.31582600000002,76.208037999999988],[-104.29804999999993,76.212494000000049],[-104.27250700000002,76.216095000000109],[-104.24722300000002,76.218596999999988],[-104.17223399999995,76.224152000000117],[-104.14806399999986,76.2227630000001],[-104.07472200000001,76.222213999999951],[-103.9569469999999,76.233047000000113],[-103.91805999999997,76.239975000000129],[-103.85138699999999,76.250000000000057],[-103.59445199999999,76.26527400000009],[-103.33693699999998,76.27998400000007],[-103.13137799999993,76.303040000000067],[-103.11000100000001,76.304703000000018],[-103.05999799999995,76.306366000000139],[-102.86472299999997,76.311095999999964],[-102.81696299999999,76.312194999999974],[-102.765556,76.311645999999996],[-102.72693599999997,76.30581699999999],[-102.66915899999992,76.295822000000101],[-102.66555799999998,76.294708000000128],[-102.65222199999994,76.287766000000033],[-102.64277599999997,76.269989000000123],[-102.63362100000001,76.257491999999957],[-102.62554899999992,76.251937999999996],[-102.6036069999999,76.24552900000009],[-102.55832700000002,76.235809000000017],[-102.54055799999998,76.229431000000091],[-102.53083800000002,76.223312000000021]],[[-89.398894999999982,76.43553200000008],[-89.425003000000004,76.43553200000008],[-89.599166999999966,76.440262000000132],[-89.613616999999977,76.440811000000053],[-89.625548999999978,76.444976999999994],[-89.615004999999996,76.449141999999995],[-89.559158000000025,76.470535000000098],[-89.533065999999963,76.47665400000011],[-89.49499499999996,76.472488000000055],[-89.488327000000027,76.46804800000001],[-89.465835999999911,76.462203999999986],[-89.446380999999917,76.457763999999997],[-89.40834000000001,76.450546000000145],[-89.386123999999938,76.447754000000089],[-89.378051999999968,76.444138000000009],[-89.380553999999961,76.439147999999989],[-89.398894999999982,76.43553200000008]],[[-83.962783999999999,76.426375999999948],[-83.986114999999984,76.423309000000017],[-84.009170999999924,76.425812000000008],[-84.109436000000017,76.444427000000132],[-84.12388599999997,76.451096000000007],[-84.139449999999954,76.507217000000082],[-84.128052000000025,76.50999500000006],[-84.097503999999901,76.506653000000142],[-84.013625999999931,76.498032000000023],[-83.992492999999854,76.494980000000112],[-83.976944000000003,76.491089000000045],[-83.918334999999956,76.469437000000028],[-83.908050999999944,76.464996000000099],[-83.962783999999999,76.426375999999948]],[[-104.05387899999999,76.563034000000073],[-104.03388999999999,76.559708000000001],[-103.87888299999997,76.573608000000092],[-103.86860699999994,76.579162999999994],[-103.86665299999993,76.584991000000116],[-103.87138400000003,76.596649000000127],[-103.86721799999998,76.603043000000014],[-103.85944399999994,76.607208000000014],[-103.82640100000003,76.618317000000047],[-103.804169,76.621918000000107],[-103.78751399999993,76.620529000000147],[-103.58194699999996,76.547759999999982],[-103.58805799999993,76.541930999999977],[-103.59249899999998,76.535812000000135],[-103.59166700000003,76.53137200000009],[-103.587784,76.524993999999936],[-103.57028199999996,76.521103000000096],[-103.404449,76.494705000000124],[-103.38445299999995,76.492203000000018],[-103.32112100000001,76.494980000000112],[-103.24500299999994,76.485535000000027],[-103.05777,76.457763999999997],[-103.03666699999991,76.453873000000101],[-103.01418299999995,76.447754000000089],[-103.00805699999989,76.441650000000038],[-103.00446299999999,76.435257000000092],[-103.00446299999999,76.429977000000008],[-103.011124,76.423309000000017],[-103.01917300000002,76.418045000000063],[-103.02971599999989,76.412491000000045],[-103.0425029999999,76.406372000000033],[-103.098343,76.384720000000016],[-103.17250099999995,76.362762000000032],[-103.20472699999993,76.354705999999965],[-103.281387,76.336929000000112],[-103.37805200000003,76.325546000000088],[-103.55444299999999,76.310257000000036],[-103.70056199999993,76.304152999999985],[-103.75195299999996,76.303589000000045],[-103.848343,76.310257000000036],[-104.06194299999993,76.317490000000021],[-104.11165599999998,76.316376000000048],[-104.33500699999996,76.318603999999993],[-104.37888299999992,76.323317999999972],[-104.396118,76.327774000000034],[-104.40471599999995,76.333328000000051],[-104.404449,76.334427000000005],[-104.38971700000002,76.342758000000117],[-104.37581599999993,76.348328000000038],[-104.362213,76.352202999999975],[-104.34333799999996,76.354156000000103],[-104.32972699999999,76.358032000000037],[-104.328056,76.363876000000005],[-104.39111300000002,76.461105000000032],[-104.43388399999998,76.484984999999995],[-104.44888300000002,76.491089000000045],[-104.47332799999998,76.49331699999999],[-104.48249800000002,76.490540000000124],[-104.48361199999999,76.485808999999961],[-104.49749800000001,76.481093999999928],[-104.52278100000001,76.480545000000006],[-104.56388900000002,76.482208000000128],[-104.65888999999987,76.545822000000044],[-104.66583300000002,76.551651000000049],[-104.63722200000001,76.603317000000118],[-104.56304899999998,76.612761999999975],[-104.53666699999997,76.617203000000075],[-104.445267,76.635818000000029],[-104.40666199999987,76.645538000000101],[-104.37416100000002,76.655823000000055],[-104.35193600000002,76.660263000000043],[-104.31500199999994,76.663879000000122],[-104.26750199999998,76.667206000000022],[-104.21665999999999,76.668320000000051],[-104.13417099999998,76.669434000000024],[-104.05332899999996,76.664703000000088],[-104.031113,76.661652000000061],[-103.96333299999998,76.649994000000049],[-103.93971299999998,76.644714000000135],[-103.926941,76.638046000000145],[-103.9225009999999,76.633605999999986],[-103.92610200000001,76.621918000000107],[-103.93831599999999,76.610535000000141],[-103.95861799999994,76.599152000000117],[-104.02778599999988,76.579162999999994],[-104.051941,76.568878000000041],[-104.05387899999999,76.563034000000073]],[[-98.418059999999912,76.668320000000051],[-98.403885000000002,76.661377000000016],[-98.413939999999911,76.647491000000059],[-98.423606999999947,76.641486999999927],[-98.425780999999972,76.63848900000005],[-98.425277999999992,76.63564300000013],[-98.429169000000002,76.626922999999977],[-98.419723999999917,76.622482000000048],[-98.376099000000011,76.611923000000047],[-98.357773000000009,76.608321999999987],[-98.281386999999995,76.602203000000145],[-98.180557000000022,76.586929000000055],[-98.189712999999983,76.580276000000083],[-98.242766999999958,76.571655000000135],[-98.258621000000005,76.573318000000086],[-98.278335999999967,76.581100000000049],[-98.298339999999996,76.585266000000104],[-98.319457999999997,76.58859300000006],[-98.362502999999947,76.593323000000112],[-98.395554000000004,76.594437000000084],[-98.40194699999995,76.591934000000094],[-98.398894999999925,76.581375000000037],[-98.378051999999968,76.572220000000016],[-98.357773000000009,76.565536000000122],[-98.322784000000013,76.561096000000134],[-98.080565999999976,76.531097000000102],[-97.944442999999978,76.518051000000128],[-97.897780999999895,76.515823000000012],[-97.807770000000005,76.514435000000105],[-97.764450000000011,76.510544000000039],[-97.750290000000007,76.506942999999978],[-97.693328999999949,76.487762000000089],[-97.684722999999963,76.47164900000007],[-97.662215999999944,76.425261999999975],[-97.662505999999894,76.419434000000081],[-97.670273000000009,76.414992999999981],[-97.706954999999937,76.405548000000067],[-97.718886999999995,76.40109300000006],[-97.727218999999991,76.395537999999988],[-97.731673999999998,76.38998400000014],[-97.761397999999986,76.334991000000002],[-97.728881999999999,76.282760999999994],[-97.726104999999905,76.278320000000065],[-97.699432000000002,76.266663000000108],[-97.64805599999994,76.250275000000045],[-97.610549999999989,76.242203000000075],[-97.591674999999952,76.23692299999999],[-97.575561999999991,76.231369000000029],[-97.523055999999997,76.205826000000116],[-97.516952999999944,76.199997000000053],[-97.509170999999981,76.188873000000001],[-97.494994999999903,76.148880000000133],[-97.494445999999868,76.138885000000073],[-97.503066999999874,76.127472000000068],[-97.517776000000026,76.119141000000127],[-97.542496000000028,76.108322000000101],[-97.563323999999966,76.097487999999998],[-97.588333000000034,76.080826000000002],[-97.656386999999938,75.972762999999986],[-97.647507000000019,75.944427000000076],[-97.64555399999989,75.938873000000058],[-97.642226999999934,75.9327550000001],[-97.612503000000004,75.901932000000102],[-97.597778000000005,75.889434999999935],[-97.597778000000005,75.846939000000134],[-97.654174999999896,75.798324999999977],[-97.664169000000015,75.793320000000108],[-97.693603999999993,75.785812000000078],[-97.707503999999972,75.783324999999991],[-97.837219000000005,75.765549000000021],[-97.913329999999974,75.751663000000065],[-97.930557000000022,75.746933000000013],[-97.938598999999954,75.741364000000033],[-97.870543999999938,75.73054499999995],[-97.827224999999885,75.726929000000098],[-97.690276999999867,75.720535000000041],[-97.425551999999982,75.692200000000071],[-97.404448999999943,75.68803400000013],[-97.386672999999973,75.682754999999986],[-97.375823999999852,75.676376000000118],[-97.369995000000017,75.670822000000101],[-97.368606999999997,75.659424000000115],[-97.369155999999975,75.653320000000065],[-97.384734999999978,75.643326000000059],[-97.394454999999937,75.638321000000019],[-97.410003999999958,75.620818999999983],[-97.41194200000001,75.61554000000001],[-97.423889000000031,75.528595000000053],[-97.422501000000011,75.506377999999984],[-97.417495999999971,75.494705000000124],[-97.401397999999858,75.458602999999982],[-97.398055999999997,75.45248400000014],[-97.378326000000015,75.43414300000012],[-97.349730999999963,75.419983000000002],[-97.330565999999919,75.414153999999996],[-97.293883999999991,75.405548000000067],[-97.285003999999958,75.402205999999978],[-97.280837999999903,75.396941999999967],[-97.293334999999956,75.390823000000125],[-97.305557000000022,75.390274000000034],[-97.320557000000008,75.391098],[-97.341675000000009,75.393875000000094],[-97.441665999999998,75.414992999999981],[-97.469161999999983,75.422760000000096],[-97.484160999999915,75.429428000000087],[-97.49610899999999,75.442200000000071],[-97.49888599999997,75.469986000000006],[-97.496658000000025,75.478592000000106],[-97.573623999999882,75.513046000000145],[-97.711944999999901,75.566666000000055],[-97.728881999999999,75.570267000000058],[-97.744155999999975,75.571106000000043],[-97.762511999999958,75.568054000000132],[-97.818061999999884,75.54898100000014],[-97.827552999999909,75.545815000000005],[-97.827056999999911,75.539817999999968],[-97.821724000000017,75.537323000000129],[-97.811561999999924,75.535156000000029],[-97.802054999999996,75.53532400000006],[-97.801940999999999,75.524429000000112],[-97.789992999999924,75.51887499999998],[-97.774169999999913,75.508331000000112],[-97.758895999999993,75.496643000000063],[-97.748046999999872,75.484421000000111],[-97.744720000000029,75.478317000000061],[-97.743332000000009,75.471924000000115],[-97.745269999999948,75.466660000000104],[-97.756392999999946,75.462204000000042],[-97.783324999999877,75.45748900000001],[-97.80749499999996,75.456650000000025],[-97.835830999999985,75.460815000000025],[-97.840835999999854,75.464996000000099],[-97.845001000000025,75.469986000000006],[-97.855674999999906,75.484482000000014],[-97.85600299999993,75.487488000000042],[-97.858001999999885,75.494644000000051],[-97.859169000000009,75.497985999999969],[-97.86983499999991,75.501160000000084],[-97.882338999999945,75.503494000000103],[-97.90834000000001,75.513321000000133],[-97.932495000000017,75.512496999999996],[-97.951950000000011,75.507492000000127],[-98.041672000000005,75.483322000000101],[-98.043335000000013,75.481368999999972],[-97.985549999999989,75.457214000000135],[-97.957503999999915,75.44720499999994],[-97.933318999999983,75.448029000000133],[-97.911117999999931,75.446090999999967],[-97.782776000000013,75.428314000000114],[-97.774718999999948,75.423035000000141],[-97.793610000000001,75.413040000000024],[-97.808608999999933,75.408875000000023],[-97.934432999999899,75.407486000000063],[-97.984726000000023,75.408875000000023],[-98.004729999999881,75.413605000000075],[-98.028060999999923,75.413879000000009],[-98.019890000000032,75.407042999999987],[-98.028724999999895,75.404541000000108],[-98.032386999999915,75.400879000000145],[-98.029556000000014,75.398375999999985],[-98.021225000000015,75.39521000000002],[-97.96055599999994,75.384720000000016],[-97.920272999999952,75.38081399999993],[-97.901397999999915,75.379974000000061],[-97.884445000000028,75.376373000000058],[-97.872771999999998,75.37081900000004],[-97.876662999999894,75.364990000000034],[-97.887786999999946,75.360535000000027],[-97.910277999999948,75.356644000000131],[-97.926392000000021,75.35554500000012],[-97.990554999999972,75.355819999999994],[-98.042769999999962,75.35914600000001],[-98.070107000000007,75.364700000000028],[-98.070769999999982,75.367088000000081],[-98.074112000000014,75.369033999999942],[-98.082779000000016,75.370033000000035],[-98.107772999999895,75.371917999999994],[-98.124709999999993,75.367202999999961],[-98.136397999999986,75.361923000000104],[-98.141953000000001,75.356644000000131],[-98.153610000000015,75.345535000000041],[-98.165282999999988,75.334152000000017],[-98.164718999999934,75.329163000000051],[-98.129165999999998,75.30192599999998],[-98.120543999999995,75.297760000000039],[-98.101395000000025,75.291931000000034],[-98.064712999999927,75.285812000000021],[-97.913054999999986,75.264159999999947],[-97.87388599999997,75.270263999999997],[-97.755843999999911,75.229431000000091],[-97.74360699999994,75.224991000000102],[-97.735001000000011,75.207214000000022],[-97.736937999999952,75.204437000000098],[-97.759734999999978,75.188582999999994],[-97.676940999999999,75.164154000000053],[-97.62860099999989,75.151093000000117],[-97.602492999999924,75.147217000000069],[-97.597503999999958,75.149155000000007],[-97.605834999999956,75.158325000000048],[-97.614440999999886,75.162766000000147],[-97.613051999999982,75.164703000000031],[-97.597778000000005,75.164703000000031],[-97.578613000000018,75.15887500000008],[-97.567779999999971,75.152481000000023],[-97.567504999999926,75.147491000000002],[-97.582503999999915,75.137496999999996],[-97.619445999999925,75.118590999999924],[-97.639998999999989,75.116379000000052],[-97.746947999999975,75.111649000000057],[-97.843886999999938,75.110260000000039],[-97.86250299999989,75.111099000000024],[-97.881377999999927,75.11692800000003],[-98.024719000000005,75.162490999999932],[-98.033614999999998,75.17164600000001],[-98.034438999999963,75.181656000000089],[-98.02694699999995,75.187195000000088],[-98.02027899999996,75.196640000000002],[-98.019164999999987,75.201096000000064],[-98.025833000000034,75.210815000000082],[-98.041381999999885,75.216385000000002],[-98.061661000000015,75.22026100000005],[-98.085281000000009,75.2227630000001],[-98.098617999999931,75.2227630000001],[-98.146666999999866,75.180816999999934],[-98.146666999999866,75.163879000000065],[-98.145553999999947,75.159987999999998],[-98.136123999999995,75.154160000000047],[-98.121384000000035,75.147491000000002],[-98.081389999999999,75.130538999999999],[-98.039169000000015,75.116379000000052],[-98.025557999999933,75.113601999999958],[-98.00306699999993,75.112761999999918],[-97.981673999999941,75.110809000000017],[-97.966949,75.104155999999989],[-97.947219999999902,75.079987000000074],[-97.938888999999904,75.069716999999969],[-97.938598999999954,75.064986999999917],[-97.945830999999998,75.026657],[-97.949996999999996,75.021103000000039],[-97.960006999999905,75.017487000000131],[-97.982497999999907,75.015273999999977],[-98.00306699999993,75.015549000000021],[-98.02027899999996,75.018326000000116],[-98.108886999999982,75.022491000000116],[-98.259170999999924,75.022766000000104],[-98.276947000000007,75.022217000000012],[-98.300277999999935,75.021103000000039],[-98.369719999999973,75.014435000000049],[-98.444442999999978,75.004990000000134],[-98.46833799999996,75.003052000000025],[-98.634734999999978,74.992477000000065],[-98.723891999999921,74.989426000000037],[-98.785004000000015,74.994980000000055],[-98.985001000000011,75.000000000000114],[-99.066955999999948,74.996368000000132],[-99.354445999999882,74.984420999999998],[-99.376662999999951,74.98553499999997],[-99.394164999999987,74.988037000000077],[-99.406113000000005,74.993316999999934],[-99.393615999999952,75.027205999999978],[-99.387512000000015,75.03776600000009],[-99.335555999999997,75.070541000000105],[-99.299437999999952,75.092758000000003],[-99.28195199999999,75.102768000000083],[-99.27694699999995,75.108032000000094],[-99.272232000000031,75.115814000000057],[-99.281386999999995,75.122481999999991],[-99.308043999999995,75.122481999999991],[-99.325835999999924,75.11831699999999],[-99.34056099999998,75.113037000000134],[-99.445540999999935,75.058318999999983],[-99.482497999999964,75.03776600000009],[-99.496657999999968,75.026382000000012],[-99.5,75.020537999999988],[-99.496108999999933,75.014708999999982],[-99.480285999999978,75.009155000000135],[-99.445540999999935,75.003875999999991],[-99.432495000000017,75.000275000000101],[-99.42721599999993,74.996368000000132],[-99.426391999999964,74.991364000000033],[-99.538605000000018,74.974152000000004],[-99.562499999999943,74.972214000000065],[-99.602782999999988,74.971100000000035],[-99.619719999999973,74.97137500000008],[-99.701675000000023,74.973602000000142],[-99.990554999999915,74.984420999999998],[-100.05722000000003,74.986923000000104],[-100.14584400000001,74.991088999999988],[-100.21056399999998,74.997208000000001],[-100.25306699999993,75.002777000000037],[-100.34777799999995,75.016937000000098],[-100.36389200000002,75.021378000000027],[-100.38945000000001,75.031097000000045],[-100.39388999999994,75.037201000000039],[-100.396118,75.043594000000041],[-100.39750699999991,75.055542000000059],[-100.39723199999997,75.066666000000112],[-100.39472999999998,75.078323000000069],[-100.38583399999999,75.095535000000098],[-100.38054699999986,75.101928999999984],[-100.37805200000003,75.113311999999951],[-100.39806399999998,75.158600000000092],[-100.41221599999994,75.16804500000012],[-100.43250299999994,75.173598999999967],[-100.45333900000003,75.177200000000028],[-100.47693599999997,75.179428000000144],[-100.51112399999994,75.184143000000006],[-100.52834300000001,75.187759000000028],[-100.54444899999993,75.193039000000113],[-100.54695099999998,75.199417000000096],[-100.53859699999998,75.204711999999972],[-100.46333299999998,75.223602000000085],[-100.43859900000001,75.226653999999996],[-100.41722099999998,75.227478000000133],[-100.32528699999995,75.230545000000063],[-100.30222299999997,75.230820000000108],[-100.27999899999998,75.22886699999998],[-100.24833699999999,75.223877000000073],[-100.22556299999997,75.223037999999974],[-100.031387,75.226929000000041],[-100.00778200000002,75.228043000000014],[-99.990554999999915,75.231369000000029],[-99.987777999999992,75.236099000000081],[-99.995269999999948,75.239975000000129],[-100.00945300000001,75.242203000000075],[-100.11945300000002,75.248596000000077],[-100.20333900000003,75.253326000000072],[-100.22609699999998,75.254165999999941],[-100.314438,75.250824000000023],[-100.35417200000001,75.251663000000008],[-100.37554899999986,75.255264000000011],[-100.39388999999994,75.260269000000108],[-100.406113,75.266663000000108],[-100.40278599999999,75.272491000000059],[-100.33444199999991,75.274428999999998],[-100.31166100000002,75.277206000000092],[-100.29387700000001,75.281371999999976],[-100.279449,75.286652000000061],[-100.25805700000001,75.297760000000039],[-100.24445299999996,75.308868000000018],[-100.25723299999993,75.313308999999947],[-100.28222699999992,75.310257000000036],[-100.33277900000002,75.302200000000084],[-100.35944399999994,75.299712999999997],[-100.49999999999989,75.292480000000012],[-100.52306399999998,75.293045000000006],[-100.60888699999998,75.305817000000047],[-100.62249799999995,75.309143000000063],[-100.76555599999989,75.34637500000008],[-100.77887699999991,75.35054000000008],[-100.76888999999994,75.355255000000113],[-100.67639199999996,75.376648000000046],[-100.65222199999999,75.378585999999984],[-100.63305700000001,75.378036000000122],[-100.61805700000002,75.376648000000046],[-100.60221899999993,75.373596000000134],[-100.61833199999995,75.368866000000082],[-100.64389,75.364700000000028],[-100.67999299999997,75.361923000000104],[-100.69833399999993,75.356644000000131],[-100.68222000000003,75.350266000000147],[-100.63806199999999,75.345825000000048],[-100.61472299999997,75.346100000000092],[-100.59472699999998,75.347487999999998],[-100.44748699999991,75.369980000000055],[-100.43277,75.375259000000028],[-100.42832899999991,75.380539000000113],[-100.44055200000003,75.386658000000125],[-100.56527699999998,75.422211000000004],[-100.58444199999997,75.426376000000005],[-100.60694899999999,75.42804000000001],[-100.67555199999993,75.426926000000037],[-100.71694899999989,75.429153000000099],[-100.72305299999999,75.432479999999998],[-100.69776899999999,75.436371000000065],[-100.67331699999994,75.438582999999937],[-100.43388399999998,75.445815999999979],[-100.33972199999999,75.447479000000101],[-100.27084400000001,75.448593000000074],[-100.17666600000001,75.449141999999995],[-100.11138899999997,75.451096000000007],[-100.06276700000001,75.454437000000041],[-100.01194800000002,75.461380000000077],[-100.00917099999992,75.466095000000109],[-100.01944700000001,75.468596999999988],[-100.10056299999997,75.470535000000098],[-100.19193999999999,75.467758000000003],[-100.21528599999988,75.467758000000003],[-100.30695300000002,75.47164900000007],[-100.30555699999996,75.473602000000028],[-100.12999000000002,75.525818000000129],[-100.03415699999988,75.529433999999981],[-99.966948999999943,75.533325000000048],[-99.845000999999968,75.540817000000004],[-99.831389999999999,75.544144000000131],[-99.832229999999981,75.545532000000037],[-99.845000999999968,75.547484999999995],[-99.856383999999991,75.548035000000027],[-99.899993999999992,75.547484999999995],[-99.946655000000021,75.544708000000071],[-99.990279999999984,75.544434000000138],[-100.03859699999998,75.549149],[-100.03943600000002,75.554152999999985],[-100.02806099999998,75.557205000000067],[-99.823623999999938,75.58415199999996],[-99.800551999999925,75.586655000000121],[-99.756393000000003,75.588043000000027],[-99.736938000000009,75.587204000000099],[-99.712508999999955,75.589157000000057],[-99.672774999999945,75.606094000000041],[-99.667770000000019,75.611099000000081],[-99.685821999999973,75.613876000000005],[-99.790833000000021,75.616653000000099],[-99.84056099999998,75.612488000000099],[-99.863051999999982,75.614426000000037],[-99.862503000000004,75.618866000000025],[-99.823623999999938,75.651657],[-99.817504999999926,75.655258000000003],[-99.788054999999929,75.658324999999934],[-99.458617999999944,75.672485000000052],[-99.226669000000015,75.675537000000134],[-99.202498999999989,75.675537000000134],[-99.083617999999944,75.675812000000008],[-99.033066000000019,75.677200000000084],[-98.982773000000009,75.681090999999981],[-98.929717999999923,75.686371000000008],[-98.905562999999916,75.689972000000068],[-98.889998999999989,75.695251000000042],[-98.891388000000006,75.699141999999938],[-98.907775999999956,75.704712000000029],[-98.925827000000027,75.707489000000123],[-98.950286999999889,75.709991000000002],[-98.97193900000002,75.710266000000047],[-99.329453000000001,75.695251000000042],[-99.55749499999996,75.691925000000026],[-99.619995000000017,75.694138000000009],[-99.643889999999999,75.694138000000009],[-99.740828999999906,75.690811000000053],[-99.84973100000002,75.677475000000072],[-100.031677,75.664428999999984],[-100.256393,75.651657],[-100.37332199999997,75.654709000000082],[-100.39723199999997,75.654434000000037],[-100.54028299999993,75.645537999999931],[-100.62888299999997,75.634720000000129],[-100.65416699999997,75.631653000000028],[-100.80471799999998,75.614990000000148],[-100.82972699999999,75.61303700000002],[-101.22556299999991,75.587494000000106],[-101.24916100000002,75.587204000000099],[-101.30638099999999,75.591094999999996],[-101.37721299999993,75.59887700000013],[-101.38806199999999,75.60026600000009],[-101.47165699999999,75.602203000000145],[-101.4955369999999,75.601929000000041],[-101.74944299999999,75.574432000000058],[-101.89835399999998,75.556091000000094],[-101.97250399999996,75.548325000000034],[-101.99638399999998,75.547211000000061],[-102.06723,75.546097000000088],[-102.13639799999993,75.553314],[-102.15915699999999,75.554977000000122],[-102.20667300000002,75.553314],[-102.35193599999997,75.542206000000022],[-102.39916999999997,75.537200999999982],[-102.44860799999998,75.530547999999953],[-102.49916099999996,75.521103000000096],[-102.53415699999999,75.511383000000023],[-102.67304999999999,75.514709000000039],[-102.86694299999999,75.601089000000002],[-102.87805200000003,75.607758000000047],[-102.88194299999992,75.613312000000064],[-102.88390400000003,75.61914100000007],[-102.87777699999992,75.624695000000031],[-102.86054999999999,75.62831100000011],[-102.8125,75.631088000000034],[-102.79305999999991,75.630539000000056],[-102.70140100000003,75.628860000000032],[-102.68916299999995,75.670532000000094],[-102.58168000000001,75.71276899999998],[-102.56360599999999,75.718322999999998],[-102.53888699999993,75.72137499999991],[-102.37748699999992,75.729155999999989],[-102.35193599999997,75.729155999999989],[-102.31139400000001,75.72665400000011],[-102.26390100000003,75.721924000000058],[-102.16832699999992,75.709152000000074],[-102.15416700000003,75.706100000000106],[-102.07861300000002,75.688309000000004],[-102.05776999999995,75.690811000000053],[-102.03666699999997,75.694138000000009],[-102.01862299999999,75.699416999999983],[-102.00917099999998,75.703048999999908],[-102.00805700000001,75.704987000000074],[-102.09166699999997,75.721924000000058],[-102.120003,75.776382000000012],[-102.10185200000001,75.784247999999991],[-102.09361299999989,75.791091999999992],[-102.112213,75.793594000000041],[-102.23277299999995,75.786652000000117],[-102.28222700000003,75.781937000000084],[-102.32668299999995,75.779983999999956],[-102.34388699999994,75.781937000000084],[-102.36609599999997,75.789978000000019],[-102.37165800000002,75.795821999999987],[-102.37332200000003,75.801650999999993],[-102.37082700000002,75.807480000000055],[-102.36250299999995,75.818054000000075],[-102.33944700000001,75.834991000000059],[-102.31667299999998,75.846649000000127],[-102.29028299999993,75.857208000000128],[-102.26640299999997,75.86192299999999],[-102.16306299999997,75.878860000000032],[-102.13806199999993,75.881087999999977],[-101.864441,75.902206000000035],[-101.82640099999992,75.898331000000042],[-101.80526700000001,75.891937000000041],[-101.79943800000001,75.886658000000068],[-101.77194199999997,75.868590999999981],[-101.74833699999999,75.859146000000067],[-101.74109599999991,75.856934000000024],[-101.55638099999987,75.821105999999986],[-101.47028399999999,75.772217000000012],[-101.46888699999994,75.766388000000006],[-101.45973199999997,75.761107999999922],[-101.43859900000001,75.755554000000132],[-101.41416899999996,75.752487000000031],[-101.301941,75.746094000000085],[-101.254997,75.744705000000067],[-101.24416400000001,75.746933000000013],[-101.23388699999998,75.751389000000131],[-101.20249899999993,75.767211999999972],[-101.18221999999997,75.779709000000139],[-101.23110999999994,75.777205999999978],[-101.328056,75.774429000000055],[-101.34777799999995,75.774994000000106],[-101.35555999999991,75.779433999999924],[-101.35861199999999,75.784988000000112],[-101.35193599999991,75.790543000000014],[-101.34137699999997,75.796097000000032],[-101.326683,75.801650999999993],[-101.323624,75.807480000000055],[-101.32501200000002,75.813309000000061],[-101.33500700000002,75.825272000000098],[-101.34056099999992,75.830276000000026],[-101.35637700000001,75.843048000000067],[-101.36389199999996,75.8477630000001],[-101.37805199999997,75.851928999999984],[-101.39277600000003,75.854431000000034],[-101.40833999999995,75.855820000000051],[-101.42388900000003,75.856369000000029],[-101.48889199999996,75.854156000000046],[-101.52694699999995,75.85832199999993],[-101.537216,75.861374000000069],[-101.54638699999992,75.867477000000008],[-101.57917799999996,75.908600000000092],[-101.56500199999988,75.929703000000018],[-101.49665800000002,75.954987000000017],[-101.47778299999999,75.96026599999999],[-101.45221700000002,75.963608000000079],[-101.39417299999997,75.97554000000008],[-101.30915800000002,76.008330999999998],[-101.30277999999987,76.013046000000031],[-101.31582599999996,76.019150000000025],[-101.33556399999992,76.020827999999995],[-101.36971999999992,76.016937000000098],[-101.38249200000001,76.010818000000086],[-101.39195299999989,76.000549000000035],[-101.40833999999995,75.995529000000147],[-101.61721799999998,75.980820000000108],[-101.641953,75.979705999999965],[-101.67832900000002,75.979705999999965],[-101.68388399999998,75.980270000000075],[-101.728882,75.987488000000099],[-101.80638099999999,76.007492000000013],[-101.83249699999999,76.016662999999994],[-101.84889199999992,76.024704000000042],[-101.89362299999993,76.060257000000092],[-101.90055799999999,76.066666000000112],[-101.90722700000003,76.078598000000056],[-101.90862299999998,76.084427000000062],[-101.90750099999997,76.096100000000092],[-101.90222199999999,76.107757999999933],[-101.88861099999991,76.119141000000127],[-101.761124,76.174148999999943],[-101.71140300000002,76.184708000000001],[-101.685272,76.187759000000028],[-101.60833699999995,76.194427000000019],[-101.53362299999998,76.205261000000064],[-101.48860200000001,76.213608000000022],[-101.46556099999998,76.218872000000033],[-101.39611799999989,76.243317000000047],[-101.38500999999997,76.248871000000065],[-101.387787,76.251937999999996],[-101.44193999999993,76.241653000000042],[-101.49694799999992,76.233871000000079],[-101.69888299999997,76.219437000000084],[-101.74973299999999,76.215820000000122],[-101.77471899999995,76.215546000000018],[-102.051941,76.213608000000022],[-102.11444099999994,76.215546000000018],[-102.13305699999989,76.219986000000006],[-102.14835399999998,76.226653999999996],[-102.16583300000002,76.238312000000008],[-102.15972899999997,76.243042000000059],[-102.13362100000001,76.246368000000075],[-102.08222999999998,76.250824000000023],[-102.06388899999996,76.255264000000011],[-102.05803700000001,76.259155000000078],[-102.00110599999999,76.352768000000026],[-102.029449,76.3808140000001],[-102.051941,76.38638300000008],[-102.05332900000002,76.392211999999915],[-102.05082700000003,76.398041000000148],[-102.03999299999998,76.403595000000109],[-102.01862299999999,76.409423999999944],[-101.88583399999993,76.444976999999994],[-101.86221299999994,76.450272000000041],[-101.80832699999996,76.454163000000108],[-101.78333299999991,76.454437000000041],[-101.67111199999999,76.449141999999995],[-101.45667300000002,76.436371000000065],[-101.43472300000002,76.434418000000107],[-101.41166699999997,76.430817000000047],[-101.31582599999996,76.414428999999984],[-101.30249000000003,76.408324999999991],[-101.29138199999994,76.401657],[-101.28362300000003,76.396102999999982],[-101.27667200000002,76.389435000000049],[-101.24027999999993,76.371643000000006],[-101.22805800000003,76.366928000000144],[-101.20612299999993,76.361374000000126],[-101.13694799999996,76.350815000000068],[-101.06806899999998,76.331940000000145],[-101.05832700000002,76.326935000000105],[-101.09388699999994,76.283051],[-101.00446299999993,76.237761999999975],[-100.98111,76.235260000000096],[-100.92832899999996,76.225815000000011],[-100.91000399999996,76.222213999999951],[-100.86582900000002,76.212204000000042],[-100.783073,76.191085999999984],[-100.75110599999994,76.18220500000001],[-100.71056399999998,76.166381999999999],[-100.63027999999991,76.133331000000055],[-100.43998699999992,76.105255],[-100.31582600000002,76.051376000000118],[-100.30943299999996,76.048035000000084],[-100.13166799999993,75.952484000000027],[-100.047234,75.913879000000065],[-99.982498000000021,75.890548999999908],[-99.888335999999981,75.886383000000023],[-99.753615999999909,75.906372000000147],[-99.730834999999956,75.910538000000031],[-99.71556099999998,75.916092000000049],[-99.678328999999962,75.931366000000139],[-99.587783999999999,75.94999700000011],[-99.508621000000005,75.957489000000066],[-99.483611999999937,75.958603000000039],[-99.457503999999972,75.961380000000133],[-99.442490000000021,75.965819999999951],[-99.439437999999996,75.970534999999984],[-99.45461999999992,75.974808000000053],[-99.494445999999982,75.973602000000085],[-99.657776000000013,75.961380000000133],[-99.785277999999948,75.951385000000016],[-99.811110999999983,75.948317999999915],[-99.859436000000017,75.935256999999979],[-99.86332699999997,75.935532000000023],[-99.898620999999991,75.950271999999984],[-100.07749899999999,76.038879000000122],[-100.08249699999999,76.043869000000029],[-100.09221600000001,76.054977000000008],[-100.14222699999999,76.112198000000149],[-100.15278599999994,76.132477000000108],[-100.12499999999994,76.148880000000133],[-100.10388199999994,76.153320000000008],[-100.07167099999998,76.155822999999941],[-100.031113,76.155548000000124],[-100.01139799999999,76.15387000000004],[-99.868332000000009,76.139984000000027],[-99.730834999999956,76.117477000000122],[-99.680832000000009,76.118591000000094],[-99.650832999999977,76.127472000000068],[-99.609160999999972,76.135817999999972],[-99.556106999999997,76.141663000000051],[-99.502227999999945,76.146103000000039],[-99.483062999999902,76.146942000000024],[-99.429717999999923,76.15387000000004],[-99.414444000000003,76.158325000000048],[-99.421386999999925,76.160262999999986],[-99.445267000000001,76.16137700000013],[-99.498885999999914,76.157761000000107],[-99.548888999999974,76.153320000000008],[-99.668059999999912,76.139709000000039],[-99.693054000000018,76.138596000000121],[-99.716949,76.139709000000039],[-99.874434999999892,76.17053199999998],[-99.915833000000021,76.180267000000072],[-99.948882999999967,76.189697000000137],[-100.15028399999994,76.1933140000001],[-100.17832900000002,76.19081100000011],[-100.20140099999998,76.189972000000012],[-100.22556299999997,76.19081100000011],[-100.43888900000002,76.212494000000049],[-100.47222899999991,76.226378999999952],[-100.49861099999998,76.237761999999975],[-100.51278699999989,76.249146000000053],[-100.514183,76.254166000000112],[-100.51112399999994,76.259720000000129],[-100.49944299999999,76.26527400000009],[-100.465012,76.274993999999992],[-100.43804899999998,76.278870000000097],[-100.41665599999999,76.280272999999966],[-100.36638600000003,76.281661999999983],[-100.26917300000002,76.278595000000053],[-100.18276999999995,76.270828000000108],[-100.111107,76.266388000000063],[-99.895553999999947,76.274703999999986],[-99.86999499999996,76.275817999999958],[-99.844727000000034,76.280272999999966],[-99.848617999999931,76.283874999999966],[-100.03859699999998,76.318878000000097],[-100.27722199999994,76.378585999999984],[-100.30166600000001,76.382750999999985],[-100.32362399999994,76.384155000000135],[-100.35056299999991,76.384430000000009],[-100.37444299999999,76.382750999999985],[-100.48137700000001,76.373871000000122],[-100.55332899999996,76.371094000000028],[-100.67360699999995,76.371917999999994],[-100.69444299999998,76.374985000000095],[-100.95249899999999,76.474700999999982],[-100.97222899999997,76.485260000000039],[-100.98388699999992,76.494430999999963],[-100.98554999999993,76.499145999999996],[-100.98249800000002,76.504990000000021],[-100.962784,76.510268999999994],[-100.93943799999988,76.514435000000105],[-100.89277600000003,76.519440000000145],[-100.82972699999999,76.519714000000079],[-100.80526700000001,76.522217000000069],[-100.737213,76.531097000000102],[-100.72083999999995,76.546097000000032],[-100.72341899999998,76.551094000000148],[-100.72332799999992,76.556091000000038],[-100.71250899999995,76.560531999999967],[-100.65306099999992,76.576385000000016],[-100.45861799999994,76.613602000000014],[-100.383827,76.627502000000106],[-100.36389200000002,76.631087999999977],[-100.318893,76.635544000000095],[-100.21665999999988,76.643051000000014],[-100.19193999999999,76.642212000000086],[-100.05222300000003,76.631363000000022],[-99.981673999999998,76.622207999999944],[-99.911117999999988,76.61303700000002],[-99.885009999999909,76.610535000000141],[-99.837783999999886,76.608596999999975],[-99.811385999999914,76.609710999999947],[-99.796111999999994,76.613875999999948],[-99.795272999999952,76.618317000000047],[-99.770554000000004,76.627762000000132],[-99.741942999999992,76.632751000000098],[-99.725829999999917,76.634720000000129],[-99.684433000000013,76.633331000000112],[-99.588333000000034,76.623871000000065],[-99.569457999999997,76.620529000000147],[-99.366942999999935,76.526382000000069],[-99.256957999999941,76.470535000000098],[-99.260559000000001,76.464706000000092],[-99.255279999999914,76.453598000000056],[-99.184433000000013,76.415817000000118],[-99.163619999999923,76.409149000000127],[-99.12332200000003,76.400818000000015],[-99.099990999999989,76.398041000000148],[-99.079726999999991,76.397217000000012],[-99.066101000000003,76.398605000000089],[-99.06639100000001,76.404434000000094],[-99.083617999999944,76.416092000000106],[-99.110001000000011,76.426650999999993],[-99.118332000000009,76.433044000000109],[-99.137221999999952,76.451934999999992],[-99.133895999999993,76.456650000000025],[-99.122498000000007,76.461105000000032],[-98.994155999999975,76.471099999999922],[-98.980834999999956,76.47164900000007],[-98.955276000000026,76.469147000000021],[-98.946945000000028,76.463042999999971],[-98.948043999999925,76.45277399999992],[-98.950286999999889,76.446365000000071],[-98.943603999999993,76.440811000000053],[-98.925827000000027,76.43609600000002],[-98.906386999999881,76.433318999999983],[-98.882767000000001,76.431366000000025],[-98.857773000000009,76.431366000000025],[-98.846114999999998,76.43609600000002],[-98.856110000000001,76.463882000000126],[-98.865279999999927,76.469147000000021],[-98.898620999999991,76.481093999999928],[-98.953888000000006,76.499145999999996],[-99.038054999999986,76.529708999999968],[-99.050551999999982,76.536102000000142],[-99.051940999999999,76.539978000000019],[-99.027221999999938,76.601088999999945],[-98.999160999999958,76.604980000000012],[-98.971663999999976,76.607758000000047],[-98.86082499999992,76.61442599999998],[-98.714721999999938,76.614150999999993],[-98.611114999999984,76.610260000000096],[-98.589172000000019,76.611374000000069],[-98.56639100000001,76.613602000000014],[-98.538894999999968,76.616379000000109],[-98.518065999999976,76.621368000000075],[-98.511123999999995,76.625259000000142],[-98.489731000000006,76.644707000000096],[-98.48832699999997,76.650818000000015],[-98.546951000000035,76.658035000000098],[-98.591109999999901,76.661652000000061],[-98.595000999999968,76.659424000000115],[-98.592498999999975,76.653870000000097],[-98.598617999999988,76.651093000000003],[-98.623046999999872,76.647217000000126],[-98.674438000000009,76.64387499999998],[-98.744445999999982,76.64387499999998],[-98.814163000000008,76.653595000000053],[-98.851105000000018,76.661652000000061],[-98.857773000000009,76.663879000000122],[-98.855834999999956,76.67025799999999],[-98.852492999999924,76.671646000000067],[-98.821395999999936,76.676925999999924],[-98.733611999999994,76.682754999999986],[-98.712509000000011,76.683044000000052],[-98.504729999999938,76.681090999999924],[-98.480285999999921,76.679152999999985],[-98.439986999999974,76.673035000000084],[-98.418059999999912,76.668320000000051]],[[-99.996947999999975,76.734420999999998],[-99.976395000000025,76.733597000000032],[-99.86999499999996,76.736374000000126],[-99.819457999999884,76.738312000000064],[-99.748336999999992,76.74275200000011],[-99.720839999999953,76.74581900000004],[-99.693877999999984,76.747756999999979],[-99.646392999999989,76.748031999999967],[-99.622498000000007,76.7452550000001],[-99.528884999999946,76.72554000000008],[-99.447768999999994,76.706100000000106],[-99.430556999999965,76.699416999999926],[-99.433883999999978,76.69470200000012],[-99.52806099999998,76.67442299999999],[-99.556106999999997,76.670532000000094],[-99.581680000000006,76.67025799999999],[-99.626937999999996,76.673035000000084],[-99.657776000000013,76.677765000000079],[-99.733321999999987,76.702484000000027],[-99.888389999999902,76.718651000000136],[-99.900222999999926,76.72015399999998],[-99.915557999999976,76.72015399999998],[-100.01112399999988,76.719147000000135],[-100.02999899999992,76.715820000000008],[-100.05139200000002,76.715546000000074],[-100.09750400000001,76.717209000000025],[-100.12138399999998,76.719711000000075],[-100.128601,76.721924000000058],[-100.12805199999997,76.723038000000031],[-100.10193599999997,76.744705000000067],[-100.08277899999996,76.748031999999967],[-100.05526700000001,76.75082400000008],[-100.03778099999988,76.751389000000131],[-99.999434999999949,76.751099000000067],[-99.972228999999913,76.747208000000001],[-99.975006000000008,76.742477000000065],[-99.994155999999975,76.739151000000049],[-100.004997,76.735535000000027],[-99.996947999999975,76.734420999999998]],[[-120.88362100000001,76.739700000000028],[-120.886124,76.728591999999992],[-120.90334299999995,76.723876999999959],[-120.94499199999996,76.717758000000117],[-120.97000100000002,76.716660000000047],[-121.09084299999989,76.71887200000009],[-121.11749299999991,76.719711000000075],[-121.16000400000001,76.723312000000135],[-121.18110699999994,76.727203000000031],[-121.18472299999991,76.731094000000098],[-121.18167099999999,76.732208000000071],[-121.15666199999998,76.733597000000032],[-121.12832600000002,76.730819999999994],[-121.083618,76.729155999999932],[-121.05972300000002,76.731369000000086],[-121.05638099999999,76.732483000000059],[-121.01806599999998,76.751389000000131],[-120.99082900000002,76.754715000000147],[-120.97833300000002,76.755264000000068],[-120.91443599999997,76.754165999999998],[-120.89083900000003,76.749710000000107],[-120.88474300000001,76.745529000000033],[-120.88362100000001,76.739700000000028]],[[-101.38054699999992,76.553588999999988],[-101.40416699999997,76.552765000000022],[-101.45388799999989,76.554153000000099],[-101.54083300000002,76.560806000000071],[-101.56471299999993,76.563599000000067],[-101.62332199999992,76.572768999999937],[-101.68831599999999,76.586380000000077],[-101.57556199999999,76.614150999999993],[-101.52194199999991,76.623871000000065],[-101.38583399999993,76.642487000000074],[-101.31777999999991,76.642761000000007],[-101.21362299999993,76.651931999999988],[-101.05999800000001,76.685805999999957],[-101.04250300000001,76.690536000000009],[-101.03943600000002,76.696365000000014],[-101.04028299999993,76.702209000000039],[-101.03307299999994,76.708038000000045],[-101.00583599999993,76.71887200000009],[-100.98361199999999,76.724700999999925],[-100.95749699999999,76.729155999999932],[-100.90249599999993,76.736374000000126],[-100.74388099999999,76.753326000000129],[-100.69193999999999,76.754715000000147],[-100.53443900000002,76.757217000000026],[-100.50917099999992,76.756378000000097],[-100.484734,76.754715000000147],[-100.26888999999989,76.737198000000092],[-100.24889400000001,76.734711000000061],[-100.25917099999998,76.728591999999992],[-100.26666299999999,76.726379000000065],[-100.29305999999997,76.721924000000058],[-100.297234,76.721924000000058],[-100.31723,76.716660000000047],[-100.48721299999988,76.684418000000051],[-100.761124,76.635818000000029],[-100.92304999999999,76.610260000000096],[-101.19275699999997,76.571381000000031],[-101.27390300000002,76.560806000000071],[-101.326683,76.556366000000082],[-101.38054699999992,76.553588999999988]],[[-89.934432999999956,76.47665400000011],[-89.978881999999999,76.469711000000132],[-89.999725000000012,76.470260999999994],[-90.040833000000021,76.476928999999927],[-90.081680000000006,76.484984999999995],[-90.151108000000022,76.504439999999988],[-90.184433000000013,76.515274000000034],[-90.21444699999995,76.528594999999996],[-90.226669000000015,76.535538000000031],[-90.412216000000001,76.636108000000036],[-90.478058000000033,76.662200999999982],[-90.504456000000005,76.675261999999918],[-90.56361400000003,76.709991000000002],[-90.573333999999988,76.715820000000008],[-90.59445199999999,76.729705999999965],[-90.600280999999939,76.734984999999995],[-90.600829999999974,76.741088999999988],[-90.599990999999989,76.746643000000006],[-90.597777999999948,76.750000000000114],[-90.58666999999997,76.761383000000137],[-90.579178000000013,76.766937000000098],[-90.57028200000002,76.771927000000005],[-90.544448999999986,76.783051000000057],[-90.510284000000013,76.793320000000108],[-90.474716000000001,76.799713000000054],[-90.230559999999969,76.828048999999965],[-90.103058000000033,76.836105000000032],[-90.025283999999999,76.839156999999943],[-89.983063000000016,76.836928999999998],[-89.927779999999984,76.828873000000101],[-89.865279999999984,76.816086000000098],[-89.825835999999981,76.806091000000038],[-89.779448999999886,76.7852630000001],[-89.673888999999974,76.737487999999928],[-89.673888999999974,76.731369000000086],[-89.687774999999988,76.708878000000084],[-89.702224999999999,76.689697000000024],[-89.729445999999996,76.673309000000017],[-89.744155999999975,76.669434000000024],[-89.768065999999976,76.668045000000006],[-89.819732999999928,76.667206000000022],[-89.837218999999891,76.663040000000137],[-89.840835999999911,76.657211000000132],[-89.862777999999992,76.60386699999998],[-89.862502999999947,76.597488000000112],[-89.858336999999949,76.591094999999939],[-89.817504999999983,76.546936000000017],[-89.794448999999929,76.533325000000048],[-89.756119000000012,76.524703999999929],[-89.721663999999976,76.519714000000079],[-89.699157999999954,76.516936999999984],[-89.684433000000013,76.511658000000011],[-89.671386999999982,76.504166000000055],[-89.673888999999974,76.502212999999927],[-89.757507000000032,76.486099000000024],[-89.783614999999884,76.483047000000056],[-89.934432999999956,76.47665400000011]],[[-108.65110800000002,76.813599000000011],[-108.65110800000002,76.808868000000075],[-108.65527299999991,76.803863999999976],[-108.67804699999999,76.784988000000112],[-108.68443299999996,76.780548000000067],[-108.69055200000003,76.774429000000055],[-108.69249000000002,76.769989000000066],[-108.68831599999999,76.766098],[-108.67971799999992,76.763321000000076],[-108.66278099999994,76.761383000000137],[-108.596947,76.760818000000086],[-108.55248999999992,76.761383000000137],[-108.52722199999999,76.760268999999937],[-108.50389099999995,76.756103999999937],[-108.48889199999996,76.751663000000065],[-108.46333299999998,76.739151000000049],[-108.45500199999998,76.733322000000044],[-108.44638099999997,76.723602000000142],[-108.44220699999994,76.717758000000117],[-108.43804899999998,76.708038000000045],[-108.44193999999999,76.696365000000014],[-108.45889299999988,76.684708000000057],[-108.54472399999997,76.646378000000141],[-108.56555200000003,76.641663000000108],[-108.58667000000003,76.641663000000108],[-108.60749800000002,76.642487000000074],[-108.628601,76.645263999999997],[-108.65387699999997,76.647217000000126],[-108.68110699999994,76.647766000000047],[-108.70417799999996,76.646378000000141],[-108.72083999999995,76.642487000000074],[-108.72721899999999,76.638046000000145],[-108.72693600000002,76.634155000000078],[-108.69915800000001,76.605545000000063],[-108.69055200000003,76.600540000000024],[-108.62721299999998,76.575546000000031],[-108.61054999999993,76.569717000000026],[-108.58389299999993,76.477478000000076],[-108.58112299999999,76.439147999999989],[-108.55803699999996,76.408599999999979],[-108.475281,76.406937000000084],[-108.36389200000002,76.399994000000049],[-108.32888800000001,76.396652000000131],[-108.31861900000001,76.394150000000081],[-108.28971899999993,76.384430000000009],[-108.26917300000002,76.374985000000095],[-108.07749899999999,76.28054800000001],[-108.11472299999997,76.261383000000023],[-108.252228,76.196929999999952],[-108.33139,76.181931000000077],[-108.38027999999997,76.165268000000026],[-108.39222699999993,76.159424000000001],[-108.40862300000003,76.14776599999999],[-108.396118,76.046097000000145],[-108.35193600000002,76.048874000000069],[-108.02555799999999,76.062195000000031],[-108.00140399999998,76.063033999999959],[-107.916946,76.063033999999959],[-107.83833300000003,76.061371000000065],[-107.81220999999999,76.056090999999981],[-107.73665599999998,76.039428999999984],[-107.72471599999994,76.035538000000088],[-107.63834399999996,75.996368000000132],[-107.63249200000001,75.991088999999988],[-107.63305699999995,75.981369000000086],[-107.639183,75.976089000000002],[-107.65139799999997,75.97026100000005],[-107.78555299999999,75.919983000000116],[-107.84221599999995,75.899993999999992],[-107.90194700000001,75.896103000000096],[-107.91805999999997,75.891373000000101],[-107.93028300000003,75.885544000000039],[-108.031113,75.822495000000004],[-108.04361,75.802199999999971],[-108.02417000000003,75.783875000000023],[-108.02027900000002,75.780823000000112],[-108.00639299999995,75.779433999999924],[-107.9569469999999,75.784714000000008],[-107.91332999999986,75.789429000000041],[-107.87361099999993,75.798035000000141],[-107.82084699999996,75.829162999999994],[-107.77834300000001,75.854706000000078],[-107.75974299999996,75.869705000000124],[-107.75974299999996,75.874419999999986],[-107.739441,75.879150000000038],[-107.51555599999995,75.899993999999992],[-107.36945299999996,75.911652000000004],[-107.33750899999995,75.911377000000016],[-107.18666099999996,75.90387000000004],[-107.08000199999998,75.892761000000007],[-107.08583099999998,75.872482000000048],[-107.09028599999994,75.867477000000008],[-107.10500300000001,75.834717000000126],[-107.09805299999999,75.823043999999925],[-107.03167699999995,75.771103000000039],[-106.96362299999993,75.738586000000055],[-106.89666699999998,75.720261000000107],[-106.88027999999991,75.765822999999955],[-106.83056599999998,75.785812000000078],[-106.79444899999993,75.791656000000103],[-106.74471999999992,75.79553199999998],[-106.72277799999995,75.795821999999987],[-106.67944299999999,75.793594000000041],[-106.6558379999999,75.793594000000041],[-106.636124,75.794434000000081],[-106.61582899999996,75.797211000000004],[-106.62110899999993,75.803314000000114],[-106.6383439999999,75.806931000000077],[-106.67944299999999,75.812485000000095],[-106.72666900000002,75.813873000000001],[-106.78611799999993,75.813309000000061],[-106.829453,75.816665999999998],[-106.85082999999992,75.819992000000013],[-106.87000299999994,75.824997000000053],[-106.88890100000003,75.834717000000126],[-106.89584400000001,75.844437000000028],[-106.89666699999998,75.935256999999979],[-106.89611799999994,75.941086000000041],[-106.89334100000002,75.947478999999987],[-106.86971999999997,75.964157000000057],[-106.63890099999998,76.053040000000124],[-106.60610999999994,76.057754999999986],[-106.58583099999993,76.058593999999971],[-106.368607,76.055817000000047],[-106.33667000000003,76.054703000000075],[-106.30082699999997,76.051376000000118],[-106.01611299999996,76.019714000000022],[-105.93720999999999,76.010269000000108],[-105.89998600000001,76.005554000000075],[-105.837219,75.996932999999956],[-105.73500100000001,75.974991000000102],[-105.66832699999998,75.955551000000128],[-105.61945299999996,75.93942300000009],[-105.60637699999995,75.934708000000057],[-105.59528399999988,75.929703000000018],[-105.47888199999994,75.863036999999963],[-105.46528599999999,75.851928999999984],[-105.45333900000003,75.841659999999933],[-105.445831,75.830551000000071],[-105.40028399999989,75.694427000000076],[-105.38834399999996,75.656372000000033],[-105.391953,75.63888500000013],[-105.48750299999995,75.560806000000127],[-105.49638399999998,75.55525200000011],[-105.51666299999994,75.550537000000077],[-105.54083300000002,75.546936000000017],[-105.60444599999988,75.539978000000019],[-105.63667299999997,75.533600000000092],[-105.68582200000003,75.519440000000145],[-105.74082900000002,75.494979999999941],[-105.75140399999998,75.489700000000084],[-105.74804699999999,75.485809000000017],[-105.73693799999995,75.48275799999999],[-105.68666100000002,75.483047000000113],[-105.67166099999986,75.481093999999985],[-105.61138900000003,75.47164900000007],[-105.59277299999997,75.46748400000007],[-105.593613,75.462769000000037],[-105.64639299999993,75.365265000000022],[-105.65110799999997,75.359421000000054],[-105.66055299999994,75.349716000000114],[-105.72666900000002,75.31303400000013],[-105.7386019999999,75.309418000000051],[-105.76251199999996,75.304976999999951],[-105.79361,75.302200000000084],[-105.81304899999998,75.29942299999999],[-105.82140399999992,75.295822000000101],[-105.86694299999999,75.275818000000015],[-105.87526699999995,75.271102999999982],[-105.93776699999989,75.214432000000045],[-105.93888900000002,75.208603000000039],[-105.93582199999997,75.202774000000034],[-105.929169,75.197754000000145],[-105.89222699999999,75.190810999999997],[-105.87249800000001,75.171920999999998],[-105.876938,75.145828000000051],[-105.88527699999997,75.14027400000009],[-105.90499899999998,75.136383000000023],[-105.92582699999997,75.135268999999994],[-106.00361599999991,75.135544000000039],[-106.01889,75.133881000000088],[-106.07028200000002,75.106644000000017],[-106.07945299999989,75.096939000000077],[-106.07333399999993,75.087203999999986],[-106.01862299999999,75.074158000000068],[-106.00446299999999,75.068054000000018],[-105.99416399999996,75.062195000000031],[-105.99333199999995,75.055817000000047],[-106.011124,75.050812000000008],[-106.23528299999998,75.021378000000027],[-106.26000999999997,75.019150000000081],[-106.45500199999992,75.005829000000119],[-106.54554699999989,75.001663000000008],[-106.564438,75.00082400000008],[-106.66332999999992,75.004165999999998],[-106.72556299999997,75.00221300000004],[-106.77111799999989,74.996643000000006],[-106.78639199999998,74.991928000000144],[-106.78307299999994,74.989975000000015],[-106.78333299999997,74.986098999999967],[-106.78582799999992,74.98054500000012],[-106.79194599999994,74.975266000000147],[-106.807503,74.969711000000075],[-106.93055699999996,74.933594000000085],[-106.97222899999997,74.926086000000055],[-107.01000999999991,74.922484999999995],[-107.05110200000001,74.921646000000067],[-107.07362399999994,74.919983000000116],[-107.16000399999996,74.910538000000088],[-107.19722000000002,74.910812000000021],[-107.21584300000001,74.911925999999994],[-107.46417199999996,74.934418000000051],[-107.506958,74.939972000000068],[-107.63082900000001,74.961104999999975],[-107.66251399999999,74.966660000000047],[-107.68804899999998,74.976379000000065],[-107.69554099999999,74.982208000000071],[-107.72389199999998,75.016388000000006],[-107.72389199999998,75.020264000000054],[-107.71972699999998,75.02609300000006],[-107.704453,75.030823000000112],[-107.68138099999999,75.042480000000012],[-107.67944299999994,75.048599000000081],[-107.68110699999994,75.05304000000001],[-107.69499199999996,75.075272000000041],[-107.70584100000002,75.086105000000032],[-107.716949,75.090820000000065],[-107.739441,75.095825000000104],[-107.75834700000001,75.096939000000077],[-107.77333099999998,75.096099999999922],[-107.78307299999994,75.093596999999988],[-107.77999899999998,75.072220000000129],[-107.77084400000001,75.06581100000011],[-107.75778200000002,75.06053199999991],[-107.74500299999994,75.054153000000042],[-107.739441,75.048874000000069],[-107.73972299999997,75.043045000000063],[-107.74388099999993,75.037201000000039],[-107.77778599999999,75.029434000000094],[-107.89499699999999,75.003601000000003],[-107.94193999999999,74.93081699999999],[-107.95527600000003,74.928589000000045],[-107.97749299999998,74.927475000000072],[-108.02417000000003,74.929152999999985],[-108.13417099999992,74.927765000000079],[-108.21083099999987,74.923599000000024],[-108.37304699999999,74.910538000000088],[-108.3916779999999,74.911377000000016],[-108.43639400000001,74.915268000000083],[-108.45500199999998,74.918319999999994],[-108.52971599999995,74.936645999999996],[-108.54110700000001,74.940536000000009],[-108.548607,74.946365000000014],[-108.54795799999999,74.951653000000022],[-108.55055199999998,74.956375000000094],[-108.55999800000001,74.960815000000139],[-108.67971799999992,74.970261000000107],[-108.781113,74.979980000000069],[-108.80721999999997,74.983597000000032],[-108.80721999999997,74.984711000000004],[-108.79611199999999,74.985809000000131],[-108.74553699999996,74.984420999999998],[-108.63890100000003,74.981094000000098],[-108.614441,74.979705999999965],[-108.55999800000001,74.976379000000065],[-108.53028899999993,74.973312000000135],[-108.51139799999999,74.97554000000008],[-108.52667199999996,75.001663000000008],[-108.53056300000003,75.005554000000075],[-108.53806299999985,75.009430000000009],[-108.628601,75.046096999999975],[-108.65139799999992,75.053863999999976],[-108.79472399999997,75.069153000000028],[-108.83249699999993,75.069992000000013],[-108.92777999999993,75.05192599999998],[-108.94972200000001,75.040267999999969],[-109.00110599999999,75.004990000000134],[-109.11971999999997,74.979430999999977],[-109.34584000000001,74.944702000000063],[-109.36416600000001,74.939697000000024],[-109.39998600000001,74.918319999999994],[-109.40722700000003,74.912490999999989],[-109.40695199999993,74.908599999999922],[-109.420547,74.893051000000014],[-109.50805700000001,74.866379000000109],[-109.52278099999995,74.863312000000008],[-109.56861900000001,74.857758000000047],[-109.58721899999995,74.856644000000017],[-109.66139199999992,74.856369000000029],[-109.76944700000001,74.859421000000111],[-109.79750099999995,74.863602000000014],[-109.81111099999993,74.868042000000059],[-109.83361799999994,74.869704999999954],[-109.87249800000001,74.869141000000013],[-109.93472300000002,74.860809000000017],[-109.95500199999987,74.857208000000014],[-109.99471999999997,74.848327999999981],[-110.01640299999991,74.842209000000082],[-110.13971700000002,74.833054000000061],[-110.30444299999994,74.846375000000023],[-110.32501200000002,74.847488000000112],[-110.34555099999989,74.846939000000134],[-110.36000100000001,74.843872000000033],[-110.37053700000001,74.839980999999966],[-110.40416699999997,74.826660000000004],[-110.39620999999994,74.813689999999951],[-110.39666699999998,74.799423000000104],[-110.43666100000002,74.793319999999937],[-110.58999599999993,74.778046000000074],[-110.59137699999997,74.724152000000061],[-110.75666799999993,74.685257000000092],[-110.77250699999996,74.680817000000047],[-110.78639199999998,74.674698000000035],[-110.79638699999998,74.668869000000029],[-110.807503,74.657486000000006],[-110.83389299999993,74.651931999999988],[-110.98111,74.621368000000132],[-111.28056300000003,74.567764000000125],[-111.38722200000001,74.563034000000073],[-111.40915699999999,74.562759000000085],[-111.43055699999996,74.560532000000023],[-111.55888399999998,74.52748100000008],[-111.64250199999992,74.501389000000017],[-111.67722300000003,74.493317000000047],[-111.700287,74.49136400000009],[-111.82389799999999,74.48332199999993],[-111.94554099999993,74.474425999999994],[-111.98416099999997,74.468872000000033],[-112.087219,74.452208999999925],[-112.29305999999991,74.427765000000022],[-112.37053699999996,74.418594000000041],[-112.43831599999999,74.414429000000041],[-112.54194599999988,74.409424000000001],[-112.75306699999993,74.401382000000012],[-112.85694899999993,74.398330999999985],[-112.91999799999991,74.397490999999945],[-113.00890400000003,74.398040999999978],[-113.25723299999993,74.405258000000117],[-113.406113,74.413315000000068],[-113.42832899999996,74.414703000000145],[-113.47168699999997,74.41891499999997],[-113.64083900000003,74.437485000000095],[-113.69638099999997,74.446091000000024],[-113.84221600000001,74.479706000000078],[-113.94167299999998,74.50360100000006],[-114.05387899999999,74.530822999999998],[-114.12110899999993,74.549987999999985],[-114.29834,74.602768000000026],[-114.34861799999999,74.618866000000082],[-114.37470999999994,74.629150000000095],[-114.39695699999993,74.639160000000004],[-114.43804899999986,74.659424000000115],[-114.44360399999994,74.664153999999996],[-114.44776899999994,74.674698000000035],[-114.42859599999991,74.691925000000026],[-114.41972399999992,74.698029000000076],[-114.40750099999997,74.704163000000108],[-114.39444700000001,74.708328000000108],[-114.21444699999995,74.755554000000132],[-114.10166899999996,74.776657000000057],[-114.01027699999992,74.790543000000071],[-113.73166699999996,74.827208999999982],[-113.71000699999996,74.829711999999915],[-113.55695300000002,74.839157],[-113.41861,74.84275800000006],[-113.28278399999999,74.848602000000085],[-113.25334199999998,74.87359600000002],[-113.22269399999988,74.896469000000025],[-113.15194699999995,74.924987999999985],[-113.1205369999999,74.932480000000112],[-113.00750699999992,74.954163000000051],[-112.91111799999987,74.970825000000048],[-112.86749299999997,74.97554000000008],[-112.84528399999994,74.976929000000098],[-112.57224299999996,74.99275200000011],[-112.52416999999991,74.995529000000033],[-112.5,74.996010000000012],[-112.453056,74.996933000000013],[-112.37444299999993,74.998321999999973],[-112.01500699999991,75.002486999999974],[-111.962219,75.001389000000074],[-111.935272,74.998871000000122],[-111.89890299999996,74.994980000000055],[-111.86527999999993,74.988312000000064],[-111.84056099999998,74.986374000000126],[-111.76444999999995,74.981659000000093],[-111.75334199999998,74.981659000000093],[-111.718613,74.986649],[-111.62666300000001,75.003875999999991],[-111.58972199999999,75.006378000000041],[-111.55139200000002,75.011383000000137],[-111.53527800000001,75.014998999999989],[-111.28971899999999,75.086105000000032],[-111.02916700000003,75.171097000000032],[-110.920547,75.223602000000085],[-110.91361999999998,75.228591999999935],[-110.91278099999994,75.233871000000136],[-110.91750300000001,75.239699999999971],[-111.05249000000003,75.270263999999997],[-111.06806899999987,75.271927000000119],[-111.23082699999998,75.264159999999947],[-111.24889400000001,75.259155000000078],[-111.25195300000001,75.254165999999941],[-111.25083899999993,75.248596000000077],[-111.25167799999997,75.243042000000059],[-111.25611900000001,75.236649000000114],[-111.26112399999994,75.232208000000014],[-111.27778599999994,75.220534999999984],[-111.33416699999992,75.19747899999993],[-111.39167800000001,75.181091000000094],[-111.47501399999999,75.161652000000004],[-111.56082200000003,75.146103000000096],[-111.57721700000002,75.143600000000106],[-111.59612299999998,75.143326000000002],[-111.69526699999989,75.145828000000051],[-111.70584100000002,75.151093000000117],[-111.787216,75.166655999999932],[-111.958054,75.13499500000006],[-112.22833300000002,75.124694999999974],[-112.39055599999995,75.123032000000023],[-112.40972899999997,75.12359600000002],[-112.42916899999994,75.125259000000085],[-112.439438,75.128586000000041],[-112.44833399999999,75.133041000000048],[-112.47084000000001,75.146378000000084],[-112.46833800000002,75.151382000000069],[-112.46166999999997,75.154433999999981],[-112.45249899999999,75.155822999999998],[-112.41197199999993,75.159012000000075],[-112.36860699999994,75.169144000000131],[-112.35833700000001,75.173035000000027],[-112.29472399999992,75.198028999999963],[-112.29583700000001,75.202774000000034],[-112.33944700000001,75.223602000000085],[-112.39750700000002,75.241089000000102],[-112.40888999999993,75.240814000000114],[-112.4366609999999,75.230545000000063],[-112.46193700000003,75.218872000000033],[-112.46417200000002,75.213043000000027],[-112.46305799999999,75.208327999999995],[-112.45056199999999,75.204711999999972],[-112.43749999999994,75.198868000000118],[-112.43221999999997,75.19331399999993],[-112.43250299999994,75.1869200000001],[-112.44471699999997,75.18331900000004],[-112.46665999999999,75.179977000000065],[-112.56111099999993,75.178314],[-112.59249899999998,75.181656000000089],[-112.60888699999992,75.185256999999979],[-112.62554899999998,75.190810999999997],[-112.6347429999999,75.196365000000128],[-112.63722200000001,75.204987000000131],[-112.63694800000002,75.210541000000148],[-112.632767,75.215820000000122],[-112.61609599999997,75.223877000000073],[-112.59472699999998,75.230270000000075],[-112.58583099999998,75.239150999999993],[-112.59472699999998,75.250000000000057],[-112.61277799999999,75.259430000000123],[-112.65167200000002,75.275269000000037],[-112.66583300000002,75.278595000000109],[-112.679169,75.277771000000143],[-112.71305799999999,75.256104000000107],[-112.718887,75.250275000000045],[-112.735817,75.203323000000125],[-112.73416099999992,75.19747899999993],[-112.72888199999994,75.192749000000106],[-112.71584299999995,75.187195000000088],[-112.698036,75.177765000000022],[-112.68859899999995,75.171920999999998],[-112.699997,75.138321000000133],[-112.80695300000002,75.115814000000057],[-112.89417300000002,75.103317000000061],[-112.95667300000002,75.097214000000122],[-113.25446299999999,75.076096000000007],[-113.29888899999997,75.073044000000095],[-113.343887,75.072220000000129],[-113.610817,75.062759000000142],[-113.68083200000001,75.05192599999998],[-113.699432,75.051375999999948],[-113.89417299999997,75.052199999999914],[-113.91750299999995,75.053589000000102],[-113.94138299999986,75.056931000000077],[-113.950287,75.06053199999991],[-113.96888699999994,75.075272000000041],[-113.97305299999994,75.086655000000064],[-113.97305299999994,75.096374999999966],[-113.93138099999999,75.189148000000046],[-113.82055700000001,75.314423000000147],[-113.80583199999995,75.326660000000118],[-113.78278399999999,75.33776899999998],[-113.72805800000003,75.345825000000048],[-113.66055299999994,75.351379000000065],[-113.64222699999993,75.353591999999992],[-113.573624,75.366928000000144],[-113.34056099999992,75.413315000000068],[-113.38110399999999,75.418320000000108],[-113.47112300000003,75.427764999999965],[-113.577789,75.411652000000117],[-113.66027799999995,75.398605000000089],[-113.74445299999996,75.385818000000086],[-113.83389299999988,75.37692300000009],[-113.87138400000003,75.374145999999996],[-113.90222199999999,75.3744200000001],[-113.91139199999998,75.378036000000122],[-113.92111199999994,75.383881000000031],[-113.958618,75.411102000000085],[-113.98166700000002,75.431091000000038],[-113.98416099999992,75.437758999999971],[-113.99221799999998,75.448318000000029],[-114.02416999999997,75.461105000000032],[-114.04083300000002,75.463882000000126],[-114.06500199999988,75.466095000000109],[-114.08389299999999,75.464706000000092],[-114.08693699999998,75.462494000000049],[-114.08917199999996,75.458602999999982],[-114.093887,75.410812000000078],[-114.09166699999992,75.404984000000127],[-114.08583099999993,75.400269000000094],[-114.07778899999988,75.394150000000081],[-114.06610099999995,75.389160000000061],[-114.05638099999987,75.383330999999998],[-114.04472399999992,75.373032000000023],[-114.04055800000003,75.36775200000011],[-114.04055800000003,75.362198000000092],[-114.04750100000001,75.35054000000008],[-114.13751200000002,75.244979999999998],[-114.15805099999994,75.233321999999987],[-114.17083699999989,75.226929000000041],[-114.18666100000002,75.223312000000078],[-114.203056,75.221375000000023],[-114.22277799999995,75.2227630000001],[-114.26363399999991,75.229705999999908],[-114.28472899999997,75.234985000000108],[-114.319458,75.24470500000001],[-114.34638999999993,75.25471500000009],[-114.35082999999997,75.26638800000012],[-114.34916699999985,75.271378000000141],[-114.35109699999992,75.276093000000003],[-114.35888699999992,75.281371999999976],[-114.49999999999994,75.312194999999974],[-114.51278699999995,75.314697000000081],[-114.52806099999992,75.314423000000147],[-114.54276999999996,75.31303400000013],[-114.60973399999995,75.27998400000007],[-114.61527999999993,75.274994000000049],[-114.61138900000003,75.265273999999977],[-114.598343,75.261658000000068],[-114.57972699999999,75.263321000000019],[-114.57250999999997,75.264434999999992],[-114.54666099999997,75.266937000000041],[-114.49638399999998,75.265548999999965],[-114.46806299999997,75.262207000000046],[-114.44304699999986,75.257216999999969],[-114.41278099999994,75.24803199999991],[-114.39723200000003,75.238876000000005],[-114.30249000000003,75.1827550000001],[-114.297234,75.179152999999928],[-114.29472399999997,75.173309000000131],[-114.29804999999999,75.166655999999932],[-114.30860899999993,75.154709000000025],[-114.32112099999995,75.143326000000002],[-114.33528099999995,75.13108799999992],[-114.34944199999995,75.119140999999956],[-114.36749299999985,75.106934000000024],[-114.39499699999993,75.090546000000131],[-114.42971799999987,75.073044000000095],[-114.46640000000002,75.06053199999991],[-114.48332199999987,75.056090999999981],[-114.51889,75.050261999999975],[-114.60082999999997,75.038315000000011],[-114.72416699999997,75.011932000000058],[-114.76342799999998,75.002472000000012],[-114.825287,74.988037000000077],[-114.88861099999991,74.977478000000019],[-114.94915800000001,74.969986000000063],[-115.03222699999992,74.961655000000007],[-115.05082700000003,74.961104999999975],[-115.066101,74.961655000000007],[-115.16055299999999,74.979430999999977],[-115.18582200000003,74.985259999999982],[-115.195267,74.989975000000015],[-115.22609699999992,75.049713000000054],[-115.22638699999993,75.058318999999983],[-115.225281,75.064147999999989],[-115.21861299999995,75.070831000000112],[-115.21167000000003,75.07638500000013],[-115.199432,75.082763999999997],[-115.18331899999993,75.088882000000126],[-115.17415599999993,75.094147000000021],[-115.17304999999999,75.099990999999989],[-115.17278299999992,75.10775799999999],[-115.17832899999996,75.115814000000057],[-115.216949,75.167480000000126],[-115.23554999999993,75.174698000000092],[-115.24861099999998,75.178314],[-115.25695799999994,75.179977000000065],[-115.26083399999993,75.179977000000065],[-115.25611900000001,75.178040000000067],[-115.252228,75.173874000000126],[-115.25361599999991,75.164429000000098],[-115.256393,75.158035000000041],[-115.26139799999999,75.151932000000102],[-115.27916699999997,75.140823000000012],[-115.291382,75.134430000000066],[-115.33640300000002,75.116652999999985],[-115.35305799999998,75.111099000000024],[-115.37304699999999,75.105820000000051],[-115.38694799999996,75.102203000000088],[-115.40416700000003,75.098877000000016],[-115.42666600000001,75.098038000000088],[-115.451683,75.098877000000016],[-115.48361199999994,75.106093999999985],[-115.51944700000001,75.117751999999996],[-115.62389399999995,75.121368000000018],[-115.60472099999993,75.108597000000088],[-115.54888899999997,75.055817000000047],[-115.53971899999993,75.044434000000081],[-115.53751399999993,75.039429000000041],[-115.53751399999993,75.027205999999978],[-115.54527300000001,75.015823000000125],[-115.5516659999999,75.009155000000135],[-115.57472200000001,74.998321999999973],[-115.60249299999998,74.98553499999997],[-115.61833200000001,74.979155999999932],[-115.658051,74.967208999999968],[-115.67194399999988,74.964706000000035],[-115.69055200000003,74.964157000000057],[-115.73500100000001,74.967208999999968],[-115.75723299999999,74.969986000000063],[-115.84777800000001,74.98553499999997],[-116.16306299999991,75.040267999999969],[-116.27916699999997,75.099425999999994],[-116.28639199999992,75.13108799999992],[-116.27694699999995,75.135268999999994],[-116.26889,75.141373000000044],[-116.2455369999999,75.162766000000147],[-116.24109599999997,75.168869000000086],[-116.23860200000001,75.196930000000009],[-116.23916599999995,75.201385000000016],[-116.24694799999992,75.205261000000064],[-116.26834100000002,75.206100000000049],[-116.287216,75.205551000000071],[-116.52722199999999,75.184708000000001],[-116.56054699999999,75.179152999999928],[-116.58084100000002,75.174423000000104],[-116.59388699999994,75.170258000000103],[-116.60249299999998,75.164993000000038],[-116.618607,75.152481000000023],[-116.66332999999997,75.122481999999991],[-116.679169,75.117203000000018],[-116.69415299999997,75.116652999999985],[-116.71721599999995,75.116652999999985],[-117.16860999999994,75.157486000000063],[-117.38417099999992,75.178588999999988],[-117.41915899999992,75.182480000000055],[-117.45777899999996,75.188873000000001],[-117.47501399999993,75.192200000000128],[-117.66361999999998,75.239150999999993],[-117.67832900000002,75.244431000000077],[-117.68305999999995,75.248596000000077],[-117.68388400000003,75.253052000000139],[-117.67166099999997,75.288879000000122],[-117.666946,75.294144000000017],[-117.66194199999995,75.298035000000084],[-117.53666699999997,75.361649],[-117.45527599999997,75.400269000000094],[-117.42054699999994,75.413315000000068],[-117.35360699999995,75.437485000000038],[-117.32112099999995,75.448593000000074],[-117.26139799999993,75.468871999999976],[-117.24054699999999,75.473602000000028],[-117.218887,75.476379000000122],[-117.14666699999998,75.480270000000019],[-117.10305799999998,75.482208000000128],[-117.041382,75.483597000000145],[-116.89778100000001,75.482482999999945],[-116.87748699999997,75.481368999999972],[-116.75334199999998,75.479431000000034],[-116.13474300000001,75.476379000000122],[-116.11554699999994,75.476928999999984],[-116.02194199999997,75.484985000000052],[-115.97332799999998,75.492751999999996],[-115.92250100000001,75.503876000000048],[-115.81833599999987,75.529709000000025],[-115.68888900000002,75.56442300000009],[-115.64639299999999,75.573607999999922],[-115.61972000000003,75.578872999999987],[-115.56527699999987,75.583878000000027],[-115.53056299999997,75.584991000000116],[-115.50611900000001,75.587204000000099],[-115.46305799999999,75.591933999999924],[-115.36609599999997,75.602768000000026],[-115.28832999999997,75.620529000000147],[-115.28611799999993,75.624420000000043],[-115.27722199999999,75.630539000000056],[-115.26777600000003,75.635818000000029],[-115.20333900000003,75.657211000000132],[-115.18611099999993,75.662766000000033],[-115.09665699999994,75.687194999999974],[-115.08194700000001,75.689423000000147],[-115.07028200000002,75.689972000000068],[-115.04250300000001,75.689697000000081],[-114.99973299999994,75.690811000000053],[-114.99804699999999,75.695816000000093],[-115.00556899999992,75.698868000000004],[-115.02834300000001,75.701660000000118],[-115.05277999999998,75.703048999999908],[-115.07611099999991,75.702484000000084],[-115.10305800000003,75.700821000000133],[-115.14555399999995,75.694138000000009],[-115.21721600000001,75.679321000000073],[-115.27916699999997,75.667755],[-115.32472199999995,75.659988000000055],[-115.38305700000001,75.653870000000097],[-115.40194699999995,75.652480999999966],[-115.47193900000002,75.650269000000037],[-115.51888999999994,75.649994000000049],[-115.60637700000001,75.651093000000003],[-115.66750299999995,75.647217000000126],[-115.71444700000001,75.642487000000131],[-115.889183,75.614426000000037],[-116.09166700000003,75.580551000000128],[-116.108047,75.574157999999954],[-116.11916400000001,75.572768999999994],[-116.34750399999996,75.559143000000006],[-116.38971700000002,75.5577550000001],[-116.46028099999995,75.557480000000055],[-116.48610699999995,75.5577550000001],[-116.84361299999989,75.564987000000031],[-117.19499200000001,75.573607999999922],[-117.21556099999998,75.574707000000103],[-117.23277300000001,75.576935000000049],[-117.24276700000001,75.580551000000128],[-117.25,75.586105000000089],[-117.25110599999994,75.597488000000112],[-117.24833699999999,75.603043000000014],[-117.23999000000003,75.614990000000148],[-117.23361199999994,75.620529000000147],[-117.21362299999993,75.633330999999998],[-117.07805599999995,75.707214000000079],[-117.06443799999994,75.714157000000114],[-117.03971899999999,75.725815000000125],[-117.02362099999993,75.732483000000116],[-117.01666299999994,75.737198000000149],[-116.95556599999992,75.761932000000115],[-116.923317,75.774704000000099],[-116.88667299999992,75.786926000000051],[-116.86888099999999,75.790543000000014],[-116.85056299999991,75.79304500000012],[-116.81639099999995,75.796371000000136],[-116.76278699999995,75.799988000000099],[-116.71972699999998,75.801650999999993],[-116.58860799999997,75.803314000000114],[-116.53056300000003,75.802765000000022],[-116.32417299999992,75.804703000000131],[-116.10582699999998,75.806931000000077],[-116.03721599999994,75.809708000000001],[-115.82305899999994,75.827208999999925],[-115.80444299999994,75.829987000000131],[-115.79444899999999,75.834152000000131],[-115.78415699999994,75.845260999999994],[-115.77971600000001,75.852203000000088],[-115.76500699999997,75.854431000000034],[-115.74944299999999,75.854980000000012],[-115.73693800000001,75.854431000000034],[-115.72638699999993,75.853317000000061],[-115.69193999999993,75.848328000000095],[-115.67388900000003,75.844147000000021],[-115.65943900000002,75.839706000000092],[-115.62277199999994,75.834427000000119],[-115.59445199999999,75.833327999999995],[-115.50723299999993,75.834991000000059],[-115.40499899999998,75.838043000000027],[-115.38194299999992,75.839706000000092],[-115.36416599999995,75.844147000000021],[-115.35193599999997,75.852203000000088],[-115.31360599999994,75.855255],[-115.13945000000001,75.859421000000111],[-115.07277699999986,75.85775799999999],[-115.04998799999998,75.855820000000051],[-115.00083899999998,75.853317000000061],[-114.98082699999992,75.853043000000127],[-114.932503,75.856644000000017],[-114.91194199999995,75.859711000000118],[-114.83860799999997,75.874419999999986],[-114.817497,75.880814000000044],[-114.80444299999994,75.886932000000002],[-114.798607,75.892212000000029],[-114.80999800000001,75.899428999999941],[-114.82417299999986,75.904160000000104],[-114.83667000000003,75.905822999999998],[-114.88166799999993,75.907486000000119],[-114.90722700000003,75.906372000000147],[-115.01806599999992,75.89888000000002],[-115.06416299999989,75.894714000000135],[-115.10527000000002,75.888596000000007],[-115.22165699999999,75.880264000000011],[-115.29277000000002,75.878311000000053],[-115.39472999999992,75.877762000000132],[-115.54055799999998,75.881362999999965],[-115.68222000000003,75.888321000000133],[-115.74694799999986,75.889434999999935],[-115.83029199999993,75.887772000000041],[-115.86888099999999,75.884430000000066],[-116.00472999999994,75.868590999999981],[-116.05332899999991,75.865540000000124],[-116.10665899999998,75.864150999999936],[-116.13474300000001,75.86442599999998],[-116.15083299999992,75.864700000000084],[-116.48277299999995,75.873871000000065],[-116.62389400000001,75.881927000000132],[-116.64972699999998,75.884995000000117],[-116.67666600000001,75.889709000000039],[-116.69972199999995,75.894989000000123],[-116.71501199999994,75.900269000000037],[-116.72444200000001,75.906372000000147],[-116.73416099999992,75.922484999999995],[-116.73361199999999,75.928589000000045],[-116.73137699999995,75.945251000000042],[-116.72666899999996,75.951385000000016],[-116.71389799999997,75.956649999999911],[-116.69972199999995,75.959990999999945],[-116.67748999999998,75.963882000000012],[-116.63221699999997,75.969147000000078],[-116.58528099999995,75.971924000000001],[-116.56139400000001,75.972762999999986],[-116.53721599999994,75.972488000000112],[-116.51611300000002,75.971100000000035],[-116.48528299999998,75.966385000000002],[-116.470551,75.96887200000009],[-116.46193700000003,75.974991000000102],[-116.46833800000002,75.986374000000126],[-116.52834299999995,76.027480999999966],[-116.60221899999993,76.022216999999955],[-116.645554,76.023041000000092],[-116.66944899999999,76.025818000000015],[-116.6875,76.02915999999999],[-116.69888300000002,76.034424000000115],[-116.70556599999998,76.039153999999996],[-116.708618,76.043869000000029],[-116.70777900000002,76.049988000000042],[-116.70612299999999,76.05386400000009],[-116.70168299999995,76.059982000000048],[-116.69638099999992,76.064987000000087],[-116.64138800000001,76.113312000000121],[-116.53388999999999,76.153320000000008],[-116.51611300000002,76.157761000000107],[-116.34221599999995,76.183043999999995],[-116.29611199999999,76.188582999999994],[-116.21362299999998,76.194977000000051],[-116.16361999999992,76.197204999999997],[-116.08416699999998,76.198318000000086],[-116.05943300000001,76.198029000000133],[-115.95889299999999,76.194138000000066],[-115.90862300000003,76.191924999999912],[-115.86554699999999,76.188309000000061],[-115.81582600000002,76.186920000000043],[-115.64334099999996,76.186096000000077],[-115.59500100000002,76.187759000000028],[-115.44721999999996,76.186920000000043],[-115.32749899999999,76.184708000000001],[-115.27306399999998,76.18220500000001],[-115.154449,76.169434000000081],[-115.13027999999997,76.165816999999947],[-115.02166699999998,76.15637200000009],[-114.87554899999998,76.149719000000118],[-114.85109699999992,76.149429000000112],[-114.79077100000001,76.151077000000043],[-114.72833300000002,76.153046000000074],[-114.68499799999995,76.156097000000045],[-114.66972399999997,76.158325000000048],[-114.66251399999999,76.160537999999974],[-114.662781,76.161651999999947],[-114.68083199999995,76.164992999999981],[-114.70639,76.167205999999965],[-114.80082699999997,76.168594000000041],[-114.85056299999997,76.170258000000047],[-114.89862099999993,76.172485000000108],[-114.94499200000001,76.176085999999998],[-114.99305700000002,76.182480000000055],[-115.00974299999996,76.187485000000095],[-115.01444999999995,76.192749000000049],[-115.02250700000002,76.196929999999952],[-115.04527300000001,76.202208999999982],[-115.08944699999995,76.208878000000027],[-115.15972899999997,76.218596999999988],[-115.27223200000003,76.230270000000019],[-115.37304699999999,76.230820000000051],[-115.54943800000001,76.230545000000063],[-115.75666799999993,76.234146000000123],[-115.78195199999993,76.235260000000096],[-115.82721699999991,76.23942599999998],[-115.84777800000001,76.243042000000059],[-115.86665299999993,76.247482000000048],[-115.88194299999992,76.252776999999924],[-115.91471899999993,76.275269000000037],[-115.92166099999997,76.281096999999932],[-115.92500299999989,76.286652000000061],[-115.90943899999996,76.345535000000041],[-115.90139799999997,76.349991000000102],[-115.86054999999999,76.362488000000099],[-115.64835399999998,76.420258000000047],[-115.62638899999996,76.425812000000008],[-115.51471700000002,76.45138500000013],[-115.49973299999994,76.454712000000086],[-115.46665999999993,76.455826000000059],[-115.26944700000001,76.461105000000032],[-115.02139299999993,76.474700999999982],[-115.00167799999997,76.477203000000088],[-114.978882,76.481658999999979],[-114.95638999999994,76.487198000000149],[-114.94638099999992,76.492477000000122],[-114.93360899999999,76.504990000000021],[-114.92999299999997,76.510268999999994],[-114.91944899999999,76.514435000000105],[-114.89972699999987,76.516936999999984],[-114.74054699999988,76.517212000000029],[-114.71112099999999,76.516936999999984],[-114.70194999999995,76.515274000000034],[-114.69611399999991,76.511382999999967],[-114.69833399999999,76.507492000000127],[-114.720551,76.501099000000124],[-114.70694699999996,76.489700000000028],[-114.61028299999992,76.488312000000121],[-114.45140099999998,76.49693300000007],[-114.29361,76.480269999999962],[-114.25167799999991,76.474990999999989],[-114.20722999999987,76.46804800000001],[-114.17471299999994,76.460266000000047],[-114.14806399999998,76.45138500000013],[-114.13555899999989,76.446365000000071],[-114.11833199999995,76.435257000000092],[-114.11193800000001,76.429428000000087],[-114.10333299999996,76.418869000000029],[-114.096947,76.403595000000109],[-114.09111000000001,76.388885000000016],[-114.10611,76.35554500000012],[-114.11749299999997,76.353317000000004],[-114.12943999999993,76.31191999999993],[-114.05972299999996,76.21775800000006],[-113.99665800000002,76.192749000000049],[-113.98332199999999,76.190262000000018],[-113.9583439999999,76.188873000000001],[-113.94833399999999,76.189423000000033],[-113.70889299999999,76.203598000000113],[-113.685272,76.206100000000049],[-113.63890100000003,76.212769000000094],[-113.61609599999997,76.218323000000055],[-113.52443700000003,76.235809000000017],[-113.36501299999992,76.258605999999929],[-113.32333399999993,76.262772000000041],[-113.26055899999994,76.264434999999992],[-112.99916100000002,76.267487000000074],[-112.95667300000002,76.263611000000026],[-112.90972899999997,76.257491999999957],[-112.89222699999993,76.253876000000105],[-112.86860699999994,76.244704999999954],[-112.85888699999998,76.239975000000129],[-112.85305800000003,76.234146000000123],[-112.75055700000001,76.200546000000031],[-112.71721599999995,76.198318000000086],[-112.62138399999998,76.198318000000086],[-112.59028599999999,76.196639999999945],[-112.48194899999999,76.181366000000082],[-112.46278399999994,76.178313999999943],[-112.45388800000001,76.176376000000005],[-112.42500299999995,76.167755000000113],[-112.43138099999993,76.161926000000108],[-112.43859900000001,76.15887500000008],[-112.47721899999999,76.151382000000012],[-112.49416400000001,76.146652000000017],[-112.50389099999995,76.138596000000121],[-112.52610800000002,76.110535000000027],[-112.52806099999998,76.103867000000037],[-112.52278100000001,76.099152000000004],[-112.42278299999987,76.047211000000118],[-112.41332999999992,76.042480000000012],[-112.38555899999994,76.036652000000061],[-112.29888900000003,76.029434000000094],[-112.15416699999997,76.014998999999989],[-112.06861899999996,76.003326000000129],[-112.04332699999992,75.998871000000122],[-111.9786069999999,75.981369000000086],[-111.78443900000002,75.949707000000103],[-111.76390100000003,75.946930000000009],[-111.75279199999994,75.942749000000106],[-111.72778299999999,75.92164600000001],[-111.72666900000002,75.915817000000004],[-111.729446,75.911101999999971],[-111.736107,75.90498400000007],[-111.77749599999999,75.894714000000135],[-111.87138400000003,75.887496999999996],[-111.94444299999998,75.884995000000117],[-112.00945300000001,75.881652999999972],[-112.03472899999997,75.879974000000004],[-112.05222300000003,75.878036000000066],[-112.07501200000002,75.873871000000065],[-112.165009,75.851928999999984],[-112.17971799999998,75.848038000000088],[-112.18694299999993,75.844986000000006],[-112.22556299999997,75.811096000000077],[-112.218613,75.808029000000147],[-112.20834399999995,75.80664100000007],[-112.19248999999996,75.805817000000104],[-112.02834299999995,75.815261999999962],[-111.85861199999988,75.826934999999992],[-111.69082599999996,75.822769000000108],[-111.64499699999993,75.821655000000135],[-111.604446,75.826660000000004],[-111.53971899999993,75.838318000000015],[-111.49638400000003,75.839706000000092],[-111.47638699999999,75.839157],[-111.45195000000001,75.836655000000064],[-111.44499200000001,75.832213999999965],[-111.35527000000002,75.724426000000108],[-111.35388199999994,75.718597000000102],[-111.35500299999995,75.714432000000102],[-111.38971700000002,75.663039999999967],[-111.40834000000001,75.620818999999983],[-111.40722700000003,75.614990000000148],[-111.35360700000001,75.57249500000006],[-111.31861900000001,75.545258000000103],[-111.27139299999999,75.522491000000002],[-111.24722299999996,75.518051000000014],[-111.22165699999999,75.516936999999984],[-110.995003,75.529160000000047],[-110.97222899999997,75.532486000000119],[-110.89943700000003,75.550262000000089],[-110.79499799999996,75.565262000000018],[-110.77166699999992,75.566666000000055],[-110.54222099999993,75.568878000000097],[-110.49553699999996,75.569153000000085],[-110.47582999999992,75.568329000000119],[-110.45612299999999,75.565535999999952],[-110.43110699999994,75.554152999999985],[-110.42443799999995,75.548873999999955],[-110.42223399999995,75.545532000000037],[-110.33389299999993,75.539154000000053],[-110.19583099999994,75.539703000000031],[-110.06777999999997,75.540543000000071],[-109.97416699999991,75.537490999999989],[-109.75,75.529709000000025],[-109.55304699999999,75.521652000000017],[-109.30444299999999,75.514999000000046],[-109.25389100000001,75.514160000000118],[-109.18360899999999,75.5086060000001],[-109.07472199999995,75.498322000000087],[-108.93639400000001,75.47665399999994],[-108.89943699999998,75.476379000000122],[-108.89584399999995,75.477203000000088],[-108.891953,75.480270000000019],[-108.91639700000002,75.513321000000133],[-108.92443800000001,75.52388000000002],[-108.83612099999993,75.612762000000032],[-108.8269499999999,75.686646000000053],[-108.84277299999991,75.691359999999975],[-108.88194299999998,75.692200000000071],[-108.91332999999992,75.691086000000041],[-108.94499199999996,75.694976999999938],[-109.05832699999996,75.728043000000071],[-109.05860899999993,75.733047000000056],[-109.06276699999989,75.737762000000089],[-109.12638900000002,75.7494200000001],[-109.21000699999996,75.762771999999984],[-109.26555599999995,75.770264000000054],[-109.30526700000001,75.771103000000039],[-109.45221700000002,75.783051000000057],[-109.62943999999993,75.799988000000099],[-109.63751200000002,75.822769000000108],[-109.62805200000003,75.829162999999994],[-109.62638900000002,75.83248900000001],[-109.65722699999992,75.866379000000109],[-109.66361999999998,75.870819000000097],[-109.72972099999998,75.876647999999932],[-109.737503,75.876647999999932],[-109.845551,75.863036999999963],[-109.85722399999992,75.860809000000017],[-109.88390400000003,75.849991000000045],[-109.90778399999994,75.849991000000045],[-109.93639399999989,75.856644000000017],[-110.05555699999996,75.890548999999908],[-110.05583200000001,75.894439999999975],[-110.04055800000003,75.898604999999975],[-109.92610200000001,75.927765000000079],[-109.826683,75.930541999999946],[-109.69776899999999,75.940262000000075],[-109.672234,75.943862999999908],[-109.65666199999998,75.94802900000002],[-109.42138699999998,76.035812000000021],[-109.30499299999991,76.100540000000137],[-109.30943300000001,76.106094000000098],[-109.31360599999999,76.109146000000067],[-109.396118,76.133041000000048],[-109.69999699999994,76.218872000000033],[-109.72250400000001,76.222213999999951],[-109.80943300000001,76.234421000000111],[-109.83416699999998,76.236099000000024],[-109.85861199999999,76.235809000000017],[-109.882767,76.233871000000079],[-109.89666699999992,76.230270000000019],[-109.90222199999999,76.226089000000115],[-109.90167199999996,76.221099999999979],[-109.88305699999995,76.198868000000118],[-109.88667299999997,76.194977000000051],[-109.89666699999992,76.193588000000034],[-109.91944899999993,76.196639999999945],[-109.94055200000003,76.20248400000014],[-110.01471700000002,76.229706000000078],[-110.06833599999993,76.250000000000057],[-110.08528100000001,76.255829000000062],[-110.12332199999997,76.266098000000056],[-110.15306099999998,76.27388000000002],[-110.201683,76.285538000000031],[-110.24109599999991,76.290543000000127],[-110.26583900000003,76.291367000000093],[-110.33138999999989,76.290817000000061],[-110.35804699999994,76.292206000000022],[-110.372772,76.294433999999967],[-110.38362099999995,76.297760000000039],[-110.39306599999986,76.391937000000098],[-110.38527699999986,76.423035000000084],[-110.38390400000003,76.427475000000129],[-110.28943600000002,76.433044000000109],[-110.095551,76.454163000000108],[-109.80721999999997,76.490540000000124],[-109.74638400000003,76.505553999999961],[-109.71833799999996,76.515274000000034],[-109.70639,76.521103000000096],[-109.70694700000001,76.526093000000117],[-109.71140300000002,76.529984000000013],[-109.72416699999997,76.531662000000097],[-109.74916100000002,76.531662000000097],[-109.81111099999993,76.527206000000035],[-109.83222999999992,76.529160000000047],[-109.84722899999991,76.532486000000063],[-109.83750900000001,76.538879000000065],[-109.75527999999997,76.572768999999937],[-109.70667299999997,76.587494000000106],[-109.64666699999998,76.593323000000112],[-109.56082199999997,76.640823000000069],[-109.5097429999999,76.708328000000051],[-109.30277999999998,76.79693600000013],[-109.22277800000001,76.808029000000147],[-109.12777699999992,76.819443000000035],[-109.02583299999998,76.822769000000108],[-108.97444199999995,76.816086000000098],[-108.95084400000002,76.81164600000011],[-108.93582200000003,76.809417999999937],[-108.91887699999995,76.809417999999937],[-108.88945000000001,76.814147999999989],[-108.84500099999997,76.823608000000036],[-108.82195299999989,76.829987000000074],[-108.81331599999999,76.833878000000141],[-108.81360599999999,76.837769000000037],[-108.81582600000002,76.84304800000001],[-108.81388899999996,76.847488000000055],[-108.78859699999992,76.857208000000128],[-108.77362099999999,76.85775799999999],[-108.74804699999999,76.855820000000051],[-108.65556300000003,76.817490000000078],[-108.65110800000002,76.813599000000011]],[[-97.045272999999952,76.797760000000096],[-97.075287000000003,76.793320000000108],[-97.093886999999995,76.79693600000013],[-97.188598999999954,76.822769000000108],[-97.200561999999991,76.829437000000041],[-97.200835999999924,76.834152000000074],[-97.200835999999924,76.857482999999945],[-97.187499999999943,76.860260000000039],[-97.149170000000026,76.859711000000118],[-97.128875999999991,76.85775799999999],[-97.086945000000014,76.851089000000115],[-97.005004999999983,76.819716999999969],[-96.997222999999963,76.813309000000004],[-97.009170999999981,76.807479999999998],[-97.026397999999915,76.802475000000129],[-97.045272999999952,76.797760000000096]],[[-113.46610999999996,76.766388000000006],[-113.61361699999992,76.713043000000084],[-113.628601,76.708038000000045],[-113.65249599999999,76.704436999999984],[-113.67999299999985,76.704436999999984],[-113.70417799999996,76.706374999999923],[-113.78472899999997,76.717209000000025],[-113.83667000000003,76.719986000000063],[-113.889183,76.718597000000102],[-114.05471799999992,76.703598000000056],[-114.16194200000001,76.716933999999981],[-114.21444699999995,76.720535000000041],[-114.50110599999999,76.73414600000001],[-114.73416099999997,76.746643000000006],[-114.78694200000001,76.750274999999931],[-114.82501200000002,76.753601000000003],[-114.85888699999998,76.758040999999992],[-114.87304699999993,76.760818000000086],[-114.87526700000001,76.765549000000021],[-114.87581599999999,76.770827999999995],[-114.85526999999996,76.794434000000081],[-114.83721899999989,76.801650999999993],[-114.80444299999994,76.813309000000004],[-114.76666299999988,76.82388300000008],[-114.62416099999996,76.86192299999999],[-114.60637700000001,76.865814000000057],[-114.58583099999993,76.867476999999951],[-114.33693700000003,76.877197000000081],[-114.13834400000002,76.884430000000066],[-113.96221899999995,76.889984000000084],[-113.885559,76.891663000000051],[-113.80750299999994,76.889435000000105],[-113.7625119999999,76.884430000000066],[-113.73444399999994,76.879149999999981],[-113.49804699999993,76.833328000000108],[-113.48750299999989,76.827773999999977],[-113.44915799999995,76.777205999999978],[-113.45388800000001,76.772765999999933],[-113.46610999999996,76.766388000000006]],[[-109.06610099999995,76.900543000000084],[-109.07444800000002,76.894714000000079],[-109.12581599999987,76.898604999999975],[-109.22917200000001,76.906936999999971],[-109.254997,76.910812000000135],[-109.29888899999997,76.922211000000061],[-109.30777,76.928040000000067],[-109.30387899999994,76.933867999999961],[-109.28278399999999,76.937759000000028],[-109.256958,76.938873000000058],[-109.20527600000003,76.935256999999979],[-109.17944299999999,76.932480000000055],[-109.12721299999998,76.923873999999955],[-109.09249899999992,76.912200999999925],[-109.07695000000001,76.906097000000102],[-109.06610099999995,76.900543000000084]],[[-97.256392999999946,76.967484000000127],[-97.284164000000033,76.965820000000122],[-97.335007000000019,76.968048000000067],[-97.40943900000002,76.973037999999974],[-97.458618000000001,76.977203000000145],[-97.473052999999936,76.980545000000063],[-97.423889000000031,77.005829000000062],[-97.374709999999936,77.022491000000059],[-97.286117999999874,77.033325000000104],[-97.243057000000022,77.037491000000045],[-97.199158000000011,77.037766000000033],[-97.154723999999931,77.030273000000022],[-97.136672999999973,77.025542999999971],[-97.092223999999987,77.010818000000029],[-97.093063000000029,77.004990000000134],[-97.231109999999944,76.971375000000023],[-97.256392999999946,76.967484000000127]],[[-95.659728999999913,77.058868000000075],[-95.585555999999883,77.053314000000057],[-95.56082200000003,77.053589000000045],[-95.465285999999935,77.058319000000097],[-95.417769999999962,77.05693100000002],[-95.386672999999973,77.052475000000072],[-95.368331999999953,77.048599000000024],[-95.337218999999948,77.039978000000076],[-95.288054999999872,77.022491000000059],[-95.224715999999944,77.006378000000041],[-95.181945999999925,76.996368000000132],[-95.168334999999956,76.99414100000007],[-95.115829000000019,76.995818999999983],[-95,76.99054000000001],[-94.906386999999881,76.976089000000002],[-94.813888999999904,76.971375000000023],[-94.728606999999954,76.972762999999929],[-94.714172000000019,76.97387700000013],[-94.688599000000011,76.97526600000009],[-94.636123999999995,76.976929000000041],[-94.593063000000029,76.975540000000024],[-94.526397999999972,76.969437000000084],[-94.510009999999909,76.966094999999996],[-94.494155999999919,76.960265999999933],[-94.489715999999987,76.956100000000049],[-94.40194699999995,76.918319999999994],[-94.25778200000002,76.896378000000084],[-94.254729999999995,76.891373000000044],[-94.238891999999964,76.889435000000105],[-94.207229999999925,76.888046000000088],[-94.15972899999997,76.887496999999996],[-94.096389999999985,76.888885000000073],[-94.081680000000006,76.89027400000009],[-94.054992999999854,76.894714000000079],[-94.032226999999921,76.903320000000008],[-94.026107999999965,76.909149000000014],[-94.010559000000001,76.919144000000131],[-94.001113999999916,76.923598999999967],[-93.986663999999962,76.928864000000033],[-93.964721999999995,76.932480000000055],[-93.943603999999937,76.933867999999961],[-93.899993999999936,76.93331900000004],[-93.755004999999926,76.922484999999995],[-93.739166000000012,76.920822000000044],[-93.658339999999896,76.909987999999998],[-93.649445000000014,76.908035000000041],[-93.641953000000001,76.905258000000117],[-93.635833999999988,76.89888000000002],[-93.488602000000014,76.839706000000092],[-93.301392000000021,76.768600000000049],[-93.208054000000004,76.746933000000013],[-93.202788999999939,76.747481999999934],[-93.192214999999976,76.747208000000001],[-93.187499999999943,76.745529000000033],[-93.179717999999923,76.741088999999988],[-93.169723999999974,76.686919999999986],[-93.174438000000009,76.674987999999985],[-93.18638599999997,76.660812000000021],[-93.300277999999878,76.552199999999971],[-93.306655999999919,76.54664600000001],[-93.461394999999982,76.49832200000003],[-93.595276000000013,76.462493999999992],[-93.629989999999964,76.451934999999992],[-93.641953000000001,76.44720500000011],[-93.651947000000007,76.441650000000038],[-93.652221999999938,76.437759000000142],[-93.650283999999999,76.43553200000008],[-93.548339999999882,76.386108000000092],[-93.528609999999958,76.384720000000016],[-93.509445000000028,76.386658000000125],[-93.498336999999992,76.388885000000016],[-93.46362299999987,76.399429000000055],[-93.456954999999994,76.403595000000109],[-93.467399999999998,76.40792799999997],[-93.480559999999969,76.409927000000039],[-93.500838999999985,76.4102630000001],[-93.508895999999993,76.406647000000078],[-93.520554000000004,76.405823000000112],[-93.537780999999995,76.407486000000006],[-93.554992999999968,76.411377000000073],[-93.570846999999958,76.416382000000112],[-93.580565999999976,76.423035000000084],[-93.576401000000033,76.426650999999993],[-93.533065999999963,76.443039000000056],[-93.518889999999999,76.448318000000029],[-93.501403999999923,76.452209000000096],[-93.476562000000001,76.454772999999932],[-93.454223999999954,76.456436000000053],[-93.422226000000023,76.458328000000108],[-93.392776000000026,76.461655000000064],[-93.370270000000005,76.466385000000059],[-93.357223999999917,76.470535000000098],[-93.123610999999926,76.573043999999982],[-93.111114999999927,76.580276000000083],[-93.095276000000013,76.590546000000018],[-93.096953999999926,76.596649000000127],[-93.09973100000002,76.601653999999996],[-93.046386999999925,76.616089000000102],[-92.945830999999998,76.622482000000048],[-92.90306099999998,76.621918000000107],[-92.880279999999971,76.620818999999983],[-92.857223999999917,76.618317000000047],[-92.789718999999934,76.609146000000123],[-92.705276000000026,76.594437000000084],[-92.68360899999999,76.592484000000127],[-92.654998999999975,76.594711000000018],[-92.642501999999979,76.598037999999974],[-92.632767000000001,76.602478000000133],[-92.618057000000022,76.607483000000002],[-92.605834999999956,76.610535000000141],[-92.564437999999939,76.616089000000102],[-92.541106999999897,76.617752000000053],[-92.506393000000003,76.617477000000008],[-92.468338000000017,76.61303700000002],[-92.440825999999959,76.603317000000118],[-92.42111199999988,76.598037999999974],[-92.40055799999999,76.594986000000006],[-92.386948000000018,76.593872000000033],[-92.36860699999994,76.594437000000084],[-92.330840999999964,76.597214000000008],[-92.183318999999983,76.614699999999914],[-92.077498999999989,76.637207000000046],[-92.043609999999887,76.646942000000081],[-92.004332999999917,76.657897999999932],[-91.991942999999992,76.660812000000021],[-91.970001000000025,76.664428999999984],[-91.938599000000011,76.668320000000051],[-91.910003999999901,76.670532000000094],[-91.775557999999933,76.679703000000018],[-91.668609999999944,76.684708000000057],[-91.535827999999924,76.688873000000058],[-91.410552999999936,76.689148000000102],[-91.385283999999956,76.688309000000118],[-91.132767000000001,76.664428999999984],[-91.008895999999936,76.651657000000114],[-90.986114999999984,76.649155000000064],[-90.883895999999936,76.626647999999989],[-90.871383999999978,76.622757000000092],[-90.854720999999984,76.61554000000001],[-90.849990999999875,76.609146000000123],[-90.844161999999926,76.603592000000106],[-90.837218999999948,76.599152000000117],[-90.817779999999971,76.593597000000045],[-90.779998999999975,76.585815000000082],[-90.741104000000007,76.580551000000071],[-90.674438000000009,76.573318000000086],[-90.626388999999961,76.56999200000007],[-90.582503999999972,76.565262000000018],[-90.56361400000003,76.559708000000001],[-90.50306699999993,76.53137200000009],[-90.498610999999926,76.524993999999936],[-90.468613000000005,76.479155999999989],[-90.468063000000029,76.473038000000088],[-90.48332199999993,76.46804800000001],[-90.510833999999988,76.463882000000126],[-90.538054999999929,76.46138000000002],[-90.61610399999995,76.45637499999998],[-90.638335999999924,76.455826000000059],[-90.779175000000009,76.461105000000032],[-90.826400999999976,76.463042999999971],[-91.090560999999923,76.478043000000127],[-91.304169000000002,76.504166000000055],[-91.34973100000002,76.509430000000066],[-91.373885999999857,76.511107999999979],[-91.414718999999934,76.512771999999984],[-91.441101000000003,76.512771999999984],[-91.564162999999951,76.500823999999966],[-91.566665999999998,76.498871000000008],[-91.416396999999961,76.460266000000047],[-91.402495999999985,76.457488999999953],[-91.271117999999944,76.453873000000101],[-91.147506999999962,76.450821000000019],[-91.057219999999973,76.450546000000145],[-90.99110399999995,76.447754000000089],[-90.974166999999966,76.446091000000138],[-90.797774999999945,76.42692599999998],[-90.642226999999991,76.410537999999917],[-90.414443999999946,76.403046000000018],[-90.368331999999953,76.399994000000049],[-90.317229999999938,76.394714000000022],[-90.281386999999995,76.389160000000004],[-90.06361400000003,76.361648999999943],[-89.831389999999942,76.34027100000003],[-89.543883999999935,76.316939999999988],[-89.367766999999958,76.304152999999985],[-89.305557000000022,76.299149],[-89.292496000000028,76.296097000000088],[-89.230559999999912,76.272766000000047],[-89.217772999999909,76.266663000000108],[-89.208617999999944,76.260818000000029],[-89.201110999999912,76.254166000000112],[-89.192214999999976,76.242203000000075],[-89.192490000000021,76.236099000000024],[-89.198607999999865,76.22526600000009],[-89.209166999999979,76.221099999999979],[-89.295546999999942,76.197754000000145],[-89.326400999999919,76.189423000000033],[-89.349730999999963,76.183594000000028],[-89.378051999999968,76.180267000000072],[-89.588332999999921,76.165816999999947],[-89.831954999999994,76.160812000000078],[-89.888610999999912,76.166091999999992],[-89.904175000000009,76.168869000000086],[-89.976105000000018,76.173874000000126],[-90.37332200000003,76.181366000000082],[-90.397780999999952,76.180542000000116],[-90.416945999999996,76.178863999999976],[-90.438598999999954,76.175537000000077],[-90.453613000000018,76.17053199999998],[-90.455840999999964,76.167205999999965],[-90.455565999999976,76.165543000000014],[-90.438598999999954,76.162201000000096],[-90.414443999999946,76.159987999999942],[-90.256957999999941,76.146942000000024],[-90.22222899999997,76.144440000000145],[-90.151671999999905,76.141663000000051],[-90.064162999999894,76.136932000000115],[-90.048614999999984,76.132751000000042],[-90.06361400000003,76.127762000000075],[-90.085280999999895,76.1244200000001],[-90.110824999999977,76.124145999999996],[-90.308884000000035,76.138321000000076],[-90.448607999999979,76.154984000000013],[-90.666397000000018,76.166930999999977],[-90.786117999999988,76.171371000000136],[-90.937209999999936,76.180817000000104],[-91.112212999999883,76.191924999999912],[-91.204726999999934,76.212769000000094],[-91.219726999999978,76.218323000000055],[-91.256957999999941,76.227203000000088],[-91.274444999999957,76.230270000000019],[-91.423614999999984,76.253876000000105],[-91.445830999999941,76.256653000000028],[-91.571395999999936,76.26527400000009],[-91.59722899999997,76.264999000000103],[-91.613616999999977,76.262206999999989],[-91.599730999999963,76.25610400000005],[-91.579453000000001,76.251663000000121],[-91.416655999999989,76.22526600000009],[-91.332779000000016,76.214157],[-91.33666999999997,76.178588999999988],[-91.27194199999991,76.155822999999941],[-91.220276000000013,76.161651999999947],[-91.203339000000028,76.16137700000013],[-91.163329999999974,76.159714000000008],[-91.116652999999985,76.15637200000009],[-90.882491999999957,76.137207000000103],[-90.700287000000003,76.119431000000134],[-90.67971799999998,76.117203000000018],[-90.665008999999998,76.112198000000149],[-90.757506999999976,76.07638500000013],[-90.785277999999948,76.072769000000051],[-90.809432999999956,76.071930000000066],[-90.833618000000001,76.072769000000051],[-90.855270000000019,76.072220000000129],[-90.862502999999947,76.069992000000127],[-90.866104000000007,76.067215000000033],[-90.864715999999987,76.064987000000087],[-90.848891999999978,76.060806000000014],[-90.71578199999999,76.06343099999998],[-90.703605999999922,76.064926000000014],[-90.663940000000025,76.074265000000025],[-90.660941999999864,76.076431000000014],[-90.611664000000019,76.084717000000069],[-90.599166999999966,76.088042999999971],[-90.575012000000015,76.090271000000087],[-90.548339999999939,76.091370000000097],[-90.474166999999966,76.089706000000035],[-90.429442999999992,76.088318000000129],[-90.408614999999998,76.08638000000002],[-90.194442999999922,76.062759000000142],[-90.190552000000025,76.06109600000002],[-90.193877999999984,76.055251999999996],[-90.202498999999989,76.050261999999975],[-90.215012000000002,76.04582199999993],[-90.233886999999925,76.041092000000106],[-90.27416999999997,76.034424000000115],[-90.301666000000012,76.032486000000006],[-90.328613000000018,76.031372000000033],[-90.404723999999931,76.031096999999988],[-90.635947999999985,76.028152000000034],[-90.718452000000013,76.022658999999976],[-90.904175000000009,76.015549000000021],[-90.929168999999888,76.015549000000021],[-91.005279999999971,76.024994000000049],[-91.144729999999981,76.021102999999982],[-91.160827999999924,76.018051000000071],[-91.155272999999909,76.014160000000004],[-91.069732999999928,75.990265000000022],[-90.950286999999946,75.962204000000099],[-90.941939999999988,75.955551000000128],[-90.938598999999954,75.951385000000016],[-90.941939999999988,75.945526000000029],[-90.948882999999967,75.939972000000012],[-90.968063000000029,75.931091000000094],[-91.016953000000001,75.925537000000077],[-91.070557000000008,75.922484999999995],[-91.100280999999995,75.918594000000098],[-91.118880999999931,75.913879000000065],[-91.129439999999988,75.908600000000092],[-91.143340999999964,75.897217000000069],[-91.125823999999852,75.857483000000002],[-91.132492000000013,75.851928999999984],[-91.135833999999932,75.846099999999979],[-91.134170999999924,75.842484000000127],[-91.129990000000021,75.839157],[-91.107498000000021,75.840545999999961],[-91.091675000000009,75.843323000000055],[-91.079452999999944,75.848038000000088],[-91.053328999999906,75.881087999999977],[-90.939986999999974,75.915268000000083],[-90.903060999999923,75.924698000000149],[-90.895844000000011,75.927200000000028],[-90.886123999999995,75.931655999999975],[-90.847778000000005,75.952208999999982],[-90.833618000000001,75.96026599999999],[-90.827788999999996,75.966385000000002],[-90.805557000000022,75.985535000000141],[-90.793883999999991,75.99470500000001],[-90.777495999999985,75.996094000000028],[-90.755843999999968,75.994980000000055],[-90.717223999999931,75.989151000000049],[-90.569457999999941,75.979980000000069],[-90.48332199999993,75.980270000000075],[-90.464447000000007,75.978591999999992],[-90.444716999999969,75.974151999999947],[-90.433318999999983,75.97026100000005],[-90.429442999999992,75.968323000000112],[-90.434158000000025,75.963318000000072],[-90.442490000000021,75.959717000000012],[-90.49221799999998,75.945816000000036],[-90.519164999999987,75.936096000000134],[-90.526107999999965,75.930541999999946],[-90.528335999999911,75.925537000000077],[-90.531386999999938,75.913605000000132],[-90.531676999999945,75.903595000000053],[-90.529998999999862,75.898331000000042],[-90.521118000000001,75.895538000000101],[-90.504729999999938,75.895263999999941],[-90.496947999999975,75.897766000000047],[-90.34722899999997,75.949417000000096],[-90.342223999999987,75.953049000000078],[-90.337783999999999,75.963043000000084],[-90.339447000000007,75.968323000000112],[-90.256957999999941,75.966933999999981],[-90.118057000000022,75.941924999999969],[-90.114440999999943,75.947753999999975],[-90.102492999999981,75.961654999999951],[-90.072509999999966,75.995529000000147],[-90.060271999999998,76.00471500000009],[-90.052779999999984,76.007217000000026],[-90.037506000000008,76.009155000000135],[-90.015015000000005,76.010269000000108],[-89.966659999999877,76.008605999999986],[-89.947495000000004,76.007217000000026],[-89.929717999999923,76.00471500000009],[-89.924437999999952,76.00221300000004],[-89.909163999999976,75.964995999999985],[-89.825012000000015,75.943038999999942],[-89.687499999999943,75.899993999999992],[-89.689986999999917,75.894989000000123],[-89.702224999999999,75.879700000000071],[-89.70944199999991,75.874146000000053],[-89.724441999999954,75.863036999999963],[-89.750290000000007,75.846649000000127],[-89.772781000000009,75.836380000000077],[-89.778885000000002,75.831665000000044],[-89.782227000000034,75.825821000000019],[-89.776397999999972,75.792755000000056],[-89.775008999999955,75.787491000000102],[-89.765014999999948,75.785812000000078],[-89.738891999999964,75.786652000000117],[-89.692490000000021,75.796371000000136],[-89.68638599999997,75.802474999999959],[-89.688048999999978,75.804428000000087],[-89.689162999999951,75.809708000000001],[-89.685546999999985,75.814147999999989],[-89.61999499999996,75.853592000000106],[-89.611114999999927,75.857208000000128],[-89.587508999999955,75.859146000000067],[-89.558334000000002,75.857483000000002],[-89.439163000000008,75.845260999999994],[-89.422774999999945,75.841934000000094],[-89.410277999999948,75.829712000000086],[-89.392501999999979,75.821105999999986],[-89.37777699999998,75.816665999999998],[-89.320007000000032,75.803863999999976],[-89.277495999999928,75.798324999999977],[-89.201401000000033,75.786926000000051],[-89.172775000000001,75.780548000000124],[-89.164169000000015,75.774704000000099],[-89.160278000000005,75.768051000000128],[-89.160552999999936,75.755828999999949],[-89.166945999999996,75.7452550000001],[-89.253890999999953,75.631088000000034],[-89.262787000000003,75.627761999999962],[-89.275008999999955,75.627761999999962],[-89.336670000000026,75.627761999999962],[-89.543059999999969,75.610535000000141],[-89.649170000000026,75.61554000000001],[-89.763061999999991,75.577484000000027],[-89.765288999999882,75.575546000000088],[-89.739440999999943,75.573607999999922],[-89.722504000000015,75.574157999999954],[-89.681945999999868,75.57998699999996],[-89.649993999999992,75.587204000000099],[-89.605559999999912,75.589705999999978],[-89.588332999999921,75.58859300000006],[-89.550995,75.579711999999972],[-89.542496000000028,75.570540999999992],[-89.548614999999984,75.566085999999984],[-89.56806899999998,75.5619200000001],[-89.628325999999959,75.561370999999951],[-89.676392000000021,75.562194999999917],[-89.692490000000021,75.561096000000134],[-89.706954999999994,75.557480000000055],[-89.700835999999981,75.553040000000067],[-89.645553999999947,75.548325000000034],[-89.576674999999966,75.547759999999982],[-89.550827000000027,75.548873999999955],[-89.526397999999915,75.551926000000094],[-89.515015000000005,75.554152999999985],[-89.500564999999995,75.558868000000018],[-89.491942999999992,75.565535999999952],[-89.473617999999874,75.574707000000103],[-89.458618000000001,75.579436999999928],[-89.441665999999998,75.583327999999995],[-89.431670999999994,75.584427000000005],[-89.403335999999967,75.587204000000099],[-89.351669000000015,75.589157000000057],[-89.302215999999987,75.589157000000057],[-89.235824999999977,75.586655000000121],[-89.217223999999987,75.584991000000116],[-89.182770000000005,75.577208999999982],[-89.174438000000009,75.572768999999994],[-89.168335000000013,75.566666000000055],[-89.156386999999938,75.549713000000111],[-89.154998999999975,75.544434000000138],[-89.149170000000026,75.532211000000075],[-89.143065999999976,75.524429000000112],[-89.09973100000002,75.484146000000067],[-88.963897999999972,75.431931000000077],[-88.950561999999934,75.429703000000131],[-88.921386999999982,75.427199999999971],[-88.87110899999999,75.43414300000012],[-88.841675000000009,75.436371000000065],[-88.818618999999956,75.436920000000043],[-88.796951000000035,75.434982000000105],[-88.779723999999987,75.432479999999998],[-88.768889999999942,75.434708000000001],[-88.747771999999941,75.470825000000104],[-88.75,75.474991000000045],[-88.801392000000021,75.531372000000147],[-88.865829000000019,75.586105000000089],[-88.755004999999983,75.676650999999936],[-88.738892000000021,75.67942800000003],[-88.722777999999892,75.679153000000042],[-88.678329000000019,75.675261999999975],[-88.631667999999991,75.667206000000078],[-88.600829999999917,75.659424000000115],[-88.574172999999917,75.648880000000077],[-88.542770000000019,75.635818000000029],[-88.50778200000002,75.619431000000077],[-88.448883000000023,75.59526100000005],[-88.399445000000014,75.579162999999994],[-88.364166000000012,75.568878000000097],[-88.315826000000015,75.556366000000082],[-88.228881999999999,75.539429000000098],[-88.203613000000018,75.531097000000102],[-88.198882999999967,75.528595000000053],[-88.196945000000028,75.522766000000047],[-88.198607999999979,75.517212000000029],[-88.201401000000033,75.512206999999989],[-88.217498999999918,75.509720000000073],[-88.240828999999962,75.509155000000078],[-88.290833000000021,75.49693300000007],[-88.305831999999896,75.492203000000075],[-88.301391999999964,75.488037000000134],[-88.295273000000009,75.484985000000052],[-88.263061999999934,75.476089000000115],[-88.228881999999999,75.471099999999979],[-88.21305799999999,75.470535000000098],[-88.200835999999924,75.471924000000115],[-88.148055999999997,75.488876000000118],[-88.12249799999995,75.501099000000011],[-88.06806899999998,75.521927000000062],[-87.958054000000004,75.544144000000131],[-87.751403999999923,75.576660000000061],[-87.716110000000015,75.575271999999927],[-87.697768999999937,75.573607999999922],[-87.661391999999921,75.567215000000147],[-87.648346000000004,75.5619200000001],[-87.495543999999995,75.485809000000017],[-87.494995000000017,75.483871000000079],[-87.498885999999914,75.478043000000127],[-87.504729999999995,75.474425999999994],[-87.529998999999918,75.465271000000143],[-87.563889000000017,75.459152000000074],[-87.588607999999965,75.456375000000037],[-87.601394999999968,75.453323000000069],[-87.606383999999935,75.449707000000046],[-87.594726999999978,75.446365000000071],[-87.58277899999996,75.444702000000007],[-87.568344000000025,75.443588000000034],[-87.548614999999927,75.444427000000132],[-87.533614999999884,75.446090999999967],[-87.5,75.452209000000096],[-87.459732000000031,75.461380000000077],[-87.445830999999941,75.465271000000143],[-87.434433000000013,75.468871999999976],[-87.4183349999999,75.479706000000078],[-87.416397000000018,75.485260000000039],[-87.430283000000031,75.501099000000011],[-87.437774999999988,75.5086060000001],[-87.444442999999922,75.513885000000073],[-87.46665999999999,75.521103000000096],[-87.462783999999942,75.563034000000073],[-87.393065999999976,75.604156000000103],[-87.381103999999937,75.609420999999998],[-87.354720999999984,75.61303700000002],[-87.285552999999879,75.620255000000043],[-87.263335999999981,75.621094000000028],[-87.25111400000003,75.621094000000028],[-87.234160999999915,75.618317000000104],[-87.088057999999933,75.57998699999996],[-87.079178000000013,75.566666000000055],[-87.072783999999956,75.559981999999991],[-87.055267000000015,75.546936000000017],[-87.011948000000018,75.531372000000147],[-86.967498999999975,75.518326000000002],[-86.931106999999997,75.508041000000048],[-86.914444000000003,75.503876000000048],[-86.862777999999935,75.491653000000042],[-86.807495000000017,75.479156000000046],[-86.771117999999944,75.475540000000137],[-86.72222899999997,75.474991000000045],[-86.643340999999964,75.478043000000127],[-86.631103999999993,75.477767999999912],[-86.601943999999946,75.476379000000122],[-86.583892999999875,75.474701000000039],[-86.567504999999983,75.472214000000122],[-86.48332199999993,75.456650000000025],[-86.464721999999995,75.452773999999977],[-86.375548999999978,75.427475000000129],[-86.365554999999972,75.423309000000074],[-86.368880999999988,75.418320000000108],[-86.389175000000023,75.40776100000005],[-86.400283999999999,75.402205999999978],[-86.415282999999988,75.398880000000133],[-86.506392999999946,75.388046000000031],[-86.553878999999938,75.381363000000079],[-86.576675000000023,75.377197000000024],[-86.611114999999984,75.36831699999999],[-86.615279999999984,75.365540000000067],[-86.596663999999976,75.361649],[-86.544723999999974,75.35914600000001],[-86.520279000000016,75.360259999999982],[-86.491942999999935,75.362762000000089],[-86.376099000000011,75.376373000000058],[-86.358336999999949,75.379699999999957],[-86.245270000000005,75.401932000000045],[-86.198607999999922,75.416091999999935],[-86.169997999999964,75.418594000000041],[-86.082503999999972,75.421371000000136],[-86.031386999999938,75.422485000000108],[-85.833618000000001,75.416091999999935],[-85.680557000000022,75.408034999999984],[-85.674438000000009,75.418320000000108],[-85.908614999999941,75.460266000000104],[-86.006392999999889,75.472214000000122],[-86.109726000000023,75.481934000000024],[-86.124709999999993,75.485535000000084],[-86.138335999999924,75.489975000000072],[-86.149445000000014,75.496368000000075],[-86.154449,75.500823999999966],[-86.143065999999976,75.508041000000048],[-86.11332699999997,75.514999000000046],[-86.096953999999982,75.51776099999995],[-86.00389100000001,75.531372000000147],[-85.908614999999941,75.543868999999916],[-85.865554999999972,75.544708000000071],[-85.763061999999991,75.546097000000088],[-85.44387799999987,75.560256999999979],[-85.329178000000013,75.561096000000134],[-85.303328999999962,75.568878000000097],[-85.189986999999917,75.611923000000047],[-85.074172999999917,75.651931999999988],[-85.054442999999992,75.656096999999988],[-85.039169000000015,75.657760999999994],[-84.926940999999943,75.658874999999966],[-84.879165999999884,75.656937000000028],[-84.797226000000023,75.652771000000143],[-84.763061999999934,75.650269000000037],[-84.71833799999996,75.642761000000064],[-84.683883999999921,75.634430000000123],[-84.62249799999995,75.628036000000066],[-84.59973100000002,75.626647999999989],[-84.572234999999978,75.626373000000001],[-84.524719000000005,75.628036000000066],[-84.497497999999894,75.631653000000028],[-84.503066999999987,75.633330999999998],[-84.519454999999937,75.636108000000036],[-84.539992999999981,75.637772000000098],[-84.557220000000029,75.63888500000013],[-84.607773000000009,75.639160000000004],[-84.63110399999988,75.640548999999965],[-84.651107999999965,75.643599999999992],[-84.657226999999921,75.647491000000059],[-84.66361999999998,75.68609600000002],[-84.644454999999994,75.687194999999974],[-84.482773000000009,75.694427000000076],[-84.350554999999872,75.697754000000032],[-84.322783999999956,75.699141999999938],[-84.299164000000019,75.70277400000009],[-84.070556999999951,75.761932000000115],[-83.929442999999878,75.810806000000071],[-83.878150999999946,75.818962000000056],[-83.767226999999934,75.824158000000125],[-83.740554999999972,75.824432000000058],[-83.722503999999958,75.822495000000004],[-83.703887999999949,75.818329000000062],[-83.698043999999925,75.814423000000033],[-83.706389999999942,75.812195000000088],[-83.72193900000002,75.810806000000071],[-83.74888599999997,75.80664100000007],[-83.752228000000002,75.801376000000005],[-83.736938000000009,75.795258000000047],[-83.698607999999979,75.790268000000026],[-83.672774999999945,75.788879000000009],[-83.619995000000017,75.789429000000041],[-83.56610099999989,75.791656000000103],[-83.515288999999882,75.789703000000145],[-83.495269999999948,75.78637700000013],[-83.479720999999927,75.782211000000018],[-83.464721999999995,75.776093000000117],[-83.458344000000011,75.770264000000054],[-83.447768999999994,75.755828999999949],[-83.43360899999999,75.750274999999988],[-83.419158999999866,75.748870999999951],[-83.292220999999927,75.737762000000089],[-83.123610999999983,75.734421000000054],[-83.065276999999924,75.739151000000049],[-82.960007000000019,75.756103999999993],[-82.82028200000002,75.781937000000084],[-82.799437999999952,75.786102000000085],[-82.664718999999991,75.811371000000122],[-82.466400000000021,75.828048999999965],[-82.327224999999942,75.836928999999998],[-82.279175000000009,75.836655000000064],[-82.139998999999875,75.826934999999992],[-81.95666499999993,75.815261999999962],[-81.885559000000001,75.811096000000077],[-81.660827999999924,75.811371000000122],[-81.536941999999954,75.809417999999994],[-81.450561999999991,75.800812000000064],[-81.212509000000011,75.771378000000084],[-81.22084000000001,75.704712000000029],[-81.276671999999962,75.668320000000051],[-81.281677000000002,75.663605000000018],[-81.285278000000005,75.657486000000006],[-81.271118000000001,75.651382000000126],[-81.256957999999997,75.649719000000005],[-81.010009999999966,75.633330999999998],[-80.983886999999982,75.633330999999998],[-80.857772999999952,75.634995000000004],[-80.779998999999918,75.637772000000098],[-80.547226000000023,75.650818000000015],[-80.502501999999936,75.652206000000092],[-80.480559999999969,75.651093000000003],[-80.46665999999999,75.649428999999998],[-80.316955999999948,75.630539000000056],[-80.275283999999999,75.624985000000095],[-80.256119000000012,75.62164300000012],[-80.199158000000011,75.608871000000136],[-80.101944000000003,75.586929000000055],[-80.068344000000025,75.578872999999987],[-79.953612999999962,75.540268000000083],[-79.948607999999922,75.534149000000014],[-79.956115999999952,75.530822999999998],[-80.085006999999905,75.507766999999944],[-80.191665999999884,75.489975000000072],[-80.252501999999993,75.485809000000017],[-80.355269999999962,75.473877000000073],[-80.371932999999956,75.468871999999976],[-80.373046999999929,75.463042999999971],[-80.358337000000006,75.458602999999982],[-80.338607999999908,75.456375000000037],[-80.306655999999919,75.456099999999992],[-80.108046999999942,75.469147000000021],[-80.000289999999893,75.476928999999984],[-79.929168999999945,75.479706000000078],[-79.73332199999993,75.471924000000115],[-79.714721999999995,75.470535000000098],[-79.644164999999987,75.462494000000049],[-79.586394999999982,75.454712000000086],[-79.574721999999895,75.449997000000053],[-79.581954999999994,75.446365000000071],[-79.635559000000001,75.445815999999979],[-79.656386999999995,75.444138000000066],[-79.675551999999925,75.441360000000032],[-79.683059999999955,75.435806000000071],[-79.682495000000017,75.430817000000104],[-79.62222300000002,75.402480999999966],[-79.605559999999969,75.398041000000148],[-79.561660999999958,75.394989000000066],[-79.520003999999972,75.391098],[-79.503066999999987,75.388596000000064],[-79.488051999999925,75.383330999999998],[-79.486937999999952,75.379974000000061],[-79.488601999999958,75.362487999999928],[-79.510009999999966,75.338043000000084],[-79.527495999999928,75.322220000000073],[-79.539443999999889,75.317763999999954],[-79.563323999999966,75.31860400000005],[-79.596664000000033,75.316086000000041],[-79.610000999999897,75.310806000000014],[-79.61471599999993,75.305542000000003],[-79.611938000000009,75.298325000000091],[-79.587508999999898,75.287491000000045],[-79.570847000000015,75.283051],[-79.548889000000031,75.281096999999988],[-79.443084999999996,75.280190000000061],[-79.506957999999884,75.229980000000069],[-79.571121000000005,75.199142000000052],[-79.629439999999988,75.174987999999928],[-79.651672000000019,75.172484999999995],[-79.731948999999929,75.164703000000031],[-79.774170000000026,75.167205999999965],[-79.835555999999997,75.160262999999986],[-79.929442999999878,75.140549000000078],[-79.944152999999915,75.136383000000023],[-79.954726999999934,75.12692300000009],[-79.955841000000021,75.113876000000118],[-79.955275999999969,75.106644000000017],[-79.955841000000021,75.100266000000033],[-79.960555999999883,75.094711000000132],[-79.974166999999852,75.08998100000008],[-80.128875999999991,75.068054000000018],[-80.150832999999977,75.065536000000066],[-80.215012000000002,75.063309000000004],[-80.296111999999994,75.058868000000075],[-80.440552000000025,75.038040000000024],[-80.427489999999921,75.029984000000127],[-80.402495999999928,75.021103000000039],[-80.327498999999989,74.998596000000134],[-80.310546999999985,74.996368000000132],[-80.297225999999966,74.996643000000006],[-80.238892000000021,74.994431000000134],[-80.194442999999978,74.989975000000015],[-80.182219999999916,74.986649],[-80.173888999999917,74.982483000000059],[-80.184158000000025,74.979430999999977],[-80.216110000000015,74.976089000000002],[-80.243057000000022,74.973038000000031],[-80.258347000000015,74.969711000000075],[-80.271941999999967,74.964996000000042],[-80.278884999999946,74.959427000000062],[-80.278884999999946,74.957214000000079],[-80.274170000000026,74.951096000000121],[-80.266112999999962,74.946640000000059],[-80.240828999999962,74.946640000000059],[-80.033614999999941,74.974426000000108],[-80.026946999999893,74.979980000000069],[-80.013061999999991,74.986923000000104],[-79.975280999999995,74.9994200000001],[-79.942764000000011,75.006943000000092],[-79.919158999999922,75.010543999999982],[-79.795273000000009,75.027480999999966],[-79.776947000000007,75.028320000000122],[-79.716400000000021,75.028869999999984],[-79.692763999999954,75.028046000000018],[-79.613891999999964,75.01998900000001],[-79.59722899999997,75.017487000000131],[-79.582503999999915,75.014435000000049],[-79.505004999999926,74.998321999999973],[-79.501953000000015,74.99581900000004],[-79.507232999999985,74.993042000000116],[-79.535827999999924,74.991653000000099],[-79.555557000000022,74.987198000000092],[-79.551940999999943,74.981659000000093],[-79.464721999999995,74.933319000000097],[-79.442489999999907,74.921646000000067],[-79.426392000000021,74.917206000000022],[-79.391953000000001,74.911102000000028],[-79.35722399999986,74.907486000000119],[-79.338608000000022,74.903320000000065],[-79.334732000000031,74.899993999999992],[-79.333617999999944,74.896378000000141],[-79.333617999999944,74.894440000000031],[-79.335830999999928,74.889160000000118],[-79.370543999999995,74.876373000000115],[-79.390839000000028,74.872482000000048],[-79.501953000000015,74.859421000000111],[-79.530288999999925,74.857758000000047],[-79.580001999999979,74.858321999999987],[-79.732773000000009,74.836655000000121],[-79.851943999999946,74.818878000000041],[-79.860549999999989,74.814697000000137],[-79.880553999999904,74.813034000000073],[-79.930557000000022,74.813309000000061],[-80.06806899999998,74.836380000000077],[-80.25306699999993,74.870818999999983],[-80.274170000000026,74.881087999999977],[-80.28195199999999,74.889984000000084],[-80.293883999999935,74.919983000000116],[-80.293610000000001,74.926376000000062],[-80.296951000000035,74.931090999999924],[-80.306380999999988,74.939148000000102],[-80.321670999999981,74.937759000000085],[-80.335280999999952,74.933044000000052],[-80.362212999999997,74.923599000000024],[-80.386123999999882,74.913604999999961],[-80.396118000000001,74.908599999999922],[-80.413054999999986,74.897766000000047],[-80.416655999999932,74.89387499999998],[-80.416107000000011,74.88888500000013],[-80.361114999999984,74.868866000000025],[-80.347777999999948,74.864990000000148],[-80.329726999999991,74.861374000000069],[-80.296951000000035,74.856934000000081],[-80.261123999999995,74.852767999999969],[-80.224166999999966,74.849426000000051],[-80.18638599999997,74.843323000000112],[-80.153609999999958,74.836655000000121],[-80.108611999999994,74.824432000000058],[-80.097778000000005,74.820267000000058],[-80.101668999999958,74.789154000000053],[-80.159164000000033,74.730269999999962],[-80.191375999999934,74.698029000000076],[-80.156112999999948,74.636932000000058],[-80.148894999999925,74.631088000000034],[-80.146666999999979,74.626923000000033],[-80.149444999999957,74.622482000000105],[-80.161391999999921,74.612198000000092],[-80.231673999999998,74.578049000000078],[-80.248046999999985,74.576096000000121],[-80.253715999999997,74.576050000000066],[-80.339995999999985,74.580551000000128],[-80.385009999999966,74.5816650000001],[-80.454453000000001,74.580825999999945],[-80.468886999999938,74.579436999999984],[-80.488891999999964,74.575546000000088],[-80.591674999999952,74.56442300000009],[-80.753066999999987,74.563309000000118],[-80.844161999999983,74.562759000000085],[-80.951950000000011,74.566086000000041],[-80.974715999999944,74.566939999999988],[-80.994155999999919,74.569717000000082],[-81.029998999999975,74.576660000000061],[-81.049727999999959,74.579163000000051],[-81.069457999999884,74.579711999999972],[-81.219161999999983,74.571381000000088],[-81.269729999999981,74.566086000000041],[-81.287505999999951,74.563034000000073],[-81.510833999999988,74.514434999999935],[-81.670836999999949,74.478592000000106],[-81.759170999999924,74.461105000000089],[-81.785003999999958,74.457764000000054],[-81.810821999999973,74.456940000000088],[-81.854720999999984,74.459427000000119],[-82.060546999999929,74.475540000000024],[-82.081680000000006,74.477203000000088],[-82.101395000000025,74.479706000000078],[-82.327498999999989,74.510544000000095],[-82.511123999999995,74.527206000000035],[-82.557219999999973,74.514709000000096],[-82.574722000000008,74.511658000000068],[-82.592498999999975,74.510544000000095],[-82.615279999999984,74.511108000000036],[-82.74749799999995,74.518051000000014],[-82.783614999999941,74.520263999999997],[-82.871933000000013,74.538589000000059],[-82.914169000000015,74.549149],[-82.953613000000018,74.565810999999997],[-83.018340999999907,74.594436999999914],[-83.056380999999988,74.61554000000001],[-83.079726999999934,74.630264000000068],[-83.088607999999965,74.636658000000125],[-83.092498999999975,74.641372999999987],[-83.102218999999934,74.65415999999999],[-83.12388599999997,74.684982000000048],[-83.128051999999968,74.691925000000026],[-83.131942999999978,74.708328000000108],[-83.128051999999968,74.71748400000007],[-83.107772999999952,74.748032000000023],[-83.090835999999854,74.757767000000115],[-83.075012000000015,74.762206999999933],[-83.041381999999942,74.769989000000066],[-83.028884999999946,74.774993999999936],[-83.02305599999994,74.780548000000124],[-83.024170000000026,74.783325000000048],[-83.081680000000006,74.818054000000075],[-83.09584000000001,74.82388300000008],[-83.105269999999962,74.826660000000004],[-83.116104000000007,74.828597999999943],[-83.15583799999996,74.826935000000049],[-83.203063999999983,74.820830999999998],[-83.227782999999874,74.820540999999992],[-83.24888599999997,74.823608000000092],[-83.299727999999959,74.835541000000148],[-83.33666999999997,74.849426000000051],[-83.380829000000006,74.866379000000109],[-83.402221999999938,74.875259000000142],[-83.475554999999929,74.896652000000074],[-83.511397999999986,74.901657000000114],[-83.52806099999998,74.901657000000114],[-83.547500999999954,74.897491000000059],[-83.55972300000002,74.892487000000074],[-83.560546999999985,74.887206999999989],[-83.559433000000013,74.880814000000044],[-83.556945999999925,74.875259000000142],[-83.527221999999995,74.84526100000005],[-83.518616000000009,74.839432000000045],[-83.472504000000015,74.815262000000018],[-83.458617999999944,74.808028999999976],[-83.429992999999911,74.797484999999938],[-83.394164999999987,74.790268000000026],[-83.375274999999931,74.786926000000108],[-83.354995999999971,74.784424000000001],[-83.327498999999932,74.779160000000047],[-83.318893000000003,74.774993999999936],[-83.324172999999973,74.755264000000125],[-83.327498999999932,74.75],[-83.454726999999991,74.591094999999996],[-83.474441999999954,74.579711999999972],[-83.484160999999972,74.574996999999939],[-83.598891999999978,74.543594000000098],[-83.611664000000019,74.540817000000004],[-83.720839999999953,74.545532000000037],[-83.785552999999936,74.548598999999967],[-83.805556999999965,74.550812000000121],[-83.830840999999964,74.551376000000062],[-83.855270000000019,74.550812000000121],[-83.907501000000025,74.546936000000073],[-84.037780999999939,74.53414900000007],[-84.063323999999966,74.530822999999998],[-84.107498000000021,74.523314999999968],[-84.145844000000011,74.515548999999965],[-84.216400000000021,74.507216999999969],[-84.238892000000021,74.505554000000018],[-84.285552999999936,74.50360100000006],[-84.332778999999903,74.503876000000105],[-84.355835000000013,74.504440000000045],[-84.396118000000001,74.507492000000127],[-84.641678000000013,74.506943000000035],[-84.850280999999995,74.502212999999983],[-84.871384000000035,74.501389000000017],[-84.889450000000011,74.502212999999983],[-84.899445000000014,74.503326000000072],[-84.91194200000001,74.508041000000105],[-84.916655999999932,74.511108000000036],[-84.983063000000016,74.570541000000048],[-84.985275000000001,74.579163000000051],[-84.974715999999944,74.617477000000065],[-84.960281000000009,74.656937000000084],[-84.955001999999865,74.66276600000009],[-84.950835999999981,74.668869000000029],[-84.950835999999981,74.672760000000096],[-84.952498999999989,74.679153000000042],[-84.955565999999976,74.684708000000114],[-84.964172000000019,74.691925000000026],[-84.973327999999867,74.696091000000138],[-84.990554999999972,74.698029000000076],[-85.003341999999975,74.697479000000044],[-85.063888999999961,74.651657],[-85.072509999999966,74.641098000000113],[-85.044723999999917,74.612198000000092],[-85.037506000000008,74.541092000000049],[-85.036941999999954,74.535263000000043],[-85.038604999999961,74.528870000000097],[-85.043609999999944,74.523314999999968],[-85.074172999999917,74.508880999999974],[-85.087783999999886,74.504990000000078],[-85.104720999999984,74.501663000000121],[-85.125274999999931,74.49859600000002],[-85.21444699999995,74.49192800000003],[-85.259445000000028,74.490540000000124],[-85.353057999999976,74.49859600000002],[-85.363616999999977,74.501937999999996],[-85.369995000000017,74.509430000000066],[-85.363891999999964,74.537490999999989],[-85.365554999999972,74.544144000000131],[-85.370270000000005,74.552475000000072],[-85.468613000000005,74.658875000000023],[-85.474166999999909,74.664428999999984],[-85.482773000000009,74.671646000000123],[-85.49499499999996,74.679153000000042],[-85.504455999999948,74.683318999999926],[-85.520554000000004,74.688033999999959],[-85.527221999999881,74.688873000000115],[-85.543335000000013,74.686371000000065],[-85.549987999999985,74.68193100000002],[-85.524170000000026,74.598602000000142],[-85.520844000000011,74.593048000000124],[-85.509170999999981,74.579987000000017],[-85.486938000000009,74.561096000000134],[-85.481948999999929,74.554152999999985],[-85.479996000000028,74.547760000000039],[-85.479171999999949,74.541655999999989],[-85.480285999999921,74.537200999999982],[-85.50389100000001,74.520538000000101],[-85.527221999999881,74.510269000000051],[-85.542220999999927,74.505554000000018],[-85.560546999999929,74.501389000000017],[-85.580840999999964,74.498322000000087],[-85.604172000000005,74.495818999999926],[-86.013335999999981,74.479431000000091],[-86.059433000000013,74.478592000000106],[-86.082503999999972,74.479156000000046],[-86.120834000000002,74.482207999999957],[-86.123046999999872,74.48332199999993],[-86.122771999999941,74.489975000000129],[-86.101105000000018,74.511383000000023],[-86.085555999999997,74.529434000000037],[-86.079178000000013,74.53915400000011],[-86.077788999999939,74.545257999999933],[-86.082779000000016,74.555251999999939],[-86.153610000000015,74.60914600000001],[-86.177779999999927,74.615265000000022],[-86.197494999999947,74.615265000000022],[-86.215835999999854,74.610809000000074],[-86.224441999999954,74.607758000000047],[-86.235001000000011,74.601929000000041],[-86.240554999999972,74.59693900000002],[-86.242766999999958,74.59137000000004],[-86.23443599999996,74.581100000000106],[-86.227492999999981,74.575271999999984],[-86.223052999999936,74.562194999999974],[-86.232223999999974,74.540268000000083],[-86.235275000000001,74.535263000000043],[-86.244719999999973,74.52388000000002],[-86.278885000000002,74.508605999999929],[-86.332779000000016,74.490265000000136],[-86.399170000000026,74.479431000000091],[-86.423324999999977,74.478866999999923],[-86.443603999999993,74.481093999999985],[-86.462508999999955,74.485535000000084],[-86.633330999999998,74.526093000000003],[-86.664168999999958,74.534714000000065],[-86.69110099999989,74.544144000000131],[-86.708618000000001,74.551086000000055],[-86.720839999999896,74.558594000000085],[-86.759170999999981,74.586380000000133],[-86.762786999999946,74.591933999999981],[-86.761672999999973,74.598037999999974],[-86.751403999999866,74.60386699999998],[-86.74610899999999,74.608871000000136],[-86.75111400000003,74.613602000000071],[-86.766952999999944,74.616088999999988],[-86.785277999999948,74.616928000000144],[-86.799437999999952,74.615265000000022],[-86.801101999999958,74.611374000000126],[-86.800551999999925,74.552200000000028],[-86.797226000000023,74.543594000000098],[-86.794448999999986,74.539978000000076],[-86.705565999999976,74.500275000000045],[-86.693603999999937,74.468048000000067],[-86.905838000000017,74.460541000000092],[-87.225829999999917,74.466934000000094],[-87.27027899999996,74.468323000000055],[-87.304169000000002,74.471649000000127],[-87.320846999999958,74.476653999999996],[-87.352782999999931,74.495254999999986],[-87.474441999999954,74.475815000000011],[-87.508621000000005,74.46775800000006],[-87.527221999999995,74.465545999999961],[-87.574722000000008,74.461929000000055],[-87.669998000000021,74.459991000000059],[-87.710830999999928,74.460815000000025],[-87.732223999999974,74.466385000000116],[-87.755004999999983,74.479431000000091],[-87.848052999999993,74.476089000000115],[-87.903610000000015,74.472214000000122],[-88.036117999999931,74.476928999999984],[-88.263625999999988,74.483597000000145],[-88.356109999999944,74.489150999999993],[-88.496947999999861,74.497757000000092],[-88.517226999999991,74.499709999999993],[-88.529723999999987,74.501937999999996],[-88.535277999999948,74.50360100000006],[-88.539992999999981,74.50610400000005],[-88.571121000000005,74.549987999999985],[-88.570846999999958,74.556091000000094],[-88.560821999999973,74.593048000000124],[-88.542220999999984,74.616088999999988],[-88.406386999999995,74.736098999999967],[-88.347504000000015,74.784714000000008],[-88.484725999999966,74.857758000000047],[-88.528060999999866,74.901931999999988],[-88.537216000000001,74.906937000000028],[-88.547774999999945,74.907760999999994],[-88.557220000000029,74.906647000000021],[-88.56806899999998,74.901382000000126],[-88.664718999999934,74.844986000000006],[-88.675827000000027,74.836929000000055],[-88.74360699999994,74.78387500000008],[-88.749724999999899,74.77777100000003],[-88.752501999999993,74.768326000000002],[-88.75306699999993,74.756103999999993],[-88.749724999999899,74.749709999999936],[-88.748885999999914,74.741364000000033],[-88.749434999999949,74.726089000000059],[-88.753341999999918,74.714157000000114],[-88.811935000000005,74.672211000000118],[-88.821395999999993,74.666382000000112],[-88.835555999999997,74.661377000000073],[-88.848343,74.659149000000127],[-88.862212999999997,74.658875000000023],[-88.873885999999914,74.6602630000001],[-88.883056999999951,74.665267999999969],[-88.889724999999999,74.670531999999923],[-88.917220999999984,74.719711000000132],[-88.918059999999855,74.732483000000116],[-88.914168999999958,74.749145999999996],[-88.910278000000005,74.754990000000021],[-88.905563000000029,74.75999500000006],[-88.904174999999952,74.765549000000078],[-88.906386999999995,74.773041000000035],[-88.909728999999857,74.77777100000003],[-88.926940999999943,74.78387500000008],[-89.073623999999882,74.833878000000027],[-89.088608000000022,74.837204000000042],[-89.097778000000005,74.836105000000089],[-89.099166999999966,74.835266000000104],[-89.059998000000007,74.797484999999938],[-89.053329000000019,74.793594000000041],[-89.042769999999905,74.789702999999975],[-89.011123999999938,74.780822999999941],[-89.010283999999956,74.775543000000084],[-89.012786999999946,74.770538000000045],[-89.041381999999999,74.730269999999962],[-89.047501000000011,74.722487999999998],[-89.055832000000009,74.719146999999964],[-89.077788999999882,74.717209000000025],[-89.102218999999991,74.719437000000028],[-89.178878999999938,74.732208000000128],[-89.178878999999938,74.735260000000039],[-89.181106999999997,74.739700000000028],[-89.190551999999968,74.744430999999963],[-89.223052999999993,74.752487000000031],[-89.243057000000022,74.755264000000125],[-89.265014999999948,74.756378000000097],[-89.271118000000001,74.754715000000033],[-89.216400000000021,74.721100000000092],[-89.202498999999932,74.713882000000126],[-89.189712999999927,74.708602999999925],[-89.141112999999962,74.698029000000076],[-89.12249799999995,74.696091000000138],[-89.105270000000019,74.693039000000056],[-89.095839999999953,74.688033999999959],[-89.095839999999953,74.68193100000002],[-89.125,74.616928000000144],[-89.131942999999922,74.611374000000126],[-89.150557999999933,74.599716000000114],[-89.185271999999998,74.587494000000106],[-89.196945000000028,74.584427000000005],[-89.438889000000017,74.550812000000121],[-89.455001999999922,74.548598999999967],[-89.489715999999987,74.545532000000037],[-89.580565999999976,74.540268000000083],[-89.92860399999995,74.530822999999998],[-89.946105999999986,74.532211000000132],[-90.106658999999979,74.549422999999933],[-90.223891999999921,74.563599000000124],[-90.244995000000017,74.566939999999988],[-90.263335999999924,74.570541000000048],[-90.363051999999982,74.594711000000075],[-90.45666499999993,74.600815000000068],[-90.496384000000035,74.601654000000053],[-90.529998999999862,74.605255000000113],[-90.589721999999995,74.613312000000064],[-90.607223999999917,74.616378999999995],[-90.619995000000017,74.619980000000055],[-90.70805399999989,74.648041000000148],[-90.731673999999941,74.664153999999996],[-90.736938000000009,74.669434000000024],[-90.739440999999999,74.673874000000069],[-90.747771999999998,74.703048999999965],[-90.75111400000003,74.716385000000059],[-90.867492999999911,74.702484000000084],[-90.875823999999966,74.691925000000026],[-90.885559000000001,74.683593999999971],[-90.895614999999964,74.681137000000092],[-91.013625999999988,74.698868000000061],[-91.024718999999948,74.70277400000009],[-91.023620999999991,74.706940000000031],[-91.012221999999952,74.717209000000025],[-90.978332999999964,74.739700000000028],[-90.965012000000002,74.747757000000036],[-90.945830999999941,74.751389000000131],[-90.938598999999954,74.750823999999966],[-90.926101999999958,74.751663000000065],[-90.896118000000001,74.75749200000007],[-90.883895999999936,74.761658000000011],[-90.851395000000025,74.776093000000117],[-90.758057000000008,74.831100000000049],[-90.752791999999943,74.835815000000082],[-90.740829000000019,74.847488000000112],[-90.742492999999911,74.852767999999969],[-90.746658000000025,74.860535000000084],[-90.75778200000002,74.880814000000044],[-90.772232000000031,74.884995000000117],[-90.816956000000005,74.883605999999986],[-90.841110000000015,74.879425000000083],[-90.853881999999942,74.875259000000142],[-90.863892000000021,74.869979999999998],[-90.870270000000005,74.86442599999998],[-90.874435000000005,74.859146000000123],[-90.87388599999997,74.853043000000014],[-90.883330999999998,74.84165999999999],[-90.975006000000008,74.799423000000104],[-91,74.789702999999975],[-91.075286999999946,74.761107999999979],[-91.101943999999946,74.751099000000124],[-91.132767000000001,74.744430999999963],[-91.144729999999981,74.747481999999991],[-91.14416499999993,74.751389000000131],[-91.146666999999923,74.755554000000132],[-91.171660999999972,74.75749200000007],[-91.188599000000011,74.752777000000037],[-91.216110000000015,74.738876000000062],[-91.225829999999917,74.733597000000088],[-91.228881999999942,74.727768000000083],[-91.226944000000003,74.722487999999998],[-91.185271999999941,74.684708000000114],[-91.177489999999977,74.678039999999953],[-91.154998999999975,74.665542999999957],[-91.11471599999993,74.645827999999995],[-91.105835000000013,74.63998400000014],[-91.098052999999879,74.633330999999998],[-91.099730999999963,74.62831100000011],[-91.106658999999979,74.625809000000061],[-91.133056999999951,74.624420000000043],[-91.256393000000003,74.628585999999984],[-91.455841000000021,74.639708999999982],[-91.539992999999924,74.646378000000027],[-91.553328999999962,74.648330999999985],[-91.676101999999901,74.671921000000111],[-91.684998000000007,74.677765000000136],[-91.671660999999972,74.689697000000081],[-91.664169000000015,74.693314000000044],[-91.634170999999981,74.696091000000138],[-91.621932999999956,74.700272000000041],[-91.620270000000005,74.704987000000074],[-91.624435000000005,74.709991000000059],[-91.635833999999932,74.715271000000087],[-91.651671999999962,74.719986000000119],[-91.708618000000001,74.727478000000076],[-91.754181000000017,74.727768000000083],[-91.779449,74.725815000000125],[-91.798888999999917,74.722214000000065],[-91.811110999999983,74.71804800000001],[-91.812499999999886,74.713042999999971],[-91.80296299999992,74.706184000000007],[-91.798888999999917,74.699416999999983],[-91.815551999999968,74.69470200000012],[-91.833069000000023,74.696091000000138],[-91.851105000000018,74.698868000000061],[-91.866652999999928,74.702209000000096],[-91.876663000000008,74.706940000000031],[-91.875274999999931,74.711928999999998],[-91.859160999999972,74.721100000000092],[-91.892226999999934,74.750823999999966],[-91.961944999999957,74.764160000000061],[-91.998610999999983,74.773041000000035],[-92.015838999999971,74.778320000000008],[-92.045546999999999,74.789702999999975],[-92.05749499999996,74.79664600000001],[-92.063613999999973,74.803588999999988],[-92.065276999999924,74.80720500000001],[-92.06639100000001,74.813309000000061],[-92.05749499999996,74.82499700000011],[-92.051665999999955,74.830551000000071],[-92.043334999999956,74.836380000000077],[-92.01916499999993,74.846099999999979],[-92.013061999999991,74.851928999999984],[-92.008056999999951,74.863602000000014],[-92.006393000000003,74.888046000000145],[-92.013335999999924,74.908325000000104],[-92.015288999999939,74.913604999999961],[-92.043334999999956,74.951935000000105],[-92.048049999999989,74.958328000000051],[-92.063323999999966,74.963882000000069],[-92.091674999999896,74.971649000000014],[-92.1058349999999,74.976654000000053],[-92.164169000000015,74.998031999999967],[-92.209732000000031,75.038588999999945],[-92.228881999999999,75.071105999999986],[-92.225829999999917,75.07388300000008],[-92.21556099999998,75.07638500000013],[-92.186385999999914,75.08137499999998],[-92.152495999999985,75.083878000000141],[-92.111664000000019,75.081940000000031],[-92.046188000000029,75.084961000000078],[-92.029998999999918,75.08638000000002],[-92.012511999999958,75.095260999999994],[-92.010009999999966,75.101089000000115],[-92.051392000000021,75.146942000000024],[-92.055557000000022,75.15026899999998],[-92.070556999999894,75.153046000000074],[-92.083618000000001,75.153320000000008],[-92.105269999999962,75.151932000000102],[-92.193329000000006,75.143326000000002],[-92.325561999999991,75.151657000000057],[-92.490829000000019,75.213608000000079],[-92.468886999999938,75.284714000000122],[-92.428604000000007,75.394440000000088],[-92.388335999999924,75.441925000000083],[-92.328063999999983,75.489151000000106],[-92.220276000000013,75.546097000000088],[-92.210281000000009,75.551376000000062],[-92.199431999999945,75.553864000000033],[-92.155838000000017,75.556641000000127],[-92.100280999999995,75.562759000000085],[-92.085830999999985,75.564987000000031],[-92.069457999999997,75.568878000000097],[-92.056655999999975,75.573043999999982],[-92.013901000000033,75.589157000000057],[-92.005004999999926,75.594986000000063],[-92.008346999999958,75.661377000000073],[-92.043609999999887,75.68553200000008],[-92.05749499999996,75.691359999999975],[-92.089995999999985,75.700272000000041],[-92.137512000000015,75.721100000000092],[-92.156661999999983,75.731094000000098],[-92.174437999999952,75.744431000000134],[-92.175551999999925,75.750549000000092],[-92.139724999999999,75.778319999999951],[-92.119155999999919,75.789154000000053],[-92.112777999999992,75.794708000000014],[-92.104720999999984,75.805252000000053],[-92.100554999999929,75.823043999999925],[-92.103881999999942,75.841369999999927],[-92.105269999999962,75.847488000000055],[-92.108611999999994,75.858871000000079],[-92.113327000000027,75.863602000000014],[-92.129714999999976,75.876373000000115],[-92.138061999999991,75.879974000000004],[-92.151108000000022,75.883041000000105],[-92.172774999999945,75.885544000000039],[-92.215012000000002,75.888321000000133],[-92.23832699999997,75.891373000000101],[-92.317779999999914,75.90498400000007],[-92.336394999999868,75.908600000000092],[-92.408614999999998,75.928589000000045],[-92.433060000000012,75.936371000000008],[-92.444442999999922,75.941086000000041],[-92.583618000000001,76.008881000000031],[-92.635833999999988,76.104155999999989],[-92.635833999999988,76.109711000000061],[-92.637222000000008,76.115814],[-92.793883999999935,76.20748900000001],[-92.809433000000013,76.212494000000049],[-92.946654999999964,76.245818999999926],[-93.066956000000005,76.299149],[-93.076674999999909,76.316939999999988],[-93.057220000000029,76.326660000000061],[-93.054992999999968,76.332489000000066],[-93.056380999999874,76.338593000000117],[-93.059158000000025,76.34387200000009],[-93.071945000000028,76.353317000000004],[-93.083618000000001,76.358032000000037],[-93.115279999999927,76.363876000000005],[-93.138061999999934,76.366378999999995],[-93.186935000000005,76.368317000000104],[-93.212783999999942,76.368042000000116],[-93.239989999999977,76.366653000000099],[-93.315276999999924,76.360259999999982],[-93.345275999999956,76.356094000000041],[-93.381377999999927,76.34637500000008],[-93.449996999999996,76.326385000000073],[-93.561934999999949,76.297211000000061],[-93.587783999999886,76.292755],[-93.617492999999968,76.291092000000049],[-93.635833999999988,76.291655999999989],[-93.658339999999896,76.293868999999972],[-93.666397000000018,76.298598999999967],[-93.653335999999911,76.302765000000079],[-93.624434999999892,76.30581699999999],[-93.623610999999926,76.310806000000127],[-93.636123999999995,76.326660000000061],[-93.654174999999896,76.325821000000133],[-93.678878999999938,76.322220000000073],[-93.718886999999995,76.312484999999981],[-93.731383999999991,76.306930999999963],[-93.763901000000033,76.286377000000016],[-93.763901000000033,76.282211000000132],[-93.761948000000018,76.280272999999966],[-93.753890999999953,76.275817999999958],[-93.74110399999995,76.271927000000062],[-93.720551,76.267761000000007],[-93.697220000000016,76.26388500000013],[-93.78443900000002,76.253052000000139],[-93.954453000000001,76.257767000000001],[-93.956116000000009,76.257767000000001],[-93.958343999999954,76.257767000000001],[-94.097504000000015,76.259430000000123],[-94.118880999999988,76.261383000000023],[-94.134170999999867,76.264709000000096],[-94.141387999999949,76.269989000000123],[-94.151671999999905,76.274155000000064],[-94.168610000000001,76.278320000000065],[-94.212509000000011,76.280822999999998],[-94.470839999999953,76.281096999999932],[-94.641677999999956,76.293319999999994],[-94.780288999999982,76.288879000000065],[-94.789992999999981,76.283600000000092],[-94.803329000000019,76.278320000000065],[-94.838608000000022,76.268326000000059],[-95.029174999999952,76.236099000000024],[-95.354995999999915,76.234146000000123],[-95.376099000000011,76.234421000000111],[-95.386947999999961,76.235809000000017],[-95.388061999999934,76.283600000000092],[-95.374435000000005,76.297760000000039],[-95.366942999999935,76.301376000000062],[-95.357223999999974,76.302765000000079],[-95.343063000000029,76.300262000000089],[-95.31806899999998,76.290817000000061],[-95.279175000000009,76.281372000000147],[-95.258895999999993,76.282760999999994],[-95.118332000000009,76.298035000000027],[-95.092772999999909,76.302765000000079],[-95.075561999999877,76.307754999999929],[-95.069732999999928,76.313309000000118],[-95.066558999999984,76.319862000000001],[-95.058883999999978,76.324706999999933],[-95.010558999999944,76.331100000000106],[-94.983886999999982,76.332489000000066],[-94.958892999999989,76.332214000000079],[-94.915008999999884,76.329711999999972],[-94.866394000000014,76.325546000000088],[-94.84973100000002,76.323317999999972],[-94.84056099999998,76.319717000000082],[-94.849990999999875,76.31442300000009],[-94.862777999999878,76.309981999999991],[-94.861663999999962,76.306930999999963],[-94.843613000000005,76.303864000000033],[-94.828613000000018,76.306091000000094],[-94.808608999999933,76.311371000000008],[-94.802489999999977,76.315536000000009],[-94.80082699999997,76.321655000000021],[-94.814163000000008,76.329163000000051],[-94.834441999999967,76.334427000000005],[-94.894729999999925,76.341660000000047],[-94.965012000000002,76.347487999999942],[-95.132767000000001,76.361374000000126],[-95.274719000000005,76.372208000000001],[-95.299437999999952,76.372482000000105],[-95.326401000000033,76.37081900000004],[-95.331679999999949,76.365265000000022],[-95.341384999999946,76.359711000000004],[-95.388900999999976,76.351929000000041],[-95.399993999999992,76.353317000000004],[-95.447220000000016,76.365813999999943],[-95.645279000000016,76.384155000000135],[-95.668335000000013,76.386108000000092],[-95.715835999999911,76.392211999999915],[-95.737502999999947,76.393875000000037],[-95.851105000000018,76.40109300000006],[-95.995834000000002,76.436919999999986],[-96.081679999999892,76.478043000000127],[-96.106948999999986,76.494430999999963],[-96.104171999999949,76.5],[-96.099166999999909,76.505553999999961],[-96.09056099999998,76.510268999999994],[-96.065552000000025,76.521378000000084],[-96.052489999999921,76.524155000000007],[-95.997222999999963,76.519440000000145],[-95.944991999999957,76.518326000000002],[-95.806380999999931,76.516388000000063],[-95.778609999999958,76.518875000000094],[-95.694152999999972,76.545258000000103],[-95.680557000000022,76.550537000000077],[-95.657776000000013,76.561371000000122],[-95.593886999999938,76.593048000000067],[-95.584166999999979,76.598327999999981],[-95.587783999999999,76.603592000000106],[-95.599441999999954,76.605255000000056],[-95.619719999999973,76.606094000000041],[-95.638901000000033,76.604156000000046],[-95.660277999999948,76.599426000000051],[-95.696105999999986,76.584152000000131],[-95.695540999999992,76.580276000000083],[-95.696654999999964,76.574432000000058],[-95.712783999999999,76.568603999999937],[-95.759170999999981,76.553588999999988],[-95.780562999999916,76.548874000000126],[-95.992492999999968,76.54803499999997],[-96.016953000000001,76.549149],[-96.158614999999941,76.583327999999995],[-96.17860399999995,76.594147000000078],[-96.225280999999882,76.625809000000004],[-96.27027899999996,76.632751000000098],[-96.33944699999995,76.63220199999995],[-96.355835000000013,76.633041000000105],[-96.38137799999987,76.635818000000029],[-96.403335999999911,76.639709000000096],[-96.421386999999982,76.646102999999982],[-96.445830999999998,76.657211000000132],[-96.454178000000013,76.662490999999989],[-96.461394999999925,76.668593999999985],[-96.461120999999991,76.673599000000024],[-96.46444699999995,76.679703000000018],[-96.470275999999956,76.685532000000023],[-96.527785999999935,76.693038999999999],[-96.611938000000009,76.702484000000027],[-96.636123999999995,76.704436999999984],[-96.661666999999966,76.704712000000029],[-96.736938000000009,76.697205000000054],[-96.764175000000023,76.695526000000086],[-96.789718999999934,76.695816000000093],[-96.81639100000001,76.697478999999987],[-96.857772999999952,76.701935000000105],[-96.879990000000021,76.705826000000002],[-96.915832999999964,76.714432000000102],[-96.946654999999964,76.723602000000142],[-96.959166999999979,76.729155999999932],[-96.964447000000007,76.733322000000044],[-96.900283999999999,76.795258000000047],[-96.887221999999952,76.805542000000059],[-96.873885999999914,76.810806000000071],[-96.854995999999971,76.813034000000016],[-96.839721999999995,76.810257000000092],[-96.724716000000001,76.783324999999991],[-96.679717999999923,76.770264000000054],[-96.592498999999918,76.758881000000031],[-96.426102000000014,76.744705000000067],[-96.330291999999929,76.750274999999931],[-96.311935000000005,76.751389000000131],[-96.305556999999965,76.753875999999991],[-96.315551999999968,76.802475000000129],[-96.320557000000008,76.80664100000007],[-96.366942999999935,76.812758999999971],[-96.453612999999962,76.815262000000132],[-96.50111400000003,76.818054000000075],[-96.547226000000023,76.822769000000108],[-96.797500999999897,76.861374000000012],[-96.81361400000003,76.868042000000003],[-96.848891999999921,76.887496999999996],[-96.865829000000019,76.898041000000035],[-96.869155999999975,76.904160000000047],[-96.869445999999982,76.913879000000065],[-96.864166000000012,76.919708000000071],[-96.857772999999952,76.924987999999928],[-96.833617999999944,76.9327550000001],[-96.796386999999982,76.937484999999924],[-96.771941999999967,76.937759000000028],[-96.761123999999995,76.937759000000028],[-96.723891999999978,76.935256999999979],[-96.708054000000004,76.93331900000004],[-96.698607999999979,76.934143000000006],[-96.660827999999981,76.947204999999997],[-96.659163999999976,76.949142000000052],[-96.667769999999962,76.954436999999928],[-96.677779999999984,76.957764000000054],[-96.696945000000028,76.960541000000148],[-96.718886999999995,76.963043000000027],[-96.765288999999996,76.96527100000003],[-96.808333999999945,76.966094999999996],[-96.824447999999904,76.96775800000006],[-96.827788999999939,76.968872000000033],[-96.825561999999991,76.974426000000051],[-96.810271999999998,76.979156000000103],[-96.772034000000019,76.98101800000012],[-96.742034999999987,76.982208000000014],[-96.673324999999977,76.982208000000014],[-96.622771999999998,76.979980000000069],[-96.483611999999994,76.971100000000035],[-96.353881999999999,76.993042000000059],[-96.391113000000018,77.026931999999988],[-96.387787000000003,77.03054800000001],[-96.373321999999973,77.031937000000028],[-96.28472899999997,77.039428999999984],[-96.27305599999994,77.040267999999912],[-96.24499499999996,77.041931000000034],[-96.226105000000018,77.043045000000006],[-96.103057999999976,77.044708000000128],[-95.96665999999999,77.053040000000124],[-95.888061999999934,77.06109600000002],[-95.752501999999993,77.06860400000005],[-95.734726000000023,77.06860400000005],[-95.707503999999915,77.066940000000045],[-95.659728999999913,77.058868000000075]],[[-113.32888800000001,77.079987000000017],[-113.353882,77.077484000000084],[-113.40888999999999,77.078873000000044],[-113.45140099999992,77.081664999999987],[-113.49194299999999,77.085541000000035],[-113.49749799999989,77.088318000000129],[-113.49027999999998,77.092484000000013],[-113.34472700000003,77.127762000000018],[-113.33528099999995,77.126083000000051],[-113.31471299999998,77.11775200000011],[-113.29332699999986,77.107483000000116],[-113.28694200000001,77.09637500000008],[-113.29110700000001,77.08998100000008],[-113.30471799999998,77.085266000000047],[-113.32888800000001,77.079987000000017]],[[-113.77861000000001,77.104155999999989],[-113.80695299999991,77.104155999999989],[-113.85333300000002,77.10554499999995],[-113.88054699999992,77.108032000000037],[-113.90888999999999,77.113037000000077],[-113.92443800000001,77.118591000000094],[-113.93138099999999,77.1244200000001],[-113.93138099999999,77.129699999999957],[-113.92722300000003,77.135268999999994],[-113.92083700000001,77.141098],[-113.90110800000002,77.146378000000027],[-113.88082900000001,77.149719000000061],[-113.859444,77.151382000000012],[-113.798607,77.152481000000023],[-113.77417000000003,77.151657000000057],[-113.72250399999996,77.148041000000148],[-113.69915800000001,77.144714000000022],[-113.67555199999993,77.140274000000034],[-113.66443599999997,77.134720000000016],[-113.65778399999999,77.129149999999925],[-113.66416900000002,77.123032000000023],[-113.67916899999989,77.116928000000144],[-113.703056,77.111649],[-113.72778299999993,77.108032000000037],[-113.75306699999993,77.10554499999995],[-113.77861000000001,77.104155999999989]],[[-104.25250199999999,77.072769000000051],[-104.30277999999998,77.072220000000073],[-104.35417200000001,77.073883000000023],[-104.37721299999998,77.076660000000118],[-104.40222199999994,77.081100000000106],[-104.421944,77.087203999999986],[-104.43167099999994,77.098877000000016],[-104.42639200000002,77.116379000000052],[-104.42027300000001,77.122208000000057],[-104.40556299999997,77.127762000000018],[-104.31973299999999,77.151657000000057],[-104.30082700000003,77.15525800000006],[-104.27333099999998,77.159714000000008],[-104.18360899999993,77.167205999999965],[-104.11389199999996,77.166091999999992],[-104.07140399999997,77.16137700000013],[-104.06139400000001,77.158875000000023],[-104.031113,77.15109300000006],[-104.01972999999998,77.146103000000039],[-104.00110599999999,77.135818000000086],[-103.99889399999995,77.123870999999951],[-104.00945300000001,77.118042000000116],[-104.02416999999991,77.112487999999985],[-104.04778299999992,77.106934000000138],[-104.15028399999994,77.08638000000002],[-104.196663,77.077484000000084],[-104.25250199999999,77.072769000000051]],[[-95.22444200000001,77.167205999999965],[-95.245270000000005,77.164153999999996],[-95.291381999999999,77.164992999999981],[-95.314437999999996,77.166656000000103],[-95.362777999999935,77.171920999999998],[-95.419998000000021,77.181931000000077],[-95.572509999999852,77.213042999999971],[-95.613051999999925,77.221924000000115],[-95.634170999999924,77.228043000000127],[-95.638901000000033,77.232208000000128],[-95.639998999999932,77.237761999999975],[-95.636672999999973,77.239150999999936],[-95.631377999999927,77.239700000000084],[-95.608046999999885,77.240814000000057],[-95.511123999999995,77.243042000000003],[-95.438048999999978,77.24443100000002],[-95.387512000000015,77.240814000000057],[-95.37222300000002,77.238037000000134],[-95.356110000000001,77.236374000000069],[-95.31361400000003,77.229156000000046],[-95.244155999999919,77.213882000000126],[-95.216399999999965,77.201660000000004],[-95.206664999999987,77.189147999999989],[-95.206954999999994,77.177764999999965],[-95.214447000000007,77.172485000000108],[-95.22444200000001,77.167205999999965]],[[-90.933059999999955,77.254440000000045],[-90.909164000000033,77.251663000000121],[-90.815001999999993,77.240265000000136],[-90.772232000000031,77.231368999999972],[-90.736388999999974,77.220824999999934],[-90.718338000000017,77.207213999999965],[-90.713622999999984,77.200821000000019],[-90.724166999999909,77.183318999999983],[-90.731948999999986,77.177764999999965],[-90.779175000000009,77.156647000000078],[-90.811385999999914,77.14665199999996],[-90.83555599999994,77.142211999999972],[-90.868331999999953,77.138321000000076],[-90.899993999999992,77.136932000000058],[-90.978606999999897,77.137771999999927],[-91.049728000000016,77.145537999999988],[-91.18472300000002,77.163605000000075],[-91.221664000000033,77.170258000000047],[-91.238892000000021,77.174423000000047],[-91.262512000000015,77.18414300000012],[-91.286391999999921,77.196640000000116],[-91.295546999999999,77.203323000000069],[-91.297501000000011,77.207213999999965],[-91.299164000000019,77.217758000000003],[-91.277221999999995,77.227478000000133],[-91.24749799999995,77.235809000000017],[-91.189712999999983,77.24803200000008],[-91.162216000000001,77.251389000000017],[-91.107223999999917,77.254715000000033],[-91.084732000000031,77.254440000000045],[-91.072234999999921,77.253326000000072],[-91.057219999999973,77.254440000000045],[-90.987503000000004,77.254990000000078],[-90.933059999999955,77.254440000000045]],[[-116.35109699999998,77.539154000000053],[-116.20333900000003,77.519989000000066],[-116.09056099999992,77.491089000000045],[-116.073624,77.485535000000027],[-115.88027999999991,77.433319000000097],[-115.52055399999995,77.364426000000037],[-115.49526999999989,77.359420999999998],[-115.458054,77.348602000000085],[-115.44611399999985,77.343048000000124],[-115.389183,77.312194999999917],[-115.390289,77.306366000000082],[-115.54332699999986,77.265548999999908],[-115.59110999999996,77.259995000000117],[-115.61694299999999,77.258331000000112],[-115.66915899999992,77.256942999999978],[-115.69499199999996,77.255264000000011],[-115.77250700000002,77.247757000000036],[-115.81973299999999,77.237488000000042],[-115.83084099999991,77.233322000000101],[-115.85888699999998,77.220824999999934],[-115.87777699999992,77.215271000000143],[-115.94695299999989,77.20887799999997],[-116.112503,77.193863000000022],[-116.13806199999999,77.192200000000128],[-116.19055200000003,77.191650000000095],[-116.21777299999997,77.192749000000049],[-116.26917300000002,77.190261999999962],[-116.28056300000003,77.183594000000028],[-116.31416300000001,77.144440000000088],[-116.31973299999999,77.11775200000011],[-116.28028899999998,77.067215000000033],[-116.26917300000002,77.055817000000047],[-116.24249299999991,77.044144000000017],[-116.17360699999989,77.027206000000092],[-116.06388900000002,77.007492000000013],[-116.00583599999999,76.997482000000105],[-115.95028699999995,76.991363999999976],[-115.860817,76.979156000000103],[-115.75499699999995,76.960815000000082],[-115.73889199999996,76.955261000000064],[-115.73137700000001,76.949707000000103],[-115.72833300000002,76.943863000000079],[-115.729446,76.938034000000073],[-115.73222399999997,76.931656000000089],[-115.74610899999999,76.925262000000089],[-115.80695300000002,76.90637200000009],[-115.829453,76.900818000000129],[-115.85333299999996,76.897217000000069],[-115.90334300000001,76.893874999999923],[-115.92859599999997,76.893050999999957],[-115.98194899999993,76.895538000000045],[-116.06388900000002,76.902771000000087],[-116.11501299999992,76.909149000000014],[-116.25389100000001,76.932480000000055],[-116.306107,76.936096000000134],[-116.32721699999996,76.935532000000023],[-116.35166899999996,76.9327550000001],[-116.36527999999993,76.926376000000062],[-116.36721799999998,76.915543000000071],[-116.36332699999997,76.90887500000008],[-116.35555999999985,76.903320000000008],[-116.34612299999992,76.898331000000042],[-116.32972699999999,76.89276099999995],[-116.18360899999993,76.845825000000104],[-116.16388699999999,76.841660000000104],[-116.10749800000002,76.833602999999982],[-116.031113,76.820267000000001],[-116.00029000000001,76.811371000000065],[-115.89472999999992,76.703323000000012],[-115.89138800000001,76.697478999999987],[-115.89666699999998,76.691649999999981],[-116.07140400000003,76.625809000000004],[-116.09306299999992,76.619141000000013],[-116.11582900000002,76.61442599999998],[-116.16055299999999,76.611099000000081],[-116.23194899999999,76.603043000000014],[-116.25446299999999,76.598602000000085],[-116.32250999999997,76.581100000000049],[-116.37351999999993,76.581802000000039],[-116.73277300000001,76.572495000000004],[-116.75890399999992,76.56999200000007],[-116.97112299999998,76.548598999999967],[-116.99471999999992,76.545822000000044],[-117.01750199999992,76.542205999999965],[-117.03999299999992,76.537490999999932],[-117.05387899999999,76.533051000000114],[-117.06861900000001,76.526093000000117],[-117.07556199999993,76.520538000000045],[-117.07749899999999,76.514160000000061],[-117.07640099999998,76.508881000000088],[-117.07277699999997,76.503052000000082],[-117.05695299999996,76.491652999999985],[-117.04360999999989,76.48692299999999],[-117.01750199999992,76.482483000000116],[-117.00389099999995,76.477478000000076],[-116.98361199999999,76.454987000000074],[-116.94082599999996,76.386932000000058],[-116.93916299999995,76.380539000000113],[-116.93582200000003,76.351929000000041],[-116.93859900000001,76.34637500000008],[-117.09555099999994,76.295257999999933],[-117.13971700000002,76.286925999999994],[-117.31973299999999,76.257767000000001],[-117.345551,76.256377999999984],[-117.36888099999999,76.256943000000035],[-117.52390300000002,76.263611000000026],[-117.5750119999999,76.26887499999998],[-117.60305799999998,76.27388000000002],[-117.62304699999999,76.278870000000097],[-117.639183,76.28414900000007],[-117.65778399999999,76.293319999999994],[-117.64917000000003,76.305542000000003],[-117.64890299999996,76.311371000000008],[-117.65527299999997,76.317490000000021],[-117.67304999999993,76.322220000000073],[-117.69915800000001,76.324158000000011],[-117.72416699999997,76.324432000000115],[-117.87777699999998,76.341933999999981],[-117.889183,76.355819999999937],[-117.90139799999997,76.367203000000131],[-117.90695199999993,76.372208000000001],[-117.99722299999996,76.396941999999967],[-118.02139299999999,76.401932000000045],[-118.04444899999999,76.404984000000127],[-118.05999800000001,76.409149000000127],[-118.04750100000001,76.441650000000038],[-118.02749599999999,76.484711000000061],[-117.97332799999998,76.596375000000023],[-117.92832899999996,76.676651000000106],[-117.91915899999992,76.68803400000013],[-117.90666199999993,76.694137999999953],[-117.883331,76.700546000000088],[-117.86444099999994,76.704163000000051],[-117.84805299999999,76.708328000000051],[-117.81331599999999,76.719436999999971],[-117.79638699999998,76.725815000000125],[-117.78806299999997,76.732208000000071],[-117.73889200000002,76.772217000000012],[-117.73444399999994,76.778320000000122],[-117.73860200000001,76.784149000000127],[-117.79888899999997,76.817764000000011],[-117.81667299999998,76.821380999999974],[-117.84221600000001,76.82388300000008],[-117.86665299999999,76.822220000000129],[-117.88806199999999,76.818878000000041],[-117.90499899999992,76.812195000000031],[-117.91777000000002,76.799988000000042],[-117.92610200000001,76.788040000000024],[-117.96056399999998,76.769989000000066],[-118.00583599999993,76.761383000000137],[-118.02971600000001,76.758606000000043],[-118.08222999999998,76.756943000000092],[-118.10611,76.75749200000007],[-118.15695199999999,76.76249700000011],[-118.21362299999998,76.769150000000081],[-118.29361,76.773041000000148],[-118.319458,76.773041000000148],[-118.33750900000001,76.768326000000116],[-118.49500299999994,76.712203999999929],[-118.47471599999994,76.679703000000018],[-118.45973199999997,76.673874000000012],[-118.42887899999999,76.663879000000122],[-118.40306099999998,76.657760999999994],[-118.35804699999989,76.64888000000002],[-118.34137699999997,76.643599999999992],[-118.33473199999992,76.637497000000053],[-118.316101,76.574707000000103],[-118.50279199999994,76.509720000000073],[-118.52390299999996,76.503876000000048],[-118.54611199999999,76.5],[-118.57084699999996,76.499145999999996],[-118.59694699999989,76.5],[-118.62361099999993,76.501938000000109],[-118.65167200000002,76.505553999999961],[-118.67804699999994,76.50999500000006],[-118.70916699999998,76.519989000000066],[-118.71333299999998,76.525818000000129],[-118.71362299999998,76.531662000000097],[-118.72222899999991,76.537201000000096],[-118.73473399999995,76.542480000000069],[-118.76139799999999,76.546936000000017],[-118.81471299999998,76.553040000000067],[-118.84166700000003,76.554977000000065],[-118.94415299999997,76.518051000000128],[-118.96806300000003,76.505264000000125],[-118.97582999999992,76.498871000000008],[-118.97609699999998,76.496368000000018],[-118.97250399999996,76.491652999999985],[-118.96777299999997,76.488312000000121],[-118.95527600000003,76.483047000000056],[-118.93110699999994,76.479155999999989],[-118.82195300000001,76.471374999999966],[-118.68195300000002,76.445251000000098],[-118.64862099999999,76.428863999999919],[-118.612503,76.400269000000094],[-118.59416199999993,76.383881000000031],[-118.56610099999995,76.343048000000124],[-118.567497,76.336655000000007],[-118.58168000000001,76.324706999999933],[-118.62554899999998,76.294433999999967],[-118.63751200000002,76.288040000000137],[-118.65556299999997,76.28414900000007],[-118.67916899999994,76.282211000000132],[-118.70556599999992,76.281661999999983],[-118.78083799999996,76.282486000000119],[-118.82833900000003,76.281937000000028],[-118.87666299999989,76.27748100000008],[-118.89584400000001,76.272217000000126],[-118.91139199999992,76.265548999999965],[-118.91915899999998,76.259430000000123],[-118.92443799999995,76.252776999999924],[-118.942207,76.210541000000148],[-118.93776699999995,76.204711999999915],[-118.92331699999994,76.194138000000066],[-118.91278099999994,76.188034000000016],[-118.90471600000001,76.169144000000074],[-118.95527600000003,76.132477000000108],[-118.96501199999994,76.126648000000102],[-119.07584399999996,76.083328000000108],[-119.10109699999998,76.084152000000074],[-119.12470999999999,76.088042999999971],[-119.22972099999993,76.107208000000071],[-119.24526999999995,76.111374000000012],[-119.26000999999997,76.117203000000018],[-119.28250099999997,76.127472000000068],[-119.29943800000001,76.138596000000121],[-119.30832699999996,76.149994000000106],[-119.31054699999999,76.155258000000117],[-119.30583200000001,76.167755000000113],[-119.30082699999997,76.174423000000047],[-119.29499799999996,76.180267000000072],[-119.29527300000001,76.186096000000077],[-119.30166600000001,76.191360000000088],[-119.36916399999996,76.229706000000078],[-119.54915599999998,76.324158000000011],[-119.5864029999999,76.318603999999993],[-119.65499899999992,76.303040000000067],[-119.67527799999993,76.264160000000118],[-119.67500299999995,76.245818999999926],[-119.64555399999995,76.230545000000063],[-119.59445199999999,76.203049000000021],[-119.58583099999998,76.197479000000101],[-119.57277699999992,76.186371000000122],[-119.56806899999987,76.180542000000116],[-119.56582600000002,76.175262000000032],[-119.56696299999999,76.168869000000086],[-119.57277699999992,76.16304000000008],[-119.64334099999996,76.112487999999985],[-119.74527,76.116652999999985],[-119.76999699999993,76.116379000000052],[-119.79305999999991,76.114426000000094],[-119.80499299999997,76.108871000000022],[-119.79723399999995,76.104155999999989],[-119.7727809999999,76.099425999999937],[-119.74416400000001,76.097487999999998],[-119.64723200000003,76.081664999999987],[-119.62666300000001,76.076660000000118],[-119.50389100000001,76.040817000000061],[-119.49137899999999,76.035538000000088],[-119.47833299999996,76.024155000000121],[-119.47389199999998,76.018599999999992],[-119.47222899999997,76.000824000000023],[-119.47609699999998,75.982483000000059],[-119.48110999999989,75.970825000000048],[-119.48916599999995,75.965546000000018],[-119.50974299999996,75.960540999999978],[-119.53555299999994,75.962494000000106],[-119.54638699999998,75.968323000000112],[-119.56111099999998,75.97886699999998],[-119.57195299999995,75.984985000000108],[-119.58583099999998,75.989699999999971],[-119.612503,75.992477000000065],[-119.63694800000002,75.992203000000131],[-119.64890300000002,75.986649000000114],[-119.699997,75.94859300000013],[-119.70333900000003,75.942749000000106],[-119.6875,75.938309000000118],[-119.612503,75.910263000000043],[-119.81082199999997,75.86943100000002],[-119.870003,75.857483000000002],[-119.93554699999993,75.848328000000095],[-119.98000300000001,75.843323000000055],[-120.02583300000003,75.839980999999966],[-120.04915599999987,75.838882000000126],[-120.07640100000003,75.867203000000075],[-120.08500700000002,75.872757000000036],[-120.11416600000001,75.888321000000133],[-120.12805199999997,75.893051000000014],[-120.14916999999997,75.896378000000141],[-120.16639700000002,75.892487000000074],[-120.18028299999997,75.879974000000004],[-120.18331899999993,75.873871000000065],[-120.19722000000002,75.861374000000069],[-120.21501199999994,75.848602000000028],[-120.22582999999992,75.842209000000082],[-120.26972999999992,75.821930000000123],[-120.28888699999987,75.816085999999927],[-120.30915800000002,75.811096000000077],[-120.33222999999998,75.807480000000055],[-120.35555999999997,75.806366000000025],[-120.37805200000003,75.80664100000007],[-120.40387699999991,75.808318999999983],[-120.43028300000003,75.811096000000077],[-120.45445299999994,75.81581100000011],[-120.46694899999994,75.821105999999986],[-120.47582999999997,75.826660000000004],[-120.48528299999998,75.837769000000094],[-120.4886019999999,75.844147000000021],[-120.48972300000003,75.849991000000045],[-120.48832699999997,75.855545000000063],[-120.46305799999999,75.916382000000056],[-120.46000700000002,75.922484999999995],[-120.44860799999987,75.935532000000023],[-120.406113,75.954987000000017],[-120.40583800000002,75.97137500000008],[-120.43499799999989,76.003052000000025],[-120.45889299999999,76.011658000000125],[-120.46749899999998,76.012207000000046],[-120.53333299999991,76.003052000000025],[-120.56054699999999,75.991653000000099],[-120.56331599999993,75.985535000000141],[-120.57417299999997,75.979156000000103],[-120.59388699999994,75.978043000000014],[-120.61361699999998,75.981934000000081],[-120.64306599999986,75.992477000000065],[-120.696663,76.013884999999959],[-120.70722999999998,76.018875000000037],[-120.71611000000001,76.024429000000055],[-120.729446,76.039428999999984],[-120.75167799999997,76.099425999999937],[-120.75110599999999,76.105819999999994],[-120.74833699999999,76.111922999999933],[-120.74305700000002,76.117751999999939],[-120.73222399999997,76.124145999999996],[-120.71193699999998,76.129149999999981],[-120.72749299999992,76.158600000000035],[-120.85722399999986,76.196639999999945],[-120.88362100000001,76.198318000000086],[-120.90249599999999,76.196365000000128],[-120.95639,76.177765000000022],[-120.96806300000003,76.172211000000004],[-121.00890400000003,76.144149999999911],[-121.01251199999996,76.139160000000061],[-121.016953,76.121094000000085],[-121.02528399999989,76.073318000000029],[-121.02278100000001,76.059143000000063],[-120.99328600000001,76.026817000000108],[-120.97961399999997,76.019653000000119],[-120.970123,76.013489000000106],[-120.93195300000002,75.959990999999945],[-120.93306000000001,75.956940000000145],[-120.94583099999994,75.94859300000013],[-120.98082699999998,75.941649999999981],[-120.99944299999999,75.939697000000024],[-121.01445000000001,75.942749000000106],[-121.01722699999999,75.94802900000002],[-121.01112399999988,75.970825000000048],[-121.00055699999996,75.977203000000145],[-120.98610699999995,75.984145999999953],[-121.00761399999999,75.988982999999962],[-121.01527399999998,75.992149000000097],[-121.030441,75.992477000000065],[-121.09277299999997,75.993317000000104],[-121.11389199999996,75.991653000000099],[-121.25945299999995,75.964432000000045],[-121.26583900000003,75.958328000000051],[-121.271118,75.946091000000081],[-121.27887699999985,75.927765000000079],[-121.34861799999993,75.928040000000067],[-121.423317,75.933868000000018],[-121.43639400000001,75.939148000000046],[-121.422775,75.946465000000103],[-121.41665599999988,75.953049000000078],[-121.42415599999993,75.956649999999911],[-121.479446,75.976379000000009],[-121.58306899999997,76.003601000000117],[-121.59500100000002,76.005554000000075],[-121.83473200000003,76.034424000000115],[-122.13417099999998,76.036377000000073],[-122.14499699999999,76.030823000000055],[-122.14472999999992,75.996932999999956],[-122.16944899999999,75.978043000000014],[-122.33583099999998,75.942474000000118],[-122.37666300000001,75.933868000000018],[-122.41639700000002,75.928589000000045],[-122.442207,75.927475000000072],[-122.48916599999995,75.927200000000028],[-122.51666299999994,75.928314],[-122.56360599999999,75.931931000000134],[-122.67610200000001,75.951660000000061],[-122.69638099999997,75.955551000000128],[-122.72250400000001,75.96887200000009],[-122.728882,75.973037999999974],[-122.66915899999998,75.976929000000041],[-122.64943699999998,75.982208000000014],[-122.59111000000001,76.001663000000008],[-122.57640100000003,76.007492000000013],[-122.5625,76.014434999999992],[-122.47556299999997,76.104431000000034],[-122.47112300000003,76.110260000000039],[-122.47193899999996,76.114990000000034],[-122.48554999999993,76.1202550000001],[-122.49833699999994,76.120529000000033],[-122.60134900000003,76.115097000000048],[-122.62222300000002,76.111374000000012],[-122.67832900000002,76.111374000000012],[-122.69999699999994,76.112198000000149],[-122.70445299999994,76.114426000000094],[-122.69554099999993,76.117751999999939],[-122.58721899999995,76.134155000000021],[-122.50195299999996,76.136383000000137],[-122.48999000000003,76.141098],[-122.57417299999992,76.166091999999992],[-122.595551,76.170822000000044],[-122.62027,76.174423000000047],[-122.64666699999998,76.175812000000064],[-122.67027300000001,76.174423000000047],[-122.69360399999999,76.17053199999998],[-122.73361199999994,76.162491000000102],[-122.84277299999997,76.131088000000091],[-122.885559,76.104431000000034],[-122.90194699999995,76.098038000000031],[-122.92138699999987,76.092758000000003],[-123.01139799999993,76.083328000000108],[-123.037781,76.084717000000069],[-122.97917199999995,76.125809000000118],[-122.84861799999999,76.208878000000027],[-122.72112299999998,76.231369000000029],[-122.636124,76.264709000000096],[-122.63166799999999,76.270538000000101],[-122.63751200000002,76.288040000000137],[-122.64527899999996,76.299712999999997],[-122.63249199999996,76.329987000000017],[-122.62638900000002,76.336380000000133],[-122.61776700000001,76.342208999999968],[-122.59889199999998,76.348328000000038],[-122.57861300000002,76.353591999999992],[-122.39890300000002,76.396941999999967],[-122.30943300000001,76.408875000000023],[-122.01471699999996,76.432479999999998],[-121.826683,76.422760000000096],[-121.78195199999999,76.420258000000047],[-121.73805199999998,76.421097000000145],[-121.54998799999993,76.434708000000114],[-121.53307299999994,76.437195000000031],[-121.51445000000001,76.444138000000009],[-121.421944,76.493590999999924],[-121.31220999999994,76.572495000000004],[-121.30695300000002,76.578323000000125],[-121.31388899999996,76.589705999999978],[-121.30915800000002,76.593872000000033],[-121.21250899999995,76.649719000000005],[-121.118607,76.673309000000017],[-121.10109699999992,76.668320000000051],[-121.079453,76.668320000000051],[-121.05666399999996,76.671371000000022],[-120.923317,76.689972000000068],[-120.900284,76.693313999999987],[-120.88417099999998,76.698868000000004],[-120.86193800000001,76.711929000000112],[-120.84777799999989,76.724700999999925],[-120.83249699999993,76.731369000000086],[-120.81220999999994,76.737198000000092],[-120.76611299999996,76.743591000000094],[-120.66915899999998,76.751099000000067],[-120.64083899999997,76.748596000000134],[-120.62581599999999,76.746367999999961],[-120.60417200000001,76.746367999999961],[-120.58112299999999,76.7494200000001],[-120.40167200000002,76.797211000000004],[-120.38194299999992,76.804153000000042],[-120.36776700000001,76.810257000000092],[-120.36609599999997,76.813309000000004],[-120.36527999999993,76.836105000000032],[-120.09137699999997,77.003051999999968],[-120.06916799999999,77.008040999999935],[-120.03888699999999,77.013321000000019],[-120.02278100000001,77.015273999999977],[-119.99722300000002,77.01638800000012],[-119.97693600000002,77.013321000000019],[-119.96112099999993,77.009995000000004],[-119.94999699999994,77.012497000000053],[-119.92027299999995,77.023605000000032],[-119.83944700000001,77.05693100000002],[-119.83167999999995,77.06303400000013],[-119.83249699999999,77.069153000000142],[-119.83583099999987,77.075271999999984],[-119.83721899999995,77.079712000000029],[-119.83556399999998,77.085266000000047],[-119.825287,77.091095000000053],[-119.8125,77.096649000000014],[-119.77639799999992,77.106094000000098],[-119.60056299999991,77.145827999999995],[-119.43331899999998,77.173599000000081],[-119.41082799999998,77.178588999999931],[-119.389183,77.184417999999994],[-119.360817,77.203323000000069],[-119.354446,77.209152000000131],[-119.346947,77.221374999999966],[-119.34583999999995,77.227767999999969],[-119.33389299999993,77.239975000000072],[-119.31582599999996,77.258041000000105],[-119.29583700000001,77.276657000000114],[-119.26834099999996,77.28915400000011],[-119.25306699999999,77.295258000000103],[-119.22222899999991,77.306366000000082],[-119.20111099999991,77.313034000000073],[-119.15334299999995,77.325821000000076],[-119.11444099999994,77.327484000000027],[-119.08666999999997,77.326660000000061],[-119.00110599999988,77.321106000000043],[-118.94138299999992,77.319717000000082],[-118.91694599999994,77.32249500000006],[-118.89389,77.327484000000027],[-118.87000299999994,77.333878000000084],[-118.75723299999999,77.352478000000019],[-118.73249800000002,77.35554500000012],[-118.65110799999997,77.360535000000141],[-118.44972199999995,77.358871000000136],[-118.224716,77.356094000000041],[-118.19721999999996,77.354980000000069],[-118.16583300000002,77.355255000000056],[-118.14111299999996,77.35803199999998],[-118.12805200000003,77.364426000000037],[-118.12721299999998,77.369431000000077],[-118.125,77.372482000000105],[-118.10694899999993,77.378036000000122],[-118.08750899999995,77.379150000000095],[-117.91111799999993,77.386932000000058],[-117.86721799999992,77.388596000000064],[-117.85056299999991,77.384430000000123],[-117.781113,77.36303700000002],[-117.76806599999998,77.357758000000047],[-117.756958,77.351654000000053],[-117.75083899999998,77.346648999999957],[-117.73860200000001,77.341933999999924],[-117.72444200000001,77.338043000000084],[-117.61193800000001,77.327774000000034],[-117.45084400000002,77.312194999999917],[-117.27639799999997,77.28915400000011],[-117.02306399999998,77.290817000000004],[-117.01478600000002,77.296700000000044],[-117.01711999999992,77.300208999999938],[-117.02749599999993,77.310256999999979],[-117.06082199999997,77.326660000000061],[-117.10555999999997,77.339981000000023],[-117.11582900000002,77.34165999999999],[-117.11805699999996,77.338593000000117],[-117.1324919999999,77.333328000000051],[-117.15416699999997,77.332489000000066],[-117.16999800000002,77.335815000000082],[-117.18195300000002,77.34027100000003],[-117.18167099999999,77.346375000000023],[-117.17666600000001,77.352203000000145],[-117.15888999999987,77.358871000000136],[-117.14277600000003,77.361374000000126],[-117.11945300000002,77.359985000000108],[-117.06082199999997,77.353317000000118],[-117.00749999999994,77.343039999999974],[-116.94666299999994,77.329436999999984],[-116.87638900000002,77.318054000000132],[-116.848343,77.315810999999997],[-116.79583700000001,77.317490000000021],[-116.77887699999997,77.319153000000085],[-116.65167199999996,77.377761999999962],[-116.64835399999998,77.383330999999998],[-116.65167199999996,77.388046000000031],[-116.66278099999994,77.391662999999994],[-116.74137899999999,77.395263999999997],[-116.87082699999996,77.400818000000015],[-116.89917000000003,77.399428999999998],[-116.97582999999997,77.393326000000059],[-116.99471999999992,77.394440000000031],[-117.01112399999994,77.398880000000077],[-117.15306099999992,77.451660000000118],[-117.14998599999996,77.457214000000135],[-117.13890100000003,77.460541000000035],[-117.08306899999997,77.474425999999937],[-117.06667299999998,77.476929000000098],[-117.06139399999989,77.476089000000059],[-117.03833799999995,77.471001000000058],[-116.991669,77.466660000000104],[-116.91972399999997,77.470535000000041],[-116.89444700000001,77.473312000000135],[-116.78527799999995,77.499145999999996],[-116.75723299999993,77.511658000000011],[-116.76944699999996,77.516388000000006],[-116.85109699999998,77.516663000000051],[-116.87917299999987,77.517761000000121],[-116.9058379999999,77.520264000000111],[-116.926941,77.524704000000099],[-116.92054699999994,77.528594999999996],[-116.900284,77.532211000000018],[-116.875,77.534988000000112],[-116.83306900000002,77.533600000000035],[-116.75418100000002,77.534424000000001],[-116.64750699999996,77.537766000000147],[-116.58583099999998,77.540543000000014],[-116.53611799999993,77.544434000000081],[-116.48777799999999,77.550262000000032],[-116.35109699999998,77.539154000000053]],[[-85.285278000000005,77.587494000000049],[-85.259734999999978,77.586655000000121],[-85.235274999999945,77.586655000000121],[-85.107223999999974,77.581099999999992],[-85.011123999999938,77.57388300000008],[-84.995270000000005,77.569443000000092],[-84.822509999999966,77.505264000000125],[-84.813889000000017,77.497208000000057],[-84.824447999999961,77.491927999999973],[-84.843062999999916,77.487198000000149],[-84.934433000000013,77.470260999999937],[-84.960830999999985,77.466385000000059],[-85.027221999999995,77.459717000000069],[-85.095551,77.454437000000041],[-85.126937999999939,77.453048999999908],[-85.153609999999958,77.454437000000041],[-85.168335000000013,77.456939999999975],[-85.178604000000007,77.464157000000114],[-85.172500999999897,77.473601999999971],[-85.159164000000033,77.48414600000001],[-85.144729999999925,77.489426000000094],[-85.138610999999969,77.494980000000112],[-85.140839000000028,77.501663000000065],[-85.152785999999992,77.507767000000115],[-85.170273000000009,77.511658000000011],[-85.248885999999914,77.527481000000023],[-85.270843999999954,77.529984000000013],[-85.319732999999928,77.532211000000018],[-85.344161999999983,77.532211000000018],[-85.39916999999997,77.53387500000008],[-85.538329999999974,77.539978000000019],[-85.535552999999936,77.543869000000086],[-85.352218999999934,77.582764000000054],[-85.31138599999997,77.586655000000121],[-85.285278000000005,77.587494000000049]],[[-90.603058000000033,77.628311000000053],[-90.521118000000001,77.626083000000108],[-90.492492999999968,77.626083000000108],[-90.438598999999954,77.630538999999999],[-90.414443999999946,77.631087999999977],[-90.388061999999877,77.629425000000026],[-90.339172000000019,77.623871000000065],[-90.242492999999854,77.612488000000042],[-90.219161999999983,77.608871000000079],[-90.208892999999932,77.603042999999957],[-90.210007000000019,77.597488000000055],[-90.206664999999987,77.59165999999999],[-90.196654999999964,77.587204000000042],[-90.177779999999927,77.58248900000001],[-90.059722999999963,77.566375999999991],[-89.937209999999993,77.53276100000005],[-89.91722099999987,77.527205999999978],[-89.841109999999958,77.504166000000055],[-89.806655999999919,77.492477000000122],[-89.753615999999965,77.473038000000031],[-89.719161999999983,77.458328000000108],[-89.636123999999995,77.339157000000057],[-89.640288999999996,77.333328000000051],[-89.67471299999994,77.310256999999979],[-89.70777899999996,77.294144000000131],[-89.849730999999963,77.25],[-89.882767000000001,77.239975000000072],[-89.919998000000021,77.230270000000019],[-90,77.213814000000013],[-90.009170999999981,77.211928999999998],[-90.088897999999915,77.199707000000046],[-90.118057000000022,77.198593000000074],[-90.129165999999998,77.200546000000031],[-90.259170999999924,77.201096000000064],[-90.366942999999992,77.197754000000089],[-90.416655999999989,77.213042999999971],[-90.683318999999926,77.271927000000062],[-90.704726999999934,77.276382000000069],[-90.727218999999934,77.279984000000013],[-90.843063000000029,77.292754999999943],[-90.90972899999997,77.303040000000067],[-90.946655000000021,77.309418000000051],[-91.146666999999923,77.362198000000092],[-91.18249499999996,77.386932000000058],[-91.187209999999993,77.390273999999977],[-91.208892999999932,77.414993000000095],[-91.206954999999994,77.568604000000107],[-91.184433000000013,77.608597000000145],[-91.173614999999927,77.613036999999963],[-91.15834000000001,77.617203000000075],[-91.10943599999996,77.624985000000038],[-90.906386999999938,77.653046000000131],[-90.880828999999949,77.654434000000037],[-90.826400999999976,77.654434000000037],[-90.801666000000012,77.651657000000114],[-90.727492999999981,77.642212000000029],[-90.683608999999933,77.633331000000112],[-90.603058000000033,77.628311000000053]],[[-105.01027699999986,77.408034999999927],[-104.98665599999998,77.404434000000094],[-104.96193700000003,77.404434000000094],[-104.90805099999994,77.406937000000028],[-104.82584400000002,77.413605000000018],[-104.77166699999998,77.416656000000046],[-104.74109599999997,77.414428999999984],[-104.73277300000001,77.411377000000073],[-104.53832999999997,77.338318000000072],[-104.48889199999996,77.318603999999993],[-104.39555399999995,77.276382000000069],[-104.38834400000002,77.271378000000141],[-104.38137799999998,77.264435000000105],[-104.37998999999996,77.261931999999945],[-104.36554699999999,77.230270000000019],[-104.36749299999997,77.224425999999994],[-104.40499899999992,77.172485000000108],[-104.416946,77.161926000000051],[-104.43804899999998,77.150543000000027],[-104.47250400000001,77.13749700000011],[-104.5,77.133040999999992],[-104.52250699999996,77.130539000000113],[-104.74027999999993,77.108597000000088],[-104.79028299999999,77.108871000000022],[-104.83249699999993,77.113312000000121],[-104.85333300000002,77.117477000000122],[-104.86916400000001,77.123596000000134],[-104.883331,77.135543999999982],[-104.89250199999992,77.141936999999928],[-104.906387,77.147491000000116],[-104.92250099999995,77.152481000000023],[-104.945267,77.157211000000018],[-104.993607,77.164992999999981],[-105.04444899999993,77.171371000000136],[-105.09583999999995,77.176085999999998],[-105.11971999999997,77.176650999999993],[-105.13751200000002,77.176085999999998],[-105.15167200000002,77.171371000000136],[-105.24694799999997,77.193863000000022],[-105.40888999999999,77.281661999999983],[-105.41722099999998,77.284714000000065],[-105.45527599999997,77.291930999999977],[-105.48111,77.294983000000116],[-105.50666799999993,77.299149],[-105.531677,77.30525200000011],[-105.55027799999999,77.311645999999996],[-105.57195300000001,77.323317999999915],[-105.67916899999994,77.447479000000044],[-105.691101,77.497208000000057],[-105.83444199999997,77.610260000000096],[-105.85833700000001,77.626923000000147],[-105.878601,77.639709000000096],[-105.88890100000003,77.645263999999997],[-105.93083200000001,77.663040000000137],[-105.94776899999994,77.668868999999972],[-105.98000299999995,77.679427999999973],[-106.01471700000002,77.688583000000051],[-106.08361799999989,77.71026599999999],[-106.09166699999997,77.71527100000003],[-106.09472700000003,77.724151999999947],[-106.08917199999996,77.72886699999998],[-106.07945299999989,77.732758000000047],[-106.04055800000003,77.744980000000055],[-106.01222200000001,77.750549000000035],[-105.94167299999987,77.759720000000016],[-105.91388699999999,77.762497000000053],[-105.70056199999999,77.753600999999946],[-105.64890299999996,77.748596000000077],[-105.55248999999998,77.729430999999977],[-105.50666799999993,77.719711000000075],[-105.47028399999999,77.709152000000017],[-105.38971699999996,77.683868000000018],[-105.17360699999995,77.612198000000035],[-105.15695199999999,77.606093999999985],[-105.03971899999999,77.552199999999971],[-105.02778599999994,77.546371000000136],[-104.968613,77.514435000000049],[-104.95916699999998,77.508041000000048],[-104.94888300000002,77.496094000000085],[-104.94499199999996,77.484984999999995],[-104.946663,77.479155999999989],[-104.95249899999999,77.474425999999937],[-104.96749899999998,77.468872000000147],[-105.01027699999986,77.458603000000096],[-105.01194800000002,77.45277400000009],[-105.01806599999986,77.411925999999994],[-105.01027699999986,77.408034999999927]],[[-95.405838000000017,77.763885000000016],[-95.408889999999928,77.75221300000004],[-95.406113000000005,77.746094000000028],[-95.389724999999942,77.739426000000037],[-95.363892000000021,77.737198000000092],[-95.343886999999995,77.738037000000077],[-95.118606999999997,77.74971000000005],[-95.087783999999942,77.75221300000004],[-95.059433000000013,77.756653000000085],[-95.029174999999952,77.767211999999915],[-95.010833999999988,77.777771000000143],[-94.981673999999998,77.780823000000055],[-94.951674999999966,77.782486000000006],[-94.752228000000002,77.788589000000115],[-94.728881999999942,77.788315000000011],[-94.623321999999973,77.783599999999979],[-94.572783999999899,77.780548000000067],[-94.542220999999927,77.773880000000077],[-94.521118000000001,77.767761000000064],[-94.477492999999924,77.764708999999982],[-94.448607999999979,77.765273999999977],[-94.356658999999866,77.767487000000131],[-94.252501999999936,77.772216999999955],[-94.089995999999928,77.765823000000125],[-94.030288999999982,77.760543999999982],[-93.951110999999969,77.735535000000141],[-93.935821999999973,77.732483000000059],[-93.931380999999988,77.732483000000059],[-93.826675000000023,77.739426000000037],[-93.820007000000032,77.744980000000055],[-93.817779999999971,77.75082400000008],[-93.806655999999919,77.756378000000041],[-93.786666999999966,77.761108000000092],[-93.68638599999997,77.773880000000077],[-93.65695199999999,77.776657],[-93.629439999999931,77.77609300000006],[-93.546111999999994,77.770827999999995],[-93.241669000000002,77.733871000000136],[-93.233886999999868,77.732483000000059],[-93.17471299999994,77.704163000000051],[-93.101944000000003,77.662490999999989],[-93.106658999999922,77.660263000000043],[-93.14834599999989,77.645538000000101],[-93.164169000000015,77.64027400000009],[-93.196380999999974,77.637206999999989],[-93.222504000000015,77.638596000000007],[-93.249161000000015,77.641663000000108],[-93.277221999999938,77.643599999999935],[-93.303054999999972,77.643599999999935],[-93.35943599999996,77.635818000000029],[-93.379439999999988,77.630814000000044],[-93.390288999999939,77.625533999999959],[-93.397232000000031,77.619979999999998],[-93.486388999999974,77.54553199999998],[-93.502501999999993,77.503052000000082],[-93.477782999999988,77.492477000000122],[-93.474715999999944,77.487487999999985],[-93.474166999999909,77.476379000000065],[-93.475280999999995,77.47137499999991],[-93.480834999999956,77.466660000000104],[-93.537780999999995,77.445816000000093],[-93.553054999999915,77.440811000000053],[-93.570556999999951,77.437759000000142],[-93.906661999999983,77.433319000000097],[-93.933884000000035,77.433593999999971],[-94.25167799999997,77.455261000000007],[-94.319457999999997,77.468597000000102],[-94.345001000000025,77.472487999999998],[-94.468886999999995,77.476929000000098],[-94.801101999999901,77.480270000000132],[-95.032226999999978,77.469986000000119],[-95.123610999999983,77.463882000000069],[-95.204453000000001,77.460814999999968],[-95.252791999999943,77.460814999999968],[-95.294998000000021,77.466385000000059],[-95.346389999999985,77.469986000000119],[-95.477492999999981,77.473877000000016],[-95.532776000000013,77.473601999999971],[-95.726105000000018,77.470260999999937],[-95.823623999999938,77.466385000000059],[-95.838897999999858,77.462493999999992],[-95.864166000000012,77.462203999999986],[-95.889450000000011,77.464432000000102],[-96,77.479980000000126],[-96.061385999999857,77.491652999999985],[-96.083327999999995,77.497756999999979],[-96.099730999999963,77.504439999999988],[-96.259170999999981,77.571929999999952],[-96.318343999999968,77.598877000000073],[-96.328888000000006,77.604980000000012],[-96.255568999999923,77.689697000000024],[-96.241104000000007,77.694977000000108],[-96.194442999999978,77.704987000000017],[-96.077224999999942,77.726929000000041],[-95.934433000000013,77.753052000000025],[-95.918059999999969,77.755554000000075],[-95.897231999999974,77.757492000000013],[-95.869445999999925,77.757217000000026],[-95.848052999999993,77.755264000000068],[-95.742767000000015,77.762207000000046],[-95.630553999999961,77.771102999999982],[-95.583892999999932,77.779709000000082],[-95.570007000000032,77.784149000000127],[-95.566101000000003,77.78776600000009],[-95.565552000000025,77.792755000000056],[-95.552779999999927,77.796097000000145],[-95.528884999999946,77.801086000000112],[-95.49610899999999,77.805542000000059],[-95.465285999999935,77.80802900000009],[-95.427779999999984,77.803314000000057],[-95.418335000000013,77.798874000000069],[-95.410827999999981,77.792480000000012],[-95.40695199999999,77.787201000000039],[-95.404449,77.776381999999955],[-95.405838000000017,77.763885000000016]],[[-77.851944000000003,77.774429000000055],[-77.875274999999874,77.774429000000055],[-77.888061999999877,77.781372000000033],[-77.930556999999965,77.808868000000075],[-77.955001999999922,77.830276000000026],[-77.952224999999999,77.833054000000004],[-77.936385999999914,77.839157000000114],[-77.906386999999995,77.844437000000028],[-77.880279999999914,77.848038000000031],[-77.821121000000005,77.854431000000034],[-77.717772999999966,77.863037000000134],[-77.676102000000014,77.864700000000028],[-77.622771999999941,77.862762000000089],[-77.596389999999985,77.860808999999961],[-77.582779000000016,77.858032000000094],[-77.575286999999946,77.854980000000126],[-77.568619000000012,77.849716000000001],[-77.575561999999991,77.823608000000036],[-77.579178000000013,77.81860400000005],[-77.592772999999909,77.813309000000004],[-77.628052000000025,77.804153000000042],[-77.658889999999985,77.79693600000013],[-77.680557000000022,77.792755000000056],[-77.851944000000003,77.774429000000055]],[[-101.71140300000002,77.901657000000057],[-101.671944,77.893326000000002],[-101.62082699999996,77.884430000000066],[-101.52443700000003,77.869980000000112],[-101.450287,77.861098999999967],[-101.36833200000001,77.853867000000093],[-101.26555599999995,77.842758000000003],[-101.23777799999993,77.838882000000126],[-101.19138299999997,77.830826000000059],[-101.16139199999992,77.822769000000051],[-100.96056399999992,77.759155000000135],[-100.92639200000002,77.743317000000104],[-100.92555199999998,77.737198000000092],[-100.92887899999999,77.731369000000086],[-100.94055200000003,77.726929000000041],[-100.96472199999994,77.72554000000008],[-101.096947,77.719436999999914],[-101.21694899999994,77.721924000000001],[-101.26777599999997,77.725815000000068],[-101.31806899999992,77.726089000000002],[-101.50695799999994,77.724991000000102],[-101.53527799999995,77.723602000000142],[-101.56471299999993,77.720535000000041],[-101.58583099999993,77.71527100000003],[-101.593613,77.709427000000005],[-101.60582699999992,77.703873000000044],[-101.62249799999995,77.69859300000013],[-101.65222199999994,77.694427000000076],[-101.79888900000003,77.676376000000062],[-101.82640099999992,77.676086000000055],[-102.01695299999994,77.679703000000018],[-102.06777999999997,77.682205000000067],[-102.1416779999999,77.690810999999997],[-102.43639399999995,77.729705999999965],[-102.44444299999998,77.731934000000081],[-102.51083399999999,77.786102000000085],[-102.52971600000001,77.834152000000074],[-102.51806599999992,77.844146999999964],[-102.49889400000001,77.855545000000006],[-102.45889299999999,77.871094000000085],[-102.44249000000002,77.876648000000102],[-102.41665599999999,77.881927000000076],[-102.38778699999995,77.884155000000021],[-102.13999899999999,77.896378000000084],[-102.08389299999999,77.897217000000069],[-102.04915599999998,77.896942000000024],[-101.91583299999996,77.893875000000094],[-101.83194699999996,77.893875000000094],[-101.779449,77.896378000000084],[-101.74973299999999,77.899719000000118],[-101.71140300000002,77.901657000000057]],[[-114.07305899999994,77.981659000000036],[-113.9813769999999,77.934982000000105],[-113.97501399999993,77.931091000000038],[-113.97222899999997,77.925262000000032],[-113.97222899999997,77.919983000000059],[-113.9583439999999,77.914993000000038],[-113.92388900000003,77.910812000000135],[-113.89499699999993,77.908325000000048],[-113.84028599999999,77.906097000000102],[-113.72666899999996,77.896103000000039],[-113.70639,77.891663000000051],[-113.58556399999998,77.825820999999962],[-113.57861300000002,77.819991999999957],[-113.57611099999997,77.814147999999989],[-113.58750899999995,77.80802900000009],[-113.61916399999996,77.795821999999987],[-113.65972899999997,77.783324999999991],[-113.78832999999992,77.745255000000043],[-113.90833999999995,77.726379000000009],[-113.93472300000002,77.72387700000013],[-114.11444099999989,77.706649999999911],[-114.19304699999998,77.69802900000002],[-114.22305299999999,77.698868000000004],[-114.27722199999999,77.702209000000039],[-114.33112299999999,77.709717000000012],[-114.415009,77.731369000000086],[-114.514183,77.765273999999977],[-114.66251399999999,77.803863999999919],[-114.70916699999998,77.813599000000011],[-114.73029300000002,77.818877999999984],[-114.84834299999994,77.854706000000022],[-115.07721699999996,77.938582999999994],[-115.11138900000003,77.953872999999987],[-115.11501299999992,77.956375000000037],[-115.11609599999991,77.958327999999995],[-115.10833700000001,77.961380000000077],[-115.09084300000001,77.963608000000079],[-115.06054699999993,77.963882000000012],[-115.03388999999993,77.962204000000042],[-114.93028299999997,77.960541000000148],[-114.81973299999993,77.973037999999917],[-114.79778299999992,77.975540000000024],[-114.77749599999993,77.981659000000036],[-114.74027999999998,78.000000000000057],[-114.60582699999998,78.03054800000001],[-114.40083299999998,78.067490000000021],[-114.35500300000001,78.070541000000048],[-114.32694999999995,78.0711060000001],[-114.30332899999996,78.070541000000048],[-114.28694200000001,78.066086000000041],[-114.07305899999994,77.981659000000036]],[[-109.58805799999999,78.064697000000024],[-109.58056599999998,78.058319000000097],[-109.58112299999988,78.041367000000093],[-109.58528100000001,78.035538000000088],[-109.66972399999997,77.971649000000127],[-109.68305999999995,77.965820000000122],[-109.70556599999986,77.959991000000116],[-109.76027699999997,77.951096000000064],[-109.81527699999992,77.942749000000106],[-109.84249899999998,77.938873000000001],[-109.89750699999996,77.932755000000043],[-110.00723299999987,77.921371000000136],[-110.14499699999999,77.911926000000108],[-110.162781,77.906936999999971],[-110.16665599999999,77.901093000000117],[-110.19611399999991,77.896652000000017],[-110.22112299999998,77.893875000000094],[-110.24889399999995,77.893875000000094],[-110.48999000000003,77.883881000000088],[-110.62666300000001,77.873032000000023],[-110.65416700000003,77.871918000000051],[-110.79250299999995,77.870819000000097],[-110.846947,77.866379000000052],[-110.87389400000001,77.862198000000149],[-110.89584400000001,77.856093999999928],[-110.90139799999992,77.849716000000001],[-110.90471600000001,77.843872000000147],[-110.90360999999996,77.838042999999971],[-110.90028399999994,77.832763999999997],[-110.89444699999996,77.826934999999992],[-110.88639799999987,77.820831000000112],[-110.74388099999993,77.773605000000089],[-110.71556099999992,77.768875000000037],[-110.65888999999999,77.759720000000016],[-110.63110399999994,77.758040999999992],[-110.60138699999999,77.758881000000031],[-110.51972999999992,77.763321000000019],[-110.41583299999996,77.770827999999995],[-110.39306599999986,77.773041000000148],[-110.368607,77.776381999999955],[-110.28916899999996,77.782486000000006],[-110.16111799999999,77.784149000000127],[-110.13305700000001,77.780548000000067],[-110.10500299999995,77.774994000000049],[-110.09028599999994,77.769150000000081],[-110.08029199999993,77.763321000000019],[-110.04055800000003,77.637496999999996],[-110.08029199999993,77.563599000000067],[-110.08416699999992,77.557755000000043],[-110.09221599999995,77.551926000000037],[-110.11749299999997,77.539978000000019],[-110.20333899999997,77.511383000000137],[-110.22501399999987,77.505264000000125],[-110.27055399999995,77.49581900000004],[-110.29695100000004,77.491652999999985],[-110.502228,77.460266000000047],[-110.81500199999999,77.424988000000042],[-110.82749899999999,77.419144000000017],[-110.85082999999992,77.414428999999984],[-110.87721299999998,77.411377000000073],[-110.95639,77.407486000000006],[-111.00974299999996,77.406096999999988],[-111.06527699999998,77.406096999999988],[-111.11721799999992,77.408874999999966],[-111.172234,77.416092000000106],[-111.29998799999993,77.419144000000017],[-111.46305799999999,77.393051000000071],[-111.61833200000001,77.373871000000122],[-111.82501199999996,77.34887700000013],[-112.031113,77.324707000000103],[-112.05722000000003,77.323317999999915],[-112.083618,77.323043999999982],[-112.13694800000002,77.323317999999915],[-112.16639700000002,77.325271999999984],[-112.41306299999997,77.356094000000041],[-112.43888900000002,77.361099000000081],[-112.48222399999992,77.371094000000028],[-112.5,77.378235000000018],[-112.50778200000002,77.381363000000022],[-112.52139299999999,77.389434999999992],[-112.52333099999993,77.395263999999997],[-112.52694700000001,77.399719000000061],[-112.545547,77.415817000000061],[-112.587784,77.449141999999938],[-112.60109699999992,77.455261000000007],[-112.626938,77.459427000000062],[-112.65387699999997,77.458878000000141],[-112.68222000000003,77.456939999999975],[-112.69721999999996,77.455261000000007],[-112.73889200000002,77.445816000000093],[-112.764183,77.441650000000038],[-112.79083300000002,77.441086000000098],[-112.80249000000003,77.442474000000004],[-112.92887899999994,77.464157000000114],[-112.95777899999996,77.469436999999971],[-112.96389799999992,77.474152000000004],[-112.96806299999992,77.485809000000131],[-112.96806299999992,77.492203000000018],[-112.97028399999999,77.498032000000023],[-112.978882,77.503326000000015],[-112.99445300000002,77.508881000000088],[-113.01167299999997,77.512771999999984],[-113.03751399999999,77.515823000000012],[-113.06500199999999,77.517211999999972],[-113.14611799999994,77.517761000000121],[-113.17388900000003,77.519440000000145],[-113.198036,77.523880000000133],[-113.20472699999999,77.529433999999981],[-113.23805199999998,77.581375000000037],[-113.24027999999993,77.587204000000042],[-113.16251399999993,77.609146000000123],[-113.1875,77.739426000000037],[-113.20556599999998,77.744431000000077],[-113.26251200000002,77.755554000000075],[-113.283073,77.761108000000092],[-113.29444899999999,77.766662999999994],[-113.30387899999994,77.773041000000148],[-113.31054699999993,77.778595000000109],[-113.31500199999994,77.783875000000023],[-113.31973299999999,77.795531999999923],[-113.31973299999999,77.807204999999954],[-113.31749699999995,77.813033999999959],[-113.30638099999993,77.837203999999986],[-113.23473399999989,77.901657000000057],[-113.23082699999992,77.903594999999996],[-113.20973200000003,77.90887500000008],[-113.12721299999998,77.912201000000096],[-113.09973100000002,77.912766000000147],[-113.07167099999998,77.912201000000096],[-113.04666099999997,77.907761000000107],[-113.03971899999999,77.901932000000102],[-112.94360399999999,77.911926000000108],[-112.80499299999985,77.933043999999995],[-112.78333299999997,77.937195000000088],[-112.76666299999999,77.942474000000061],[-112.74194299999988,77.951660000000004],[-112.57444799999996,77.979431000000091],[-112.46694899999994,77.992477000000008],[-112.29499800000002,78.010544000000095],[-112.12526699999995,78.00610400000005],[-111.97944599999994,78.018599999999992],[-111.787216,78.033599999999922],[-111.77610800000002,78.028046000000131],[-111.756393,78.024428999999998],[-111.73055999999997,78.024155000000064],[-111.70556599999998,78.026931999999988],[-111.63221699999991,78.040817000000061],[-111.34583999999995,78.076935000000105],[-111.31833599999999,78.08027600000014],[-111.28832999999997,78.081940000000145],[-111.09333800000002,78.092484000000013],[-111.048607,78.093597000000102],[-111.02749599999999,78.093322999999998],[-110.99861099999993,78.090546000000074],[-110.99749799999995,78.084717000000069],[-111.00110599999994,78.079987000000017],[-110.995003,78.074158000000011],[-110.90334300000001,78.062194999999974],[-110.861107,78.061645999999996],[-110.83306899999997,78.06303400000013],[-110.80555700000002,78.065262000000075],[-110.78778099999994,78.0711060000001],[-110.77500899999995,78.076935000000105],[-110.77139299999999,78.082764000000111],[-110.76334399999996,78.088882000000069],[-110.74553700000001,78.094711000000075],[-110.72721899999988,78.097762999999986],[-110.67051700000002,78.101089000000002],[-110.54998799999998,78.106094000000098],[-110.46584299999995,78.108597000000032],[-110.23777799999999,78.110809000000131],[-110.10082999999992,78.108597000000032],[-109.95916699999987,78.104705999999965],[-109.78916899999996,78.099716000000114],[-109.67777999999998,78.091933999999981],[-109.65387699999985,78.088318000000129],[-109.60527000000002,78.0711060000001],[-109.58805799999999,78.064697000000024]],[[-101.65139799999997,78.144714000000022],[-101.67527799999999,78.144440000000088],[-101.859444,78.15525800000006],[-101.87917299999992,78.158324999999991],[-101.88194299999998,78.162201000000039],[-101.77610800000002,78.216385000000116],[-101.75334199999992,78.227203000000088],[-101.73137700000001,78.232483000000116],[-101.70722999999987,78.23275799999999],[-101.68472299999996,78.230545000000006],[-101.68167099999994,78.227478000000076],[-101.67250100000001,78.226089000000115],[-101.63362100000001,78.210815000000025],[-101.62277199999988,78.204712000000086],[-101.61582899999996,78.199416999999983],[-101.60360700000001,78.187485000000038],[-101.59999099999993,78.181090999999981],[-101.59861799999993,78.175261999999975],[-101.59973100000002,78.164429000000041],[-101.60527000000002,78.159149000000127],[-101.61305199999998,78.153594999999939],[-101.62581599999993,78.148041000000148],[-101.65139799999997,78.144714000000022]],[[-103.05695300000002,78.119705000000067],[-103.11444099999994,78.11775200000011],[-103.19444299999992,78.11914100000007],[-103.212784,78.120529000000033],[-103.23029300000002,78.123871000000122],[-103.25862099999995,78.134995000000004],[-103.27027900000002,78.141097999999943],[-103.27722199999999,78.146941999999967],[-103.28222700000003,78.15776100000005],[-103.27971600000001,78.163605000000075],[-103.274719,78.169983000000002],[-103.26750199999998,78.17553700000002],[-103.23916600000001,78.192200000000071],[-103.22721899999993,78.197754000000089],[-103.17027300000001,78.219985999999949],[-103.12470999999999,78.236649000000057],[-103.06276700000001,78.258041000000048],[-103.04138199999994,78.263610999999969],[-102.98693800000001,78.27276599999999],[-102.93415800000002,78.27276599999999],[-102.89750700000002,78.269149999999968],[-102.82556199999993,78.258881000000088],[-102.8125,78.255829000000006],[-102.79860699999995,78.250274999999988],[-102.78916899999996,78.24443100000002],[-102.78222700000003,78.238586000000055],[-102.78028899999993,78.23275799999999],[-102.77639799999986,78.215546000000131],[-102.77639799999986,78.210266000000047],[-102.781387,78.204987000000074],[-102.79332699999998,78.199416999999983],[-102.85527000000002,78.188872999999944],[-102.89806399999992,78.17804000000001],[-102.93195300000002,78.166931000000091],[-102.97721899999999,78.150269000000094],[-103.01777599999997,78.133606000000043],[-103.04167199999995,78.122208000000001],[-103.05695300000002,78.119705000000067]],[[-94.366652999999985,78.159149000000127],[-94.378051999999968,78.15776100000005],[-94.404448999999943,78.159988000000112],[-94.506118999999956,78.172760000000096],[-94.520003999999858,78.177475000000129],[-94.67111199999988,78.240814000000057],[-94.683060000000012,78.247208000000057],[-94.694152999999915,78.2586060000001],[-94.692215000000033,78.264709000000039],[-94.681106999999884,78.274155000000007],[-94.660827999999924,78.279160000000047],[-94.635558999999944,78.28387500000008],[-94.602218999999991,78.287200999999925],[-94.572234999999921,78.287766000000147],[-94.546386999999982,78.284424000000058],[-94.515014999999892,78.278046000000074],[-94.481948999999929,78.268326000000002],[-94.36111499999987,78.22164900000007],[-94.344726999999978,78.214706000000092],[-94.316665999999998,78.197479000000044],[-94.309433000000013,78.191086000000098],[-94.306945999999925,78.184982000000048],[-94.309157999999968,78.179153000000042],[-94.366652999999985,78.159149000000127]],[[-88.287215999999944,78.24331699999999],[-88.360001000000011,78.237761999999918],[-88.381942999999978,78.242476999999951],[-88.393616000000009,78.248871000000008],[-88.404723999999987,78.25999500000006],[-88.407500999999911,78.264435000000105],[-88.411117999999931,78.273879999999963],[-88.40972899999997,78.292205999999965],[-88.404449,78.298035000000027],[-88.235274999999888,78.42692599999998],[-88.113051999999982,78.45526099999995],[-88.09445199999999,78.456940000000145],[-88.070281999999963,78.454712000000029],[-88.061385999999914,78.452484000000084],[-88.052779999999927,78.445526000000086],[-88.049728000000016,78.444427000000076],[-88.043334999999956,78.436646000000053],[-88.044448999999929,78.42442299999999],[-88.044997999999964,78.421371000000079],[-88.046660999999972,78.418868999999972],[-88.057220000000029,78.407485999999949],[-88.166396999999961,78.308029000000033],[-88.187774999999988,78.291655999999932],[-88.245543999999995,78.252777000000094],[-88.255004999999983,78.247208000000057],[-88.287215999999944,78.24331699999999]],[[-109.64806399999992,78.588042999999971],[-109.569458,78.586380000000077],[-109.54998799999998,78.586655000000064],[-109.50055700000001,78.582763999999997],[-109.40527299999997,78.556931000000077],[-109.33416699999998,78.524155000000121],[-109.26055899999994,78.487198000000092],[-109.25556899999998,78.482483000000059],[-109.254997,78.478591999999992],[-109.26055899999994,78.455826000000002],[-109.31806899999992,78.35803199999998],[-109.32721700000002,78.352203000000145],[-109.40499899999992,78.306366000000082],[-109.42859599999997,78.303314],[-109.59583999999995,78.302765000000022],[-109.766953,78.294144000000131],[-109.82444799999996,78.293869000000086],[-109.85333300000002,78.29664600000001],[-109.882767,78.301376000000062],[-109.89306599999998,78.307205000000067],[-109.89835399999998,78.3119200000001],[-109.90862299999998,78.317764000000068],[-109.92610200000001,78.323043999999982],[-109.95527599999997,78.325821000000076],[-109.98388699999998,78.325546000000031],[-110.01251200000002,78.323608000000092],[-110.19638099999997,78.303864000000033],[-110.22444199999995,78.299987999999928],[-110.25250199999999,78.295822000000044],[-110.279449,78.284987999999998],[-110.29778299999992,78.281097000000102],[-110.354446,78.276657000000057],[-110.4119419999999,78.277206000000035],[-110.484734,78.284424000000058],[-110.57167099999992,78.289703000000031],[-110.65833999999995,78.29304500000012],[-110.71556099999992,78.292480000000126],[-110.78778099999994,78.306931000000134],[-110.85665899999987,78.327208999999982],[-110.85888699999998,78.337769000000094],[-110.97501399999999,78.363876000000005],[-111.00250199999999,78.368042000000059],[-111.14138799999995,78.386108000000036],[-111.16999799999996,78.384155000000078],[-111.27778599999994,78.372207999999944],[-111.27139299999999,78.346100000000035],[-111.30610699999994,78.321106000000043],[-111.41000400000001,78.277206000000035],[-111.42304999999993,78.272217000000069],[-111.43888899999996,78.268600000000106],[-111.46250899999995,78.267487000000017],[-111.50527999999997,78.266936999999984],[-111.57556199999999,78.270538000000045],[-111.65249599999993,78.27276599999999],[-111.73832700000003,78.27276599999999],[-111.76666299999994,78.271378000000084],[-111.79527299999995,78.271103000000096],[-111.82000700000003,78.273604999999975],[-111.86472300000003,78.296370999999965],[-111.88221699999997,78.306931000000134],[-111.88861099999997,78.312485000000095],[-111.89277599999997,78.318054000000132],[-111.89167800000001,78.322220000000016],[-111.91861,78.332764000000054],[-111.939438,78.338318000000072],[-112.13305700000001,78.36554000000001],[-112.21501199999994,78.365265000000136],[-112.43776700000001,78.354431000000091],[-112.58306899999997,78.343597000000045],[-112.68443299999996,78.331375000000037],[-112.73916599999995,78.323043999999982],[-112.78721599999989,78.310531999999967],[-112.89083900000003,78.292480000000126],[-112.94499199999996,78.28387500000008],[-113.02694700000001,78.27276599999999],[-113.05499299999997,78.271378000000084],[-113.14222699999999,78.268326000000002],[-113.16860999999994,78.268600000000106],[-113.18831599999999,78.269989000000123],[-113.21777299999985,78.27777100000003],[-113.27333099999998,78.296370999999965],[-113.28195199999999,78.299713000000111],[-113.287781,78.302475000000015],[-113.33249699999993,78.328872999999987],[-113.33416699999998,78.332764000000054],[-113.21611000000001,78.385269000000108],[-113.1241609999999,78.420822000000101],[-113.11527999999987,78.423035000000084],[-113.03832999999997,78.436919999999986],[-112.71167000000003,78.484711000000061],[-112.60749800000002,78.4994200000001],[-112.36305199999998,78.533324999999991],[-112.31166100000002,78.539977999999962],[-112.23805199999998,78.547211000000004],[-112.12970699999994,78.551926000000037],[-111.98805199999987,78.552764999999965],[-111.90360999999996,78.548874000000069],[-111.87304699999999,78.544434000000081],[-111.85305800000003,78.542755000000056],[-111.80972299999991,78.545258000000047],[-111.75250199999994,78.55053700000002],[-111.67777999999993,78.563034000000016],[-111.641953,78.574158000000068],[-111.60082999999997,78.585266000000104],[-111.57224299999996,78.588593000000003],[-111.45556599999998,78.592758000000003],[-111.39195299999994,78.61192299999999],[-111.378601,78.617751999999996],[-111.37998999999991,78.622757000000036],[-111.36305199999998,78.64276099999995],[-111.16055299999999,78.691649999999925],[-110.95612299999993,78.718323000000112],[-110.79110700000001,78.735259999999926],[-110.6375119999999,78.748596000000077],[-110.46028100000001,78.757492000000013],[-110.43055700000002,78.758605999999986],[-110.41055299999999,78.757767000000001],[-110.39527900000002,78.756104000000107],[-110.38445299999989,78.751389000000074],[-110.271118,78.727768000000026],[-110.16416900000002,78.70915199999996],[-110.07778899999988,78.694977000000051],[-109.99722300000002,78.683868000000018],[-109.86165599999998,78.666930999999977],[-109.85582699999998,78.660262999999986],[-109.86000100000001,78.654433999999981],[-109.86165599999998,78.649155000000007],[-109.86110699999995,78.643326000000002],[-109.85526999999996,78.637496999999996],[-109.67054699999989,78.591370000000097],[-109.64806399999992,78.588042999999971]],[[-74.306945999999982,78.676651000000049],[-74.334166999999923,78.675262000000089],[-74.36721799999998,78.676086000000055],[-74.419448999999986,78.681655999999919],[-74.614166000000012,78.702774000000034],[-74.704726999999934,78.722762999999929],[-74.710007000000019,78.727477999999962],[-74.710281000000009,78.731094000000041],[-74.706664999999987,78.737488000000099],[-74.645003999999972,78.772491000000059],[-74.632216999999969,78.777206000000092],[-74.615829000000019,78.778595000000109],[-74.591109999999958,78.778870000000097],[-74.555557000000022,78.776093000000003],[-74.356948999999929,78.755829000000062],[-74.312042000000019,78.750000000000057],[-74.28195199999999,78.746094000000028],[-74.192489999999964,78.729705999999965],[-74.167770000000019,78.719986000000063],[-74.163619999999923,78.716094999999996],[-74.172774999999888,78.711380000000133],[-74.236388999999974,78.687194999999917],[-74.256667999999934,78.6827550000001],[-74.28443900000002,78.678864000000033],[-74.306945999999982,78.676651000000049]],[[-96.768065999999976,78.684143000000006],[-96.708892999999989,78.6827550000001],[-96.645003999999972,78.686096000000134],[-96.613051999999982,78.685532000000023],[-96.585007000000019,78.68331900000004],[-96.533614999999941,78.676926000000094],[-96.510559000000001,78.672484999999995],[-96.466399999999965,78.661926000000108],[-96.395279000000016,78.640549000000078],[-96.379165999999998,78.634430000000066],[-96.356109999999944,78.627762000000075],[-96.315826000000015,78.618042000000003],[-96.293883999999935,78.615265000000079],[-96.265015000000005,78.618866000000139],[-96.235549999999989,78.627762000000075],[-96.202498999999875,78.630264000000011],[-96.184432999999956,78.628586000000041],[-96.167495999999971,78.623306000000014],[-96.158889999999872,78.617203000000075],[-96.152495999999985,78.611374000000012],[-96.216400000000021,78.560531999999967],[-96.178054999999915,78.518875000000094],[-96.009445000000028,78.492477000000122],[-95.857773000000009,78.494980000000055],[-95.820006999999919,78.502213000000097],[-95.746658000000025,78.514998999999989],[-95.71665999999999,78.519714000000022],[-95.68472300000002,78.521103000000039],[-95.652221999999995,78.521378000000027],[-95.601944000000003,78.519714000000022],[-95.537215999999944,78.514708999999982],[-95.481673999999998,78.508881000000031],[-95.407775999999956,78.497208000000057],[-95.206389999999942,78.461655000000007],[-95.086944999999957,78.437759000000085],[-94.895003999999972,78.395828000000108],[-94.877776999999924,78.391373000000101],[-94.86082499999992,78.384720000000129],[-94.831679999999949,78.364699999999971],[-94.829177999999956,78.358871000000136],[-94.830840999999907,78.352767999999969],[-94.837508999999955,78.347214000000008],[-94.853332999999907,78.341934000000094],[-94.941939999999988,78.316375999999991],[-94.966948999999943,78.311371000000122],[-95.096389999999928,78.290268000000026],[-95.36361699999992,78.24136400000009],[-95.388061999999934,78.236374000000012],[-95.399170000000026,78.231093999999985],[-95.398620999999991,78.226928999999984],[-95.388900999999976,78.222488000000055],[-95.368880999999988,78.218596999999988],[-95.345839999999953,78.217758000000003],[-95.255279999999914,78.21804800000001],[-95.227492999999981,78.216660000000104],[-95.130829000000006,78.194138000000009],[-95.113051999999925,78.188583000000108],[-95.106948999999986,78.185257000000092],[-95.108611999999994,78.179428000000087],[-95.111937999999952,78.174149000000114],[-95.111937999999952,78.167480000000012],[-95.106109999999944,78.161926000000051],[-95.089721999999995,78.154984000000127],[-95.068068999999923,78.148041000000148],[-94.98332199999993,78.133040999999992],[-94.90695199999999,78.117203000000131],[-94.889998999999989,78.108870999999965],[-94.886947999999961,78.102768000000026],[-94.911666999999852,78.055251999999996],[-95.011397999999986,77.991363999999919],[-95.043883999999935,77.974991000000045],[-95.057494999999903,77.969147000000078],[-95.085280999999952,77.958878000000027],[-95.100554999999929,77.953597999999943],[-95.112503000000004,77.951385000000016],[-95.137511999999958,77.950546000000031],[-95.162506000000008,77.953597999999943],[-95.186385999999857,77.957764000000054],[-95.211670000000026,77.961105000000089],[-95.236938000000009,77.964157],[-95.265838999999971,77.966095000000109],[-95.321395999999993,77.96775800000006],[-95.379989999999964,77.966384999999946],[-95.400283999999999,77.962769000000094],[-95.41332999999986,77.959426999999948],[-95.425551999999925,77.948029000000133],[-95.449722000000008,77.9433140000001],[-95.549728000000016,77.934143000000006],[-95.758057000000008,77.911926000000108],[-95.830840999999964,77.898880000000133],[-95.938599000000011,77.885817999999972],[-96.189437999999939,77.866089000000045],[-96.285552999999936,77.859421000000054],[-96.317504999999926,77.858322000000101],[-96.345551,77.858597000000088],[-96.365279999999984,77.859984999999995],[-96.386123999999995,77.862762000000089],[-96.404174999999952,77.868591000000094],[-96.41194200000001,77.874984999999981],[-96.410827999999924,77.880813999999987],[-96.405272999999966,77.886382999999967],[-96.410552999999993,77.890549000000078],[-96.416945999999996,77.893875000000094],[-96.43582200000003,77.898604999999975],[-96.456664999999987,77.901657000000057],[-96.541107000000011,77.897217000000069],[-96.734436000000017,77.872757000000036],[-96.735000999999954,77.86692800000003],[-96.710555999999997,77.855545000000006],[-96.696380999999917,77.850815000000125],[-96.667220999999927,77.849152000000061],[-96.585007000000019,77.856368999999972],[-96.558884000000035,77.859421000000054],[-96.539718999999991,77.864426000000094],[-96.516113000000018,77.869430999999963],[-96.491668999999888,77.870254999999929],[-96.515563999999983,77.845535000000098],[-96.542770000000019,77.841934000000037],[-96.628325999999959,77.840546000000131],[-96.68720999999988,77.840546000000131],[-96.71166999999997,77.839706000000092],[-96.734160999999972,77.835541000000092],[-96.748610999999926,77.830276000000026],[-96.829452999999944,77.789153999999996],[-96.849990999999989,77.787201000000039],[-96.880553999999961,77.786926000000051],[-96.900283999999999,77.788315000000011],[-96.907776000000013,77.790542999999957],[-96.912216000000001,77.793045000000063],[-96.933884000000035,77.797485000000052],[-97.014174999999966,77.804153000000042],[-97.057495000000017,77.805542000000059],[-97.072509999999909,77.804153000000042],[-97.096953999999926,77.803314000000057],[-97.102218999999991,77.807479999999998],[-97.119720000000029,77.865265000000079],[-97.11999499999996,77.870254999999929],[-97.107497999999964,77.876373000000058],[-97.081389999999942,77.886658000000011],[-97.015563999999983,77.904160000000047],[-97.002228000000002,77.908600000000035],[-96.99221799999998,77.914154000000053],[-96.992492999999911,77.918869000000086],[-96.994995000000017,77.921097000000032],[-97.142775999999969,77.934982000000105],[-97.281676999999945,77.948318000000086],[-97.30999799999995,77.951096000000064],[-97.354445999999996,77.962204000000042],[-97.380279999999971,77.969986000000006],[-97.431670999999994,77.986923000000047],[-97.454726999999934,77.992752000000053],[-97.503066999999874,78.002486999999917],[-97.572234999999978,78.012497000000053],[-97.602782999999931,78.015548999999965],[-97.673614999999984,78.021378000000141],[-97.75556899999998,78.025542999999971],[-97.766953000000001,78.028870000000097],[-97.77555799999999,78.034988000000055],[-97.666945999999996,78.088043000000084],[-97.647781000000009,78.090820000000008],[-97.618331999999953,78.091660000000047],[-97.567504999999926,78.089706000000035],[-97.513061999999991,78.086655000000007],[-97.43249499999996,78.080551000000128],[-97.323623999999995,78.076935000000105],[-97.297775000000001,78.076385000000073],[-97.024444999999901,78.074706999999933],[-96.997771999999998,78.075271999999984],[-96.910278000000005,78.079163000000051],[-96.887511999999958,78.083054000000118],[-96.855559999999912,78.104155999999932],[-96.856383999999991,78.108032000000037],[-96.870543999999995,78.133330999999998],[-96.885558999999944,78.138046000000031],[-96.983886999999925,78.150818000000072],[-97.059157999999968,78.15776100000005],[-97.138061999999934,78.165817000000118],[-97.164444000000003,78.168869000000029],[-97.184722999999963,78.172485000000108],[-97.194992000000013,78.17692599999998],[-97.200835999999924,78.183593999999971],[-97.212509000000011,78.189422999999977],[-97.299438000000009,78.204712000000086],[-97.321120999999948,78.207488999999953],[-97.349166999999966,78.208602999999982],[-97.407776000000013,78.207763999999997],[-97.635558999999944,78.206650000000025],[-97.829453000000001,78.219147000000021],[-97.849441999999954,78.234711000000118],[-97.817504999999983,78.23275799999999],[-97.773055999999997,78.238876000000118],[-97.763335999999924,78.24443100000002],[-97.777785999999878,78.25],[-97.867766999999958,78.279709000000025],[-97.881103999999993,78.283600000000092],[-97.904175000000009,78.28804000000008],[-97.930557000000022,78.290817000000004],[-98.012786999999946,78.296936000000017],[-98.054717999999923,78.301651000000049],[-98.068343999999968,78.308029000000033],[-98.070846999999958,78.313599000000067],[-98.043610000000001,78.389434999999992],[-98.148345999999947,78.403870000000097],[-98.172226000000023,78.40498400000007],[-98.198333999999988,78.408599999999979],[-98.347778000000005,78.443038999999999],[-98.366652999999985,78.449416999999983],[-98.388061999999991,78.467484000000013],[-98.410552999999993,78.490265000000022],[-98.411391999999921,78.4952550000001],[-98.410277999999948,78.508040999999992],[-98.308884000000035,78.533875000000023],[-98.171386999999982,78.529709000000139],[-98.054442999999992,78.533600000000035],[-98.022231999999917,78.53637700000013],[-98.019164999999987,78.542755000000056],[-98.028060999999923,78.563309000000004],[-98.042220999999927,78.569716999999969],[-98.080001999999922,78.582763999999997],[-98.115004999999996,78.593871999999976],[-98.139998999999989,78.599425999999994],[-98.169158999999922,78.603043000000127],[-98.235001000000011,78.619141000000013],[-98.315276999999924,78.64387499999998],[-98.326950000000011,78.650542999999914],[-98.328063999999927,78.652206000000035],[-98.371658000000025,78.719986000000063],[-98.366104000000007,78.763611000000026],[-98.36471599999993,78.768051000000071],[-98.17332499999992,78.812759000000142],[-98.144454999999994,78.816666000000112],[-98.06138599999997,78.818877999999984],[-97.777785999999878,78.815262000000075],[-97.65695199999999,78.811371000000008],[-97.59973100000002,78.807479999999941],[-97.488602000000014,78.796646000000067],[-97.461945000000014,78.792755],[-97.436934999999892,78.786925999999994],[-97.385559000000001,78.776931999999988],[-97.359160999999972,78.773041000000092],[-97.273620999999991,78.764434999999992],[-97.160278000000005,78.758881000000031],[-97.078063999999983,78.74971000000005],[-97.025283999999942,78.741928000000087],[-96.999725000000012,78.736923000000047],[-96.954726999999934,78.726379000000009],[-96.922500999999954,78.713318000000072],[-96.913895000000025,78.706940000000088],[-96.903884999999946,78.701660000000061],[-96.886397999999986,78.696640000000002],[-96.768065999999976,78.684143000000006]],[[-86.319457999999997,78.883606000000043],[-86.388061999999877,78.883041000000048],[-86.414718999999934,78.884430000000009],[-86.444442999999978,78.887207000000103],[-86.469161999999926,78.889708999999982],[-86.484436000000017,78.892761000000121],[-86.476943999999889,78.896378000000084],[-86.43638599999997,78.911102000000085],[-86.386672999999973,78.924988000000099],[-86.366104000000007,78.929703000000131],[-86.346114999999998,78.939697000000137],[-86.328613000000018,78.950821000000019],[-86.292770000000019,78.983047000000113],[-86.285277999999948,78.993317000000047],[-86.283614999999941,78.99803200000008],[-86.046951000000035,79.038589000000059],[-85.990828999999962,79.046936000000073],[-85.924437999999952,79.053864000000033],[-85.896117999999944,79.056931000000134],[-85.820007000000032,79.061371000000008],[-85.712509000000011,79.064148000000046],[-85.646118000000001,79.06442300000009],[-85.321395999999936,79.053864000000033],[-85.263335999999924,79.048874000000012],[-85.216109999999901,79.041367000000037],[-85.199722000000008,79.037490999999989],[-85.182495000000017,79.031372000000147],[-85.167220999999927,79.020828000000108],[-85.169448999999986,79.014709000000039],[-85.176391999999964,79.008880999999974],[-85.186661000000015,79.002777000000094],[-85.20944199999991,78.993590999999981],[-85.225829999999974,78.988586000000112],[-85.246947999999975,78.984146000000067],[-85.301392000000021,78.975266000000033],[-85.466110000000015,78.958327999999995],[-85.546660999999972,78.95248400000014],[-85.765563999999983,78.93414300000012],[-86.026947000000007,78.910262999999986],[-86.213897999999972,78.891663000000051],[-86.244995000000017,78.888321000000076],[-86.284163999999976,78.885268999999994],[-86.319457999999997,78.883606000000043]],[[-103.59388699999988,79.325821000000019],[-103.39835399999993,79.299988000000099],[-103.33556399999998,79.299988000000099],[-103.26251200000002,79.299988000000099],[-103.13999899999993,79.287766000000147],[-103.09777799999995,79.282486000000063],[-103.08361799999994,79.279433999999981],[-103.06806899999992,79.273880000000133],[-102.92111199999999,79.21748400000007],[-102.92666600000001,79.211105000000032],[-102.92639199999996,79.206649999999968],[-102.921944,79.200272000000041],[-102.90194699999995,79.172211000000118],[-102.89167800000001,79.166656000000046],[-102.87444299999987,79.164992999999924],[-102.76862299999993,79.138884999999959],[-102.620003,79.097214000000008],[-102.61165599999998,79.093048000000124],[-102.60582699999998,79.074432000000115],[-102.60637700000001,79.068054000000132],[-102.612213,79.056641000000127],[-102.654449,78.994141000000013],[-102.66555799999998,78.98275799999999],[-102.67582700000003,78.977478000000133],[-102.69860799999992,78.971924000000115],[-102.72084000000001,78.938309000000061],[-102.59500099999997,78.876648000000046],[-102.57945299999994,78.873032000000023],[-102.56082200000003,78.869705000000067],[-102.55082700000003,78.869431000000134],[-102.52887699999985,78.873032000000023],[-102.39195299999994,78.931656000000089],[-102.37638900000002,78.946365000000128],[-102.38054699999998,78.962769000000094],[-102.39806399999992,78.987198000000035],[-102.36305199999998,79.014999000000103],[-102.27944899999989,79.018051000000014],[-102.09361299999989,79.044144000000131],[-102.04943799999995,79.054427999999973],[-102.01500699999997,79.064987000000031],[-101.99333199999995,79.076096000000121],[-101.975281,79.080825999999945],[-101.942207,79.084717000000012],[-101.90249599999993,79.086380000000133],[-101.88194299999998,79.086104999999918],[-101.64890299999996,79.075821000000076],[-101.62805200000003,79.071930000000009],[-101.54194599999994,79.044708000000071],[-101.5202789999999,79.038315000000125],[-101.30803699999996,78.975815000000011],[-101.23166699999996,78.959427000000119],[-101.20472699999999,78.954162999999994],[-101.17666600000001,78.95387299999993],[-101.15222199999988,78.956650000000025],[-101.14334100000002,78.962494000000049],[-101.14472999999992,78.968323000000055],[-101.14083900000003,78.974152000000061],[-101.09388699999994,78.963608000000022],[-101.00556899999998,78.943039000000056],[-100.98665599999998,78.937195000000088],[-100.98528299999998,78.931366000000025],[-101.11694299999988,78.856934000000138],[-101.15278599999999,78.83998100000008],[-101.19304699999992,78.824431999999945],[-101.20056199999999,78.820831000000112],[-101.20333899999997,78.815811000000053],[-101.20084399999996,78.811919999999986],[-101.18639400000001,78.802765000000136],[-101.17278299999998,78.800537000000134],[-100.99194299999999,78.788879000000122],[-100.86389199999991,78.781372000000033],[-100.83056599999992,78.789703000000088],[-100.80055199999998,78.793320000000051],[-100.70556599999998,78.799712999999997],[-100.61389200000002,78.798035000000084],[-100.587784,78.799149000000057],[-100.55915799999997,78.80442800000003],[-100.55027799999993,78.809982000000048],[-100.53639199999998,78.815536000000009],[-100.52443700000003,78.818054000000018],[-100.35109699999998,78.828323000000012],[-100.34445199999993,78.826660000000118],[-100.32389799999999,78.802200000000084],[-100.32250999999997,78.797211000000118],[-100.33249699999993,78.782760999999994],[-100.32333399999993,78.778046000000131],[-100.283073,78.767761000000064],[-100.22778299999993,78.760544000000095],[-100.14334099999996,78.75221300000004],[-100.12416100000002,78.750000000000057],[-100.03250099999997,78.739426000000037],[-100.004997,78.735809000000074],[-99.952498999999989,78.725540000000024],[-99.93638599999997,78.719986000000063],[-99.896392999999932,78.695816000000036],[-99.893889999999942,78.693039000000113],[-99.893065999999976,78.6869200000001],[-99.913329999999917,78.679703000000018],[-99.972777999999948,78.659987999999998],[-100.0625,78.638885000000073],[-100.0625,78.635544000000039],[-100.01666299999988,78.616653000000042],[-99.988891999999908,78.613876000000118],[-99.96305799999999,78.614990000000091],[-99.90972899999997,78.623871000000008],[-99.853332999999964,78.633041000000048],[-99.817504999999926,78.630538999999999],[-99.573623999999995,78.595535000000098],[-99.550277999999878,78.590271000000143],[-99.533324999999991,78.583602999999982],[-99.529723999999987,78.578048999999965],[-99.534164000000033,78.572220000000129],[-99.661117999999931,78.485535000000027],[-99.670272999999895,78.479706000000022],[-99.684157999999968,78.474426000000108],[-99.712508999999955,78.469436999999971],[-99.777221999999995,78.46138000000002],[-99.831389999999999,78.450821000000133],[-99.859436000000017,78.442200000000014],[-99.867767000000015,78.437484999999981],[-99.865004999999996,78.434418000000051],[-99.821395999999993,78.427475000000072],[-99.801391999999964,78.420822000000101],[-99.786666999999966,78.414703000000088],[-99.776672000000019,78.408599999999979],[-99.761123999999995,78.396378000000141],[-99.753615999999909,78.389709000000096],[-99.748336999999992,78.383605999999986],[-99.749160999999958,78.372482000000105],[-99.778609999999958,78.332214000000022],[-99.797774999999945,78.308594000000028],[-99.799437999999952,78.303314],[-99.793883999999878,78.297211000000061],[-99.775832999999977,78.292480000000126],[-99.741378999999938,78.289978000000019],[-99.673049999999989,78.290817000000004],[-99.620543999999938,78.290268000000026],[-99.551102000000014,78.286102000000142],[-99.529449,78.282486000000063],[-99.514450000000011,78.277206000000035],[-99.479720999999984,78.249146000000053],[-99.447768999999994,78.224152000000061],[-99.428329000000019,78.211655000000064],[-99.413894999999968,78.205261000000007],[-99.398620999999991,78.199997000000053],[-99.188599000000011,78.133040999999992],[-98.989166000000012,78.073044000000039],[-98.969161999999926,78.068329000000006],[-98.945830999999885,78.061645999999996],[-98.945830999999885,78.05581699999999],[-98.962783999999942,78.009155000000078],[-98.971663999999976,77.997757000000092],[-98.980834999999956,77.992203000000075],[-98.998885999999914,77.986923000000047],[-99.021666999999866,77.981659000000036],[-99.081115999999952,77.971923999999944],[-99.094727000000034,77.966384999999946],[-99.099166999999966,77.960815000000082],[-99.098891999999921,77.954987000000131],[-99.078612999999905,77.925537000000077],[-99.069167999999991,77.913605000000075],[-99.041381999999942,77.900818000000072],[-99.022781000000009,77.894440000000145],[-99.013335999999981,77.888321000000133],[-99.022231999999974,77.882477000000108],[-99.238051999999982,77.837769000000037],[-99.396666999999979,77.824158000000068],[-99.525283999999999,77.813599000000011],[-99.549438000000009,77.812485000000038],[-99.713057999999933,77.810806000000014],[-99.853881999999999,77.792206000000078],[-99.859436000000017,77.786926000000051],[-99.876937999999939,77.781372000000033],[-99.90695199999999,77.778595000000109],[-100.21000699999996,77.809982000000048],[-100.32972699999999,77.825272000000041],[-100.49889399999995,77.85165400000011],[-100.60637699999995,77.879974000000118],[-100.75527999999997,77.955551000000071],[-100.78611799999999,77.974152000000117],[-100.81749699999995,77.999146000000053],[-100.82389799999999,78.004440000000045],[-100.83833299999998,78.022766000000047],[-100.83778399999994,78.034988000000055],[-100.83693700000003,78.040268000000083],[-100.83444199999991,78.04414399999996],[-100.82694999999995,78.048874000000012],[-100.853882,78.096649000000014],[-100.87581599999999,78.099990999999932],[-100.99861099999998,78.131653000000085],[-101.00974300000001,78.136658000000125],[-101.02194199999991,78.147766000000104],[-101.01889,78.156937000000084],[-101.01528899999994,78.16276600000009],[-101.01363399999997,78.173599000000081],[-101.01390100000003,78.184707999999944],[-101.02027900000002,78.189697000000081],[-101.03555299999999,78.196091000000138],[-101.06276699999995,78.198593000000017],[-101.08944700000001,78.198029000000076],[-101.23137700000001,78.183868000000075],[-101.28943599999997,78.182479999999998],[-101.31667299999998,78.184982000000048],[-101.34249899999998,78.189422999999977],[-101.41722099999998,78.208878000000141],[-101.432503,78.215271000000087],[-101.43138099999999,78.221374999999966],[-101.43276999999989,78.227478000000076],[-101.45638999999994,78.232208000000128],[-101.47416699999991,78.234711000000118],[-101.49665800000002,78.237198000000149],[-101.83332799999999,78.264999000000046],[-102.13305699999989,78.282761000000107],[-102.15750100000002,78.282486000000063],[-102.18221999999997,78.281097000000102],[-102.29888900000003,78.273315000000139],[-102.34722899999997,78.267761000000121],[-102.38890100000003,78.260817999999972],[-102.47138999999999,78.248871000000008],[-102.50167799999997,78.245819000000097],[-102.56139400000001,78.241089000000045],[-102.59056099999987,78.239700000000084],[-102.61860699999994,78.24136400000009],[-102.64527900000002,78.24552900000009],[-102.73222399999992,78.263885000000073],[-102.781387,78.276093000000117],[-102.79778299999998,78.282211000000075],[-102.80943300000001,78.288315000000125],[-102.8163909999999,78.294434000000138],[-102.81833599999999,78.300262000000032],[-102.81360599999994,78.310806000000127],[-102.80803700000001,78.316939999999931],[-102.74999999999989,78.338318000000072],[-102.736107,78.342484000000127],[-102.68639400000001,78.350540000000024],[-102.66583299999991,78.358596999999975],[-102.67083699999995,78.36303700000002],[-102.69499199999996,78.367752000000053],[-102.72250400000001,78.371368000000075],[-102.77778599999994,78.376372999999944],[-102.80610699999994,78.377762000000132],[-102.83583099999998,78.376372999999944],[-102.88999899999999,78.36914100000007],[-102.92027299999995,78.365814000000114],[-102.93804899999992,78.364699999999971],[-102.96694899999989,78.364150999999993],[-103.02443699999998,78.365265000000136],[-103.13390400000003,78.36914100000007],[-103.16388699999999,78.366928000000087],[-103.21417200000002,78.356644000000074],[-103.23832700000003,78.350540000000024],[-103.26471699999996,78.34526100000005],[-103.38110399999988,78.3316650000001],[-103.41111799999999,78.329437000000098],[-103.49804699999999,78.327774000000034],[-103.52749599999987,78.326385000000016],[-103.58473200000003,78.321930000000009],[-103.67999299999997,78.3119200000001],[-103.75110599999999,78.301376000000062],[-103.78195199999999,78.296097000000032],[-103.80803700000001,78.290543000000071],[-103.829453,78.284987999999998],[-103.87721299999998,78.272217000000069],[-103.89417300000002,78.252212999999927],[-103.89890299999996,78.245819000000097],[-103.91027800000001,78.241089000000045],[-103.93331899999998,78.237198000000149],[-103.96305799999999,78.233597000000088],[-103.99194299999999,78.233047000000056],[-104.02250699999996,78.234146000000067],[-104.04277000000002,78.23692299999999],[-104.06984699999987,78.242171999999982],[-104.08306899999997,78.244140999999956],[-104.110817,78.246643000000063],[-104.19027699999998,78.251663000000121],[-104.30471799999992,78.252212999999927],[-104.36361699999998,78.254439999999988],[-104.41251399999999,78.257767000000115],[-104.46749899999998,78.26527400000009],[-104.49445300000002,78.270538000000045],[-104.82055700000001,78.355820000000108],[-104.99194299999999,78.437759000000085],[-104.99999999999994,78.443862999999965],[-105.05055199999998,78.488037000000077],[-105.05139200000002,78.494431000000134],[-105.04305999999991,78.505829000000119],[-105.01194800000002,78.52165199999996],[-104.95361299999996,78.537491000000102],[-104.86860699999994,78.560531999999967],[-104.83139,78.569992000000013],[-104.806107,78.572495000000004],[-104.69638099999992,78.578873000000101],[-104.66665599999999,78.579712000000086],[-104.39778100000001,78.569992000000013],[-104.35500300000001,78.566375999999934],[-104.287781,78.555252000000053],[-104.26278699999995,78.549423000000047],[-104.21221899999995,78.539977999999962],[-104.1661069999999,78.53276100000005],[-104.14277600000003,78.529434000000094],[-104.08833300000003,78.524155000000121],[-104.03388999999999,78.519989000000066],[-103.93055699999996,78.516098],[-103.87110899999993,78.518051000000128],[-103.78250100000002,78.519714000000022],[-103.7225039999999,78.517211999999972],[-103.66583299999996,78.51249700000011],[-103.58860799999997,78.503875999999991],[-103.53333299999991,78.496367999999961],[-103.52362099999999,78.496094000000028],[-103.51834100000002,78.496933000000013],[-103.46584300000001,78.51748699999996],[-103.37805200000003,78.586105000000032],[-103.39998599999996,78.615540000000124],[-103.44666299999994,78.621368000000075],[-103.50611900000001,78.621368000000075],[-103.74082900000002,78.619705000000124],[-103.98554999999999,78.61692800000003],[-104.01000999999991,78.617203000000075],[-104.04215999999991,78.620681999999931],[-104.04222099999998,78.629973999999947],[-104.03278399999988,78.635269000000051],[-103.98916600000001,78.646103000000096],[-103.85193600000002,78.669434000000138],[-103.82611099999997,78.671921000000054],[-103.77223200000003,78.671097000000088],[-103.65834000000001,78.664993000000038],[-103.62888299999992,78.664429000000098],[-103.53943600000002,78.664993000000038],[-103.50917099999987,78.666382000000056],[-103.48361199999994,78.669144000000131],[-103.49082899999996,78.674987999999985],[-103.50306699999999,78.681091000000094],[-103.51306199999993,78.687484999999924],[-103.52778599999999,78.699417000000096],[-103.525284,78.705261000000121],[-103.51806599999998,78.710815000000082],[-103.48860200000001,78.715820000000122],[-103.439438,78.72026100000005],[-103.41221599999989,78.72026100000005],[-103.38861099999997,78.716933999999924],[-103.35804699999994,78.718597000000045],[-103.33389299999999,78.722488000000112],[-103.31916799999999,78.728591999999992],[-103.31639099999995,78.734420999999998],[-103.31889299999995,78.740264999999965],[-103.41665599999999,78.778870000000097],[-103.43916300000001,78.784988000000055],[-103.46806300000003,78.787491000000045],[-103.63971699999996,78.765273999999977],[-103.66915899999992,78.760544000000095],[-103.71056399999998,78.750000000000057],[-103.79611199999999,78.735809000000074],[-103.70249899999999,78.788315000000011],[-103.69526699999994,78.793868999999972],[-103.698036,78.799712999999997],[-103.72693599999997,78.802200000000084],[-103.86054999999999,78.806090999999981],[-103.87053699999996,78.806365999999969],[-103.886124,78.80442800000003],[-103.9083399999999,78.799149000000057],[-103.90556299999997,78.794144000000017],[-103.89639299999993,78.784714000000122],[-103.89083900000003,78.780273000000022],[-103.89527899999996,78.774994000000049],[-103.90527299999997,78.768875000000037],[-103.92916899999994,78.764998999999932],[-103.96056399999992,78.76138300000008],[-103.99109599999991,78.758881000000031],[-104.02166699999992,78.757492000000013],[-104.04943800000001,78.756378000000041],[-104.07389799999993,78.757767000000001],[-104.170547,78.765823000000069],[-104.19888300000002,78.770263999999997],[-104.21167000000003,78.776093000000003],[-104.21972699999998,78.782211000000132],[-104.21528599999999,78.793593999999985],[-104.16722099999998,78.816376000000105],[-104.13305700000001,78.827484000000084],[-104.04834,78.838882000000069],[-103.98665599999998,78.850265999999976],[-103.86054999999999,78.876648000000046],[-103.83139,78.886932000000115],[-103.82389799999999,78.892487000000017],[-103.82167099999992,78.898330999999985],[-103.82472199999995,78.903319999999951],[-103.86749299999997,78.916091999999992],[-103.96305799999999,78.929977000000065],[-103.98998999999998,78.932755000000043],[-104.00639299999995,78.935531999999967],[-104.029449,78.941650000000095],[-104.04750099999995,78.947754000000089],[-104.05332899999996,78.952208999999925],[-104.05387899999999,78.95748900000001],[-104.05222300000003,78.961380000000077],[-104.04778299999992,78.966659999999933],[-104.048607,78.971099999999979],[-104.05777,78.974152000000061],[-104.08112299999999,78.979431000000034],[-104.12943999999999,78.985809000000017],[-104.17859599999991,78.990265000000136],[-104.20361300000002,78.991653000000042],[-104.23388699999998,78.99192800000003],[-104.265556,78.988586000000112],[-104.45500199999998,78.956099999999992],[-104.47193899999996,78.950546000000031],[-104.51112399999994,78.910262999999986],[-104.53832999999997,78.881927000000019],[-104.56416300000001,78.864700000000028],[-104.57888799999989,78.858597000000088],[-104.78582799999998,78.806641000000013],[-104.81749699999995,78.802200000000084],[-104.87860099999995,78.798035000000084],[-104.90915699999999,78.796646000000067],[-104.96888699999994,78.797211000000118],[-104.98832700000003,78.798325000000091],[-105.01194800000002,78.803589000000102],[-105.02250699999996,78.809982000000048],[-105.02861000000001,78.815262000000075],[-105.02916699999997,78.821655000000078],[-105.02834300000001,78.832763999999941],[-105.01222200000001,78.844711000000075],[-104.83389299999999,78.926650999999993],[-104.68859899999995,78.993590999999981],[-104.67887899999999,78.999709999999993],[-104.674713,79.004990000000078],[-104.68110699999994,79.016663000000108],[-104.69415300000003,79.022766000000047],[-104.70805399999995,79.027771000000087],[-104.737213,79.031936999999971],[-104.90249599999993,79.04971299999994],[-104.98638899999997,79.043045000000006],[-105.01334399999996,79.038315000000125],[-105.09916699999991,79.02388000000002],[-105.12526700000001,79.021103000000096],[-105.15638699999988,79.019439999999975],[-105.39527900000002,79.011658000000068],[-105.42610200000001,79.011108000000036],[-105.48388699999998,79.013046000000145],[-105.51363399999997,79.016098000000056],[-105.54332699999998,79.020263999999941],[-105.5625,79.024428999999941],[-105.58138999999994,79.03054800000001],[-105.59084299999995,79.034424000000058],[-105.59944200000001,79.040268000000083],[-105.60665899999992,79.051926000000094],[-105.628601,79.161377000000073],[-105.62053699999996,79.172760000000096],[-105.48277300000001,79.306366000000082],[-105.45973199999997,79.324158000000125],[-105.43998699999997,79.329162999999994],[-105.40862299999992,79.328872999999987],[-105.38305699999995,79.326935000000049],[-105.33277899999996,79.319443000000092],[-105.19721999999996,79.299713000000111],[-105.16111799999999,79.297485000000108],[-105.12721299999998,79.297485000000108],[-105.10861199999999,79.298874000000126],[-105.01611300000002,79.310531999999967],[-104.95472699999993,79.315262000000018],[-104.85916099999997,79.319153000000085],[-104.74276700000001,79.322495000000004],[-104.58332799999999,79.329437000000098],[-104.54860699999989,79.331375000000037],[-104.49082900000002,79.339157],[-104.46083099999998,79.342209000000082],[-104.18167099999999,79.358871000000079],[-104.00723299999999,79.367752000000053],[-103.97778299999999,79.368866000000025],[-103.9491579999999,79.368042000000059],[-103.83500699999996,79.36442599999998],[-103.7225039999999,79.356934000000024],[-103.69526699999994,79.352203000000088],[-103.62053700000001,79.330551000000071],[-103.59388699999988,79.325821000000019]],[[-99.471663999999976,80.109711000000004],[-99.436661000000015,80.107208000000014],[-99.404723999999931,80.10803199999998],[-99.298049999999989,80.118866000000025],[-99.136672999999917,80.133040999999935],[-99.110549999999876,80.130539000000056],[-99.081680000000006,80.124695000000031],[-98.868880999999988,80.077774000000034],[-98.856658999999922,80.07249500000006],[-98.774719000000005,80.01527400000009],[-98.705841000000021,79.965820000000065],[-98.644164999999873,79.800261999999918],[-98.644164999999873,79.794144000000017],[-98.648620999999878,79.783599999999922],[-98.673049999999989,79.771927000000119],[-98.779175000000009,79.702208999999982],[-98.830001999999922,79.664429000000098],[-98.868057000000022,79.700821000000076],[-98.936110999999983,79.719711000000018],[-98.967772999999909,79.724152000000117],[-99.139998999999932,79.740814000000114],[-99.243056999999965,79.748596000000077],[-99.273620999999935,79.751389000000017],[-99.301391999999908,79.75471500000009],[-99.317229999999995,79.758605999999986],[-99.324448000000018,79.762497000000053],[-99.325561999999991,79.767487000000074],[-99.322509999999909,79.771378000000141],[-99.313048999999921,79.776093000000003],[-99.304717999999923,79.782211000000132],[-99.302779999999984,79.787490999999989],[-99.297501000000011,79.812759000000085],[-99.295837000000006,79.833328000000051],[-99.296386999999925,79.839157000000057],[-99.302215999999873,79.845261000000107],[-99.315826000000015,79.848602000000142],[-99.368880999999988,79.857758000000103],[-99.556655999999919,79.888885000000016],[-99.584441999999967,79.891937000000098],[-99.614166000000012,79.893326000000116],[-99.647781000000009,79.893051000000071],[-99.67971799999998,79.888046000000031],[-99.700835999999867,79.882750999999985],[-99.732223999999974,79.878860000000088],[-99.800827000000027,79.876648000000046],[-100.00556899999998,79.8744200000001],[-100.03582799999992,79.874695000000088],[-100.07028199999996,79.876923000000033],[-100.09777800000001,79.881088000000034],[-100.12110899999999,79.886658000000125],[-100.14389,79.893051000000071],[-100.15862299999998,79.898605000000089],[-100.17748999999998,79.909988000000112],[-100.17832900000002,79.915817000000118],[-100.19332900000001,80.03387500000008],[-100.08167999999989,80.084427000000005],[-100.06555200000003,80.089980999999966],[-100.02362099999993,80.099716000000058],[-99.827224999999999,80.143599999999992],[-99.795272999999952,80.147766000000104],[-99.759170999999981,80.149719000000005],[-99.726944000000003,80.150542999999971],[-99.625548999999921,80.148880000000077],[-99.599990999999989,80.145263999999997],[-99.593886999999881,80.139160000000004],[-99.571120999999948,80.132751000000098],[-99.471663999999976,80.109711000000004]],[[-99.155563000000029,80.174697999999978],[-99.127212999999927,80.168045000000006],[-99.113891999999964,80.163879000000122],[-99.138061999999991,80.162491000000045],[-99.160552999999993,80.163040000000137],[-99.184998000000007,80.167755],[-99.251952999999901,80.173035000000084],[-99.277495999999985,80.173035000000084],[-99.313613999999973,80.171097000000145],[-99.341384999999946,80.166092000000106],[-99.333069000000023,80.159424000000115],[-99.30360399999995,80.153870000000097],[-99.305556999999908,80.148331000000098],[-99.342498999999918,80.145538000000101],[-99.375274999999931,80.147217000000126],[-99.400557999999933,80.150818000000015],[-99.418059999999969,80.157211000000132],[-99.418335000000013,80.163040000000137],[-99.413329999999974,80.168868999999972],[-99.386947999999961,80.17886400000009],[-99.366942999999935,80.182205000000124],[-99.239165999999898,80.183868000000075],[-99.211944999999957,80.182205000000124],[-99.155563000000029,80.174697999999978]],[[-95.030837999999903,80.670258000000047],[-94.969451999999933,80.640274000000034],[-94.970551,80.635268999999994],[-94.981383999999991,80.631927000000076],[-95.006957999999997,80.626648000000046],[-95.190276999999924,80.608871000000022],[-95.226104999999961,80.60914600000001],[-95.453613000000018,80.629424999999969],[-95.611114999999984,80.648040999999978],[-95.676940999999943,80.653319999999951],[-95.711945000000014,80.654433999999981],[-95.749160999999958,80.653869999999984],[-95.788054999999929,80.652205999999978],[-95.823623999999938,80.648604999999918],[-95.86332699999997,80.645828000000051],[-96.061935000000005,80.656647000000078],[-96.118056999999965,80.660537999999974],[-96.14916999999997,80.664703000000145],[-96.139449999999954,80.669708000000014],[-96.076675000000023,80.683043999999995],[-96.028335999999967,80.687195000000088],[-96.006119000000012,80.688034000000016],[-95.491378999999995,80.699997000000053],[-95.424438000000009,80.699707000000046],[-95.200561999999934,80.697479000000101],[-95.166945999999939,80.695250999999985],[-95.128875999999934,80.691925000000083],[-95.096663999999976,80.688582999999994],[-95.062499999999943,80.682480000000055],[-95.065276999999924,80.680542000000116],[-95.045836999999949,80.676926000000037],[-95.030837999999903,80.670258000000047]],[[-92.727782999999931,81.305542000000059],[-92.530288999999982,81.284988000000112],[-92.21305799999999,81.245529000000033],[-92.148055999999997,81.236374000000126],[-92.124709999999936,81.232758000000103],[-92.052489999999921,81.218597000000102],[-91.955841000000021,81.196365000000014],[-91.858046999999999,81.167755],[-91.781677000000002,81.090271000000143],[-91.783889999999928,81.083602999999982],[-91.797501000000011,81.081665000000044],[-91.832503999999972,81.080276000000083],[-91.888061999999934,81.081940000000088],[-91.914444000000003,81.078049000000021],[-91.913894999999968,81.07499700000011],[-91.908614999999998,81.070540999999992],[-91.893341000000021,81.064986999999974],[-91.865828999999962,81.058594000000028],[-91.767226999999934,81.049148999999943],[-91.72222899999997,81.042205999999965],[-91.538895000000025,80.981658999999979],[-91.52555799999999,80.974990999999989],[-91.522781000000009,80.962769000000037],[-91.531676999999945,80.951096000000007],[-91.527221999999995,80.939697000000081],[-91.517776000000026,80.932754999999986],[-91.481673999999998,80.919434000000024],[-91.321121000000005,80.882750999999985],[-91.306106999999997,80.875534000000016],[-91.152221999999995,80.785538000000031],[-91.154998999999975,80.78054800000001],[-91.14916999999997,80.770263999999997],[-91.140563999999983,80.764709000000096],[-91.121658000000025,80.754715000000033],[-91.099441999999954,80.74803200000008],[-91.03472899999997,80.737488000000042],[-90.972777999999948,80.730270000000019],[-90.905272999999966,80.724425999999994],[-90.777221999999995,80.71775800000006],[-90.754181000000017,80.714995999999928],[-90.712783999999999,80.705551000000071],[-90.664718999999991,80.684708000000001],[-90.652495999999928,80.67804000000001],[-90.603881999999999,80.651382000000012],[-90.593612999999948,80.645264000000111],[-90.593063000000029,80.640823000000012],[-90.601943999999946,80.636107999999979],[-90.615829000000019,80.630264000000125],[-90.678054999999972,80.615540000000067],[-90.715835999999911,80.605545000000006],[-90.742492999999911,80.594711000000075],[-90.763061999999991,80.583603000000096],[-90.771666999999979,80.577484000000084],[-90.772780999999952,80.571930000000066],[-90.766402999999912,80.565536000000066],[-90.741378999999938,80.562195000000031],[-90.706116000000009,80.561371000000065],[-90.607223999999917,80.561371000000065],[-90.583069000000023,80.561371000000065],[-90.418059999999912,80.552200000000084],[-90.238891999999964,80.550536999999963],[-90.203339000000028,80.549712999999997],[-90.177215999999987,80.548874000000069],[-90.046386999999925,80.541656000000046],[-90.016402999999968,80.538039999999967],[-90,80.534591999999975],[-89.989990000000034,80.532486000000006],[-89.961394999999982,80.520263999999997],[-89.955565999999976,80.515548999999965],[-89.938598999999954,80.508330999999998],[-89.84056099999998,80.481369000000086],[-89.81639100000001,80.474991000000102],[-89.790282999999931,80.469437000000084],[-89.762511999999958,80.464995999999985],[-89.75111400000003,80.464432000000045],[-89.784163999999919,80.500824000000023],[-89.748336999999879,80.532760999999994],[-89.586945000000014,80.545532000000094],[-89.546111999999994,80.547485000000052],[-89.482773000000009,80.544983000000002],[-89.447219999999902,80.542480000000012],[-89.354172000000005,80.534988000000055],[-89.326400999999919,80.531937000000028],[-89.272781000000009,80.523315000000025],[-89.244995000000017,80.517212000000086],[-89.059158000000025,80.461380000000133],[-89.087508999999955,80.438583000000051],[-89.115279999999927,80.433868000000018],[-89.176101999999958,80.426651000000049],[-89.198333999999932,80.42164600000001],[-89.20944199999991,80.417754999999943],[-89.235001000000011,80.408035000000041],[-89.25,80.402206000000035],[-89.257232999999985,80.396942000000081],[-89.253615999999965,80.392761000000007],[-89.237212999999997,80.388596000000007],[-89.216948999999943,80.389709000000039],[-89.189712999999927,80.394149999999968],[-89.167496000000028,80.399155000000007],[-89.136123999999995,80.40248100000008],[-89.09973100000002,80.40248100000008],[-89.083327999999881,80.398331000000042],[-89.075835999999924,80.393051000000014],[-89.104995999999915,80.339431999999988],[-89.114165999999955,80.333327999999938],[-89.125274999999931,80.327773999999977],[-89.143616000000009,80.323318000000029],[-89.169158999999979,80.318054000000075],[-89.220275999999899,80.30914300000012],[-89.241942999999935,80.304153000000099],[-89.256667999999991,80.298599000000081],[-89.263900999999976,80.293320000000108],[-89.262221999999952,80.286652000000117],[-89.25140399999998,80.278320000000122],[-89.180496000000005,80.238174000000072],[-89.113892000000021,80.208038000000045],[-89.092223999999987,80.200821000000133],[-89.072784000000013,80.195526000000086],[-88.776672000000019,80.131363000000022],[-88.75,80.126647999999989],[-88.534728999999913,80.09887700000013],[-88.49888599999997,80.09887700000013],[-88.441939999999931,80.100540000000024],[-88.414718999999991,80.104980000000069],[-88.414444000000003,80.10803199999998],[-88.363051999999925,80.124420000000043],[-88.235274999999888,80.102477999999962],[-88.161941999999954,80.09165999999999],[-88.145554000000004,80.093872000000033],[-88.148346000000004,80.098037999999974],[-88.261397999999929,80.18803400000013],[-88.27305599999994,80.195526000000086],[-88.294158999999979,80.201385000000073],[-88.350829999999974,80.208878000000084],[-88.422775000000001,80.210541000000035],[-88.479996000000028,80.213608000000136],[-88.506957999999941,80.218322999999998],[-88.595276000000013,80.236923000000104],[-88.618057000000022,80.24331699999999],[-88.630279999999914,80.249145999999996],[-88.661391999999921,80.272491000000116],[-88.684432999999956,80.358597000000145],[-88.68582200000003,80.365540000000124],[-88.685271999999998,80.371643000000063],[-88.683059999999955,80.376923000000147],[-88.67721599999993,80.382751000000042],[-88.648894999999925,80.393600000000106],[-88.615279999999927,80.40387000000004],[-88.510284000000013,80.428864000000033],[-88.487777999999992,80.433868000000018],[-88.463333000000034,80.438034000000073],[-88.420546999999999,80.442200000000014],[-88.383895999999993,80.443588000000091],[-88.308333999999945,80.442749000000106],[-88.110549999999932,80.4327550000001],[-87.918883999999991,80.421097000000088],[-87.718613000000005,80.411102000000142],[-87.683884000000035,80.410263000000043],[-87.666396999999904,80.40387000000004],[-87.636123999999938,80.36692800000003],[-87.607498000000021,80.324158000000068],[-87.563889000000017,80.233322000000044],[-87.561935000000005,80.183593999999914],[-87.562774999999931,80.179153000000042],[-87.572234999999921,80.176086000000112],[-87.678054999999915,80.156371999999976],[-87.721389999999985,80.153046000000131],[-87.939162999999951,80.143875000000037],[-87.96665999999999,80.139434999999992],[-88.048889000000031,80.125809000000004],[-88.065552000000025,80.120818999999983],[-88.060546999999985,80.117477000000065],[-87.956664999999987,80.069717000000026],[-87.938048999999978,80.06442300000009],[-87.891387999999949,80.055542000000116],[-87.860001000000011,80.053588999999988],[-87.836120999999935,80.0577550000001],[-87.823059000000001,80.062484999999924],[-87.763061999999934,80.071106000000043],[-87.720000999999911,80.074707000000103],[-87.680557000000022,80.076385000000016],[-87.641678000000013,80.076385000000016],[-87.365004999999996,80.072768999999994],[-87.299987999999985,80.069443000000092],[-87.275557999999876,80.066939999999931],[-87.258620999999948,80.063873000000058],[-87.233321999999987,80.057480000000055],[-87.215285999999992,80.050537000000077],[-87.043334999999956,79.964996000000099],[-87.093612999999948,79.929428000000087],[-87.314437999999996,79.866088999999988],[-87.336120999999935,79.861374000000126],[-87.368332000000009,79.857208000000071],[-87.446655000000021,79.856094000000098],[-87.471938999999907,79.852478000000019],[-87.483062999999959,79.847214000000065],[-87.489440999999943,79.84137000000004],[-87.485549999999876,79.834991000000002],[-87.463622999999984,79.831374999999923],[-87.439162999999951,79.831940000000145],[-87.412780999999995,79.833328000000051],[-87.338608000000022,79.840820000000008],[-87.190826000000015,79.866088999999988],[-87.165558000000033,79.871094000000028],[-87.146956999999929,79.875534000000073],[-87.079726999999934,79.896103000000039],[-87.051392000000021,79.906647000000078],[-87.024718999999948,79.916091999999935],[-87.003066999999987,79.917755000000056],[-86.985824999999977,79.917755000000056],[-86.973891999999864,79.916381999999942],[-86.961394999999982,79.909988000000112],[-86.957779000000016,79.903594999999939],[-86.960555999999997,79.891372999999987],[-87.055557000000022,79.731934000000081],[-87.134170999999924,79.645264000000111],[-87.14416499999993,79.637771999999984],[-87.154998999999975,79.6336060000001],[-87.173049999999989,79.629149999999981],[-87.258620999999948,79.610260000000039],[-87.344451999999933,79.596374999999966],[-87.425551999999982,79.579163000000108],[-87.441665999999941,79.573883000000023],[-87.448043999999982,79.568329000000062],[-87.462509000000011,79.534713999999951],[-87.441939999999988,79.526382000000012],[-87.406661999999983,79.515823000000125],[-87.390563999999927,79.511108000000092],[-87.366394000000014,79.506378000000041],[-87.345276000000013,79.503052000000025],[-87.309998000000007,79.50221300000004],[-87.280563000000029,79.506943000000092],[-87.262786999999946,79.51138300000008],[-87.248336999999992,79.516937000000098],[-87.190552000000025,79.543593999999985],[-87.182769999999948,79.548874000000069],[-87.179992999999968,79.554153000000042],[-87.168883999999991,79.566376000000105],[-87.161117999999931,79.571655000000078],[-87.076675000000023,79.587493999999992],[-87.02555799999999,79.595535000000098],[-87.001113999999973,79.598877000000016],[-86.966659999999933,79.60165400000011],[-86.932495000000017,79.60165400000011],[-86.841384999999946,79.59304800000001],[-86.823623999999995,79.587769000000037],[-86.819732999999985,79.576096000000007],[-86.823897999999986,79.566086000000098],[-86.839721999999995,79.555817000000047],[-86.846389999999985,79.549988000000042],[-86.837783999999999,79.543320000000051],[-86.816665999999998,79.539703000000145],[-86.789992999999981,79.538878999999952],[-86.777221999999995,79.542206000000078],[-86.694991999999957,79.567490000000078],[-86.693329000000006,79.573608000000036],[-86.71055599999994,79.587203999999986],[-86.723891999999978,79.594437000000028],[-86.746383999999978,79.599990999999989],[-86.802489999999977,79.606093999999928],[-86.813048999999921,79.61192299999999],[-86.806380999999874,79.617751999999996],[-86.795272999999952,79.621643000000063],[-86.77694699999995,79.627472000000068],[-86.762222000000008,79.631653000000142],[-86.687209999999993,79.645264000000111],[-86.640838999999914,79.653320000000008],[-86.613051999999925,79.655822999999998],[-86.575012000000015,79.657211000000075],[-86.547775000000001,79.65637200000009],[-86.334166999999923,79.645538000000045],[-86.302779999999984,79.642761000000121],[-86.279448999999943,79.640274000000034],[-86.258895999999993,79.63499500000006],[-86.109160999999972,79.595260999999994],[-86.046111999999994,79.568877999999984],[-86.042220999999927,79.565536000000066],[-86.028060999999923,79.474701000000096],[-86.05471799999998,79.470535000000041],[-86.160552999999993,79.463608000000136],[-86.167496000000028,79.457764000000111],[-86.136123999999995,79.444702000000063],[-86.120834000000002,79.439972000000068],[-86.098891999999921,79.435806000000127],[-86.070847000000015,79.434143000000063],[-86.035004000000015,79.436371000000008],[-86.011947999999961,79.440262000000075],[-85.990554999999972,79.444977000000108],[-85.975829999999917,79.449142000000109],[-85.964171999999962,79.454436999999984],[-85.901108000000022,79.493591000000038],[-85.887222000000008,79.505264000000068],[-85.885283999999956,79.51138300000008],[-85.893341000000021,79.523315000000082],[-85.89916999999997,79.536377000000073],[-85.896666999999979,79.549149000000114],[-85.893341000000021,79.554703000000075],[-85.887786999999946,79.56109600000002],[-85.847504000000015,79.596374999999966],[-85.840285999999992,79.601928999999927],[-85.828339000000028,79.607483000000116],[-85.781386999999995,79.615540000000124],[-85.743606999999997,79.61692800000003],[-85.681945999999925,79.613312000000121],[-85.639175000000023,79.604155999999989],[-85.623885999999914,79.599152000000061],[-85.591385000000002,79.585266000000047],[-85.531112999999948,79.559418000000107],[-85.485000999999954,79.518600000000049],[-85.402221999999995,79.473602000000142],[-85.306655999999919,79.428314],[-85.27806099999998,79.415543000000127],[-85.150557999999933,79.38220200000012],[-85.130279999999971,79.378586000000098],[-85.039718999999877,79.350815000000011],[-84.93249499999996,79.300262000000032],[-84.920273000000009,79.293320000000108],[-84.904175000000009,79.276657000000057],[-84.904175000000009,79.267761000000121],[-84.909728999999857,79.263046000000088],[-84.93110699999994,79.258331000000055],[-85.099990999999932,79.239426000000094],[-85.158889999999928,79.231933999999967],[-85.211394999999868,79.223311999999964],[-85.232772999999952,79.218872000000147],[-85.248046999999872,79.213042999999971],[-85.260009999999909,79.207763999999997],[-85.271941999999967,79.19720500000011],[-85.280563000000029,79.192200000000071],[-85.297226000000023,79.187195000000031],[-85.591385000000002,79.15415999999999],[-85.779998999999918,79.131088000000034],[-85.877212999999983,79.121642999999949],[-86.00389100000001,79.111374000000126],[-86.158889999999985,79.103316999999947],[-86.271392999999989,79.095534999999984],[-86.341674999999952,79.088318000000072],[-86.422501000000011,79.075546000000088],[-86.485549999999989,79.063309000000118],[-86.550827000000027,79.048874000000012],[-86.55999799999995,79.044434000000138],[-86.555557000000022,79.042480000000126],[-86.550827000000027,79.035538000000031],[-86.552490000000034,79.029434000000037],[-86.55999799999995,79.012206999999989],[-86.587783999999942,78.983597000000145],[-86.598891999999921,78.978317000000061],[-86.614440999999943,78.973312000000021],[-86.676940999999886,78.959717000000126],[-86.702224999999942,78.955261000000064],[-86.741378999999938,78.951934999999992],[-86.765015000000005,78.953598000000113],[-86.785004000000015,78.957213999999965],[-86.808334000000002,78.967209000000082],[-86.903335999999854,79.009430000000066],[-86.916396999999961,79.016663000000108],[-86.926391999999964,79.035812000000135],[-86.930556999999965,79.047760000000039],[-86.940551999999968,79.053589000000045],[-86.949158000000011,79.057205000000067],[-86.965285999999935,79.057480000000112],[-86.98332199999993,79.056641000000127],[-86.989989999999977,79.047760000000039],[-87.004456000000005,78.987198000000035],[-87.002501999999993,78.981369000000029],[-86.986937999999952,78.949707000000046],[-86.979995999999971,78.9433140000001],[-86.966948999999943,78.936371000000122],[-86.950835999999981,78.929428000000087],[-86.942764000000011,78.922485000000108],[-86.937774999999988,78.91693099999992],[-86.952498999999932,78.906647000000078],[-86.97084000000001,78.896103000000039],[-86.997498000000007,78.882477000000051],[-87.021666999999923,78.873032000000023],[-87.052490000000034,78.862762000000089],[-87.179442999999935,78.830551000000014],[-87.282775999999956,78.810257000000036],[-87.328063999999983,78.794708000000128],[-87.353881999999999,78.78414900000007],[-87.529998999999918,78.6869200000001],[-87.532776000000013,78.669983000000116],[-87.543059999999969,78.664703000000031],[-87.572783999999956,78.654433999999981],[-87.591949,78.649718999999948],[-87.615829000000019,78.645264000000111],[-87.663054999999986,78.642487000000017],[-87.684432999999956,78.644989000000123],[-87.872771999999941,78.694977000000051],[-87.937774999999874,78.738312000000064],[-87.953612999999962,78.74971000000005],[-87.959166999999979,78.755264000000068],[-87.993880999999931,78.79525799999999],[-88.003341999999918,78.807205000000124],[-88.00140399999998,78.824158000000011],[-87.985275000000001,78.957213999999965],[-87.981673999999884,78.960541000000092],[-87.968338000000017,78.966385000000116],[-87.894164999999987,78.979706000000078],[-87.833617999999944,78.992203000000075],[-87.81361400000003,78.99693300000007],[-87.794448999999986,79.006943000000035],[-87.728881999999942,79.069442999999978],[-87.724715999999944,79.075821000000076],[-87.733886999999982,79.081100000000049],[-87.746108999999933,79.086104999999918],[-87.752791999999999,79.085540999999978],[-87.772780999999952,79.080825999999945],[-87.806380999999931,79.06999200000007],[-87.849166999999966,79.054977000000122],[-87.872771999999941,79.045258000000103],[-87.883330999999998,79.039978000000076],[-87.894454999999994,79.028320000000008],[-87.890288999999996,79.021652000000074],[-87.899993999999992,79.011108000000036],[-87.929442999999992,79.006943000000035],[-88.000564999999995,79.00360100000006],[-88.032776000000013,79.003876000000105],[-88.061385999999914,79.005829000000006],[-88.093886999999938,79.004440000000045],[-88.162506000000008,78.990540000000124],[-88.202498999999932,78.976379000000122],[-88.21305799999999,78.966095000000109],[-88.215285999999935,78.960815000000025],[-88.216659999999933,78.948318000000029],[-88.229720999999984,78.802200000000084],[-88.224716000000001,78.78915399999994],[-88.22222899999997,78.783324999999934],[-88.218063000000029,78.776931999999988],[-88.201110999999969,78.757216999999969],[-88.132216999999969,78.68081699999999],[-88.044158999999922,78.658600000000092],[-88.02416999999997,78.656647000000135],[-88.010833999999932,78.652771000000087],[-87.993056999999965,78.645264000000111],[-87.982772999999952,78.639435000000105],[-87.908614999999998,78.596939000000077],[-87.894729999999981,78.584717000000126],[-87.890839000000028,78.578323000000069],[-87.896956999999873,78.566375999999934],[-87.908339999999953,78.548599000000081],[-87.984725999999966,78.492202999999961],[-88.011948000000018,78.481369000000086],[-88.055832000000009,78.472762999999986],[-88.205276000000026,78.452484000000084],[-88.234160999999972,78.453598000000056],[-88.249160999999958,78.456649999999968],[-88.389450000000011,78.521378000000027],[-88.559432999999899,78.604156000000046],[-88.574721999999952,78.607208000000128],[-88.723052999999993,78.615814000000057],[-88.788605000000018,78.612761999999975],[-88.804168999999945,78.609711000000118],[-88.746108999999933,78.535812000000078],[-88.725006000000008,78.524155000000121],[-88.659164000000033,78.491088999999988],[-88.595276000000013,78.459991000000002],[-88.5625,78.44470200000012],[-88.552215999999987,78.437484999999981],[-88.543883999999991,78.426086000000112],[-88.535552999999993,78.413040000000137],[-88.536117999999931,78.406937000000028],[-88.538054999999986,78.401382000000126],[-88.541381999999999,78.396652000000074],[-88.553054999999915,78.385544000000095],[-88.561110999999983,78.379425000000083],[-88.570556999999951,78.373871000000065],[-88.614715999999987,78.348327999999981],[-88.663329999999974,78.321381000000031],[-88.672501000000011,78.316085999999984],[-88.704177999999956,78.271103000000096],[-88.710555999999997,78.261107999999979],[-88.713897999999858,78.254715000000033],[-88.71556099999998,78.249146000000053],[-88.716110000000015,78.243042000000003],[-88.721114999999941,78.231093999999985],[-88.726105000000018,78.225266000000033],[-88.75140399999998,78.196930000000123],[-88.776672000000019,78.176085999999941],[-88.78443900000002,78.169983000000002],[-88.793334999999956,78.164429000000041],[-88.817779999999914,78.154434000000094],[-88.847777999999948,78.151382000000012],[-88.978881999999942,78.165817000000118],[-89.002791999999943,78.169434000000081],[-89.065001999999879,78.184418000000107],[-89.079726999999991,78.189147999999989],[-89.115828999999962,78.200821000000019],[-89.227492999999981,78.245254999999986],[-89.259170999999924,78.262771999999984],[-89.265014999999948,78.268326000000002],[-89.275283999999999,78.281936999999971],[-89.353881999999885,78.339705999999978],[-89.364440999999999,78.344147000000078],[-89.381103999999993,78.3477630000001],[-89.518341000000021,78.392212000000086],[-89.676665999999955,78.447478999999987],[-89.803878999999995,78.494431000000134],[-89.819457999999997,78.500549000000092],[-89.891113000000018,78.552764999999965],[-89.921660999999972,78.578048999999965],[-89.945830999999998,78.599425999999994],[-89.95695499999988,78.605255],[-89.980559999999969,78.609711000000118],[-90.014724999999885,78.609421000000111],[-90.051391999999964,78.605820000000051],[-90.088332999999977,78.595825000000104],[-90.092498999999975,78.589980999999909],[-90.09973100000002,78.555252000000053],[-90.100829999999974,78.549713000000054],[-90.064712999999927,78.513321000000076],[-89.985000999999954,78.43609600000002],[-89.960555999999997,78.432480000000112],[-89.936110999999983,78.430267000000015],[-89.910004000000015,78.426086000000112],[-89.869995000000017,78.417755],[-89.80972300000002,78.404709000000082],[-89.785278000000005,78.398041000000092],[-89.774445000000014,78.39387499999998],[-89.748046999999929,78.380264000000011],[-89.615554999999858,78.300262000000032],[-89.606109999999944,78.293319999999994],[-89.461670000000026,78.17553700000002],[-89.455841000000021,78.169983000000002],[-89.452498999999989,78.162491000000045],[-89.461670000000026,78.158599999999979],[-89.476668999999958,78.153869999999984],[-89.507781999999963,78.149994000000106],[-89.530288999999982,78.148330999999985],[-89.549437999999952,78.148605000000089],[-89.563048999999921,78.149719000000061],[-89.59584000000001,78.156937000000084],[-89.61860699999994,78.163040000000024],[-89.631942999999978,78.168594000000041],[-89.639724999999942,78.173309000000074],[-89.644164999999987,78.179703000000075],[-89.646118000000001,78.184707999999944],[-89.646118000000001,78.19720500000011],[-89.64805599999994,78.202209000000096],[-89.654174999999952,78.209427000000119],[-89.657226999999978,78.212203999999986],[-89.673888999999974,78.217209000000082],[-89.700835999999981,78.219147000000021],[-89.748885999999914,78.217209000000082],[-89.783324999999934,78.214431999999988],[-89.847778000000005,78.213042999999971],[-89.886948000000018,78.215271000000087],[-89.911117999999988,78.218872000000147],[-89.929169000000002,78.223038000000088],[-89.955276000000026,78.233322000000101],[-89.960281000000009,78.238311999999951],[-89.961945000000014,78.243590999999924],[-89.959441999999967,78.254439999999988],[-89.955001999999922,78.260544000000039],[-89.980285999999921,78.27777100000003],[-90.023330999999985,78.298035000000027],[-90.060271999999998,78.308029000000033],[-90.172500999999954,78.331100000000049],[-90.186110999999926,78.333327999999995],[-90.213622999999984,78.335265999999933],[-90.242492999999854,78.336105000000089],[-90.27416999999997,78.334991000000116],[-90.34056099999998,78.331100000000049],[-90.411391999999921,78.324432000000058],[-90.478881999999999,78.321106000000043],[-90.507781999999963,78.320540999999992],[-90.59445199999999,78.322768999999937],[-90.620269999999948,78.325546000000031],[-90.667770000000019,78.32748399999997],[-90.729445999999996,78.326096000000064],[-90.744445999999982,78.323043999999982],[-90.748610999999983,78.320267000000058],[-90.73721299999994,78.314423000000033],[-90.715560999999923,78.309143000000006],[-90.622771999999941,78.291091999999992],[-90.598343,78.287490999999932],[-90.544998000000021,78.283051000000114],[-90.46166999999997,78.27887000000004],[-90.410277999999948,78.276657000000057],[-90.363327000000027,78.256942999999978],[-90.273894999999982,78.192200000000071],[-90.267501999999922,78.18664600000011],[-90.268889999999999,78.182755000000043],[-90.272781000000009,78.17692599999998],[-90.293883999999991,78.159988000000112],[-90.301102000000014,78.15525800000006],[-90.330291999999986,78.146103000000039],[-90.353881999999942,78.143326000000116],[-90.433884000000035,78.136383000000137],[-90.465012000000002,78.135268999999937],[-90.497771999999941,78.134995000000004],[-90.624434999999949,78.134430000000009],[-90.711120999999991,78.135818000000086],[-90.967223999999987,78.142761000000064],[-91.021392999999989,78.146103000000039],[-91.039718999999991,78.150269000000094],[-91.238387999999986,78.166594999999973],[-91.326674999999966,78.168594000000041],[-91.489715999999873,78.17692599999998],[-91.539992999999924,78.181366000000025],[-91.613891999999964,78.191925000000083],[-91.661941999999897,78.199707000000046],[-91.707229999999981,78.209427000000119],[-91.724715999999944,78.214706000000092],[-91.807770000000005,78.23275799999999],[-91.831389999999999,78.23692299999999],[-91.857497999999964,78.239700000000084],[-91.887511999999901,78.239425999999924],[-91.920273000000009,78.237198000000149],[-91.946380999999974,78.23275799999999],[-91.963332999999977,78.227768000000083],[-91.974441999999954,78.223312000000021],[-91.986114999999984,78.214706000000092],[-92.003066999999987,78.209717000000126],[-92.031113000000005,78.207488999999953],[-92.058334000000002,78.208878000000141],[-92.083327999999995,78.212494000000049],[-92.105559999999969,78.217758000000003],[-92.308333999999945,78.278594999999996],[-92.537216000000001,78.310531999999967],[-92.556655999999975,78.314696999999967],[-92.589447000000007,78.323608000000092],[-92.949431999999888,78.43193100000002],[-92.96665999999999,78.44358799999992],[-92.982498000000021,78.454436999999984],[-92.98721299999994,78.46026599999999],[-92.987502999999947,78.465546000000074],[-92.978881999999942,78.483322000000044],[-92.96665999999999,78.488586000000055],[-92.863891999999964,78.505264000000125],[-92.848617999999988,78.505554000000132],[-92.690551999999968,78.49581900000004],[-92.646392999999932,78.487487999999928],[-92.621933000000013,78.487198000000092],[-92.600554999999986,78.488037000000077],[-92.576675000000023,78.490540000000067],[-92.520279000000016,78.498596000000134],[-92.493606999999997,78.503325999999959],[-92.48721299999994,78.507767000000058],[-92.487777999999992,78.509430000000009],[-92.497771999999998,78.513046000000031],[-92.563323999999966,78.520537999999988],[-92.529448999999943,78.521378000000027],[-92.24722300000002,78.52777100000003],[-92.216659999999933,78.528046000000018],[-92.070847000000015,78.525543000000027],[-92.011123999999938,78.526657],[-91.949996999999939,78.530273000000079],[-91.918610000000001,78.534424000000001],[-91.726395000000025,78.530548000000067],[-91.682495000000017,78.52609300000006],[-91.660827999999981,78.526932000000045],[-91.646117999999944,78.529984000000127],[-91.636123999999938,78.533600000000035],[-91.632492000000013,78.539429000000041],[-91.635284000000013,78.546097000000032],[-91.647506999999962,78.560257000000092],[-91.657500999999968,78.563873000000001],[-91.670272999999952,78.56581100000011],[-91.945267000000001,78.572220000000129],[-92.151397999999915,78.579437000000041],[-92.351943999999946,78.586928999999998],[-92.557220000000029,78.594711000000132],[-92.58555599999994,78.596099999999979],[-92.604720999999984,78.598602000000028],[-92.697768999999994,78.614151000000106],[-92.733063000000016,78.62359600000002],[-92.757781999999963,78.628036000000009],[-92.806106999999997,78.6336060000001],[-92.828888000000006,78.631927000000076],[-92.907227000000034,78.62303200000008],[-92.935546999999985,78.618866000000139],[-92.935821999999973,78.614990000000091],[-92.941665999999998,78.608597000000145],[-92.955841000000021,78.603867000000093],[-92.991668999999945,78.599716000000001],[-93.176940999999999,78.586380000000077],[-93.210555999999997,78.584152000000074],[-93.242492999999968,78.582763999999997],[-93.271118000000001,78.584152000000074],[-93.28443900000002,78.587494000000049],[-93.434157999999968,78.6336060000001],[-93.771392999999989,78.750549000000035],[-93.813613999999973,78.765823000000069],[-93.802779999999927,78.770263999999997],[-93.684158000000025,78.782486000000006],[-93.650283999999999,78.784714000000122],[-93.589721999999995,78.783599999999979],[-93.534438999999963,78.778870000000097],[-93.429169000000002,78.767212000000086],[-93.376388999999961,78.760544000000095],[-93.351394999999968,78.756104000000107],[-93.299728000000016,78.748596000000077],[-93.24722300000002,78.741928000000087],[-93.190551999999968,78.736374000000126],[-93.163329999999974,78.735535000000141],[-93.09973100000002,78.737198000000092],[-93.054992999999968,78.739974999999959],[-93.04222099999987,78.745255000000043],[-93.039963,78.750000000000057],[-93.039443999999946,78.751099000000067],[-93.035277999999948,78.761932000000002],[-93.037780999999939,78.765823000000069],[-93.118880999999988,78.772491000000059],[-93.170273000000009,78.77998400000007],[-93.271941999999967,78.796097000000145],[-93.346389999999928,78.809982000000048],[-93.369155999999975,78.816086000000041],[-93.391388000000006,78.820831000000112],[-93.416397000000018,78.824996999999996],[-93.560546999999929,78.833328000000108],[-93.589721999999995,78.834717000000069],[-93.650283999999999,78.835541000000035],[-93.746947999999975,78.834991000000002],[-93.779723999999987,78.833603000000096],[-93.842772999999966,78.832489000000123],[-93.874709999999936,78.833603000000096],[-93.892501999999979,78.838042999999914],[-93.902221999999995,78.842484000000013],[-93.906386999999995,78.849152000000004],[-93.917495999999971,78.860535000000027],[-93.939437999999939,78.871643000000006],[-93.959441999999967,78.878310999999997],[-94.052490000000034,78.902481000000023],[-94.09584000000001,78.911102000000085],[-94.253066999999987,78.956940000000031],[-94.269729999999981,78.962204000000042],[-94.282227000000034,78.968872000000033],[-94.287506000000008,78.981093999999985],[-94.288605000000018,78.986374000000069],[-94.241378999999881,78.996643000000063],[-94.005279999999914,79.029709000000025],[-93.910277999999948,79.041930999999977],[-93.878051999999968,79.042480000000126],[-93.854720999999927,79.040543000000071],[-93.813889000000017,79.035538000000031],[-93.784164000000033,79.038040000000137],[-93.601943999999889,79.068328999999949],[-93.472778000000005,79.108871000000136],[-93.455565999999976,79.11970500000001],[-93.452498999999989,79.125534000000016],[-93.456664999999987,79.132202000000007],[-93.463333000000034,79.136932000000058],[-93.46055599999994,79.142761000000064],[-93.443054000000018,79.148041000000092],[-93.36610399999995,79.161377000000073],[-93.329726999999934,79.164428999999984],[-93.294997999999907,79.166931000000091],[-93.259170999999924,79.167480000000012],[-93.227782999999931,79.166931000000091],[-93.003066999999987,79.154434000000094],[-92.895553999999947,79.143875000000037],[-92.869720000000029,79.139708999999925],[-92.841109999999958,79.141098000000113],[-92.816101000000003,79.145537999999988],[-92.801392000000021,79.150269000000094],[-92.7933349999999,79.155823000000055],[-92.780288999999868,79.161102000000028],[-92.746947999999975,79.164153999999996],[-92.506957999999941,79.158324999999991],[-92.478606999999954,79.155823000000055],[-92.407500999999911,79.146102999999982],[-92.309433000000013,79.145264000000054],[-92.243057000000022,79.146941999999967],[-91.89805599999994,79.161377000000073],[-91.691939999999988,79.173309000000017],[-91.439162999999951,79.183593999999971],[-91.205275999999969,79.191925000000026],[-91.009170999999867,79.203048999999965],[-90.811934999999949,79.208038000000101],[-90.601669000000015,79.214157000000114],[-90.564162999999951,79.215546000000131],[-90.528335999999911,79.21748400000007],[-90.492767000000015,79.220825000000104],[-90.390839000000028,79.236374000000012],[-90.368331999999953,79.243042000000003],[-90.36326600000001,79.246811000000093],[-90.382216999999969,79.2494200000001],[-90.405563000000029,79.251938000000109],[-90.472778000000005,79.250823999999909],[-90.502227999999945,79.2494200000001],[-90.732223999999974,79.238312000000121],[-90.885833999999988,79.244141000000127],[-91.139998999999932,79.244431000000134],[-91.198883000000023,79.241364000000033],[-91.47084000000001,79.228867000000037],[-91.861114999999927,79.215271000000087],[-92.026397999999972,79.207489000000123],[-92.053604000000007,79.205261000000007],[-92.087783999999999,79.204163000000108],[-92.180832000000009,79.203048999999965],[-92.213897999999972,79.204163000000108],[-92.238892000000021,79.205551000000014],[-92.510284000000013,79.232757999999933],[-92.621933000000013,79.244431000000134],[-92.676666000000012,79.251389000000131],[-92.694716999999969,79.257217000000082],[-92.693053999999961,79.262207000000103],[-92.625548999999978,79.295258000000047],[-92.603881999999942,79.300812000000064],[-92.571944999999971,79.304153000000099],[-92.523330999999928,79.307755000000043],[-92.454453000000001,79.308594000000028],[-92.394729999999981,79.308594000000028],[-92.303329000000019,79.306366000000082],[-92.255004999999983,79.304428000000144],[-92.131377999999984,79.299988000000099],[-91.994995000000017,79.295258000000047],[-91.961944999999957,79.29553199999998],[-91.932494999999903,79.297211000000004],[-91.894164999999987,79.301085999999998],[-91.865279999999927,79.305542000000116],[-91.829452999999944,79.314697000000137],[-91.795546999999885,79.319153000000085],[-91.727492999999924,79.326096000000064],[-91.658889999999985,79.329987000000131],[-91.589721999999938,79.332214000000022],[-91.528884999999946,79.333054000000061],[-91.493880999999874,79.33248900000001],[-91.467498999999975,79.333602999999982],[-91.267776000000026,79.345824999999991],[-91.231673999999941,79.348037999999917],[-91.15834000000001,79.356093999999985],[-91.119995000000017,79.386383000000023],[-91.129165999999884,79.390823000000069],[-91.156386999999995,79.394440000000031],[-91.191100999999946,79.393326000000059],[-91.230559999999969,79.389434999999992],[-91.422225999999966,79.374146000000053],[-91.508621000000005,79.373306000000014],[-91.580841000000021,79.369141000000013],[-91.702224999999942,79.361374000000069],[-91.729720999999984,79.359421000000111],[-91.766662999999994,79.353317000000118],[-91.788329999999974,79.346375000000023],[-91.835281000000009,79.340820000000122],[-91.864715999999987,79.339431999999988],[-91.897781000000009,79.339157],[-92.150832999999977,79.344437000000084],[-92.18110699999994,79.345824999999991],[-92.210006999999962,79.348327999999924],[-92.290833000000021,79.358031999999923],[-92.351943999999946,79.362761999999975],[-92.41194200000001,79.36442599999998],[-92.510009999999966,79.364150999999993],[-92.561934999999949,79.365814000000057],[-92.571670999999867,79.37052900000009],[-92.577498999999989,79.379150000000038],[-92.567504999999869,79.384155000000078],[-92.479996000000028,79.404434000000037],[-92.462509000000011,79.406937000000028],[-92.41194200000001,79.411652000000061],[-92.31361400000003,79.418593999999928],[-92.243880999999988,79.426651000000106],[-92.228607000000011,79.431366000000139],[-92.227782999999931,79.435257000000036],[-92.228881999999999,79.438309000000118],[-92.234726000000023,79.441649999999981],[-92.241942999999935,79.444138000000123],[-92.259170999999981,79.446930000000066],[-92.283324999999991,79.449142000000109],[-92.33805799999999,79.453049000000078],[-92.419723999999974,79.457214000000079],[-92.580841000000021,79.452209000000039],[-92.605270000000019,79.450546000000088],[-92.634170999999981,79.445816000000036],[-92.679992999999968,79.437194999999974],[-92.774170000000026,79.417755],[-92.803054999999972,79.413040000000137],[-92.854445999999996,79.407760999999994],[-92.876098999999954,79.407760999999994],[-92.901671999999962,79.408874999999966],[-92.929442999999935,79.412490999999989],[-92.950835999999981,79.416382000000056],[-92.973327999999981,79.423598999999967],[-93.029175000000009,79.46026599999999],[-93.032775999999956,79.465546000000074],[-93.034728999999913,79.471649000000014],[-93.044723999999917,79.476089000000002],[-93.063048999999921,79.48054500000012],[-93.09056099999998,79.482208000000071],[-93.107223999999974,79.482208000000071],[-93.126662999999951,79.479980000000069],[-93.143889999999885,79.475815000000068],[-93.146666999999979,79.469986000000063],[-93.144454999999994,79.463882000000069],[-93.125,79.450821000000133],[-93.105834999999956,79.43942300000009],[-93.081389999999942,79.426376000000062],[-93.061110999999983,79.415817000000061],[-93.033614999999941,79.404434000000037],[-93.018889999999999,79.399719000000005],[-93.009170999999981,79.395263999999997],[-93.006957999999941,79.389160000000118],[-93.008347000000015,79.388046000000145],[-93.009445000000028,79.387206999999989],[-93.021392999999989,79.382751000000098],[-93.125,79.359711000000118],[-93.264175000000023,79.353592000000106],[-93.312499999999943,79.372757000000092],[-93.251113999999973,79.40498400000007],[-93.236114999999984,79.415268000000083],[-93.229720999999984,79.425537000000134],[-93.231383999999991,79.429977000000122],[-93.235001000000011,79.435257000000036],[-93.252501999999993,79.441924999999969],[-93.275833000000034,79.446640000000002],[-93.293334999999956,79.44802900000002],[-93.320007000000032,79.448317999999972],[-93.338057999999933,79.447205000000054],[-93.354445999999996,79.441360000000145],[-93.424437999999896,79.405258000000003],[-93.433059999999898,79.387496999999996],[-93.485275000000001,79.354156000000046],[-93.641387999999893,79.31164600000011],[-93.757507000000032,79.283600000000035],[-93.801940999999886,79.274704000000099],[-93.869995000000017,79.263885000000073],[-93.906661999999983,79.260544000000039],[-93.969726999999978,79.25749200000007],[-93.99722300000002,79.256942999999978],[-94.047225999999966,79.25749200000007],[-94.206954999999994,79.272490999999945],[-94.212219000000005,79.276657000000057],[-94.162780999999995,79.322220000000016],[-94.14805599999994,79.333602999999982],[-94.119720000000029,79.344711000000018],[-94.088608000000022,79.353592000000106],[-94.056380999999931,79.379700000000071],[-94.245834000000002,79.404160000000104],[-94.366652999999985,79.419708000000128],[-94.386123999999938,79.421371000000022],[-94.494720000000029,79.421371000000022],[-94.509170999999981,79.416382000000056],[-94.5,79.379700000000071],[-94.483063000000016,79.375809000000004],[-94.46305799999999,79.379150000000038],[-94.454453000000001,79.385544000000095],[-94.432769999999948,79.385544000000095],[-94.398055999999997,79.375259000000142],[-94.389998999999989,79.368866000000025],[-94.506667999999991,79.337204000000042],[-94.538054999999929,79.333602999999982],[-94.573623999999938,79.331100000000049],[-94.638900999999976,79.33248900000001],[-94.669997999999964,79.331375000000037],[-94.697495000000004,79.326660000000004],[-94.720001000000025,79.321655000000135],[-94.765015000000005,79.31164600000011],[-94.952498999999932,79.289978000000019],[-94.970000999999968,79.284714000000008],[-94.972777999999892,79.273880000000133],[-94.977218999999991,79.270264000000111],[-94.985824999999977,79.267487000000017],[-95.018616000000009,79.266936999999984],[-95.087555000000009,79.27075200000013],[-95.161666999999966,79.281097000000045],[-95.304992999999968,79.325821000000019],[-95.318619000000012,79.332214000000022],[-95.32028200000002,79.335266000000104],[-95.294448999999986,79.336655000000121],[-95.285004000000015,79.353042999999957],[-95.295837000000006,79.379425000000026],[-95.394164999999987,79.387496999999996],[-95.477218999999991,79.380814000000044],[-95.655563000000029,79.391663000000108],[-95.753341999999975,79.404434000000037],[-95.771666999999979,79.409714000000065],[-95.778609999999958,79.413040000000137],[-95.779449,79.425812000000121],[-95.736388999999974,79.537491000000045],[-95.657500999999968,79.553314000000114],[-95.636123999999938,79.557479999999998],[-95.565552000000025,79.55914300000012],[-95.309722999999963,79.569153000000028],[-95.170273000000009,79.575272000000041],[-95.051665999999955,79.582214000000135],[-94.839995999999871,79.597214000000122],[-94.802489999999977,79.600540000000137],[-94.699432000000002,79.612198000000149],[-94.40695199999999,79.667755000000113],[-94.360275000000001,79.677765000000022],[-94.329453000000001,79.688309000000061],[-94.282776000000013,79.757492000000013],[-94.28694200000001,79.762772000000041],[-94.298339999999996,79.76887499999998],[-94.318344000000025,79.778595000000053],[-94.335281000000009,79.780823000000055],[-94.361664000000019,79.781937000000028],[-94.384170999999981,79.778046000000131],[-94.577498999999932,79.735809000000074],[-94.592498999999975,79.731094000000041],[-94.596663999999976,79.725815000000011],[-94.601395000000025,79.713882000000012],[-94.608886999999925,79.708327999999995],[-94.748336999999935,79.678314],[-94.776671999999962,79.673598999999967],[-94.814437999999939,79.670258000000103],[-94.878325999999959,79.66804500000012],[-94.946380999999974,79.666930999999977],[-94.985001000000011,79.664993000000038],[-95.091675000000009,79.656936999999971],[-95.153610000000015,79.647491000000002],[-95.190825999999959,79.644149999999968],[-95.355559999999969,79.638321000000133],[-95.419998000000021,79.637496999999996],[-95.485274999999945,79.638046000000088],[-95.740828999999906,79.641373000000044],[-95.799437999999952,79.642487000000017],[-95.853332999999964,79.646103000000096],[-95.901107999999965,79.654433999999981],[-95.933060000000012,79.664429000000098],[-95.954726999999991,79.671920999999998],[-95.980835000000013,79.6827550000001],[-96.032227000000034,79.706940000000088],[-96.282501000000025,79.798874000000012],[-96.335555999999997,79.815536000000009],[-96.360824999999977,79.82249500000006],[-96.384170999999924,79.826385000000073],[-96.490554999999972,79.836104999999975],[-96.575561999999934,79.849990999999932],[-96.589447000000007,79.852478000000019],[-96.610549999999989,79.877762000000018],[-96.61500499999994,79.883881000000031],[-96.609436000000017,79.888596000000064],[-96.573623999999995,79.900269000000094],[-96.458618000000001,79.914429000000041],[-96.422775000000001,79.916091999999935],[-96.391387999999949,79.913879000000009],[-96.385009999999909,79.909714000000008],[-96.37777699999998,79.899155000000121],[-96.194716999999912,79.901382000000012],[-96.158889999999872,79.903046000000018],[-96.138061999999991,79.906372000000033],[-96.147780999999952,79.912491000000102],[-96.164718999999991,79.917205999999908],[-96.23332199999993,79.933043999999938],[-96.262512000000015,79.936920000000043],[-96.325561999999991,79.941360000000032],[-96.399170000000026,79.941086000000098],[-96.492766999999958,79.943314000000044],[-96.52416999999997,79.945251000000098],[-96.556655999999975,79.948868000000061],[-96.580565999999976,79.952773999999977],[-96.595839999999953,79.956940000000031],[-96.606658999999922,79.962204000000042],[-96.675003000000004,80.008331000000055],[-96.679442999999992,80.014435000000105],[-96.661941999999954,80.019989000000123],[-96.628052000000025,80.024429000000112],[-96.482772999999952,80.041091999999992],[-96.419158999999922,80.041930999999977],[-96.394164999999873,80.043869000000086],[-96.391677999999956,80.045822000000044],[-96.40583799999996,80.048325000000034],[-96.428878999999995,80.050537000000077],[-96.479172000000005,80.053864000000033],[-96.512222000000008,80.054977000000122],[-96.548614999999927,80.053314],[-96.582503999999915,80.048598999999967],[-96.599166999999909,80.044434000000138],[-96.627776999999924,80.039429000000098],[-96.676101999999958,80.041930999999977],[-96.698882999999967,80.046936000000017],[-96.737503000000004,80.058029000000033],[-96.781676999999945,80.076660000000061],[-96.801391999999964,80.086929000000055],[-96.802779999999984,80.090820000000122],[-96.748885999999857,80.134720000000129],[-96.734436000000017,80.139709000000096],[-96.711120999999935,80.14498900000001],[-96.675827000000027,80.145538000000101],[-96.410003999999958,80.13888500000013],[-96.381103999999937,80.13638300000008],[-96.351395000000025,80.132476999999994],[-96.322784000000013,80.127472000000125],[-96.163054999999872,80.093048000000067],[-96.077788999999996,80.078049000000021],[-96.017776000000026,80.070830999999998],[-95.847777999999892,80.053314],[-95.545836999999949,80.040543000000071],[-95.418883999999935,80.036652000000004],[-95.325011999999958,80.03387500000008],[-95.193877999999984,80.03137200000009],[-95.06361400000003,80.029984000000013],[-95.038054999999986,80.031936999999971],[-95.011672999999917,80.038879000000065],[-94.988892000000021,80.04304500000012],[-94.951110999999855,80.045532000000037],[-94.921386999999925,80.046371000000022],[-94.887512000000015,80.045822000000044],[-94.852782999999874,80.044144000000131],[-94.825835999999924,80.040543000000071],[-94.717772999999966,80.020828000000051],[-94.607498000000021,80.002777000000094],[-94.569457999999941,79.997208000000114],[-94.416945999999996,79.978867000000093],[-94.383620999999948,79.982482999999945],[-94.387786999999946,79.987761999999918],[-94.413894999999911,79.997757000000036],[-94.451674999999966,80.009720000000073],[-94.525557999999933,80.02276599999999],[-94.62110899999999,80.04304500000012],[-94.67111199999988,80.056931000000134],[-94.74888599999997,80.07998699999996],[-94.728881999999942,80.105545000000063],[-94.632766999999944,80.131088000000034],[-94.611937999999952,80.135544000000095],[-94.510558999999944,80.154434000000037],[-94.480559999999855,80.15914900000007],[-94.416396999999961,80.163605000000018],[-94.387222000000008,80.163315000000011],[-94.285827999999924,80.164993000000095],[-94.121108999999933,80.17025799999999],[-94.091675000000009,80.172485000000052],[-94.083892999999989,80.175537000000134],[-94.096389999999985,80.179153000000042],[-94.119995000000017,80.183044000000109],[-94.184433000000013,80.186646000000053],[-94.217772999999966,80.18803400000013],[-94.354171999999949,80.190811000000053],[-94.485000999999954,80.209991000000002],[-94.642226999999991,80.199996999999996],[-94.649993999999879,80.194427000000076],[-94.704453000000001,80.178040000000124],[-94.748336999999935,80.169434000000024],[-94.816956000000005,80.159714000000122],[-95.033324999999991,80.134995000000004],[-95.104996000000028,80.128860000000032],[-95.263625999999988,80.118317000000104],[-95.333618000000001,80.118042000000059],[-95.367767000000015,80.118317000000104],[-95.420273000000009,80.122482000000105],[-95.658889999999985,80.168593999999985],[-95.683884000000035,80.173874000000012],[-95.695830999999998,80.178314000000057],[-95.692215000000033,80.181090999999981],[-95.673889000000031,80.186371000000008],[-95.621658000000025,80.195251000000042],[-95.580841000000021,80.199706999999989],[-95.542770000000019,80.202209000000039],[-95.471114999999941,80.203598000000056],[-95.404175000000009,80.203598000000056],[-95.370543999999995,80.204712000000029],[-95.327788999999882,80.208603000000096],[-95.295837000000006,80.21276899999998],[-95.268341000000021,80.218047999999953],[-95.254455999999948,80.222214000000065],[-95.235000999999897,80.232208000000071],[-95.229996000000028,80.236098999999967],[-95.235000999999897,80.241088999999988],[-95.243331999999953,80.243591000000094],[-95.258895999999993,80.244980000000055],[-95.278060999999923,80.243866000000082],[-95.287216000000001,80.241088999999988],[-95.325561999999991,80.232208000000071],[-95.39834599999989,80.223602000000142],[-95.461394999999868,80.219986000000119],[-95.496947999999975,80.219436999999971],[-95.548339999999996,80.220261000000107],[-95.566955999999948,80.224152000000004],[-95.577498999999989,80.229430999999977],[-95.581389999999885,80.235535000000027],[-95.586394999999925,80.240540000000067],[-95.601944000000003,80.242203000000018],[-95.645844000000011,80.239700000000028],[-95.69027699999998,80.232483000000116],[-95.71055599999994,80.227768000000083],[-95.884170999999981,80.199142000000109],[-95.922500999999954,80.194138000000009],[-95.93360899999999,80.194427000000076],[-95.98443599999996,80.200271999999984],[-96.216659999999877,80.235809000000131],[-96.43499799999995,80.269714000000022],[-96.46444699999995,80.313034000000016],[-96.613892000000021,80.329987000000131],[-96.645844000000011,80.333054000000004],[-96.670272999999952,80.336928999999998],[-96.681670999999881,80.342209000000082],[-96.676101999999958,80.346939000000134],[-96.658051,80.352203000000088],[-96.634170999999981,80.357208000000128],[-96.604720999999984,80.362198000000035],[-96.592223999999987,80.362761999999975],[-96.440552000000025,80.356644000000017],[-96.408889999999985,80.353592000000106],[-96.363892000000021,80.342209000000082],[-96.254729999999938,80.335541000000092],[-96.232223999999974,80.334717000000126],[-96.216400000000021,80.338042999999971],[-96.221664000000033,80.343323000000055],[-96.255004999999983,80.354156000000046],[-96.277221999999938,80.359985000000052],[-96.280838000000017,80.36192299999999],[-96.268065999999919,80.367477000000008],[-96.240554999999972,80.37303200000008],[-96.080841000000021,80.387206999999989],[-96.047774999999888,80.389984000000084],[-95.978606999999954,80.388596000000007],[-95.732497999999907,80.372757000000036],[-95.697495000000004,80.369979999999941],[-95.636948000000018,80.364150999999936],[-95.61221299999994,80.360260000000039],[-95.566955999999948,80.352203000000088],[-95.542770000000019,80.345824999999934],[-95.513900999999976,80.340820000000065],[-95.48832699999997,80.338042999999971],[-95.460280999999952,80.336928999999998],[-95.440826000000015,80.338318000000015],[-95.436935000000005,80.341095000000109],[-95.453338999999971,80.373306000000014],[-95.458617999999944,80.378586000000041],[-95.468063000000029,80.38220200000012],[-95.498610999999983,80.383880999999974],[-95.564162999999951,80.385817999999972],[-95.624999999999943,80.391663000000108],[-95.653885000000002,80.396652000000074],[-95.694992000000013,80.406097000000102],[-95.721664000000033,80.412765999999976],[-95.852218999999991,80.454163000000051],[-95.957229999999925,80.504990000000134],[-96.020553999999947,80.567490000000078],[-96.027221999999995,80.574158000000068],[-96.024445000000014,80.578323000000069],[-96.006957999999884,80.582763999999941],[-95.979996000000028,80.584717000000069],[-95.941665999999941,80.58638000000002],[-95.671660999999972,80.584717000000069],[-95.536391999999978,80.590820000000008],[-95.498046999999872,80.59248400000007],[-95.423614999999984,80.593597000000102],[-95.318343999999911,80.590820000000008],[-95.246658000000025,80.58998100000008],[-95.172226000000023,80.59137000000004],[-95.132216999999969,80.593872000000147],[-95.067229999999995,80.601379000000065],[-95.030837999999903,80.603317000000004],[-94.99499499999996,80.603043000000071],[-94.962783999999942,80.599715999999944],[-94.902495999999985,80.586655000000007],[-94.846953999999926,80.574706999999989],[-94.823623999999995,80.569716999999969],[-94.77194199999991,80.561371000000065],[-94.752791999999943,80.559982000000048],[-94.696654999999964,80.55693100000002],[-94.658614999999998,80.555817000000047],[-94.554992999999911,80.55442800000003],[-94.374999999999943,80.557205000000124],[-94.230835000000013,80.556365999999969],[-94.010559000000001,80.54942299999999],[-93.968886999999995,80.540817000000061],[-93.968886999999995,80.536925999999994],[-93.966110000000015,80.530823000000055],[-93.958343999999954,80.52609300000006],[-93.89916999999997,80.519150000000025],[-93.866942999999992,80.518326000000059],[-93.839447000000007,80.518599999999992],[-93.786391999999978,80.525543000000027],[-93.783066000000019,80.529709000000082],[-93.790832999999964,80.534424000000115],[-93.810546999999985,80.541367000000093],[-93.894729999999868,80.565811000000053],[-93.949158000000011,80.578048999999908],[-93.973617999999931,80.581939999999975],[-94.005004999999983,80.585266000000047],[-94.093612999999948,80.593322999999998],[-94.308334000000002,80.606368999999972],[-94.437774999999988,80.605545000000006],[-94.457503999999915,80.600265999999976],[-94.484726000000023,80.598328000000038],[-94.524170000000026,80.598328000000038],[-94.543335000000013,80.599715999999944],[-94.561935000000005,80.605819999999994],[-94.660278000000005,80.651382000000012],[-94.669448999999929,80.65776100000005],[-94.672775000000001,80.663879000000009],[-94.670273000000009,80.669708000000014],[-94.662215999999944,80.675262000000032],[-94.650283999999999,80.681366000000082],[-94.628326000000015,80.685806000000071],[-94.596953999999982,80.690536000000122],[-94.553604000000007,80.694977000000051],[-94.514724999999942,80.696365000000128],[-94.439163000000008,80.697479000000101],[-94.331116000000009,80.693863000000022],[-94.231673999999884,80.692200000000128],[-94.199722000000008,80.693039000000056],[-94.117492999999968,80.698593000000074],[-94.088332999999977,80.701660000000004],[-94.075561999999991,80.706099999999992],[-94.076950000000011,80.709152000000131],[-94.086394999999982,80.713043000000027],[-94.108337000000006,80.718872000000033],[-94.140288999999996,80.721924000000115],[-94.304442999999935,80.733871000000079],[-94.423049999999876,80.734985000000052],[-94.449158000000011,80.730270000000019],[-94.491104000000007,80.726928999999984],[-94.549438000000009,80.724991000000045],[-94.65972899999997,80.72526600000009],[-94.694716999999969,80.726653999999996],[-94.722778000000005,80.728592000000106],[-94.895554000000004,80.747757000000092],[-95.035827999999867,80.768326000000002],[-95.037505999999951,80.771378000000141],[-95.03694200000001,80.776093000000003],[-95.033889999999985,80.778046000000131],[-95.025283999999999,80.801651000000106],[-95.243056999999965,80.787766000000033],[-95.282501000000025,80.786101999999971],[-95.334166999999923,80.788879000000065],[-95.442764000000011,80.79971299999994],[-95.475554999999986,80.803040000000067],[-95.501113999999973,80.806931000000134],[-95.524170000000026,80.812484999999981],[-95.534164000000033,80.818878000000097],[-95.526397999999972,80.833328000000051],[-95.500838999999871,80.838318000000072],[-95.44027699999998,80.846100000000035],[-95.371384000000035,80.853316999999947],[-95.212783999999999,80.868317000000104],[-95.170837000000006,80.875809000000061],[-95.150832999999921,80.881088000000034],[-95.146666999999923,80.883881000000031],[-95.170546999999999,80.884720000000016],[-95.300827000000027,80.885269000000108],[-95.41332999999986,80.885269000000108],[-95.468886999999995,80.890273999999977],[-95.481383999999991,80.894714000000022],[-95.484726000000023,80.899155000000121],[-95.474166999999966,80.904434000000094],[-95.460280999999952,80.909713999999951],[-95.422775000000001,80.920821999999987],[-95.334166999999923,80.934708000000114],[-95.311934999999949,80.939147999999989],[-95.283614999999941,80.949996999999996],[-95.267501999999979,80.96138000000002],[-95.259734999999921,80.973602000000028],[-95.257506999999976,80.979431000000034],[-95.259170999999981,80.984984999999995],[-95.255004999999983,80.996643000000063],[-95.241104000000007,81.006103999999993],[-95.220839999999896,81.011382999999967],[-95.183060000000012,81.019714000000079],[-94.943329000000006,81.048874000000126],[-94.814163000000008,81.054153000000099],[-94.663054999999986,81.048598999999911],[-94.572783999999899,81.038879000000009],[-94.546111999999994,81.033325000000048],[-94.493880999999988,81.017487000000017],[-94.495543999999995,80.995819000000097],[-94.504181000000017,80.990265000000079],[-94.509170999999981,80.984711000000061],[-94.508057000000008,80.979431000000034],[-94.492767000000015,80.972763000000043],[-94.472778000000005,80.969146999999964],[-94.434158000000025,80.965546000000131],[-94.408614999999941,80.965546000000131],[-94.365554999999972,80.968872000000147],[-94.344726999999978,80.974152000000061],[-94.330001999999865,80.979706000000022],[-94.143616000000009,81.015823000000012],[-94.071670999999924,81.024993999999936],[-93.908051,81.039429000000041],[-93.906386999999995,81.040543000000071],[-94.013335999999981,81.053588999999988],[-94.042220999999927,81.055542000000116],[-94.18249499999996,81.068054000000075],[-94.328612999999962,81.089432000000045],[-94.357498000000021,81.09526100000005],[-94.36221299999994,81.100540000000024],[-94.353607000000011,81.106093999999985],[-94.345550999999944,81.109421000000111],[-94.313048999999978,81.115539999999953],[-94.278335999999967,81.117203000000075],[-94.255279999999971,81.115539999999953],[-94.230835000000013,81.110535000000084],[-94.214721999999881,81.106369000000029],[-94.195830999999941,81.10026600000009],[-94.154723999999987,81.093872000000033],[-94.130279999999971,81.09275800000006],[-93.989715999999987,81.092484000000127],[-93.960830999999928,81.094147000000078],[-93.935271999999941,81.098327999999981],[-93.907227000000034,81.101653999999996],[-93.866394000000014,81.103043000000014],[-93.795273000000009,81.099426000000051],[-93.689437999999996,81.093048000000067],[-93.517226999999878,81.084426999999948],[-93.299987999999928,81.079711999999915],[-93.255844000000025,81.082764000000054],[-93.163054999999929,81.091934000000094],[-93.152221999999938,81.094711000000018],[-93.123321999999916,81.115265000000136],[-93.095550999999944,81.154160000000104],[-93.091674999999952,81.159988000000055],[-93.095839999999953,81.165268000000083],[-93.121108999999933,81.182754999999929],[-93.259734999999978,81.212203999999929],[-93.419448999999929,81.219986000000063],[-93.514724999999999,81.217758000000117],[-93.687499999999943,81.21026599999999],[-93.728333000000021,81.207214000000079],[-93.852218999999934,81.203049000000078],[-93.928878999999995,81.203873000000044],[-94.031386999999938,81.208878000000084],[-94.166397000000018,81.218048000000124],[-94.200561999999877,81.221100000000035],[-94.282227000000034,81.231094000000098],[-94.302489999999977,81.234984999999938],[-94.381667999999991,81.25082400000008],[-94.388061999999991,81.254990000000134],[-94.391388000000006,81.261108000000092],[-94.386123999999938,81.272766000000104],[-94.370270000000005,81.284714000000008],[-94.278610000000015,81.341934000000037],[-94.268616000000009,81.346099999999922],[-94.240829000000019,81.350814999999955],[-94.200561999999877,81.355545000000006],[-94.153884999999946,81.359711000000118],[-94.06806899999998,81.363311999999951],[-94.035278000000005,81.363311999999951],[-93.789444000000003,81.348038000000088],[-93.755004999999926,81.344711000000132],[-93.694442999999922,81.337494000000049],[-93.665833000000021,81.332763999999997],[-93.638900999999976,81.327209000000096],[-93.621933000000013,81.321655000000078],[-93.611389000000031,81.316376000000105],[-93.594451999999933,81.31053199999991],[-93.553329000000019,81.305542000000059],[-93.515288999999996,81.31053199999991],[-93.494994999999903,81.314697000000081],[-93.483063000000016,81.319716999999969],[-93.483611999999994,81.325272000000041],[-93.488051999999982,81.330551000000014],[-93.533324999999991,81.348602000000028],[-93.560546999999929,81.367751999999996],[-93.564712999999927,81.376648000000102],[-93.550551999999925,81.38108799999992],[-93.517501999999979,81.38499500000006],[-93.340285999999992,81.372208000000057],[-93.177490000000034,81.358597000000088],[-93.01556399999987,81.341370000000097],[-92.928054999999972,81.330826000000059],[-92.831680000000006,81.317764000000011],[-92.727782999999931,81.305542000000059]],[[-91.71833799999996,81.549149000000057],[-91.761672999999973,81.548035000000084],[-91.801391999999964,81.548599000000024],[-91.837509000000011,81.551086000000112],[-91.863616999999977,81.555251999999996],[-91.951110999999912,81.584152000000017],[-91.958617999999944,81.588882000000069],[-91.960555999999997,81.594986000000119],[-91.956115999999952,81.600815000000125],[-91.932494999999903,81.605819999999994],[-91.903884999999946,81.608322000000044],[-91.868332000000009,81.608597000000088],[-91.823897999999986,81.606934000000138],[-91.789444000000003,81.603317000000004],[-91.724715999999944,81.596100000000092],[-91.597778000000005,81.580550999999957],[-91.582229999999925,81.578049000000078],[-91.619995000000017,81.562484999999981],[-91.643615999999895,81.557480000000112],[-91.673614999999984,81.552765000000079],[-91.71833799999996,81.549149000000057]],[[-78.365828999999962,82.883605999999986],[-78.383330999999998,82.883605999999986],[-78.419448999999986,82.899155000000064],[-78.417220999999927,82.935532000000023],[-78.414718999999934,82.941925000000026],[-78.405838000000017,82.947754000000032],[-78.389724999999885,82.953323000000012],[-78.361663999999962,82.958603000000096],[-78.323333999999875,82.961929000000112],[-78.273894999999868,82.963043000000084],[-78.223617999999988,82.961104999999975],[-78.145279000000016,82.954712000000029],[-78.119720000000029,82.94859299999996],[-78.116942999999992,82.942200000000014],[-78.122498000000007,82.937194999999974],[-78.150833000000034,82.926925999999924],[-78.212783999999999,82.911377000000016],[-78.336394999999982,82.888046000000145],[-78.365828999999962,82.883605999999986]],[[-70.111937999999952,83.109421000000111],[-70.00140399999998,83.10775799999999],[-69.812209999999993,83.112197999999978],[-69.74888599999997,83.11192299999999],[-69.701675000000023,83.110535000000084],[-69.665008999999998,83.108322000000101],[-69.659164000000033,83.103043000000127],[-69.662215999999944,83.074158000000068],[-69.664168999999958,83.070830999999941],[-69.680557000000022,83.064986999999974],[-69.716109999999958,83.061096000000077],[-69.757506999999976,83.057755000000043],[-69.773894999999982,83.051926000000037],[-69.775283999999942,83.047760000000096],[-69.744445999999982,83.04553199999998],[-69.671936000000017,83.041091999999935],[-69.636123999999995,83.039703000000145],[-69.471389999999985,83.038879000000009],[-69.451110999999969,83.035812000000078],[-69.513335999999981,83.019714000000022],[-69.536117999999988,83.014435000000049],[-69.565001999999936,83.009995000000004],[-69.559722999999963,82.994141000000127],[-69.233062999999959,83.010268999999937],[-69.156386999999938,83.017487000000131],[-69.120543999999995,83.021652000000131],[-69.097777999999948,83.026657],[-69.06361400000003,83.038040000000024],[-69.015563999999927,83.040817000000118],[-68.983063000000016,83.036652000000117],[-68.975280999999995,83.028320000000122],[-68.973891999999978,83.015549000000021],[-68.977218999999991,83.001663000000065],[-68.902785999999935,82.988312000000064],[-68.708344000000011,82.978043000000071],[-68.665008999999941,82.980270000000132],[-68.630829000000006,82.985259999999982],[-68.626663000000008,82.986923000000104],[-68.579726999999991,82.996933000000013],[-68.550551999999925,83.001663000000065],[-68.514724999999999,83.005554000000132],[-68.46665999999999,83.008040999999992],[-68.404723999999987,83.008330999999998],[-68.358046999999885,83.006103999999937],[-68.316101000000003,83.003326000000129],[-68.190826000000015,82.994705000000067],[-68.154175000000009,82.991088999999988],[-68.142226999999934,82.983597000000032],[-68.155272999999966,82.972487999999998],[-68.177779999999984,82.959991000000002],[-68.188599000000011,82.946091000000081],[-68.176391999999964,82.938873000000058],[-68.145554000000004,82.934981999999991],[-68.09973100000002,82.933594000000085],[-68.06806899999998,82.935257000000036],[-68.054169000000002,82.938873000000058],[-67.881667999999934,82.958878000000084],[-67.666945999999996,82.969711000000075],[-67.61082499999992,82.96887200000009],[-67.544158999999979,82.962203999999929],[-67.50140399999998,82.957214000000079],[-67.499999999999943,82.957016000000067],[-67.476104999999961,82.953598000000056],[-67.410003999999958,82.946640000000059],[-67.327788999999939,82.940811000000053],[-67.241669000000002,82.936919999999986],[-67.196655000000021,82.93609600000002],[-67.136123999999938,82.936646000000053],[-67.116942999999992,82.941086000000041],[-67.122771999999998,82.949142000000109],[-67.121658000000025,82.955261000000121],[-67.113327000000027,82.959427000000062],[-67.092223999999931,82.961104999999975],[-67.041107000000011,82.959717000000069],[-66.964721999999995,82.954163000000051],[-66.939986999999917,82.950546000000088],[-66.938323999999909,82.947754000000032],[-66.818893000000003,82.935257000000036],[-66.653060999999866,82.936371000000008],[-66.330001999999922,82.933868000000018],[-66.301391999999964,82.93193100000002],[-66.299437999999952,82.92942800000003],[-66.347503999999958,82.898041000000092],[-66.369155999999919,82.888321000000019],[-66.81138599999997,82.815262000000018],[-66.841110000000015,82.810806000000071],[-66.876663000000008,82.807205000000067],[-66.959732000000031,82.800812000000064],[-67.138335999999981,82.78387500000008],[-67.31527699999998,82.764709000000039],[-67.386123999999995,82.757767000000115],[-67.45777899999996,82.752212999999927],[-67.499999999999943,82.749611000000129],[-67.597778000000005,82.743590999999924],[-67.644729999999925,82.741652999999985],[-67.799164000000019,82.731658999999979],[-67.914168999999958,82.719986000000119],[-68.041381999999999,82.703873000000101],[-68.081679999999949,82.700821000000019],[-68.134170999999981,82.698593000000017],[-68.234726000000023,82.696640000000116],[-68.276108000000022,82.69470199999995],[-68.356658999999979,82.688034000000016],[-68.424437999999896,82.679703000000075],[-68.633621000000005,82.648605000000089],[-68.655838000000017,82.643600000000049],[-68.672225999999966,82.637772000000098],[-68.667220999999984,82.632477000000051],[-68.642501999999979,82.628585999999984],[-68.573623999999938,82.628860000000088],[-68.465011999999945,82.639435000000049],[-68.424437999999896,82.641937000000098],[-68.325835999999981,82.645537999999988],[-67.934998000000007,82.658324999999991],[-67.812774999999988,82.659149000000127],[-67.606658999999922,82.655548000000067],[-67.518065999999862,82.65109300000006],[-67.47084000000001,82.652205999999978],[-67.430557000000022,82.655548000000067],[-67.381942999999978,82.66276600000009],[-67.328063999999983,82.677199999999914],[-67.275283999999999,82.68609600000002],[-67.245834000000002,82.689697000000081],[-67.210830999999928,82.693587999999977],[-66.997771999999998,82.712203999999986],[-66.900283999999999,82.719437000000028],[-66.670837000000006,82.740265000000079],[-66.657227000000034,82.744430999999963],[-66.638335999999981,82.748871000000008],[-66.122771999999998,82.813034000000073],[-66.086670000000026,82.816665999999998],[-65.810271999999941,82.840820000000122],[-65.767776000000026,82.843048000000067],[-65.724166999999909,82.843597000000045],[-65.546660999999915,82.838043000000027],[-65.467772999999852,82.833327999999995],[-65.454726999999991,82.829162999999994],[-65.481673999999998,82.816665999999998],[-65.495834000000002,82.8119200000001],[-65.527221999999938,82.797484999999938],[-65.518065999999976,82.789978000000019],[-65.511123999999995,82.786652000000004],[-65.458617999999888,82.779433999999981],[-65.430832000000009,82.777481000000023],[-65.197494999999947,82.764160000000061],[-65.164444000000003,82.763046000000088],[-65.154723999999987,82.765274000000034],[-65.167496000000028,82.769989000000066],[-65.259170999999924,82.781662000000097],[-65.327498999999989,82.789154000000053],[-65.339721999999938,82.791930999999977],[-65.353057999999976,82.797211000000004],[-65.34445199999999,82.801926000000037],[-65.221938999999963,82.832764000000054],[-65.102782999999931,82.848037999999974],[-65.110001000000011,82.852767999999969],[-65.128052000000025,82.856094000000041],[-65.172775000000001,82.858321999999987],[-65.272781000000009,82.861099000000081],[-65.30749499999996,82.86554000000001],[-65.289168999999958,82.873306000000014],[-65.258057000000008,82.877472000000125],[-65.104720999999984,82.891663000000108],[-64.982223999999974,82.901093000000003],[-64.884734999999921,82.905823000000055],[-64.83555599999994,82.906937000000028],[-64.729720999999927,82.904160000000104],[-64.68472300000002,82.901657000000114],[-64.655562999999972,82.896942000000081],[-64.664168999999902,82.89027399999992],[-64.678604000000007,82.884720000000129],[-64.713897999999915,82.876372999999944],[-64.751953000000015,82.875259000000142],[-64.790558000000033,82.875809000000004],[-64.829726999999934,82.877762000000132],[-64.890288999999939,82.878036000000066],[-64.922501000000011,82.876372999999944],[-64.936934999999949,82.871368000000075],[-64.923614999999984,82.864699999999914],[-64.883895999999993,82.861649000000114],[-64.839995999999985,82.861923000000047],[-64.746384000000035,82.860535000000141],[-64.723052999999993,82.856369000000029],[-64.710555999999997,82.852478000000133],[-64.713897999999915,82.846375000000023],[-64.722777999999948,82.840820000000122],[-64.742217999999923,82.834427000000005],[-64.750838999999928,82.828323000000125],[-64.737777999999992,82.822220000000016],[-64.706954999999994,82.813034000000073],[-64.64805599999994,82.799713000000111],[-64.478607000000011,82.764435000000105],[-64.445266999999944,82.761932000000115],[-64.418059999999912,82.761382999999967],[-64.412780999999939,82.762206999999933],[-64.398055999999997,82.766936999999984],[-64.328888000000006,82.787201000000096],[-64.18638599999997,82.819153000000085],[-64.139998999999989,82.828049000000021],[-64.103058000000033,82.831665000000044],[-64.059722999999963,82.833327999999995],[-63.972770999999966,82.834991000000116],[-63.672775000000001,82.834717000000012],[-63.623610999999926,82.833603000000039],[-63.529723999999987,82.828323000000125],[-63.490836999999942,82.825272000000098],[-63.43472300000002,82.816665999999998],[-63.389167999999927,82.804977000000065],[-63.382499999999993,82.798325000000034],[-63.382216999999912,82.767761000000121],[-63.397223999999994,82.761382999999967],[-63.479163999999855,82.739425999999924],[-63.510284000000013,82.732483000000116],[-63.525832999999977,82.730545000000006],[-63.590836000000024,82.733047000000056],[-63.666106999999954,82.731368999999972],[-63.819449999999961,82.721374999999966],[-63.834998999999982,82.719147000000021],[-63.850280999999995,82.715820000000065],[-63.764450000000011,82.715271000000087],[-63.67888599999992,82.717758000000003],[-63.65166499999998,82.714996000000099],[-63.540001000000018,82.694427000000132],[-63.502040999999906,82.682762000000082],[-63.422226000000023,82.665543000000014],[-63.286948999999993,82.654434000000094],[-63.254447999999968,82.650269000000094],[-63.232215999999994,82.64498900000001],[-63.226105000000018,82.640273999999977],[-63.235557999999855,82.633330999999998],[-63.255835999999988,82.627197000000137],[-63.287223999999981,82.624985000000095],[-63.339721999999995,82.623596000000077],[-63.376388999999961,82.619980000000055],[-63.380829000000006,82.615265000000022],[-63.369445999999982,82.61053499999997],[-63.347495999999978,82.604980000000069],[-63.315001999999936,82.601089000000002],[-63.272223999999937,82.598602000000142],[-63.229720999999984,82.597214000000008],[-63.11361699999992,82.597487999999942],[-63.071113999999966,82.59637500000008],[-63.033614999999941,82.594436999999971],[-62.99639099999996,82.59027100000003],[-62.96416499999998,82.585541000000035],[-62.942496999999946,82.5816650000001],[-62.926108999999997,82.576096000000121],[-62.930557000000022,82.56999200000007],[-62.960555999999997,82.557754999999929],[-63.059440999999936,82.511932000000002],[-63.08943899999997,82.466385000000116],[-63.119994999999903,82.463608000000022],[-63.243889000000024,82.457764000000054],[-63.285004000000015,82.454987000000131],[-63.346106999999904,82.449142000000052],[-63.366111999999987,82.444977000000051],[-63.369995000000017,82.438873000000001],[-63.328613000000018,82.437759000000028],[-63.277221999999938,82.439148000000046],[-63.148887999999999,82.446929999999952],[-63.071670999999981,82.451935000000049],[-63.015838999999971,82.459716999999955],[-62.990836999999885,82.467209000000082],[-62.920836999999949,82.491089000000102],[-62.823616000000015,82.504440000000045],[-62.678336999999999,82.516098000000056],[-62.553328999999962,82.524428999999998],[-62.506667999999877,82.526657000000114],[-62.286948999999993,82.528046000000131],[-62.24500299999994,82.528046000000131],[-62.171669000000009,82.525542999999971],[-62.171386999999982,82.521378000000141],[-62.322776999999974,82.511108000000036],[-62.333060999999987,82.504166000000112],[-62.353057999999976,82.486374000000069],[-62.352782999999931,82.481093999999985],[-62.300835000000006,82.482483000000002],[-62.264449999999954,82.485809000000017],[-62.21566799999988,82.491928000000087],[-62.212497999999869,82.495766000000003],[-62.098052999999936,82.502212999999983],[-61.884170999999981,82.492752000000053],[-61.691665999999998,82.48803700000002],[-61.582503999999972,82.482483000000002],[-61.530829999999867,82.478317000000118],[-61.5,82.474152000000117],[-61.448607999999979,82.464431999999988],[-61.326110999999969,82.439697000000137],[-61.28556100000003,82.430267000000072],[-61.170279999999877,82.395264000000111],[-61.141113000000018,82.383041000000048],[-61.131385999999907,82.377472000000068],[-61.11222099999992,82.363876000000062],[-61.098609999999951,82.350266000000033],[-61.076392999999996,82.320831000000112],[-61.078613000000018,82.301086000000112],[-61.084723999999994,82.293593999999985],[-61.107779999999934,82.267761000000064],[-61.130359999999996,82.252937000000088],[-61.135558999999944,82.247482000000105],[-61.15694400000001,82.235259999999982],[-61.193328999999949,82.223602000000085],[-61.281112999999948,82.202774000000034],[-61.306389000000024,82.197205000000054],[-61.388054000000011,82.18331900000004],[-61.43332700000002,82.176376000000062],[-61.463614999999891,82.172484999999995],[-61.534171999999899,82.165543000000071],[-61.599441999999954,82.160812000000135],[-61.804442999999992,82.146652000000074],[-61.86999499999996,82.106644000000017],[-61.885001999999986,82.100539999999967],[-62.077781999999956,82.053588999999988],[-62.126944999999978,82.043869000000086],[-62.25417299999998,82.019989000000066],[-62.278885000000002,82.015822999999955],[-62.313056999999958,82.01249700000011],[-62.356948999999929,82.010268999999994],[-62.513618000000008,82.004715000000147],[-62.570281999999963,81.976089000000059],[-62.944999999999993,81.922211000000118],[-63.040557999999976,81.909714000000122],[-63.292502999999897,81.877761999999962],[-63.387221999999952,81.867752000000053],[-63.656104999999968,81.837494000000106],[-63.715003999999965,81.820831000000055],[-63.761116000000015,81.811645999999996],[-63.817223000000013,81.804703000000018],[-63.849723999999924,81.801086000000055],[-63.925003000000004,81.795258000000103],[-63.962775999999963,81.792480000000126],[-64.010009999999966,81.790268000000083],[-64.053054999999915,81.789978000000019],[-64.086945000000014,81.791930999999977],[-64.111663999999962,81.794983000000116],[-64.131667999999991,81.799149],[-64.142226999999934,81.803040000000067],[-64.177779999999984,81.810532000000023],[-64.207503999999972,81.81442300000009],[-64.271666999999923,81.821655000000021],[-64.301392000000021,81.824157999999954],[-64.325287000000003,81.824707000000103],[-64.323623999999995,81.819153000000085],[-64.308043999999995,81.814697000000024],[-64.253066999999987,81.806091000000094],[-64.232772999999952,81.800537000000077],[-64.12388599999997,81.768326000000002],[-64.118057000000022,81.764435000000105],[-64.134734999999921,81.754715000000033],[-64.207779000000016,81.74192800000003],[-64.355269999999962,81.726379000000122],[-64.472503999999958,81.721374999999966],[-64.629439999999931,81.722488000000055],[-64.720001000000025,81.723877000000073],[-64.767776000000026,81.725815000000011],[-64.801665999999955,81.728317000000061],[-64.812209999999993,81.730820000000051],[-64.833892999999932,81.738876000000118],[-64.839721999999938,81.742203000000075],[-64.885559000000001,81.750823999999966],[-64.910004000000015,81.752777000000094],[-64.962218999999948,81.752212999999983],[-65.21665999999999,81.74552900000009],[-65.337508999999955,81.737761999999975],[-65.409728999999913,81.728317000000061],[-65.631377999999927,81.70248400000014],[-65.668334999999956,81.700821000000019],[-65.725554999999929,81.701660000000004],[-65.773330999999985,81.702773999999977],[-65.924437999999952,81.70138500000013],[-66.012221999999952,81.696930000000123],[-66.038605000000018,81.692474000000004],[-66.042220999999984,81.690536000000066],[-66.030288999999925,81.684982000000105],[-65.991378999999995,81.682755000000043],[-65.821944999999971,81.684417999999937],[-65.612503000000004,81.680817000000104],[-65.487777999999935,81.687485000000038],[-65.404175000000009,81.69081100000011],[-65.352492999999868,81.691925000000083],[-65.336670000000026,81.688034000000016],[-65.370833999999945,81.678863999999976],[-65.402221999999995,81.674423000000047],[-65.523620999999991,81.659714000000008],[-65.618056999999908,81.648605000000089],[-65.789443999999946,81.632202000000063],[-65.871657999999911,81.627197000000024],[-65.910278000000005,81.629699999999957],[-65.926391999999964,81.634154999999964],[-65.92721599999993,81.635543999999982],[-65.924437999999952,81.639708999999982],[-65.92721599999993,81.645827999999995],[-65.943328999999892,81.650543000000027],[-65.982223999999917,81.65277100000003],[-66.024718999999948,81.653046000000018],[-66.042770000000019,81.651657],[-66.064712999999983,81.647765999999933],[-66.085555999999997,81.642761000000064],[-66.101943999999946,81.637207000000103],[-66.140838999999971,81.620529000000033],[-66.172501000000011,81.618042000000116],[-66.218886999999938,81.616928000000144],[-66.355270000000019,81.617477000000122],[-66.393889999999942,81.619705000000067],[-66.439712999999983,81.62692300000009],[-66.478333000000021,81.628585999999984],[-66.575561999999934,81.626082999999994],[-66.727492999999924,81.6202550000001],[-66.804992999999854,81.615814],[-66.896392999999932,81.611923000000104],[-67.15695199999999,81.608032000000037],[-67.509170999999924,81.60054000000008],[-67.55972300000002,81.599152000000004],[-67.766662999999994,81.593047999999953],[-67.792770000000019,81.589706000000035],[-68.111389000000031,81.56303400000013],[-68.156661999999983,81.56109600000002],[-68.231383999999991,81.561371000000008],[-68.274718999999948,81.562759000000085],[-68.309433000000013,81.565536000000009],[-68.330565999999919,81.56860400000005],[-68.352492999999981,81.573044000000039],[-68.410277999999892,81.588043000000084],[-68.459731999999974,81.597487999999998],[-68.661391999999978,81.633330999999998],[-68.715285999999992,81.642211999999972],[-68.976944000000003,81.684417999999937],[-69.058883999999921,81.697479000000101],[-69.139998999999989,81.70887799999997],[-69.176392000000021,81.712494000000049],[-69.247222999999963,81.71748400000007],[-69.291381999999999,81.718871999999976],[-69.299438000000009,81.717209000000082],[-69.306655999999975,81.714431999999988],[-69.291381999999999,81.707763999999997],[-69.268065999999976,81.70248400000014],[-69.214172000000019,81.695251000000098],[-69.123610999999983,81.683868000000132],[-69.005279999999914,81.667480000000069],[-68.902221999999995,81.651382000000012],[-68.624709999999993,81.604430999999977],[-68.449158000000011,81.570831000000055],[-68.370833999999888,81.553589000000045],[-68.357772999999952,81.548325000000091],[-68.352492999999981,81.541656000000046],[-68.37332200000003,81.537766000000033],[-68.407500999999968,81.533874999999966],[-68.504455999999948,81.532211000000132],[-68.551391999999964,81.532760999999994],[-68.637512000000015,81.535538000000088],[-68.715285999999992,81.539703000000088],[-68.810821999999916,81.548599000000024],[-68.848891999999978,81.549149000000057],[-68.856948999999986,81.547760000000039],[-68.851944000000003,81.541656000000046],[-68.839172000000019,81.536925999999994],[-68.813048999999978,81.533325000000104],[-68.777495999999928,81.529709000000082],[-68.579452999999887,81.514434999999992],[-68.536666999999966,81.513321000000019],[-68.446654999999964,81.517487000000074],[-68.376098999999954,81.522766000000047],[-68.285827999999924,81.526931999999988],[-68.091949,81.529160000000104],[-68.051101999999958,81.53054800000001],[-68.011123999999938,81.533051],[-67.910003999999958,81.542206000000078],[-67.819732999999871,81.546936000000073],[-67.724716000000001,81.551086000000112],[-67.383651999999984,81.56088299999999],[-67.182495000000017,81.564697000000081],[-67.150283999999942,81.564987000000087],[-67.107773000000009,81.564987000000087],[-67.064712999999983,81.562759000000085],[-66.859726000000023,81.546646000000067],[-66.791381999999885,81.540817000000061],[-66.766112999999962,81.537491000000045],[-66.629990000000021,81.518051000000014],[-66.608611999999994,81.512772000000041],[-66.62388599999997,81.506378000000041],[-66.741104000000007,81.491928000000087],[-66.887787000000003,81.480545000000063],[-66.962783999999942,81.474991000000102],[-67.043334999999956,81.469711000000018],[-67.248336999999992,81.44999700000011],[-67.457503999999972,81.423035000000027],[-67.753890999999896,81.391663000000051],[-67.818344000000025,81.385268999999994],[-67.994719999999973,81.368042000000003],[-68.244720000000029,81.33998100000008],[-68.355835000000013,81.32388300000008],[-68.429169000000002,81.31164600000011],[-68.486938000000009,81.303863999999976],[-68.618057000000022,81.290543000000014],[-68.796951000000035,81.275269000000094],[-69.028609999999958,81.258606000000043],[-69.319457999999997,81.260268999999937],[-69.34056099999998,81.263885000000016],[-69.357773000000009,81.268326000000116],[-69.362777999999992,81.268875000000037],[-69.391388000000006,81.270537999999988],[-69.426940999999943,81.26998900000001],[-69.455565999999976,81.265823000000125],[-69.468886999999995,81.259995000000004],[-69.46305799999999,81.253326000000129],[-69.436934999999949,81.249145999999939],[-69.366652999999985,81.246368000000132],[-69.319457999999997,81.243591000000038],[-69.312209999999993,81.240540000000067],[-69.323897999999929,81.238037000000077],[-69.541671999999949,81.212493999999936],[-69.911941999999954,81.182480000000112],[-69.999434999999949,81.179977000000122],[-70.158339999999953,81.181366000000139],[-70.206389999999942,81.179703000000018],[-70.210007000000019,81.173874000000012],[-70.126098999999954,81.165543000000127],[-70.050551999999982,81.161652000000061],[-69.960281000000009,81.160538000000088],[-69.907227000000034,81.161652000000061],[-69.864440999999999,81.16415400000011],[-69.760009999999966,81.173035000000027],[-69.638061999999991,81.177475000000072],[-69.647506999999962,81.172484999999995],[-69.831954999999994,81.137206999999989],[-69.887786999999946,81.129150000000038],[-69.953063999999983,81.122208000000114],[-69.976943999999946,81.118866000000025],[-70.013061999999934,81.109146000000123],[-70.025283999999999,81.102767999999969],[-70.023330999999985,81.100815000000011],[-69.995269999999948,81.099426000000051],[-69.955565999999976,81.099426000000051],[-69.922225999999966,81.102203000000145],[-69.832229999999981,81.111649000000114],[-69.632492000000013,81.139160000000118],[-69.609726000000023,81.14387499999998],[-69.591675000000009,81.14888000000002],[-69.541671999999949,81.164428999999927],[-69.528335999999911,81.169434000000024],[-69.463333000000034,81.183044000000052],[-69.430556999999965,81.187194999999974],[-69.359436000000017,81.193313999999987],[-68.876099000000011,81.231094000000098],[-68.760833999999932,81.239426000000037],[-68.37388599999997,81.266662999999994],[-68.246947999999975,81.272766000000104],[-68.116652999999928,81.280273000000079],[-68.052779999999984,81.286102000000085],[-67.887221999999952,81.30304000000001],[-67.823623999999938,81.310257000000092],[-67.791107000000011,81.315536000000066],[-67.690826000000015,81.329437000000041],[-67.593062999999972,81.340271000000087],[-67.356658999999979,81.363601999999958],[-67.24749799999995,81.371918000000051],[-67.124160999999901,81.379700000000014],[-66.990554999999915,81.385544000000039],[-66.621383999999978,81.413879000000065],[-66.365828999999962,81.434708000000001],[-66.290282999999988,81.440262000000018],[-66.16972399999986,81.447754000000145],[-66.134170999999924,81.450821000000076],[-66.050827000000027,81.459152000000131],[-65.985549999999989,81.468048000000067],[-65.831679999999949,81.484711000000004],[-65.724715999999944,81.493866000000025],[-65.643616000000009,81.498871000000065],[-65.557495000000017,81.503052000000139],[-65.466400000000021,81.506378000000041],[-65.252791999999943,81.517212000000086],[-65.002791999999999,81.530823000000055],[-64.612503000000004,81.544982999999945],[-64.566390999999953,81.545532000000094],[-64.537780999999995,81.543593999999985],[-64.528060999999923,81.541656000000046],[-64.517501999999979,81.537491000000045],[-64.444152999999972,81.490814000000114],[-64.436385999999914,81.479431000000091],[-64.451110999999969,81.466934000000094],[-64.491942999999992,81.448868000000118],[-64.508620999999948,81.441924999999969],[-64.520844000000011,81.4369200000001],[-64.554169000000002,81.425812000000064],[-64.616652999999928,81.404984000000013],[-64.658889999999985,81.393050999999957],[-64.735274999999945,81.374146000000053],[-64.808608999999933,81.360535000000084],[-64.855835000000013,81.352768000000083],[-64.99499499999996,81.333328000000108],[-65.060271999999998,81.326096000000007],[-65.168059999999969,81.309982000000048],[-65.286391999999978,81.287201000000039],[-65.323623999999995,81.278046000000018],[-65.441375999999934,81.256378000000041],[-65.493057000000022,81.250549000000035],[-65.527785999999992,81.247481999999934],[-65.571670999999981,81.244980000000055],[-65.747771999999998,81.235809000000131],[-65.941101000000003,81.226379000000065],[-65.980559999999912,81.22387700000013],[-66.010284000000013,81.220261000000107],[-66.199721999999895,81.183868000000018],[-66.244445999999868,81.17442299999999],[-66.264449999999954,81.169434000000024],[-66.418335000000013,81.128860000000032],[-66.438048999999978,81.12359600000002],[-66.482772999999952,81.106934000000081],[-66.50418099999996,81.095534999999984],[-66.509445000000028,81.08859300000006],[-66.529723999999987,81.076096000000064],[-66.544723999999974,81.070540999999992],[-66.603333000000021,81.05525200000011],[-66.685821999999973,81.035812000000135],[-66.753341999999975,81.021927000000005],[-66.921111999999994,80.991089000000045],[-67.164443999999946,80.948593000000017],[-67.208618000000001,80.941925000000026],[-67.279175000000009,80.93553200000008],[-67.309158000000025,80.934418000000107],[-67.349441999999954,80.936371000000065],[-67.440825999999959,80.936646000000053],[-67.562209999999993,80.93553200000008],[-67.591384999999946,80.933044000000109],[-67.606658999999922,80.929977000000008],[-67.603607000000011,80.92442299999999],[-67.588333000000034,80.913878999999952],[-67.567779999999971,80.908599999999979],[-67.543335000000013,80.90415999999999],[-67.53083799999996,80.897491000000116],[-67.539992999999981,80.891098000000113],[-67.583618000000001,80.876648000000046],[-67.634445000000028,80.860809000000074],[-67.653609999999958,80.856369000000086],[-67.863891999999964,80.834152000000017],[-67.910278000000005,80.8119200000001],[-67.965835999999911,80.797484999999995],[-68.011397999999986,80.788315000000125],[-68.065552000000025,80.779160000000104],[-68.089447000000007,80.776093000000003],[-68.138335999999981,80.772491000000002],[-68.202788999999939,80.765823000000069],[-68.225280999999939,80.761383000000023],[-68.672500999999897,80.66693099999992],[-68.738891999999908,80.647217000000012],[-68.814712999999983,80.628586000000041],[-68.952498999999875,80.603043000000071],[-69.146666999999923,80.529709000000082],[-69.171111999999994,80.517487000000131],[-69.273055999999997,80.463882000000012],[-69.289168999999958,80.451660000000061],[-69.291381999999999,80.444138000000123],[-69.290558000000033,80.437194999999917],[-69.297774999999945,80.424698000000149],[-69.305557000000022,80.418319999999994],[-69.317504999999983,80.412490999999989],[-69.333892999999932,80.406647000000135],[-69.384734999999921,80.391937000000041],[-69.427489999999977,80.382751000000042],[-69.479720999999984,80.37553400000013],[-69.551102000000014,80.366379000000109],[-69.596389999999872,80.361099000000024],[-69.729720999999927,80.352767999999969],[-69.982772999999895,80.344986000000006],[-70.072783999999956,80.344437000000028],[-70.218886999999938,80.346374999999966],[-70.284438999999907,80.351089000000115],[-70.305266999999958,80.356093999999985],[-70.310821999999973,80.363037000000134],[-70.285827999999981,80.372482000000048],[-70.256393000000003,80.381362999999965],[-70.244155999999919,80.386658000000011],[-70.227782999999988,80.401382000000069],[-70.220001000000025,80.416930999999977],[-70.235000999999897,80.429703000000018],[-70.275283999999942,80.44802900000002],[-70.314163000000008,80.464432000000045],[-70.499434999999949,80.513884999999959],[-70.539992999999924,80.521927000000119],[-70.68110699999994,80.548035000000084],[-70.706116000000009,80.552475000000129],[-70.754729999999995,80.559418000000107],[-70.783065999999963,80.56303400000013],[-70.812499999999886,80.562759000000142],[-70.825286999999889,80.558593999999971],[-70.827498999999932,80.551376000000118],[-70.813048999999921,80.544983000000002],[-70.796111999999994,80.540543000000127],[-70.765288999999996,80.534424000000115],[-70.741668999999945,80.531372000000033],[-70.670837000000006,80.518051000000071],[-70.637786999999946,80.509155000000135],[-70.531386999999995,80.474426000000051],[-70.490554999999915,80.460815000000082],[-70.476669000000015,80.454436999999984],[-70.423324999999977,80.42164600000001],[-70.434722999999963,80.391663000000108],[-70.450561999999991,80.385817999999972],[-70.458892999999989,80.381362999999965],[-70.472228999999913,80.368042000000003],[-70.471389999999985,80.362488000000042],[-70.469161999999983,80.354980000000012],[-70.462219000000005,80.346939000000134],[-70.444153000000028,80.340271000000143],[-70.424164000000019,80.336105000000032],[-70.352492999999924,80.324707000000046],[-70.309998000000007,80.318054000000075],[-70.252791999999943,80.313309000000061],[-70.15055799999999,80.299149000000114],[-70.035278000000005,80.278320000000122],[-69.991103999999893,80.268875000000094],[-69.974166999999966,80.263046000000088],[-69.960555999999997,80.256378000000097],[-69.965285999999935,80.252213000000097],[-69.990828999999962,80.24331699999999],[-70.128326000000015,80.19720500000011],[-70.145554000000004,80.193587999999977],[-70.178604000000007,80.189148000000102],[-70.21665999999999,80.186371000000008],[-70.24888599999997,80.18609600000002],[-70.315001999999879,80.187484999999981],[-70.611388999999974,80.19720500000011],[-70.645554000000004,80.199142000000109],[-70.821121000000005,80.195526000000086],[-71.120833999999945,80.172485000000052],[-71.180556999999908,80.166656000000046],[-71.238326999999913,80.158874999999966],[-71.381942999999978,80.139160000000004],[-71.418610000000001,80.131088000000034],[-71.446105999999929,80.121368000000132],[-71.463057999999933,80.118042000000059],[-71.50111400000003,80.11554000000001],[-71.654448999999943,80.111374000000069],[-71.694442999999978,80.110809000000074],[-71.731948999999929,80.111923000000047],[-71.762787000000003,80.114426000000037],[-71.789992999999981,80.117752000000053],[-71.811660999999901,80.123596000000077],[-71.836120999999991,80.131927000000132],[-71.848052999999993,80.143875000000037],[-71.878600999999946,80.162491000000045],[-71.907776000000013,80.171371000000079],[-71.953339000000028,80.180542000000003],[-72.006393000000003,80.188583000000108],[-72.057220000000029,80.19470200000012],[-72.081116000000009,80.194138000000009],[-72.099990999999875,80.192748999999992],[-72.127776999999924,80.187759000000142],[-72.165282999999988,80.188873000000115],[-72.189163000000008,80.192200000000014],[-72.223327999999981,80.201660000000118],[-72.241378999999995,80.207489000000123],[-72.256392999999946,80.213882000000069],[-72.274445000000014,80.219711000000075],[-72.294448999999872,80.223312000000135],[-72.329726999999878,80.22554000000008],[-72.358886999999925,80.226089000000059],[-72.378051999999968,80.224700999999982],[-72.391113000000018,80.221649000000014],[-72.400283999999942,80.218597000000102],[-72.420837000000006,80.211104999999975],[-72.412506000000008,80.207214000000079],[-72.188598999999954,80.163879000000122],[-72.140839000000028,80.156937000000028],[-72.082779000000016,80.151656999999943],[-72.052489999999977,80.149719000000005],[-71.996947999999861,80.143051000000071],[-71.977218999999934,80.139434999999992],[-71.896956999999929,80.11554000000001],[-71.895553999999947,80.114150999999993],[-71.898055999999997,80.108597000000032],[-71.905272999999966,80.103591999999935],[-71.926102000000014,80.099991000000102],[-71.954726999999934,80.096375000000023],[-72.115554999999972,80.087494000000106],[-72.250564999999938,80.085541000000148],[-72.391677999999956,80.085541000000148],[-72.392226999999991,80.081940000000088],[-72.358337000000006,80.064987000000031],[-72.340560999999923,80.059143000000006],[-72.306380999999988,80.057480000000055],[-72.170272999999952,80.053864000000033],[-72.137787000000003,80.053588999999988],[-72.053054999999915,80.057480000000055],[-71.920836999999949,80.066375999999991],[-71.885833999999932,80.067215000000147],[-71.849730999999906,80.067764000000125],[-71.701950000000011,80.064148000000046],[-71.618057000000022,80.06442300000009],[-71.489166000000012,80.068878000000097],[-71.376098999999954,80.076935000000049],[-71.316665999999941,80.081940000000088],[-71.186385999999914,80.093872000000033],[-70.968063000000029,80.114990000000148],[-70.854720999999984,80.12831100000011],[-70.821121000000005,80.131088000000034],[-70.762512000000015,80.133330999999941],[-70.651671999999962,80.131363000000022],[-70.626663000000008,80.130539000000056],[-70.50778200000002,80.099716000000058],[-70.502227999999945,80.093048000000067],[-70.497498000000007,80.082764000000054],[-70.48832699999997,80.057205000000067],[-70.494995000000017,80.050812000000121],[-70.508346999999958,80.047759999999982],[-70.568068999999923,80.042755000000113],[-70.59722899999997,80.039429000000098],[-70.646666999999979,80.031936999999971],[-70.662216000000001,80.026657000000057],[-70.673049999999989,80.020828000000051],[-70.679717999999866,80.014435000000105],[-70.672774999999945,80.006377999999984],[-70.672501000000011,80.001389000000017],[-70.689712999999983,79.993317000000047],[-70.71945199999999,79.986374000000012],[-70.767226999999878,79.981658999999979],[-70.916107000000011,79.974425999999994],[-70.954178000000013,79.972763000000043],[-71.08555599999994,79.968596999999988],[-71.241669000000002,79.960815000000025],[-71.27027899999996,79.957214000000135],[-71.401108000000022,79.93553199999991],[-71.416397000000018,79.930267000000072],[-71.453612999999962,79.906372000000033],[-71.460555999999883,79.901382000000012],[-71.458892999999932,79.894989000000066],[-71.438599000000011,79.88998399999997],[-71.415832999999907,79.886658000000125],[-71.394454999999994,79.884995000000004],[-71.352782999999931,79.886932000000058],[-71.338608000000022,79.888596000000064],[-71.168335000000013,79.914153999999996],[-71.109725999999966,79.915267999999969],[-71.063048999999978,79.911652000000117],[-70.944716999999969,79.894150000000081],[-70.925827000000027,79.890274000000034],[-70.910278000000005,79.885818000000086],[-70.916397000000018,79.879424999999969],[-71.005843999999968,79.819717000000082],[-71.116652999999985,79.789703000000088],[-71.136123999999938,79.784988000000055],[-71.183884000000035,79.77748100000008],[-71.212783999999999,79.774428999999998],[-71.343612999999948,79.76388500000013],[-71.376098999999954,79.760818000000029],[-71.400283999999999,79.757492000000013],[-71.444442999999922,79.741653000000042],[-71.463333000000034,79.736923000000047],[-71.49110399999995,79.733321999999987],[-71.699158000000011,79.709991000000116],[-71.739440999999943,79.707214000000022],[-71.781113000000005,79.706100000000049],[-71.817504999999983,79.703597999999943],[-71.922500999999954,79.695525999999973],[-71.990279999999984,79.689148000000046],[-72.096664000000033,79.674988000000099],[-72.217772999999909,79.659987999999998],[-72.267226999999934,79.659149000000014],[-72.287215999999944,79.659987999999998],[-72.317779999999914,79.667205999999965],[-72.330841000000021,79.672484999999938],[-72.348052999999879,79.678040000000067],[-72.367217999999923,79.681656000000089],[-72.392226999999991,79.683594000000028],[-72.425003000000004,79.685531999999967],[-72.467223999999931,79.684708000000001],[-72.574172999999917,79.679153000000099],[-72.619445999999925,79.677765000000022],[-72.661391999999978,79.677199999999971],[-72.697220000000016,79.678040000000067],[-72.729995999999971,79.679703000000131],[-72.756119000000012,79.682205000000067],[-72.912780999999939,79.702208999999982],[-72.932769999999948,79.706375000000037],[-72.944442999999978,79.710266000000104],[-73.062774999999988,79.79942299999999],[-73.061110999999983,79.805251999999996],[-73.048614999999984,79.808319000000097],[-73.027495999999985,79.80693100000002],[-73.017226999999934,79.804703000000018],[-73.003341999999975,79.803040000000124],[-72.979171999999949,79.802200000000084],[-72.945830999999998,79.804152999999985],[-72.924437999999952,79.806366000000139],[-72.912216000000001,79.809418000000051],[-72.902495999999928,79.815262000000075],[-72.926392000000021,79.819442999999978],[-73.059158000000025,79.825546000000088],[-73.091675000000009,79.826385000000073],[-73.178328999999906,79.822768999999994],[-73.218063000000029,79.822768999999994],[-73.285003999999958,79.826096000000121],[-73.348617999999988,79.83027600000014],[-73.371383999999978,79.833054000000118],[-73.396956999999986,79.834991000000002],[-73.43360899999999,79.835815000000139],[-73.576401000000033,79.832764000000111],[-73.667770000000019,79.829712000000029],[-73.745270000000005,79.828323000000012],[-73.780288999999982,79.82777400000009],[-73.853332999999907,79.829163000000051],[-73.866942999999992,79.830826000000002],[-73.864715999999987,79.835815000000139],[-73.853607000000011,79.839706000000035],[-73.801666000000012,79.84637500000008],[-73.745543999999938,79.849152000000004],[-73.742492999999854,79.849990999999932],[-73.746947999999975,79.854155999999932],[-73.768615999999895,79.858870999999965],[-73.890839000000028,79.875259000000028],[-73.945830999999885,79.881653000000085],[-74.010284000000013,79.885818000000086],[-74.117492999999968,79.888885000000016],[-74.156951999999933,79.888885000000016],[-74.238891999999964,79.887207000000103],[-74.283614999999941,79.881363000000079],[-74.30610699999994,79.876923000000033],[-74.383621000000005,79.868591000000094],[-74.415282999999988,79.865265000000022],[-74.576401000000033,79.856934000000138],[-74.667495999999971,79.853591999999992],[-74.795272999999952,79.850815000000125],[-74.833069000000023,79.849152000000004],[-74.846389999999985,79.847214000000065],[-74.846114999999941,79.84387200000009],[-74.71665999999999,79.796936000000073],[-74.699431999999945,79.792755],[-74.683884000000035,79.789978000000076],[-74.654998999999975,79.788879000000122],[-74.488892000000021,79.791655999999989],[-74.444992000000013,79.794708000000128],[-74.392226999999934,79.800261999999918],[-74.351668999999958,79.802475000000072],[-74.309432999999956,79.803314000000057],[-74.236388999999974,79.801925999999924],[-74.106383999999878,79.795532000000094],[-73.951401000000033,79.784424000000115],[-73.714721999999938,79.76638800000012],[-73.510833999999988,79.756377999999984],[-73.384734999999921,79.748871000000065],[-73.366652999999985,79.718048000000067],[-73.360824999999863,79.712769000000094],[-73.295546999999999,79.688582999999994],[-73.256957999999884,79.678040000000067],[-73.206664999999987,79.663605000000132],[-73.188889000000017,79.658035000000041],[-73.174438000000009,79.651657000000057],[-73.168334999999956,79.646103000000096],[-73.126098999999897,79.569443000000035],[-73.125823999999966,79.558318999999983],[-73.128875999999991,79.554153000000042],[-73.135833999999988,79.549713000000054],[-73.148620999999991,79.543593999999985],[-73.163054999999986,79.538878999999952],[-73.180831999999953,79.534149000000127],[-73.247222999999963,79.520827999999995],[-73.296111999999937,79.512772000000098],[-73.353881999999942,79.505829000000119],[-73.446380999999917,79.499145999999939],[-73.657776000000013,79.496368000000132],[-73.693054000000018,79.496933000000013],[-73.729172000000005,79.498596000000077],[-73.758057000000008,79.500275000000101],[-73.779998999999975,79.503052000000025],[-73.791945999999939,79.506653000000085],[-73.817229999999938,79.515549000000021],[-73.837783999999999,79.527480999999966],[-73.863892000000021,79.540267999999969],[-73.876662999999951,79.544708000000014],[-73.916106999999954,79.552475000000129],[-73.950286999999889,79.555252000000053],[-73.965012000000002,79.554703000000075],[-73.988892000000021,79.55192599999998],[-74.001113999999973,79.545821999999987],[-74.000290000000007,79.541656000000046],[-73.996947999999975,79.535537999999917],[-73.989440999999943,79.528595000000109],[-73.968612999999891,79.516937000000098],[-73.959166999999923,79.508881000000031],[-73.949996999999939,79.493866000000082],[-73.949721999999952,79.479980000000069],[-73.953063999999983,79.472762999999986],[-73.961945000000014,79.466933999999981],[-73.98332199999993,79.455551000000128],[-73.998046999999985,79.451385000000073],[-74.023620999999991,79.446930000000066],[-74.081389999999999,79.440536000000009],[-74.11610399999995,79.43803400000013],[-74.160278000000005,79.436371000000008],[-74.198333999999988,79.436095999999964],[-74.544158999999922,79.43803400000013],[-74.617492999999854,79.438583000000051],[-74.673614999999927,79.444138000000123],[-74.688598999999897,79.446930000000066],[-74.931670999999938,79.498871000000122],[-74.932410999999888,79.504798999999991],[-74.941939999999988,79.510543999999982],[-74.96444699999995,79.513046000000031],[-74.987503000000004,79.509995000000004],[-75.043334999999956,79.49581900000004],[-75.060271999999884,79.490813999999943],[-75.059433000000013,79.483871000000136],[-74.995269999999948,79.453598],[-74.983062999999959,79.449706999999933],[-74.948882999999967,79.440810999999997],[-74.912215999999944,79.429703000000018],[-74.897231999999974,79.423308999999961],[-74.884444999999971,79.416092000000049],[-74.883056999999894,79.408325000000104],[-74.911117999999988,79.39387499999998],[-74.93499799999995,79.385269000000051],[-74.951949999999954,79.380264000000011],[-75,79.375488000000075],[-75.016953000000001,79.374146000000053],[-75.058334000000002,79.373871000000065],[-75.213897999999972,79.376373000000115],[-75.31361400000003,79.379974000000004],[-75.410278000000005,79.384155000000078],[-75.531386999999995,79.392487000000074],[-75.695266999999944,79.409987999999998],[-75.799728000000016,79.431366000000139],[-75.907776000000013,79.426086000000055],[-75.931380999999988,79.423598999999967],[-75.957503999999972,79.426086000000055],[-75.985275000000001,79.429703000000018],[-76.031386999999995,79.438309000000118],[-76.049164000000019,79.443038999999999],[-76.097503999999958,79.461929000000112],[-76.109160999999915,79.467758000000117],[-76.115279999999927,79.472487999999942],[-76.124160999999958,79.476379000000009],[-76.138610999999912,79.481369000000086],[-76.175827000000027,79.488876000000005],[-76.203888000000006,79.492477000000065],[-76.261123999999995,79.497756999999979],[-76.320281999999906,79.501389000000074],[-76.636123999999995,79.519440000000088],[-76.665282999999988,79.520827999999995],[-76.718338000000017,79.51998900000001],[-76.795273000000009,79.51138300000008],[-76.834441999999967,79.508881000000031],[-76.872771999999998,79.508606000000043],[-76.90583799999996,79.509720000000016],[-77.050277999999992,79.518600000000049],[-77.069732999999985,79.523880000000077],[-77.092772999999909,79.539703000000145],[-77.112212999999997,79.545258000000047],[-77.142501999999865,79.547485000000052],[-77.160552999999936,79.543593999999985],[-77.191375999999934,79.511108000000092],[-77.184433000000013,79.503600999999946],[-77.178604000000007,79.499710000000107],[-77.134444999999971,79.490265000000022],[-77.071670999999924,79.486923000000104],[-76.895554000000004,79.48054500000012],[-76.867217999999923,79.479705999999965],[-76.612503000000004,79.474701000000096],[-76.406386999999995,79.473602000000142],[-76.204726999999991,79.461380000000133],[-76.179168999999888,79.459717000000069],[-76.159438999999963,79.456375000000094],[-76.143341000000021,79.449996999999939],[-76.138061999999934,79.443313999999987],[-76.138901000000033,79.441086000000041],[-76.149993999999992,79.437759000000085],[-76.159164000000033,79.436095999999964],[-76.189986999999974,79.433319000000097],[-76.208054000000004,79.429703000000018],[-76.205565999999976,79.424698000000149],[-76.167496000000028,79.396102999999925],[-76.157501000000025,79.391663000000108],[-76.11721799999998,79.384430000000123],[-76.083327999999995,79.378860000000032],[-76.059157999999968,79.374985000000038],[-75.902221999999995,79.357207999999957],[-75.881942999999978,79.353317000000118],[-75.879165999999998,79.351378999999952],[-75.889998999999875,79.348037999999917],[-75.902785999999878,79.346099999999979],[-76.086670000000026,79.332214000000022],[-76.12332200000003,79.331100000000049],[-76.351104999999961,79.341934000000094],[-76.682770000000005,79.352767999999969],[-76.717772999999909,79.353317000000118],[-76.790557999999976,79.353317000000118],[-76.829178000000013,79.350815000000011],[-76.869719999999973,79.349426000000051],[-76.89416499999993,79.353317000000118],[-76.959441999999967,79.367203000000075],[-77.018889999999999,79.381927000000132],[-77.076401000000033,79.398331000000098],[-77.090285999999935,79.40554800000001],[-77.105559999999912,79.416092000000049],[-77.108337000000006,79.420822000000101],[-77.212509000000011,79.447754000000032],[-77.326400999999976,79.454163000000051],[-77.359160999999915,79.455551000000128],[-77.386123999999938,79.452774000000034],[-77.397507000000019,79.447205000000054],[-77.395003999999972,79.440262000000075],[-77.384445000000028,79.433044000000052],[-77.262221999999952,79.372482000000048],[-77.172500999999954,79.336380000000077],[-77.158614999999998,79.329162999999994],[-77.163894999999968,79.324707000000046],[-77.187774999999988,79.322769000000108],[-77.228058000000033,79.321655000000135],[-77.260559000000001,79.322769000000108],[-77.317229999999938,79.327773999999977],[-77.36721799999998,79.336105000000089],[-77.386397999999986,79.33859300000006],[-77.41361999999998,79.34165999999999],[-77.466110000000015,79.346099999999979],[-77.477782999999931,79.346099999999979],[-77.596114999999941,79.345824999999991],[-77.634170999999924,79.345534999999984],[-77.707503999999972,79.343323000000055],[-77.739990000000034,79.344437000000084],[-77.769729999999981,79.346375000000023],[-77.819732999999985,79.351653999999996],[-77.905272999999909,79.365265000000136],[-77.922501000000011,79.366379000000109],[-77.957229999999981,79.363876000000118],[-78.051391999999964,79.354706000000078],[-78.058883999999978,79.349426000000051],[-78.043610000000001,79.344437000000084],[-78.021392999999932,79.339980999999966],[-77.903335999999967,79.322495000000004],[-77.876099000000011,79.319717000000026],[-77.846114999999998,79.317764000000068],[-77.809998000000007,79.316665999999998],[-77.760009999999966,79.316375999999991],[-77.726944000000003,79.317490000000134],[-77.650833000000034,79.317764000000068],[-77.624434999999949,79.315536000000122],[-77.529175000000009,79.30525200000011],[-77.478607000000011,79.29664600000001],[-77.322234999999978,79.267487000000017],[-77.329178000000013,79.261383000000137],[-77.341384999999946,79.259430000000009],[-77.358046999999942,79.257767000000115],[-77.422226000000023,79.254714999999976],[-77.453063999999983,79.252487000000031],[-77.482223999999974,79.248871000000008],[-77.496947999999918,79.24581900000004],[-77.488051999999982,79.244980000000112],[-77.424712999999997,79.246094000000085],[-77.358336999999949,79.249999999999943],[-77.191939999999988,79.263885000000073],[-76.999725000000012,79.273315000000139],[-76.671386999999925,79.277481000000023],[-76.237777999999935,79.271103000000039],[-76.168059999999969,79.269989000000066],[-76.136123999999995,79.268600000000106],[-76.105834999999956,79.265823000000012],[-76.068619000000012,79.25749200000007],[-76.052779999999984,79.251099000000124],[-76.03443900000002,79.24581900000004],[-75.991942999999992,79.236374000000012],[-75.938889000000017,79.230270000000132],[-75.807495000000017,79.227768000000083],[-75.777221999999938,79.227478000000076],[-75.734436000000017,79.229431000000034],[-75.675277999999992,79.236374000000012],[-75.637786999999946,79.239426000000094],[-75.608336999999949,79.239975000000072],[-75.465012000000002,79.239975000000072],[-75.405837999999903,79.237487999999985],[-75.083068999999966,79.235260000000039],[-74.876099000000011,79.238037000000134],[-74.800277999999992,79.240540000000067],[-74.777221999999995,79.240265000000079],[-74.52555799999999,79.227203000000031],[-74.496947999999975,79.224990999999989],[-74.47084000000001,79.22164900000007],[-74.464721999999995,79.219986000000119],[-74.467223999999987,79.215546000000131],[-74.474166999999966,79.211928999999998],[-74.520279000000016,79.203048999999965],[-74.571944999999914,79.196091000000138],[-74.601944000000003,79.192748999999992],[-74.758057000000008,79.18553200000008],[-74.791945999999996,79.182754999999986],[-74.817504999999926,79.17886400000009],[-74.826950000000011,79.174149000000057],[-74.819167999999934,79.167755000000056],[-74.795546999999999,79.163605000000018],[-74.766952999999944,79.161377000000073],[-74.672501000000011,79.156937000000028],[-74.617492999999854,79.151381999999955],[-74.445830999999941,79.065810999999997],[-74.436661000000015,79.0577550000001],[-74.443053999999961,79.046936000000073],[-74.455276000000026,79.041655999999989],[-74.47193900000002,79.036652000000004],[-74.514450000000011,79.028595000000053],[-74.543883999999991,79.025269000000037],[-74.578339000000028,79.023314999999968],[-74.654175000000009,79.022217000000069],[-74.725005999999951,79.022766000000047],[-74.960007000000019,79.028320000000008],[-75.116104000000007,79.035812000000135],[-75.243057000000022,79.043045000000006],[-75.626662999999951,79.066086000000041],[-75.655563000000029,79.068328999999949],[-75.763335999999981,79.080551000000128],[-75.885284000000013,79.097488000000112],[-75.891387999999949,79.102203000000145],[-75.887221999999952,79.12831100000011],[-75.880829000000006,79.134995000000004],[-75.856658999999979,79.139708999999925],[-75.848617999999988,79.14498900000001],[-75.857772999999952,79.152205999999921],[-75.944442999999922,79.173035000000084],[-76.047774999999945,79.192200000000071],[-76.071670999999924,79.196091000000138],[-76.098052999999993,79.199141999999995],[-76.132767000000001,79.199706999999989],[-76.309433000000013,79.190811000000053],[-76.519164999999987,79.190262000000132],[-76.859160999999972,79.185257000000092],[-76.973327999999924,79.183318999999926],[-77.044998000000021,79.183318999999926],[-77.083069000000023,79.183593999999971],[-77.111663999999962,79.184982000000048],[-77.167496000000028,79.189972000000125],[-77.205001999999979,79.195251000000098],[-77.250564999999995,79.198029000000076],[-77.388901000000033,79.199706999999989],[-77.510833999999988,79.194976999999994],[-77.548049999999932,79.194427000000132],[-77.642501999999922,79.199706999999989],[-77.695267000000001,79.204712000000029],[-77.749999999999886,79.208328000000108],[-77.777495999999928,79.208878000000141],[-77.817504999999983,79.207763999999997],[-78.158889999999985,79.189972000000125],[-78.213622999999984,79.183593999999971],[-78.233321999999987,79.17886400000009],[-78.245833999999945,79.174698000000035],[-78.25389100000001,79.169983000000002],[-78.253066999999987,79.164428999999984],[-78.228607000000011,79.160538000000088],[-78.181670999999994,79.159424000000115],[-78.084732000000031,79.168045000000063],[-78.056106999999997,79.171921000000111],[-78.026397999999972,79.174698000000035],[-77.988892000000021,79.177475000000129],[-77.912216000000001,79.17942800000003],[-77.842772999999966,79.178589000000102],[-77.47193900000002,79.167755000000056],[-77.237777999999992,79.156937000000028],[-77.208617999999944,79.154709000000082],[-77.181106999999997,79.153869999999927],[-77.018615999999952,79.153595000000109],[-76.841949,79.153595000000109],[-76.706115999999952,79.153045999999961],[-76.639998999999989,79.15109300000006],[-76.61082499999992,79.149155000000121],[-76.484725999999966,79.136108000000092],[-76.430557000000022,79.132202000000007],[-76.319732999999928,79.124695000000088],[-76.260009999999909,79.121917999999994],[-76.233611999999937,79.121642999999949],[-76.191375999999934,79.123596000000077],[-76.15972899999997,79.122208000000001],[-76.136672999999973,79.11914100000007],[-76.081954999999994,79.099716000000114],[-76.085006999999905,79.093323000000112],[-76.099990999999875,79.08776899999998],[-76.116652999999928,79.083328000000051],[-76.146666999999979,79.077774000000034],[-76.170546999999885,79.075821000000076],[-76.210006999999962,79.074707000000103],[-76.265014999999948,79.074432000000115],[-76.360001000000011,79.078323000000012],[-76.515015000000005,79.085815000000082],[-76.575561999999991,79.089432000000045],[-76.637222000000008,79.090546000000018],[-76.676391999999964,79.089432000000045],[-76.828339000000028,79.082764000000111],[-76.996383999999978,79.074707000000103],[-77.073333999999932,79.070831000000055],[-77.152785999999992,79.066086000000041],[-77.223052999999993,79.060532000000023],[-77.326950000000011,79.051651000000106],[-77.355559999999969,79.048325000000034],[-77.429717999999923,79.037200999999982],[-77.449431999999945,79.032760999999937],[-77.464721999999995,79.027771000000087],[-77.49499499999996,79.017761000000007],[-77.529175000000009,79.018051000000014],[-77.693054000000018,79.033600000000092],[-77.719727000000034,79.036652000000004],[-77.742217999999923,79.041930999999977],[-77.783066000000019,79.062484999999981],[-77.799987999999928,79.066666000000055],[-77.84973100000002,79.069717000000082],[-77.919723999999917,79.068878000000097],[-78.035004000000015,79.065536000000009],[-78.103333000000021,79.066086000000041],[-78.135009999999966,79.067490000000021],[-78.165282999999931,79.06999200000007],[-78.214447000000007,79.075271999999984],[-78.234160999999858,79.078323000000012],[-78.289992999999981,79.083328000000051],[-78.351105000000018,79.086380000000133],[-78.425277999999992,79.083054000000118],[-78.671386999999982,79.071930000000009],[-78.818343999999968,79.069442999999978],[-78.860000999999954,79.067214999999976],[-78.891387999999893,79.063309000000118],[-78.879439999999931,79.060256999999979],[-78.692489999999964,79.058594000000085],[-78.588332999999977,79.059143000000006],[-78.405272999999966,79.064987000000031],[-78.283889999999985,79.066666000000055],[-78.236388999999974,79.064987000000031],[-78.15972899999997,79.051086000000055],[-78.108337000000006,79.04664600000001],[-78.070557000000008,79.04664600000001],[-77.966110000000015,79.049149],[-77.86111499999987,79.049149],[-77.829453000000001,79.048035000000027],[-77.799437999999896,79.045258000000103],[-77.785552999999993,79.041092000000049],[-77.708344000000011,79.013046000000145],[-77.703339000000028,79.006943000000035],[-77.71665999999999,79.003326000000072],[-77.796111999999937,78.988586000000112],[-77.835007000000019,78.979431000000034],[-77.946945000000028,78.951660000000004],[-77.946380999999917,78.945815999999979],[-77.952498999999932,78.939697000000137],[-78.040282999999988,78.906097000000045],[-78.147506999999962,78.865265000000079],[-78.282227000000034,78.80386400000009],[-78.289992999999981,78.799149000000057],[-78.297226000000023,78.788879000000122],[-78.296111999999937,78.783051],[-78.285552999999993,78.775818000000015],[-78.269454999999937,78.772491000000059],[-78.248046999999929,78.770263999999997],[-78.215560999999923,78.770537999999931],[-78.196105999999929,78.772217000000126],[-78.168334999999956,78.780823000000055],[-78.15972899999997,78.784988000000055],[-78.15943900000002,78.789978000000133],[-78.145843999999954,78.800812000000008],[-78.129439999999988,78.812194999999974],[-78.105269999999905,78.828598000000056],[-78.042769999999962,78.861649],[-78.029174999999896,78.867477000000122],[-77.902221999999995,78.91276600000009],[-77.887222000000008,78.917755000000056],[-77.75167799999997,78.95748900000001],[-77.711944999999957,78.966095000000109],[-77.689437999999996,78.968596999999988],[-77.526397999999972,78.979156000000046],[-77.370270000000005,78.984421000000111],[-77.258346999999958,78.986374000000069],[-77.177490000000034,78.989700000000084],[-77.107497999999964,78.99552900000009],[-77.078888000000006,78.998871000000065],[-77.026107999999965,79.006652999999972],[-76.960281000000009,79.012772000000041],[-76.75418099999996,79.027771000000087],[-76.710555999999997,79.028320000000008],[-76.683318999999983,79.027771000000087],[-76.424163999999962,79.022491000000002],[-76.361389000000031,79.019714000000135],[-75.98971599999993,78.99552900000009],[-75.732223999999974,78.969147000000021],[-75.720276000000013,78.965545999999961],[-75.769454999999994,78.939971999999955],[-75.781113000000005,78.934708000000001],[-75.796951000000035,78.929703000000131],[-75.825561999999991,78.926085999999998],[-75.858611999999937,78.923309000000074],[-75.896118000000001,78.920821999999987],[-76.095276000000013,78.910262999999986],[-76.25,78.902205999999978],[-76.287215999999944,78.899719000000118],[-76.315552000000025,78.896103000000039],[-76.335555999999997,78.891663000000051],[-76.375548999999921,78.882750999999985],[-76.415008999999998,78.873870999999951],[-76.446105999999929,78.863876000000062],[-76.456389999999942,78.857758000000103],[-76.460007000000019,78.851929000000098],[-76.458343999999897,78.844986000000119],[-76.440276999999924,78.839432000000102],[-76.41194200000001,78.837203999999986],[-76.394454999999937,78.840820000000008],[-76.391113000000018,78.843872000000147],[-76.37470999999988,78.851089000000059],[-76.344727000000034,78.858871000000022],[-76.330001999999979,78.861649],[-76.231673999999998,78.879149999999981],[-76.204726999999991,78.881088000000091],[-76.178329000000019,78.880264000000125],[-76.15834000000001,78.879149999999981],[-76.133330999999998,78.876648000000046],[-76.077498999999989,78.873032000000023],[-75.975006000000008,78.872756999999979],[-75.791671999999949,78.884155000000021],[-75.461120999999991,78.891372999999987],[-75.316101000000003,78.892211999999972],[-75.292220999999927,78.890274000000034],[-75.180557000000022,78.879149999999981],[-74.964721999999995,78.856094000000098],[-74.775009000000011,78.829987000000074],[-74.760559000000001,78.823607999999979],[-74.752791999999943,78.816940000000045],[-74.719726999999978,78.707489000000066],[-74.727218999999934,78.701385000000016],[-74.755844000000025,78.69802900000002],[-74.823059000000001,78.697478999999987],[-74.84333799999996,78.693039000000113],[-74.86999499999996,78.675812000000121],[-74.869445999999925,78.668594000000098],[-74.857773000000009,78.636107999999979],[-74.819457999999884,78.627472000000068],[-74.789992999999981,78.591370000000097],[-74.862212999999997,78.56721500000009],[-74.878052000000025,78.562485000000038],[-75.024169999999913,78.531937000000084],[-75.048049999999989,78.528046000000018],[-75.072509999999909,78.52777100000003],[-75.079453000000001,78.533875000000023],[-75.101394999999968,78.53776600000009],[-75.131377999999927,78.539153999999996],[-75.16722099999987,78.539703000000145],[-75.200287000000003,78.537491000000102],[-75.219726999999978,78.533051000000057],[-75.235275000000001,78.528046000000018],[-75.261672999999973,78.523315000000082],[-75.290557999999919,78.520537999999988],[-75.479445999999996,78.50999500000006],[-75.830001999999979,78.504715000000147],[-75.888335999999924,78.506103999999993],[-75.965011999999888,78.510818000000086],[-75.989990000000034,78.513885000000016],[-76.030563000000029,78.521103000000039],[-76.073058999999944,78.529709000000139],[-76.095550999999944,78.533600000000035],[-76.120270000000005,78.536652000000117],[-76.151107999999965,78.538589000000002],[-76.404448999999886,78.548035000000141],[-76.437209999999993,78.548599000000081],[-76.468886999999938,78.54553199999998],[-76.642775999999969,78.528320000000122],[-76.684433000000013,78.522217000000012],[-76.691101000000003,78.518875000000094],[-76.692764000000011,78.514708999999982],[-76.693603999999993,78.509720000000016],[-76.684997999999894,78.505829000000119],[-76.668335000000013,78.503875999999991],[-76.645844000000011,78.502777000000037],[-76.539992999999981,78.503325999999959],[-76.468338000000017,78.505264000000125],[-76.36471599999993,78.513321000000076],[-76.324722000000008,78.515274000000034],[-76.289444000000003,78.515549000000021],[-76.261948000000018,78.513611000000083],[-76.243057000000022,78.512207000000103],[-76.124999999999943,78.494141000000127],[-76.114165999999955,78.488312000000121],[-76.112777999999878,78.481094000000098],[-76.108886999999982,78.474990999999989],[-76.100554999999986,78.468322999999998],[-76.081679999999949,78.464432000000102],[-76.057495000000017,78.461929000000112],[-75.761123999999995,78.443862999999965],[-75.61721799999998,78.43803400000013],[-75.49888599999997,78.433044000000052],[-75.443603999999993,78.430542000000003],[-75.410827999999924,78.426651000000106],[-75.269729999999925,78.404160000000104],[-75.089995999999985,78.368866000000025],[-75.031386999999995,78.331375000000037],[-75.038329999999917,78.325546000000031],[-75.051940999999886,78.315810999999997],[-75.0625,78.309708000000001],[-75.086670000000026,78.306366000000082],[-75.189986999999974,78.299713000000111],[-75.22193900000002,78.300262000000032],[-75.246108999999933,78.303314],[-75.273055999999883,78.305542000000116],[-75.307495000000017,78.305542000000116],[-75.358611999999937,78.301651000000049],[-75.377212999999983,78.29664600000001],[-75.385009999999909,78.291367000000037],[-75.392226999999934,78.285262999999986],[-75.39805599999994,78.272491000000002],[-75.479172000000005,78.222214000000122],[-75.494155999999975,78.217209000000082],[-75.513335999999924,78.212769000000037],[-75.582503999999915,78.201096000000007],[-75.61361699999992,78.198029000000076],[-75.650283999999942,78.196930000000123],[-75.679442999999992,78.198318000000029],[-75.776397999999972,78.210541000000092],[-75.902495999999928,78.224152000000061],[-75.985549999999932,78.229979999999955],[-76.157227000000034,78.240540000000124],[-76.188888999999961,78.241089000000045],[-76.225829999999974,78.239975000000072],[-76.291945999999996,78.234421000000054],[-76.324447999999961,78.23275799999999],[-76.361389000000031,78.231658999999979],[-76.393065999999976,78.232208000000128],[-76.474715999999944,78.239425999999924],[-76.520278999999903,78.24552900000009],[-76.548049999999876,78.248322000000087],[-76.574172999999917,78.249709999999993],[-76.608336999999949,78.249419999999986],[-76.630554000000018,78.247757000000036],[-76.831680000000006,78.230820000000051],[-76.855269999999962,78.227478000000076],[-76.888061999999991,78.21804800000001],[-76.898620999999935,78.212494000000049],[-76.912216000000001,78.201096000000007],[-76.90834000000001,78.195525999999916],[-76.883330999999941,78.191925000000083],[-76.688599000000011,78.168869000000029],[-76.664444000000003,78.166092000000106],[-76.641678000000013,78.164429000000041],[-76.537780999999939,78.158324999999991],[-76.021392999999989,78.138046000000031],[-75.763900999999976,78.131653000000085],[-75.735549999999989,78.1308140000001],[-75.621933000000013,78.1244200000001],[-75.59722899999997,78.12081900000004],[-75.581389999999942,78.115814],[-75.575561999999934,78.107758000000103],[-75.575287000000003,78.101379000000065],[-75.588897999999972,78.089432000000102],[-75.599166999999909,78.083328000000051],[-75.692763999999954,78.039978000000076],[-75.707503999999915,78.034988000000055],[-75.723052999999993,78.030823000000055],[-75.761123999999995,78.022491000000059],[-75.809433000000013,78.008331000000112],[-75.838608000000022,77.998322000000087],[-75.922775000000001,77.956650000000081],[-75.965011999999888,77.973037999999917],[-75.984160999999858,77.977478000000133],[-76.157227000000034,78.012497000000053],[-76.214721999999995,78.01527399999992],[-76.246108999999933,78.015823000000069],[-76.276672000000019,78.012772000000041],[-76.303054999999972,78.009430000000123],[-76.444716999999912,77.988586000000112],[-76.466949,77.984710999999947],[-76.481383999999935,77.979706000000078],[-76.491942999999992,77.968597000000045],[-76.499725000000012,77.958327999999995],[-76.526108000000022,77.949142000000052],[-76.548339999999996,77.944977000000051],[-76.595839999999953,77.939697000000137],[-76.669998000000021,77.936371000000122],[-76.694442999999865,77.937195000000088],[-76.730559999999912,77.936096000000077],[-76.757232999999985,77.93331900000004],[-76.780288999999925,77.929977000000065],[-76.802490000000034,77.920258000000103],[-76.805557000000022,77.917205999999965],[-76.806945999999925,77.91304000000008],[-76.825287000000003,77.908325000000048],[-76.86221299999994,77.90277100000003],[-76.93110699999994,77.901382000000069],[-76.959731999999974,77.902481000000023],[-76.986114999999927,77.904708999999968],[-77.036391999999921,77.909714000000008],[-77.077788999999939,77.915817000000004],[-77.089171999999962,77.919708000000071],[-77.095276000000013,77.927199999999971],[-77.104172000000005,77.934417999999994],[-77.120269999999891,77.939148000000046],[-77.160003999999901,77.946091000000024],[-77.210830999999985,77.949142000000052],[-77.244445999999982,77.948593000000074],[-77.272232000000031,77.946365000000128],[-77.298339999999996,77.942749000000106],[-77.336120999999991,77.94081099999994],[-77.838897999999972,77.942749000000106],[-77.997498000000007,77.957214000000022],[-78.03694200000001,77.966384999999946],[-78.140838999999914,77.985260000000096],[-78.162216000000001,77.988312000000008],[-78.237502999999947,77.995818999999983],[-78.260833999999932,77.995254999999986],[-78.411391999999921,77.917755000000113],[-78.420837000000006,77.912491000000102],[-78.426391999999964,77.90637200000009],[-78.419723999999974,77.898880000000133],[-78.410552999999936,77.892211999999972],[-78.330840999999907,77.868591000000094],[-78.317107999999962,77.865814],[-78.282500999999968,77.862762000000089],[-78.260283999999899,77.861374000000012],[-78.173889000000031,77.859984999999995],[-78.139450000000011,77.857208000000128],[-77.97193900000002,77.807204999999954],[-77.958617999999888,77.802200000000084],[-77.947768999999994,77.796371000000079],[-77.940826000000015,77.765549000000021],[-77.940551999999968,77.759995000000004],[-77.981109999999887,77.701385000000073],[-77.920272999999952,77.669983000000116],[-77.882767000000001,77.661652000000004],[-77.862777999999992,77.656372000000147],[-77.742766999999958,77.622208000000114],[-77.724716000000001,77.613312000000008],[-77.718612999999948,77.605820000000051],[-77.723052999999936,77.599152000000061],[-77.730835000000013,77.597214000000122],[-77.87222300000002,77.568329000000119],[-77.952224999999999,77.555817000000104],[-77.958343999999954,77.529709000000139],[-77.944442999999978,77.511383000000137],[-77.946105999999986,77.504714999999976],[-77.948607999999979,77.501938000000109],[-77.981673999999998,77.486374000000012],[-77.99499499999996,77.481094000000098],[-78.256667999999934,77.381926999999962],[-78.303878999999995,77.373306000000071],[-78.690552000000025,77.315535999999952],[-78.741104000000007,77.309418000000051],[-78.777221999999995,77.307205000000067],[-78.806655999999975,77.307205000000067],[-78.834166999999923,77.30831900000004],[-78.839721999999995,77.310256999999979],[-78.833069000000023,77.314987000000031],[-78.786117999999988,77.335815000000082],[-78.733886999999982,77.362762000000032],[-78.726944000000003,77.367477000000065],[-78.725280999999995,77.371094000000028],[-78.727782999999988,77.375259000000028],[-78.764449999999954,77.3808140000001],[-78.784438999999907,77.3808140000001],[-78.816665999999998,77.378036000000122],[-78.841110000000015,77.374420000000043],[-78.861663999999962,77.370255000000043],[-78.89805599999994,77.360809000000074],[-78.920273000000009,77.350815000000068],[-78.939986999999917,77.338882000000012],[-78.948043999999982,77.332489000000066],[-78.955565999999919,77.328322999999955],[-78.968338000000017,77.323317999999915],[-79.00418099999996,77.313873000000058],[-79.083327999999995,77.299987999999985],[-79.139724999999999,77.293594000000098],[-79.171386999999868,77.290817000000004],[-79.207229999999981,77.288315000000125],[-79.270554000000004,77.286926000000108],[-79.321670999999924,77.288589000000059],[-79.373321999999973,77.29304499999995],[-79.493332000000009,77.304428000000144],[-79.631377999999984,77.316666000000055],[-79.653885000000002,77.318603999999993],[-79.712218999999948,77.318328999999949],[-79.83666999999997,77.306931000000134],[-79.860824999999977,77.303314],[-79.881942999999978,77.299713000000111],[-79.896118000000001,77.295822000000044],[-79.92332499999992,77.285263000000043],[-79.960555999999883,77.276932000000102],[-79.988327000000027,77.273604999999975],[-80.01916499999993,77.272217000000069],[-80.042495999999971,77.272766000000047],[-80.456116000000009,77.296097000000088],[-80.753341999999918,77.330551000000128],[-80.775833000000034,77.334427000000005],[-80.879714999999919,77.353043000000014],[-81.005568999999923,77.377197000000137],[-81.015288999999996,77.381363000000022],[-81.019454999999994,77.392761000000064],[-81.027221999999995,77.398041000000092],[-81.035277999999948,77.40109300000006],[-81.095276000000013,77.411925999999994],[-81.121108999999933,77.413605000000018],[-81.150833000000034,77.413605000000018],[-81.207778999999903,77.415817000000061],[-81.254729999999995,77.420532000000094],[-81.277495999999928,77.42442299999999],[-81.294448999999929,77.429153000000042],[-81.310546999999985,77.434982000000048],[-81.316665999999998,77.438873000000115],[-81.321121000000005,77.450272000000041],[-81.325287000000003,77.454987000000074],[-81.337509000000011,77.462769000000037],[-81.351669000000015,77.469711000000075],[-81.370543999999938,77.475540000000137],[-81.388901000000033,77.480819999999994],[-81.442215000000033,77.491364000000033],[-81.533889999999928,77.506942999999978],[-81.573623999999938,77.512771999999984],[-81.587783999999942,77.517487000000017],[-81.589721999999995,77.520828000000051],[-81.608337000000006,77.553588999999988],[-81.610549999999989,77.576096000000064],[-81.820281999999963,77.621918000000107],[-81.839721999999938,77.625809000000004],[-81.845001000000025,77.628860000000032],[-81.848617999999988,77.639434999999935],[-81.847778000000005,77.643326000000002],[-81.836670000000026,77.65498400000007],[-81.847503999999901,77.665817000000004],[-81.860000999999954,77.671371000000022],[-81.876662999999951,77.677475000000072],[-81.89527899999996,77.682480000000112],[-81.913894999999911,77.685532000000023],[-81.928329000000019,77.685806000000127],[-81.930283000000031,77.684981999999991],[-81.935546999999929,77.678040000000067],[-81.949158000000011,77.655258000000003],[-81.949431999999945,77.644989000000123],[-81.911391999999921,77.609421000000111],[-81.895844000000011,77.604156000000046],[-81.857223999999974,77.598877000000073],[-81.810271999999941,77.595260999999994],[-81.798049999999989,77.59165999999999],[-81.787506000000008,77.587494000000049],[-81.678054999999972,77.538315000000068],[-81.670546999999942,77.531662000000097],[-81.667220999999984,77.52526899999998],[-81.666945999999996,77.502213000000097],[-81.670836999999949,77.496094000000085],[-81.690276999999924,77.485260000000039],[-81.710555999999997,77.474990999999989],[-81.71945199999999,77.469986000000119],[-81.748046999999929,77.448029000000076],[-81.743606999999997,77.441086000000098],[-81.739440999999999,77.436371000000065],[-81.728881999999999,77.429977000000008],[-81.700561999999877,77.422760000000096],[-81.523620999999991,77.378036000000122],[-81.484726000000023,77.372208000000001],[-81.432220000000029,77.368042000000059],[-81.336670000000026,77.368591000000038],[-81.25140399999998,77.36914100000007],[-81.203888000000006,77.370529000000147],[-81.189986999999917,77.368042000000059],[-81.178054999999972,77.360259999999926],[-81.172775000000001,77.354705999999965],[-81.167769999999962,77.342758000000117],[-81.165833000000021,77.337204000000099],[-81.165833000000021,77.332764000000054],[-81.169448999999986,77.32249500000006],[-81.283889999999985,77.315262000000018],[-81.425003000000004,77.306366000000082],[-81.538329999999974,77.302765000000079],[-81.874999999999943,77.292480000000126],[-81.953887999999949,77.302200000000028],[-82.091948999999943,77.316376000000048],[-82.151397999999972,77.303864000000033],[-82.166107000000011,77.292480000000126],[-82.081680000000006,77.272766000000047],[-82.043335000000013,77.265548999999908],[-81.978881999999999,77.258331000000112],[-81.90695199999999,77.198318000000029],[-81.906577999999968,77.1933140000001],[-81.902221999999995,77.187195000000031],[-81.876099000000011,77.174698000000092],[-81.868057000000022,77.171646000000123],[-81.834166999999866,77.162491000000102],[-81.796660999999972,77.157486000000063],[-81.78694200000001,77.157486000000063],[-81.715835999999967,77.176926000000037],[-81.696654999999907,77.181366000000025],[-81.634444999999971,77.193863000000022],[-81.607497999999964,77.197479000000101],[-81.395003999999972,77.231659000000036],[-81.149170000000026,77.274703999999986],[-80.960281000000009,77.271378000000141],[-80.592772999999966,77.242477000000008],[-80.526397999999915,77.234985000000052],[-80.280288999999868,77.213608000000022],[-80.258621000000005,77.212204000000042],[-80.205840999999964,77.209427000000119],[-80.154998999999975,77.208037999999931],[-80.135833999999988,77.205826000000059],[-80.116104000000007,77.20138500000013],[-80.114715999999987,77.195525999999973],[-80.136947999999961,77.186096000000077],[-80.152785999999992,77.181656000000032],[-80.255004999999983,77.153320000000122],[-80.401671999999962,77.086655000000007],[-80.40972899999997,77.081100000000106],[-80.40972899999997,77.076660000000118],[-80.394454999999937,77.072769000000051],[-80.373046999999929,77.071380999999917],[-80.34584000000001,77.074996999999996],[-80.328063999999927,77.078323000000012],[-80.206954999999937,77.108597000000088],[-80.159438999999963,77.122756999999979],[-80.135009999999966,77.139435000000049],[-80.118606999999997,77.150818000000072],[-80.094726999999978,77.161102000000085],[-80.072509999999909,77.17053199999998],[-80.013335999999924,77.190536000000066],[-79.93582200000003,77.206650000000025],[-79.785278000000005,77.231368999999972],[-79.725829999999917,77.239975000000072],[-79.660277999999948,77.24443100000002],[-79.633057000000008,77.243317000000047],[-79.445540999999992,77.234421000000111],[-79.424163999999905,77.233047000000113],[-79.255004999999983,77.218596999999988],[-79.216949,77.209717000000126],[-79.041945999999882,77.161102000000085],[-79.033066000000019,77.156647000000078],[-79.02806099999998,77.150543000000027],[-79.003890999999953,77.103592000000049],[-79.005004999999926,77.09693900000002],[-79.013335999999924,77.09137000000004],[-79.029723999999987,77.086929000000112],[-79.132492000000013,77.053589000000045],[-79.328888000000006,76.978591999999935],[-79.365554999999915,76.963318000000072],[-79.376663000000008,76.957489000000066],[-79.391387999999949,76.947204999999997],[-79.395003999999915,76.940536000000122],[-79.393065999999976,76.934143000000006],[-79.386948000000018,76.927475000000015],[-79.37222300000002,76.923309000000131],[-79.34584000000001,76.91804500000012],[-79.317504999999926,76.917755000000113],[-79.244445999999925,76.924987999999928],[-79.193053999999904,76.929152999999928],[-79.005843999999911,76.936096000000134],[-78.980835000000013,76.936371000000122],[-78.954178000000013,76.935256999999979],[-78.886123999999995,76.926926000000094],[-78.870834000000002,76.922211000000061],[-78.866394000000014,76.918869000000086],[-78.910004000000015,76.886658000000011],[-78.915282999999988,76.839706000000092],[-78.748336999999935,76.822494999999947],[-78.721938999999963,76.821380999999974],[-78.712218999999948,76.823318000000029],[-78.708053999999947,76.824997000000053],[-78.56361400000003,76.906647000000135],[-78.566101000000003,76.913605000000132],[-78.567504999999983,76.927200000000028],[-78.562774999999874,76.933043999999995],[-78.553878999999938,76.938582999999994],[-78.547775000000001,76.941360000000088],[-78.384444999999914,76.99971000000005],[-78.344161999999926,77.007767000000001],[-78.32028200000002,77.011658000000068],[-78.292770000000019,77.014709000000096],[-78.196944999999971,77.019440000000031],[-78.140838999999914,77.01998900000001],[-78.087219000000005,77.017761000000007],[-78.07028200000002,77.014434999999992],[-77.896666999999979,76.955551000000128],[-77.886947999999961,76.947754000000145],[-77.881103999999993,76.940262000000018],[-77.779448999999943,76.79136699999998],[-77.789443999999946,76.78166200000004],[-77.813323999999966,76.692748999999992],[-77.813613999999973,76.687759000000085],[-77.813048999999864,76.68193100000002],[-77.804992999999968,76.675261999999918],[-77.769454999999937,76.658325000000104],[-77.78443900000002,76.650269000000037],[-77.810271999999941,76.640823000000069],[-77.841110000000015,76.633331000000112],[-77.861663999999905,76.629700000000071],[-77.918335000000013,76.62831100000011],[-77.947219999999959,76.629425000000083],[-77.985000999999954,76.632476999999994],[-78.013625999999988,76.630814000000044],[-78.027495999999985,76.626922999999977],[-78.089721999999995,76.609420999999941],[-78.097777999999948,76.606094000000041],[-78.178328999999962,76.566085999999984],[-78.186110999999926,76.559708000000001],[-78.206107999999972,76.53914600000013],[-78.256667999999934,76.506653000000142],[-78.364440999999999,76.462493999999992],[-78.377486999999917,76.458038000000101],[-78.435103999999967,76.453171000000111],[-78.443328999999892,76.452209000000096],[-78.473052999999993,76.451660000000118],[-78.519164999999987,76.456940000000031],[-78.552490000000034,76.464157000000114],[-78.607772999999952,76.486649000000057],[-78.61471599999993,76.489975000000072],[-78.619445999999982,76.496094000000085],[-78.616942999999992,76.498871000000008],[-78.615004999999883,76.5],[-78.611388999999917,76.49941999999993],[-78.597228999999913,76.505264000000125],[-78.591949,76.5086060000001],[-78.588332999999977,76.513046000000088],[-78.613327000000027,76.547759999999982],[-78.627212999999927,76.563873000000001],[-78.75111400000003,76.572220000000016],[-78.773330999999985,76.572768999999937],[-78.790558000000033,76.571655000000135],[-78.868331999999953,76.521103000000096],[-78.886947999999961,76.497208000000057],[-78.900833000000034,76.478867000000093],[-78.937774999999988,76.449997000000053],[-78.946655000000021,76.444976999999994],[-78.96945199999999,76.43414300000012],[-78.994155999999975,76.424423000000047],[-79.013061999999991,76.420258000000047],[-79.06138599999997,76.41276600000009],[-79.090285999999992,76.411377000000073],[-79.139174999999966,76.411652000000117],[-79.170837000000006,76.409988000000112],[-79.18971299999987,76.405823000000112],[-79.198043999999868,76.400269000000094],[-79.261123999999995,76.352202999999975],[-79.265563999999927,76.346100000000035],[-79.266402999999968,76.339432000000102],[-79.262786999999946,76.331940000000145],[-79.254181000000017,76.320267000000115],[-79.25306699999993,76.314697000000024],[-79.261123999999995,76.309143000000063],[-79.272780999999952,76.304152999999985],[-79.312774999999988,76.297484999999995],[-79.338608000000022,76.296371000000022],[-79.365828999999962,76.296646000000067],[-79.414168999999902,76.301086000000055],[-79.445540999999992,76.306641000000127],[-79.500838999999928,76.314148000000102],[-79.525283999999886,76.31442300000009],[-79.573623999999995,76.311645999999996],[-79.596664000000033,76.308594000000085],[-79.805556999999965,76.278320000000065],[-79.924438000000009,76.25360100000006],[-80.061385999999914,76.226928999999984],[-80.087218999999948,76.223602000000085],[-80.107223999999974,76.2227630000001],[-80.121658000000025,76.224426000000051],[-80.136123999999995,76.228317000000118],[-80.156386999999881,76.23692299999999],[-80.178329000000019,76.239700000000084],[-80.203613000000018,76.240539999999953],[-80.230285999999978,76.239975000000129],[-80.261123999999995,76.238312000000008],[-80.2933349999999,76.235260000000096],[-80.338332999999977,76.228317000000118],[-80.366942999999992,76.218048000000067],[-80.375548999999921,76.213043000000027],[-80.383056999999951,76.20748900000001],[-80.396666999999923,76.202208999999982],[-80.412216000000001,76.198029000000133],[-80.426940999999886,76.195525999999973],[-80.506957999999941,76.196365000000128],[-80.606383999999991,76.191650000000095],[-80.627486999999917,76.187195000000088],[-80.637787000000003,76.17053199999998],[-80.639724999999885,76.167480000000069],[-80.654175000000009,76.162491000000102],[-80.672501000000011,76.158325000000048],[-80.703338999999971,76.156647000000078],[-80.949996999999996,76.144989000000066],[-81.053329000000019,76.128036000000009],[-81.075835999999924,76.129149999999981],[-81.085830999999928,76.134155000000021],[-81.090285999999935,76.137496999999939],[-81.095551,76.212204000000042],[-81.047501000000011,76.249419999999986],[-81.041106999999954,76.25360100000006],[-81.026397999999915,76.258331000000112],[-80.903885000000002,76.312194999999974],[-80.783614999999998,76.374985000000095],[-80.769454999999994,76.384720000000016],[-80.761123999999995,76.394150000000081],[-80.760009999999909,76.40415999999999],[-80.763625999999874,76.411102000000085],[-80.771666999999923,76.419144000000017],[-80.78472899999997,76.423874000000069],[-80.991668999999945,76.483047000000056],[-81.188889000000017,76.518875000000094],[-81.275008999999955,76.533325000000048],[-81.304169000000002,76.510544000000039],[-81.337218999999891,76.494980000000112],[-81.351944000000003,76.490265000000079],[-81.388901000000033,76.481368999999972],[-81.411117999999988,76.477478000000076],[-81.460830999999928,76.471374999999966],[-81.492492999999911,76.469437000000028],[-81.521941999999967,76.468596999999988],[-81.636948000000018,76.468872000000147],[-81.71665999999999,76.470260999999994],[-81.788605000000018,76.474700999999982],[-81.879990000000021,76.483871000000022],[-82.039718999999934,76.509430000000066],[-82.05860899999999,76.513610999999969],[-82.075835999999981,76.518600000000106],[-82.083617999999944,76.523879999999963],[-82.03195199999999,76.553588999999988],[-81.985000999999954,76.578597999999943],[-81.981948999999929,76.584717000000012],[-81.993331999999953,76.590270999999973],[-82.045273000000009,76.603592000000106],[-82.056655999999862,76.609146000000123],[-82.049438000000009,76.612488000000042],[-81.953338999999914,76.631927000000132],[-81.873610999999869,76.645828000000108],[-81.851394999999968,76.649719000000005],[-81.814163000000008,76.658599999999922],[-81.790282999999931,76.667755],[-81.782227000000034,76.672760000000039],[-81.776947000000007,76.677475000000072],[-81.778885000000002,76.681090999999924],[-81.785827999999924,76.685532000000023],[-81.799163999999962,76.685805999999957],[-81.819457999999997,76.682754999999986],[-81.838057999999933,76.678314000000057],[-81.852782999999988,76.673599000000024],[-81.861938000000009,76.669144000000017],[-81.893341000000021,76.660812000000021],[-82.081115999999952,76.631087999999977],[-82.115554999999915,76.628860000000032],[-82.145553999999947,76.628036000000066],[-82.199996999999996,76.628586000000098],[-82.273330999999928,76.633331000000112],[-82.292495999999971,76.635544000000095],[-82.326950000000011,76.641373000000101],[-82.346114999999998,76.645538000000101],[-82.377486999999917,76.657485999999949],[-82.442490000000021,76.684981999999991],[-82.470276000000013,76.698868000000004],[-82.476668999999958,76.704712000000029],[-82.487212999999997,76.717758000000117],[-82.580291999999986,76.776382000000012],[-82.596114999999998,76.782486000000006],[-82.698607999999979,76.812485000000038],[-82.725005999999951,76.819153000000028],[-82.749725000000012,76.818604000000107],[-82.767226999999991,76.813309000000004],[-82.769729999999925,76.811096000000077],[-82.76556399999987,76.808318999999983],[-82.74610899999999,76.804153000000042],[-82.728333000000021,76.799149000000114],[-82.698607999999979,76.788589000000002],[-82.640563999999983,76.766388000000006],[-82.556106999999997,76.723038000000031],[-82.558333999999945,76.718322999999998],[-82.566665999999941,76.707489000000123],[-82.569457999999941,76.701385000000073],[-82.562499999999943,76.688873000000058],[-82.545546999999942,76.674149000000057],[-82.533324999999991,76.666382000000056],[-82.460555999999997,76.636108000000036],[-82.435271999999998,76.628036000000066],[-82.415008999999884,76.62303199999991],[-82.308884000000035,76.609420999999941],[-82.208054000000004,76.593048000000067],[-82.113891999999908,76.572220000000016],[-82.102218999999991,76.568878000000041],[-82.081115999999952,76.561096000000134],[-82.093886999999995,76.557205000000067],[-82.175002999999947,76.546936000000017],[-82.196944999999971,76.542755000000113],[-82.211394999999925,76.53804000000008],[-82.22222899999997,76.532761000000107],[-82.225280999999995,76.526657000000057],[-82.224715999999887,76.520264000000111],[-82.222504000000015,76.514435000000105],[-82.216399999999965,76.5086060000001],[-82.189437999999882,76.486649000000057],[-82.158050999999944,76.466095000000053],[-82.147232000000031,76.461105000000032],[-82.135558999999944,76.453323000000069],[-82.131377999999927,76.448593000000017],[-82.127212999999927,76.441650000000038],[-82.132216999999912,76.436919999999986],[-82.162505999999951,76.421921000000111],[-82.17971799999998,76.416931000000091],[-82.209441999999967,76.409988000000112],[-82.260284000000013,76.398605000000089],[-82.293335000000013,76.395827999999995],[-82.348342999999943,76.395537999999988],[-82.483063000000016,76.396378000000027],[-82.704453000000001,76.386932000000058],[-82.833327999999881,76.397766000000104],[-82.990554999999915,76.426650999999993],[-83.003615999999965,76.429153000000042],[-83.0625,76.450272000000041],[-83.099730999999963,76.463882000000126],[-83.102492999999981,76.469437000000028],[-83.096953999999982,76.475814999999955],[-83.08944699999995,76.480819999999994],[-83.065001999999993,76.491089000000045],[-83.061935000000005,76.497208000000057],[-83.075012000000015,76.532761000000107],[-83.084441999999967,76.546370999999965],[-83.110001000000011,76.579987000000131],[-83.116652999999985,76.586105000000089],[-83.198607999999979,76.619431000000077],[-83.338897999999858,76.66415400000011],[-83.384170999999981,76.730819999999994],[-83.365279999999927,76.740540000000067],[-83.358611999999937,76.746094000000028],[-83.355834999999956,76.752213000000097],[-83.362212999999997,76.756103999999937],[-83.379989999999964,76.758881000000031],[-83.400833000000034,76.759995000000004],[-83.410003999999901,76.757767000000058],[-83.497498000000007,76.723876999999959],[-83.518340999999964,76.713318000000129],[-83.523620999999935,76.706649999999968],[-83.523330999999928,76.700821000000133],[-83.520553999999947,76.695251000000042],[-83.515014999999948,76.689972000000068],[-83.499161000000015,76.676651000000106],[-83.352218999999991,76.612488000000042],[-83.331116000000009,76.603317000000118],[-83.316101000000003,76.598037999999974],[-83.298614999999984,76.593048000000067],[-83.278060999999923,76.588318000000072],[-83.254181000000017,76.579437000000098],[-83.246383999999978,76.572768999999937],[-83.207503999999915,76.505553999999961],[-83.184432999999899,76.424988000000042],[-83.188323999999966,76.419434000000081],[-83.202224999999942,76.414428999999984],[-83.223617999999874,76.410537999999917],[-83.256667999999991,76.407486000000006],[-83.285827999999981,76.406372000000033],[-83.439986999999917,76.411102000000085],[-83.619995000000017,76.423599000000081],[-83.691100999999946,76.428863999999919],[-83.710555999999997,76.433044000000109],[-83.735000999999954,76.444138000000009],[-83.734160999999915,76.449141999999995],[-83.735275000000001,76.455826000000059],[-83.740554999999972,76.462769000000037],[-83.756667999999991,76.468596999999988],[-83.893616000000009,76.501663000000065],[-83.985001000000011,76.520538000000045],[-84.018616000000009,76.529433999999981],[-84.033614999999941,76.534714000000065],[-84.046660999999972,76.542205999999965],[-84.058334000000002,76.553040000000067],[-84.058884000000035,76.558868000000132],[-84.061661000000015,76.585266000000104],[-84.070846999999901,76.616653000000042],[-84.086670000000026,76.62414600000011],[-84.101944000000003,76.629425000000083],[-84.118880999999988,76.633880999999974],[-84.138610999999912,76.637772000000041],[-84.261123999999995,76.65554800000001],[-84.284438999999963,76.657760999999994],[-84.31082200000003,76.658325000000104],[-84.319732999999871,76.656096999999988],[-84.324722000000008,76.653320000000065],[-84.330841000000021,76.647491000000059],[-84.313323999999909,76.641098000000113],[-84.256667999999991,76.628586000000098],[-84.220551,76.622207999999944],[-84.202498999999932,76.617203000000075],[-84.193053999999961,76.609985000000108],[-84.194442999999978,76.606934000000081],[-84.216948999999886,76.571655000000135],[-84.249725000000012,76.536926000000108],[-84.248336999999992,76.530548000000124],[-84.24499499999996,76.524993999999936],[-84.221114999999941,76.510817999999972],[-84.208617999999888,76.505264000000125],[-84.192490000000021,76.49941999999993],[-84.179717999999923,76.49192800000003],[-84.180832000000009,76.484984999999995],[-84.195540999999935,76.45637499999998],[-84.205565999999976,76.451096000000007],[-84.215835999999967,76.448029000000076],[-84.236938000000009,76.443587999999977],[-84.489166000000012,76.429153000000042],[-84.518615999999952,76.427765000000136],[-84.570846999999958,76.428863999999919],[-84.619720000000029,76.431656000000032],[-84.636947999999961,76.434418000000107],[-84.652785999999992,76.438034000000016],[-84.783889999999985,76.469986000000119],[-84.792770000000019,76.474990999999989],[-84.785278000000005,76.485260000000039],[-84.783889999999985,76.489975000000072],[-84.795273000000009,76.503876000000048],[-84.848891999999921,76.53637700000013],[-84.860001000000011,76.542755000000113],[-84.950561999999934,76.577773999999977],[-84.970550999999944,76.581940000000088],[-84.991378999999938,76.582764000000054],[-85.016402999999912,76.578872999999987],[-85.028335999999967,76.57499700000011],[-85.034163999999976,76.569153000000085],[-85.051391999999964,76.514160000000061],[-85.022507000000019,76.456099999999992],[-84.970276000000013,76.426086000000112],[-84.960281000000009,76.42053199999998],[-84.944442999999978,76.416931000000091],[-84.904175000000009,76.411926000000051],[-84.728058000000033,76.390273999999977],[-84.43638599999997,76.338593000000117],[-84.397506999999962,76.330551000000128],[-84.381377999999927,76.324706999999933],[-84.376098999999954,76.317764000000125],[-84.381942999999978,76.31191999999993],[-84.393889999999999,76.308029000000033],[-84.413054999999986,76.304703000000018],[-84.429169000000002,76.303040000000067],[-84.533614999999941,76.30581699999999],[-84.716659999999933,76.306930999999963],[-84.776397999999972,76.303314],[-84.898055999999997,76.288589000000059],[-84.928328999999962,76.286377000000016],[-85.174438000000009,76.280272999999966],[-85.232223999999917,76.295257999999933],[-85.36221299999994,76.303314],[-85.505004999999983,76.321930000000066],[-85.523055999999883,76.326660000000061],[-85.544448999999986,76.329987000000017],[-85.698333999999988,76.34887700000013],[-85.952498999999932,76.368591000000038],[-85.978058000000033,76.370528999999976],[-86.004181000000017,76.37081900000004],[-86.110274999999945,76.368317000000104],[-86.134734999999978,76.369431000000077],[-86.281677000000002,76.376923000000033],[-86.330565999999976,76.3808140000001],[-86.37222300000002,76.38638300000008],[-86.412216000000001,76.40776100000005],[-86.415008999999884,76.41276600000009],[-86.421386999999925,76.456940000000031],[-86.418610000000001,76.469147000000021],[-86.409728999999913,76.474700999999982],[-86.398055999999997,76.478867000000093],[-86.378875999999991,76.483871000000022],[-86.36082499999992,76.487762000000089],[-86.307769999999948,76.49552900000009],[-86.277785999999935,76.5],[-86.256119000000012,76.503876000000048],[-86.22222899999997,76.513321000000133],[-86.213057999999933,76.518600000000106],[-86.20777899999996,76.524429000000112],[-86.211944999999957,76.535262999999986],[-86.226104999999961,76.542755000000113],[-86.532776000000013,76.623306000000014],[-86.594161999999983,76.634994999999947],[-86.63034099999993,76.635132000000112],[-86.625823999999966,76.629425000000083],[-86.601104999999961,76.619979999999998],[-86.512512000000015,76.586929000000055],[-86.36221299999994,76.541655999999932],[-86.342223999999987,76.512206999999933],[-86.508056999999894,76.487762000000089],[-86.64916999999997,76.458878000000141],[-86.664718999999991,76.419708000000014],[-86.711120999999991,76.348037999999974],[-86.71665999999999,76.346100000000035],[-86.770554000000004,76.350815000000068],[-87.083327999999995,76.379424999999912],[-87.130829000000006,76.384155000000135],[-87.148346000000004,76.388321000000076],[-87.154998999999975,76.39498900000001],[-87.154175000000009,76.40109300000006],[-87.225280999999995,76.448029000000076],[-87.426665999999898,76.468596999999988],[-87.462783999999942,76.586929000000055],[-87.468886999999995,76.59165999999999],[-87.520279000000016,76.612488000000042],[-87.53694200000001,76.617477000000008],[-87.563613999999973,76.616379000000109],[-87.580001999999979,76.611374000000069],[-87.583618000000001,76.604980000000012],[-87.598617999999988,76.540817000000004],[-87.595550999999944,76.534149000000014],[-87.553604000000007,76.451096000000007],[-87.545273000000009,76.443587999999977],[-87.53694200000001,76.439147999999989],[-87.516953000000001,76.432479999999998],[-87.500290000000007,76.428863999999919],[-87.455276000000026,76.423874000000069],[-87.429992999999911,76.417755000000056],[-87.402495999999985,76.352768000000026],[-87.416397000000018,76.348037999999974],[-87.591384999999889,76.341094999999996],[-87.648894999999868,76.338043000000084],[-87.719726999999978,76.343048000000124],[-87.742767000000015,76.34637500000008],[-87.760559000000001,76.352202999999975],[-87.788604999999961,76.366378999999995],[-87.817229999999995,76.390549000000021],[-87.864166000000012,76.38998400000014],[-87.900833000000034,76.363037000000077],[-87.916945999999996,76.359711000000004],[-87.948333999999988,76.357758000000103],[-87.997771999999998,76.358322000000044],[-88.351104999999905,76.384995000000004],[-88.389998999999875,76.389708999999982],[-88.42971799999998,76.398041000000148],[-88.434433000000013,76.402205999999978],[-88.391953000000001,76.454163000000108],[-88.371932999999956,76.476089000000059],[-88.355835000000013,76.481093999999928],[-88.348617999999988,76.487198000000149],[-88.349441999999954,76.514435000000105],[-88.356658999999979,76.521103000000096],[-88.442764000000011,76.59165999999999],[-88.515288999999939,76.636108000000036],[-88.509170999999981,76.697478999999987],[-88.488601999999958,76.765274000000034],[-88.479720999999927,76.776932000000045],[-88.476669000000015,76.783324999999991],[-88.474715999999887,76.788879000000009],[-88.474715999999887,76.794983000000002],[-88.477782999999988,76.807755000000043],[-88.485275000000001,76.814422999999977],[-88.494719999999973,76.81721500000009],[-88.518889999999999,76.816086000000098],[-88.541945999999939,76.812758999999971],[-88.554442999999935,76.807479999999998],[-88.557220000000029,76.805817000000104],[-88.701950000000011,76.707489000000123],[-88.683318999999983,76.701935000000105],[-88.649733999999967,76.684143000000063],[-88.591949,76.642761000000007],[-88.584441999999967,76.635818000000029],[-88.495543999999938,76.552199999999971],[-88.489440999999999,76.503326000000015],[-88.496383999999978,76.497208000000057],[-88.571670999999924,76.473602000000028],[-88.593558999999971,76.455933000000016],[-88.60321799999997,76.449265000000025],[-88.608214999999973,76.442261000000144],[-88.607727000000011,76.439095000000009],[-88.608611999999994,76.416092000000106],[-88.59973100000002,76.409988000000112],[-88.597503999999958,76.405823000000112],[-88.608046999999942,76.399994000000049],[-88.631942999999922,76.397217000000012],[-88.656386999999881,76.398330999999985],[-88.67721599999993,76.401932000000045],[-88.689986999999974,76.408324999999991],[-88.693603999999993,76.414703000000145],[-88.693329000000006,76.420821999999987],[-88.684998000000007,76.432479999999998],[-88.678054999999972,76.441650000000038],[-88.659508000000017,76.478706000000102],[-88.646506999999986,76.489212000000009],[-88.640288999999996,76.558594000000028],[-88.644164999999987,76.565262000000018],[-88.651672000000019,76.571930000000009],[-88.660277999999948,76.577773999999977],[-88.688888999999961,76.591369999999984],[-88.710006999999962,76.594986000000006],[-88.733611999999937,76.593872000000033],[-88.740828999999962,76.587769000000094],[-88.791381999999942,76.513321000000133],[-88.795273000000009,76.479431000000034],[-88.786666999999909,76.473602000000028],[-88.781386999999938,76.466385000000059],[-88.783324999999991,76.460815000000025],[-88.799438000000009,76.449997000000053],[-88.901671999999962,76.408324999999991],[-88.921111999999937,76.40525800000006],[-88.947220000000016,76.40525800000006],[-88.994155999999919,76.409149000000127],[-89.166396999999961,76.424423000000047],[-89.213332999999977,76.429703000000075],[-89.231673999999998,76.433593999999971],[-89.353333000000021,76.479979999999955],[-89.407227000000034,76.515823000000012],[-89.490279999999927,76.557480000000055],[-89.499435000000005,76.54664600000001],[-89.515015000000005,76.541655999999932],[-89.541381999999999,76.541655999999932],[-89.667220999999984,76.564423000000033],[-89.676665999999955,76.567215000000147],[-89.679442999999992,76.571655000000135],[-89.614166000000012,76.616089000000102],[-89.603607000000011,76.621918000000107],[-89.571945000000028,76.631653000000028],[-89.528335999999967,76.640823000000069],[-89.480559999999969,76.649428999999998],[-89.443329000000006,76.658325000000104],[-89.431380999999988,76.663605000000018],[-89.415558000000033,76.67442299999999],[-89.411666999999966,76.680266999999958],[-89.434432999999899,76.724426000000108],[-89.47222899999997,76.784714000000008],[-89.496947999999918,76.820267000000001],[-89.514449999999954,76.835815000000025],[-89.529175000000009,76.847214000000122],[-89.533324999999991,76.853592000000049],[-89.521392999999932,76.858871000000079],[-89.417770000000019,76.886658000000011],[-89.279449,76.906936999999971],[-89.238892000000021,76.916091999999992],[-89.14805599999994,76.925537000000077],[-88.986938000000009,76.954436999999928],[-88.976104999999961,76.959991000000116],[-88.898894999999982,76.985535000000141],[-88.769164999999987,76.998871000000065],[-88.740279999999927,77.00277699999998],[-88.719451999999933,77.007492000000013],[-88.702788999999939,77.012207000000046],[-88.50111400000003,77.071655000000078],[-88.473327999999981,77.096649000000014],[-88.544723999999917,77.098038000000031],[-88.545837000000006,77.100266000000147],[-88.426392000000021,77.12081900000004],[-88.307219999999973,77.128860000000088],[-88.278335999999911,77.129699999999957],[-88.172501000000011,77.128035999999952],[-88.154175000000009,77.116088999999988],[-87.967223999999931,77.127472000000012],[-87.690552000000025,77.135268999999994],[-87.670272999999952,77.133606000000043],[-87.656951999999933,77.130264000000125],[-87.642501999999979,77.124984999999924],[-87.626937999999996,77.117477000000122],[-87.619719999999973,77.110809000000131],[-87.568892999999889,77.099426000000108],[-87.455841000000021,77.101929000000098],[-87.349166999999966,77.106094000000098],[-87.337783999999886,77.110259999999982],[-87.353607000000011,77.114700000000028],[-87.37222300000002,77.117203000000018],[-87.451401000000033,77.122756999999979],[-87.460555999999997,77.125534000000073],[-87.456664999999987,77.131927000000019],[-87.452224999999999,77.136383000000137],[-87.432219999999973,77.149719000000061],[-87.416107000000011,77.156647000000078],[-87.404174999999896,77.160812000000078],[-87.356383999999991,77.17553700000002],[-87.33666999999997,77.179153000000099],[-87.312774999999988,77.180817000000104],[-87.069167999999991,77.182755000000043],[-87.044448999999929,77.180542000000059],[-86.959166999999979,77.161926000000051],[-86.951674999999966,77.158324999999991],[-86.946945000000028,77.154433999999924],[-86.951949999999897,77.149994000000106],[-86.951401000000033,77.144714000000022],[-86.942490000000021,77.141936999999928],[-86.875274999999931,77.132202000000063],[-86.829177999999956,77.127762000000018],[-86.804442999999992,77.127197000000024],[-86.791381999999999,77.130813999999987],[-86.739990000000034,77.174149000000114],[-86.773620999999935,77.185806000000071],[-86.960006999999962,77.195815999999979],[-87.15055799999999,77.199417000000039],[-87.148055999999997,77.198029000000133],[-87.146956999999929,77.195815999999979],[-87.161117999999931,77.194426999999962],[-87.182769999999948,77.196930000000123],[-87.196105999999929,77.199997000000053],[-87.21055599999994,77.205261000000064],[-87.174437999999896,77.229431000000034],[-87.166945999999939,77.233871000000079],[-87.141388000000006,77.238037000000134],[-87.007232999999985,77.255829000000006],[-86.976669000000015,77.257492000000127],[-86.948882999999967,77.255554000000018],[-86.928329000000019,77.255264000000011],[-86.910552999999936,77.260269000000051],[-86.919158999999979,77.266098000000056],[-86.947494999999947,77.271652000000074],[-86.984436000000017,77.274703999999986],[-87.012221999999952,77.274993999999992],[-87.078063999999927,77.273604999999975],[-87.106110000000001,77.272217000000069],[-87.136672999999973,77.272217000000069],[-87.183884000000035,77.273604999999975],[-87.197495000000004,77.27526899999998],[-87.229171999999949,77.285538000000031],[-87.245270000000005,77.298325000000034],[-87.24888599999997,77.303314],[-87.108611999999994,77.338318000000072],[-87.09584000000001,77.34027100000003],[-87.068618999999956,77.342209000000139],[-87.037780999999995,77.342209000000139],[-86.962783999999942,77.339157000000057],[-86.934722999999963,77.338882000000012],[-86.900283999999999,77.342209000000139],[-86.845839999999953,77.349152000000117],[-86.829726999999991,77.353043000000014],[-86.838608000000022,77.357483000000059],[-86.851944000000003,77.360535000000141],[-86.963332999999977,77.366378999999995],[-87.064162999999951,77.366928000000087],[-87.091109999999958,77.366378999999995],[-87.241378999999938,77.356094000000041],[-87.263061999999877,77.351654000000053],[-87.280838000000017,77.34693900000002],[-87.294158999999979,77.34165999999999],[-87.326110999999969,77.333878000000084],[-87.358886999999982,77.331375000000094],[-87.391112999999962,77.330551000000128],[-87.416397000000018,77.330826000000116],[-87.695830999999998,77.35554500000012],[-87.711945000000014,77.359985000000108],[-87.715835999999911,77.363312000000064],[-87.775283999999999,77.415543000000127],[-87.780288999999982,77.421097000000145],[-87.78472899999997,77.429703000000075],[-87.775009000000011,77.441360000000032],[-87.748336999999992,77.451660000000118],[-87.730834999999956,77.45637499999998],[-87.669539999999984,77.469238000000018],[-87.65194699999995,77.474990999999989],[-87.642501999999979,77.480270000000132],[-87.646117999999944,77.486923000000104],[-87.694442999999978,77.537201000000096],[-87.711120999999878,77.541656000000103],[-87.868880999999988,77.578598000000113],[-88.063048999999978,77.618866000000025],[-88.162216000000001,77.626923000000147],[-88.180556999999965,77.631927000000132],[-88.200835999999924,77.642761000000007],[-88.214721999999995,77.650542999999971],[-88.223617999999931,77.662490999999989],[-88.223052999999993,77.667206000000022],[-88.221114999999884,77.672760000000039],[-88.162780999999995,77.758330999999998],[-88.06806899999998,77.820267000000001],[-87.835830999999928,77.840271000000087],[-87.640563999999983,77.862487999999985],[-87.294723999999917,77.898041000000035],[-87.231383999999935,77.898880000000133],[-87.174712999999997,77.897491000000002],[-86.876099000000011,77.8836060000001],[-86.824172999999917,77.879424999999969],[-86.651671999999962,77.860260000000039],[-86.46166999999997,77.836105000000032],[-86.422225999999966,77.830826000000059],[-86.377486999999917,77.822769000000051],[-86.222778000000005,77.794434000000024],[-86.198883000000023,77.786102000000085],[-85.986938000000009,77.711380000000133],[-85.975280999999882,77.705825999999945],[-85.884445000000028,77.632751000000098],[-85.718886999999995,77.472214000000065],[-85.715835999999967,77.467209000000025],[-85.717223999999931,77.462493999999992],[-85.727218999999877,77.451934999999935],[-85.748610999999983,77.446930000000066],[-85.76916499999993,77.443587999999977],[-85.775832999999921,77.439972000000068],[-85.795837000000006,77.423874000000069],[-85.794448999999929,77.419708000000128],[-85.776947000000007,77.421371000000079],[-85.551391999999964,77.458328000000108],[-85.530562999999916,77.461928999999941],[-85.493331999999953,77.430267000000015],[-85.436385999999914,77.404159999999933],[-85.39973399999991,77.395827999999995],[-85.376662999999894,77.392487000000131],[-85.299438000000009,77.387772000000098],[-85.270003999999915,77.386658000000125],[-85.155838000000017,77.387497000000053],[-84.973327999999867,77.377197000000137],[-84.954726999999934,77.374420000000043],[-84.9375,77.370818999999983],[-84.875274999999988,77.351654000000053],[-84.825286999999946,77.334152000000017],[-84.759170999999867,77.318328999999949],[-84.719727000000034,77.311645999999996],[-84.649444999999957,77.304428000000144],[-84.601944000000003,77.300537000000077],[-84.529175000000009,77.295822000000044],[-84.479445999999996,77.294434000000138],[-84.466399999999965,77.296371000000022],[-84.463333000000034,77.300262000000089],[-84.47444200000001,77.3119200000001],[-84.481948999999986,77.317764000000125],[-84.494719999999973,77.321106000000043],[-84.520279000000016,77.324157999999954],[-84.553878999999995,77.331375000000094],[-84.569167999999991,77.339705999999978],[-84.615004999999996,77.383040999999992],[-84.612777999999878,77.389160000000004],[-84.603881999999942,77.393599999999992],[-84.58555599999994,77.398041000000092],[-84.550277999999935,77.401382000000126],[-84.520844000000011,77.401657],[-84.49610899999999,77.399428999999998],[-84.470550999999944,77.396378000000027],[-84.429442999999935,77.388884999999959],[-84.386397999999986,77.383881000000031],[-84.33444199999991,77.383040999999992],[-84.27027899999996,77.384995000000004],[-84.153609999999958,77.39498900000001],[-84.061661000000015,77.398605000000032],[-84.005843999999968,77.397491000000059],[-83.985275000000001,77.395537999999931],[-83.949996999999996,77.388884999999959],[-83.868057000000022,77.376923000000033],[-83.793610000000001,77.36914100000007],[-83.531951999999933,77.346375000000023],[-83.505843999999968,77.344711000000018],[-83.478058000000033,77.344147000000078],[-83.464721999999995,77.348327999999981],[-83.463057999999876,77.349152000000117],[-83.46444699999995,77.35554500000012],[-83.472504000000015,77.387207000000046],[-83.553054999999972,77.393051000000071],[-83.654998999999975,77.395537999999931],[-83.711669999999913,77.404709000000082],[-83.728607000000011,77.408324999999934],[-83.778609999999958,77.423309000000017],[-83.822509999999966,77.442474000000004],[-83.833892999999989,77.448868000000004],[-83.835555999999997,77.455261000000007],[-83.824722000000008,77.460541000000035],[-83.801391999999964,77.464706000000035],[-83.768065999999919,77.466934000000037],[-83.682220000000029,77.46804800000001],[-83.620833999999945,77.471924000000058],[-83.593886999999938,77.475540000000137],[-83.426102000000014,77.499710000000107],[-83.389450000000011,77.507767000000115],[-83.36332699999997,77.518051000000128],[-83.216110000000015,77.577773999999977],[-83.011123999999995,77.665817000000004],[-82.895003999999858,77.717484000000013],[-82.674438000000009,77.836928999999998],[-82.655272999999852,77.847763000000043],[-82.541671999999949,77.920532000000037],[-82.526107999999965,77.961929000000055],[-82.577224999999999,78.003326000000072],[-82.590835999999967,78.011108000000036],[-82.591675000000009,78.017487000000074],[-82.579726999999878,78.022766000000047],[-82.56361400000003,78.027771000000087],[-82.538054999999986,78.031096999999988],[-82.497498000000007,78.03414900000007],[-82.470551,78.034714000000122],[-82.40972899999997,78.03414900000007],[-82.377486999999917,78.035812000000021],[-82.369445999999925,78.039428999999927],[-82.326110999999969,78.065262000000075],[-82.318619000000012,78.070831000000055],[-82.320007000000032,78.075821000000133],[-82.336120999999991,78.078873000000044],[-82.518341000000021,78.074158000000011],[-82.549438000000009,78.071930000000066],[-82.652221999999995,78.056090999999924],[-82.672500999999954,78.051651000000106],[-82.692489999999964,78.044983000000116],[-82.780288999999982,78.014999000000103],[-82.790282999999988,78.010544000000095],[-82.792769999999905,78.005829000000062],[-82.794158999999979,77.994979999999998],[-82.785277999999948,77.969986000000006],[-82.775283999999942,77.964157],[-82.735275000000001,77.947479000000101],[-82.728881999999942,77.939972000000012],[-82.728607000000011,77.929703000000131],[-82.736114999999984,77.924148999999943],[-82.769164999999987,77.914993000000038],[-82.852218999999991,77.896942000000024],[-82.949157999999898,77.874694999999974],[-83.123046999999929,77.780548000000067],[-83.156661999999926,77.744980000000055],[-83.185546999999985,77.716385000000002],[-83.192489999999964,77.710540999999978],[-83.200835999999867,77.705551000000128],[-83.386672999999917,77.616653000000042],[-83.427215999999987,77.600815000000011],[-83.527785999999935,77.572769000000108],[-83.648055999999997,77.540816999999947],[-83.735000999999954,77.518875000000094],[-83.873046999999985,77.49331699999999],[-83.898345999999947,77.490540000000067],[-83.920546999999942,77.491652999999985],[-84.143889999999999,77.509430000000009],[-84.192490000000021,77.515549000000078],[-84.229995999999971,77.521378000000084],[-84.386672999999917,77.528594999999996],[-84.419997999999964,77.52777100000003],[-84.452224999999942,77.524994000000106],[-84.483321999999987,77.521652000000017],[-84.500564999999995,77.518051000000128],[-84.555557000000022,77.51249700000011],[-84.579726999999991,77.51249700000011],[-84.760558999999944,77.519714000000079],[-84.779174999999952,77.522490999999945],[-84.858886999999925,77.542755000000113],[-84.869155999999975,77.562759000000028],[-84.87110899999999,77.569153000000085],[-84.866393999999957,77.574158000000125],[-84.837219000000005,77.583878000000027],[-84.815552000000025,77.588881999999955],[-84.773620999999991,77.5977630000001],[-84.707229999999981,77.609985000000052],[-84.665282999999988,77.618866000000025],[-84.627486999999917,77.628036000000066],[-84.520003999999972,77.664703000000031],[-84.441939999999931,77.706100000000106],[-84.429992999999968,77.718322999999941],[-84.428328999999962,77.722762999999986],[-84.431106999999884,77.726379000000009],[-84.443054000000018,77.736374000000126],[-84.486938000000009,77.750275000000101],[-84.495270000000005,77.751099000000067],[-84.503066999999987,77.74971000000005],[-84.48971599999993,77.746368000000132],[-84.483062999999959,77.74470500000001],[-84.475280999999995,77.738876000000005],[-84.476669000000015,77.728316999999947],[-84.486388999999974,77.711380000000133],[-84.499161000000015,77.699707000000103],[-84.520844000000011,77.689148000000102],[-84.533889999999985,77.684981999999991],[-84.547226000000023,77.68081699999999],[-84.715012000000002,77.639709000000096],[-84.922501000000011,77.601653999999996],[-84.952498999999989,77.601379000000122],[-84.972503999999901,77.606369000000029],[-85.158339999999896,77.641663000000108],[-85.298889000000031,77.660538000000031],[-85.310546999999985,77.664703000000031],[-85.348891999999921,77.72886699999998],[-85.348891999999921,77.733871000000136],[-85.335830999999985,77.738037000000077],[-85.190276999999867,77.779984000000127],[-85.054992999999968,77.79693600000013],[-85.05360399999995,77.830551000000014],[-85.144164999999987,77.817490000000078],[-85.297775000000001,77.797211000000118],[-85.328063999999927,77.79832499999992],[-85.381942999999978,77.807754999999986],[-85.400283999999942,77.813309000000004],[-85.402495999999928,77.819991999999957],[-85.400283999999942,77.83638000000002],[-85.389724999999999,77.841934000000037],[-85.353333000000021,77.855545000000006],[-85.325012000000015,77.866089000000045],[-85.281386999999995,77.87441999999993],[-85.231948999999986,77.881653000000142],[-85.207778999999903,77.883881000000088],[-84.925551999999982,77.891098],[-84.837219000000005,77.887496999999939],[-84.692490000000021,77.898604999999975],[-84.664444000000003,77.902206000000035],[-84.611114999999927,77.90387000000004],[-84.498154,77.900116000000082],[-84.428878999999995,77.896942000000024],[-84.385833999999932,77.891098],[-84.368056999999908,77.887206999999933],[-84.342772999999909,77.88499500000006],[-84.318618999999956,77.886932000000115],[-84.31361400000003,77.891936999999984],[-84.325012000000015,77.896103000000039],[-84.379715000000033,77.90637200000009],[-84.401671999999962,77.910262999999986],[-84.559432999999956,77.92303499999997],[-84.575561999999991,77.923874000000126],[-84.634444999999914,77.926926000000037],[-84.663054999999929,77.925262000000032],[-84.816665999999941,77.911652000000004],[-84.847228999999913,77.90887500000008],[-85.056945999999982,77.900543000000084],[-85.166396999999961,77.902206000000035],[-85.200561999999991,77.901657000000057],[-85.267501999999922,77.898041000000035],[-85.303604000000007,77.894714000000079],[-85.331680000000006,77.890823000000012],[-85.378051999999968,77.882202000000063],[-85.423049999999989,77.874694999999974],[-85.474715999999944,77.868591000000094],[-85.515288999999996,77.8836060000001],[-85.678878999999938,77.929428000000144],[-85.67971799999998,77.936645999999939],[-85.675277999999992,77.941650000000095],[-85.660278000000005,77.946639999999945],[-85.450561999999991,77.991089000000102],[-85.28694200000001,78.021652000000074],[-85.065551999999911,78.056366000000139],[-85.038894999999911,78.057205000000124],[-85.009734999999921,78.055251999999996],[-84.963057999999933,78.04414399999996],[-84.884170999999924,78.033051],[-84.816955999999948,78.026382000000126],[-84.788054999999986,78.024155000000064],[-84.761672999999917,78.023605000000032],[-84.726943999999946,78.025817999999958],[-84.708892999999989,78.029434000000037],[-84.695540999999935,78.033599999999922],[-84.688888999999961,78.03915400000011],[-84.673888999999974,78.04414399999996],[-84.654175000000009,78.048874000000012],[-84.575561999999991,78.067215000000033],[-84.547501000000011,78.0711060000001],[-84.524444999999901,78.072220000000073],[-84.360001000000011,78.070267000000115],[-84.328612999999905,78.070541000000048],[-84.307219999999973,78.07249500000006],[-84.288054999999929,78.075546000000088],[-84.292769999999962,78.078049000000078],[-84.299438000000009,78.079712000000029],[-84.323623999999938,78.082764000000111],[-84.410003999999958,78.086929000000112],[-84.532775999999899,78.085541000000035],[-84.557220000000029,78.083603000000096],[-84.623046999999985,78.071381000000088],[-84.673614999999984,78.064148000000102],[-84.736937999999896,78.058319000000097],[-84.765563999999983,78.056366000000139],[-84.798888999999974,78.055251999999996],[-84.855835000000013,78.056930999999963],[-84.881942999999978,78.059143000000063],[-84.993880999999988,78.074158000000011],[-85.077498999999932,78.090820000000008],[-85.094451999999933,78.097487999999998],[-85.087783999999886,78.103317000000004],[-84.994994999999903,78.163040000000024],[-84.901947000000007,78.170821999999987],[-84.829452999999944,78.168869000000029],[-84.793883999999991,78.171096999999975],[-84.761123999999995,78.174423000000047],[-84.708617999999944,78.182479999999998],[-84.688598999999954,78.187195000000031],[-84.657775999999956,78.19720500000011],[-84.63110399999988,78.199997000000053],[-84.549437999999952,78.19720500000011],[-84.430557000000022,78.186371000000065],[-84.315551999999968,78.173599000000081],[-84.284164000000033,78.166381999999942],[-84.222778000000005,78.158875000000023],[-84.201110999999969,78.156937000000084],[-84.173889000000031,78.15776100000005],[-84.127776999999924,78.171096999999975],[-84.126662999999951,78.179977000000008],[-84.453612999999962,78.214706000000092],[-84.479720999999927,78.216934000000037],[-84.506667999999934,78.217758000000003],[-84.693603999999993,78.217209000000082],[-84.722504000000015,78.216934000000037],[-84.777495999999871,78.210266000000047],[-84.877212999999927,78.193039000000056],[-84.909728999999857,78.191086000000098],[-84.937774999999931,78.192474000000004],[-84.951400999999976,78.195525999999916],[-84.968613000000005,78.202484000000084],[-84.973891999999978,78.208602999999982],[-84.970276000000013,78.214157000000114],[-84.967223999999931,78.21804800000001],[-84.956116000000009,78.232208000000128],[-84.942764000000011,78.243866000000139],[-84.83444199999991,78.314987000000031],[-84.815276999999924,78.321654999999964],[-84.792496000000028,78.32499700000011],[-84.731383999999991,78.325546000000031],[-84.658614999999998,78.329437000000098],[-84.629715000000033,78.333327999999995],[-84.605270000000019,78.337494000000106],[-84.585281000000009,78.341934000000094],[-84.575561999999991,78.346375000000023],[-84.572784000000013,78.350540000000024],[-84.571944999999971,78.355545000000063],[-84.575835999999924,78.361374000000069],[-84.581679999999949,78.366089000000102],[-84.601944000000003,78.368866000000025],[-84.630828999999949,78.364990000000148],[-84.667769999999962,78.348602000000085],[-84.684722999999963,78.344147000000078],[-84.707229999999981,78.341094999999939],[-84.735001000000011,78.340270999999973],[-84.772231999999974,78.342209000000139],[-84.815552000000025,78.349152000000117],[-84.866942999999992,78.36914100000007],[-84.865829000000019,78.372207999999944],[-84.785278000000005,78.501663000000065],[-84.782501000000025,78.505829000000119],[-84.774718999999948,78.509154999999964],[-84.759170999999867,78.514160000000061],[-84.738602000000014,78.518875000000094],[-84.724166999999966,78.524429000000055],[-84.704452999999944,78.534988000000112],[-84.625823999999966,78.584152000000074],[-84.619445999999925,78.588318000000015],[-84.61999499999996,78.590546000000131],[-84.638610999999969,78.594147000000021],[-84.661117999999988,78.59248400000007],[-84.675277999999992,78.588318000000015],[-84.838332999999977,78.516662999999994],[-84.846389999999928,78.511658000000125],[-84.978333000000021,78.414993000000095],[-84.974715999999944,78.358871000000136],[-84.970550999999944,78.353317000000118],[-84.964721999999938,78.348602000000085],[-84.961945000000014,78.343597000000045],[-84.96665999999999,78.338882000000012],[-85.043335000000013,78.299149],[-85.188048999999978,78.228317000000061],[-85.418335000000013,78.118866000000082],[-85.433318999999983,78.113876000000005],[-85.450835999999924,78.109984999999938],[-85.486114999999927,78.102478000000019],[-85.508057000000008,78.099152000000004],[-85.523055999999883,78.099426000000108],[-85.528060999999923,78.101929000000098],[-85.608886999999982,78.100815000000068],[-85.740829000000019,78.093048000000124],[-85.80471799999998,78.088882000000069],[-85.876662999999951,78.08166499999993],[-85.894164999999987,78.078049000000078],[-86.010283999999956,78.066086000000041],[-86.119995000000017,78.056366000000139],[-86.148345999999947,78.054703000000018],[-86.178054999999972,78.054977000000122],[-86.223327999999981,78.057480000000112],[-86.267226999999991,78.066376000000048],[-86.282227000000034,78.071655000000021],[-86.288329999999974,78.076385000000073],[-86.291381999999999,78.081375000000094],[-86.290558000000033,78.085815000000139],[-86.25140399999998,78.156647000000078],[-86.234160999999972,78.160537999999974],[-86.135558999999944,78.165543000000014],[-86.113051999999868,78.17053199999998],[-86.098052999999993,78.17553700000002],[-85.949996999999996,78.228317000000061],[-85.93110699999994,78.236649000000057],[-85.839995999999985,78.325821000000076],[-85.835281000000009,78.332214000000022],[-85.827224999999942,78.344147000000078],[-85.825561999999934,78.348602000000085],[-85.833068999999966,78.379974000000004],[-85.853333000000021,78.379150000000038],[-85.878051999999968,78.376922999999977],[-86.052779999999984,78.297484999999995],[-86.060271999999998,78.292480000000126],[-86.060546999999929,78.280548000000124],[-86.06527699999998,78.263610999999969],[-86.073623999999938,78.24859600000002],[-86.259170999999924,78.196365000000071],[-86.285277999999948,78.193314000000044],[-86.311110999999983,78.193314000000044],[-86.453613000000018,78.211928999999998],[-86.476668999999958,78.215820000000065],[-86.497771999999941,78.215546000000131],[-86.515014999999948,78.211655000000064],[-86.537215999999944,78.19470199999995],[-86.548888999999974,78.183044000000109],[-86.569457999999941,78.172210999999947],[-86.719726999999978,78.121917999999994],[-86.736938000000009,78.118042000000116],[-86.763061999999991,78.114990000000034],[-87.079726999999934,78.102768000000026],[-87.10943599999996,78.103043000000071],[-87.196654999999964,78.106094000000098],[-87.439712999999983,78.121643000000006],[-87.505843999999911,78.12831099999994],[-87.529174999999952,78.132202000000007],[-87.538605000000018,78.138046000000031],[-87.535003999999958,78.143051000000071],[-87.526671999999962,78.149155000000121],[-87.483886999999925,78.164429000000041],[-87.430556999999965,78.178314000000114],[-87.407501000000025,78.183044000000109],[-87.352218999999991,78.191086000000098],[-87.314163000000008,78.193863000000022],[-87.289992999999981,78.19470199999995],[-87.166945999999939,78.195525999999916],[-87.104996000000028,78.199141999999995],[-87.08944699999995,78.201934999999992],[-87.087219000000005,78.206099999999992],[-87.105835000000013,78.209427000000119],[-87.262222000000008,78.22665400000011],[-87.293609999999944,78.226089000000115],[-87.363892000000021,78.221099999999922],[-87.371657999999968,78.219437000000028],[-87.396118000000001,78.217209000000082],[-87.423049999999932,78.216095000000053],[-87.475554999999872,78.216385000000116],[-87.497771999999941,78.219711000000132],[-87.513335999999924,78.224990999999989],[-87.518616000000009,78.230545000000006],[-87.516953000000001,78.24136400000009],[-87.516113000000018,78.245819000000097],[-87.494445999999982,78.298598999999967],[-87.502501999999879,78.30525200000011],[-87.513061999999991,78.316375999999991],[-87.516402999999968,78.322768999999937],[-87.52555799999999,78.410263000000043],[-87.524718999999948,78.416382000000112],[-87.517226999999991,78.426376000000118],[-87.503066999999987,78.436646000000053],[-87.476943999999946,78.44802900000002],[-87.311385999999914,78.509154999999964],[-87.292220999999927,78.513885000000016],[-87.15834000000001,78.546371000000136],[-87.140563999999983,78.550262000000032],[-87.013061999999991,78.554153000000099],[-86.891112999999962,78.54553199999998],[-86.866394000000014,78.546371000000136],[-86.858336999999949,78.547760000000096],[-86.855834999999956,78.551650999999993],[-86.858886999999982,78.566375999999934],[-86.864440999999999,78.568878000000041],[-86.877776999999924,78.573044000000095],[-86.898620999999991,78.575821000000019],[-86.957779000000016,78.574997000000053],[-87.031676999999945,78.569153000000028],[-87.066101000000003,78.567490000000134],[-87.095275999999956,78.568604000000107],[-87.113051999999925,78.573044000000095],[-87.121658000000025,78.576934999999992],[-87.12388599999997,78.581099999999992],[-87.122498000000007,78.587204000000042],[-86.944716999999969,78.704711999999972],[-86.934432999999956,78.709991000000116],[-86.922501000000011,78.714705999999978],[-86.856948999999929,78.734985000000108],[-86.638901000000033,78.79942299999999],[-86.615829000000019,78.803040000000124],[-86.377212999999983,78.809982000000048],[-86.138061999999991,78.816666000000112],[-86.067504999999983,78.819716999999912],[-86.037215999999944,78.821380999999974],[-85.646666999999866,78.848602000000142],[-85.607497999999964,78.85165400000011],[-85.577498999999932,78.855819999999994],[-85.350280999999995,78.88749700000011],[-85.329726999999934,78.892211999999972],[-85.297500999999954,78.902205999999978],[-85.257507000000032,78.910537999999974],[-85.09973100000002,78.917755000000056],[-85.064163000000008,78.919144000000074],[-85.036117999999988,78.91693099999992],[-85.008895999999993,78.913315000000068],[-84.84584000000001,78.888885000000016],[-84.788329999999917,78.878035999999952],[-84.766402999999968,78.873032000000023],[-84.740554999999915,78.869980000000112],[-84.712783999999942,78.86775200000011],[-84.563323999999966,78.859984999999995],[-84.412216000000001,78.85554499999995],[-84.212783999999886,78.856934000000138],[-84.145003999999972,78.85554499999995],[-83.850829999999974,78.845261000000107],[-83.746947999999918,78.836928999999941],[-83.694442999999978,78.829712000000029],[-83.674437999999952,78.825546000000145],[-83.660004000000015,78.819992000000127],[-83.64056399999987,78.813873000000115],[-83.601944000000003,78.802200000000084],[-83.579726999999934,78.796371000000079],[-83.538329999999917,78.787201000000039],[-83.513061999999991,78.783874999999966],[-83.485824999999977,78.781372000000033],[-83.428604000000007,78.779159999999933],[-83.394164999999987,78.778870000000097],[-83.34584000000001,78.773605000000032],[-83.327498999999932,78.769713999999965],[-83.308334000000002,78.76388500000013],[-83.293610000000001,78.756104000000107],[-83.284926999999925,78.750000000000057],[-83.236938000000009,78.74054000000001],[-83.101394999999968,78.714432000000045],[-82.994720000000029,78.699707000000103],[-82.941939999999988,78.695526000000029],[-82.910827999999981,78.694702000000063],[-82.845000999999968,78.697478999999987],[-82.822509999999966,78.695250999999985],[-82.689712999999983,78.664154000000053],[-82.69638099999986,78.657761000000107],[-82.704453000000001,78.651932000000102],[-82.695540999999992,78.645264000000111],[-82.610549999999932,78.611374000000012],[-82.506957999999997,78.591095000000109],[-82.417220999999927,78.574158000000068],[-82.37388599999997,78.568604000000107],[-82.357497999999907,78.567490000000134],[-82.337783999999999,78.566665999999941],[-82.308334000000002,78.568878000000041],[-82.262222000000008,78.578048999999965],[-82.236938000000009,78.588318000000015],[-82.235549999999932,78.595825000000104],[-82.244719999999973,78.598877000000073],[-82.310271999999941,78.616653000000042],[-82.416655999999989,78.64276099999995],[-82.496384000000035,78.661926000000108],[-82.516953000000001,78.666930999999977],[-82.535278000000005,78.672759999999982],[-82.559433000000013,78.682205000000067],[-82.565552000000025,78.685256999999979],[-82.584732000000031,78.695526000000029],[-82.59445199999999,78.703049000000021],[-82.581954999999994,78.708327999999995],[-82.569167999999991,78.711380000000133],[-82.45666499999993,78.730820000000108],[-82.435546999999929,78.731659000000093],[-82.407775999999956,78.730820000000108],[-82.350554999999986,78.726089000000002],[-82.279723999999987,78.71775800000006],[-82.255279999999914,78.71665999999999],[-82.230835000000013,78.71775800000006],[-82.223327999999981,78.719711000000018],[-82.215011999999888,78.723037999999974],[-82.220550999999887,78.732208000000014],[-82.231948999999986,78.736374000000126],[-82.254729999999995,78.740814000000114],[-82.279175000000009,78.74414100000007],[-82.310821999999973,78.746933000000126],[-82.396392999999932,78.74914600000011],[-82.45666499999993,78.74914600000011],[-82.480835000000013,78.748322000000144],[-82.506119000000012,78.745818999999983],[-82.525557999999933,78.742203000000131],[-82.542770000000019,78.737198000000092],[-82.564437999999996,78.732758000000047],[-82.619155999999975,78.728043000000014],[-82.663619999999923,78.728043000000014],[-82.752501999999936,78.729705999999965],[-82.781386999999995,78.731094000000041],[-82.809722999999963,78.734146000000123],[-82.826950000000011,78.737488000000099],[-82.84333799999996,78.742203000000131],[-82.911666999999909,78.76638800000012],[-83.069732999999928,78.792206000000078],[-83.108611999999994,78.796646000000067],[-83.21055599999994,78.798874000000069],[-83.228607000000011,78.804153000000042],[-83.255844000000025,78.829987000000074],[-83.254729999999995,78.834991000000002],[-83.244445999999925,78.839432000000102],[-83.218337999999903,78.843597000000102],[-83.1875,78.847214000000065],[-83.085830999999985,78.85554499999995],[-83.056945999999925,78.856094000000098],[-82.991669000000002,78.85554499999995],[-82.811110999999983,78.848038000000031],[-82.67582699999997,78.842209000000025],[-82.65055799999999,78.838882000000069],[-82.621384000000035,78.837493999999992],[-82.462783999999942,78.833328000000108],[-82.429442999999992,78.833328000000108],[-82.289718999999991,78.837203999999986],[-82.254455999999948,78.840546000000074],[-82.112777999999992,78.857483000000116],[-82.079452999999944,78.859711000000061],[-81.947495000000004,78.865814],[-81.913894999999911,78.865814],[-81.764174999999966,78.859984999999995],[-81.749434999999949,78.858032000000037],[-81.740554999999915,78.855254999999943],[-81.767226999999991,78.853317000000004],[-81.824447999999961,78.853867000000037],[-81.838607999999965,78.851379000000065],[-81.833618000000001,78.846649000000014],[-81.820281999999963,78.845261000000107],[-81.741378999999881,78.839157000000114],[-81.712509000000011,78.839706000000035],[-81.699157999999954,78.842757999999947],[-81.660827999999924,78.877762000000018],[-81.656661999999869,78.883881000000088],[-81.65695199999999,78.888321000000076],[-81.666397000000018,78.895537999999988],[-81.68249499999996,78.900268999999923],[-81.734725999999966,78.90637200000009],[-81.753066999999987,78.912201000000096],[-81.755843999999968,78.91804500000012],[-81.698607999999922,78.973877000000073],[-81.690825999999959,78.980270000000019],[-81.683060000000012,78.984421000000111],[-81.553604000000007,79.024155000000007],[-81.486114999999927,79.041655999999989],[-81.477218999999991,79.047211000000061],[-81.486663999999962,79.052475000000072],[-81.50306699999993,79.059143000000006],[-81.521118000000001,79.061096000000134],[-81.548614999999984,79.061355999999989],[-81.617767000000015,79.051086000000055],[-81.865829000000019,79.013610999999969],[-81.910277999999948,79.004990000000078],[-81.928329000000019,79],[-81.961120999999935,78.98692299999999],[-81.97222899999997,78.982483000000002],[-81.974166999999966,78.979431000000034],[-81.999725000000012,78.960266000000104],[-82.092772999999909,78.918320000000108],[-82.110274999999945,78.913605000000075],[-82.34722899999997,78.894440000000088],[-82.50306699999993,78.882750999999985],[-82.559433000000013,78.884720000000016],[-82.681380999999988,78.903319999999951],[-82.813888999999961,78.923035000000141],[-82.839447000000007,78.926376000000005],[-82.924438000000009,78.934982000000105],[-83.063048999999978,78.939697000000137],[-83.126663000000008,78.941085999999927],[-83.264175000000023,78.939147999999989],[-83.514174999999966,78.930542000000059],[-83.570557000000008,78.929977000000065],[-83.637512000000015,78.930817000000104],[-83.694716999999912,78.934708000000001],[-83.787215999999887,78.942474000000061],[-83.812774999999988,78.945815999999979],[-84.034163999999976,78.956650000000025],[-84.165558000000033,78.956940000000031],[-84.200561999999991,78.957213999999965],[-84.259170999999981,78.959427000000119],[-84.328888000000006,78.965271000000143],[-84.367492999999968,78.972488000000055],[-84.386123999999882,78.977767999999969],[-84.429992999999968,78.987761999999975],[-84.473052999999936,78.99552900000009],[-84.573333999999875,79.009995000000117],[-84.651397999999972,79.019439999999975],[-84.679442999999992,79.021652000000074],[-84.726943999999946,79.027771000000087],[-84.748046999999985,79.031936999999971],[-84.766953000000001,79.037200999999982],[-84.779174999999952,79.04664600000001],[-84.789718999999991,79.064148000000046],[-84.789168999999958,79.069442999999978],[-84.783889999999985,79.074432000000115],[-84.651672000000019,79.114699999999971],[-84.544158999999979,79.141372999999987],[-84.528609999999901,79.143326000000059],[-84.503615999999909,79.144440000000088],[-84.473052999999936,79.143051000000071],[-84.163894999999911,79.12414600000011],[-84.135559000000001,79.121917999999994],[-84.075561999999934,79.10443099999992],[-84.0625,79.090546000000018],[-84.040558000000033,79.075447000000054],[-83.990279999999984,79.051651000000106],[-83.950561999999934,79.043594000000098],[-83.896392999999989,79.038040000000137],[-83.744720000000029,79.028046000000074],[-83.600554999999929,79.025269000000037],[-83.504456000000005,79.023604999999975],[-83.474716000000001,79.024155000000007],[-83.454726999999991,79.025542999999971],[-83.386123999999995,79.039429000000098],[-83.36860699999994,79.044434000000138],[-83.358611999999937,79.050812000000121],[-83.373610999999926,79.056366000000139],[-83.399445000000014,79.059708000000057],[-83.415557999999976,79.059981999999991],[-83.430831999999953,79.05831900000004],[-83.461670000000026,79.052200000000028],[-83.493880999999931,79.043319999999994],[-83.521118000000001,79.041367000000037],[-83.546111999999937,79.042480000000126],[-83.70666499999993,79.077774000000034],[-83.976394999999968,79.141098000000113],[-84.003615999999909,79.148605000000089],[-84.029998999999975,79.151657],[-84.029175000000009,79.156937000000028],[-84.018889999999999,79.161377000000073],[-84.005004999999926,79.166092000000106],[-83.952498999999989,79.180267000000015],[-83.939986999999917,79.18553200000008],[-83.933318999999926,79.191925000000026],[-83.941101000000003,79.216385000000059],[-83.956664999999987,79.221924000000058],[-83.979720999999927,79.22164900000007],[-84.016952999999944,79.213042999999971],[-84.043059999999912,79.203048999999965],[-84.051940999999943,79.198029000000076],[-84.067504999999983,79.192474000000004],[-84.086120999999991,79.188033999999959],[-84.121933000000013,79.184708000000114],[-84.158507999999983,79.183304000000135],[-84.193329000000006,79.183044000000109],[-84.303329000000019,79.186646000000053],[-84.326949999999954,79.188583000000108],[-84.323897999999872,79.19470200000012],[-84.316665999999941,79.200546000000145],[-84.31361400000003,79.206649999999968],[-84.335555999999997,79.252213000000097],[-84.34445199999999,79.258041000000048],[-84.362777999999992,79.264999000000046],[-84.401108000000022,79.27526899999998],[-84.428878999999995,79.290268000000026],[-84.452788999999996,79.328872999999987],[-84.452224999999942,79.34165999999999],[-84.446654999999964,79.353866999999923],[-84.446105999999929,79.358871000000079],[-84.484725999999966,79.406372000000147],[-84.503341999999975,79.413040000000137],[-84.581116000000009,79.433868000000018],[-84.606110000000001,79.43803400000013],[-84.660278000000005,79.444138000000123],[-84.709166999999979,79.451660000000061],[-84.821120999999948,79.473037999999974],[-84.882492000000013,79.486098999999911],[-84.896956999999929,79.492477000000065],[-84.96945199999999,79.537491000000045],[-84.972503999999901,79.542206000000078],[-85.022232000000031,79.611099000000024],[-85.028885000000002,79.615814000000057],[-85.050277999999992,79.621643000000063],[-85.068892999999946,79.626083000000051],[-85.25418099999996,79.667205999999965],[-85.372497999999894,79.684417999999994],[-85.493331999999953,79.700546000000031],[-85.551391999999964,79.705826000000116],[-85.615828999999962,79.708327999999995],[-85.684433000000013,79.709152000000131],[-85.763061999999991,79.705551000000071],[-85.94888299999991,79.708327999999995],[-86.203339000000028,79.735809000000074],[-86.387512000000015,79.747482000000048],[-86.415833000000021,79.750548999999978],[-86.445830999999885,79.754166000000112],[-86.47193900000002,79.759720000000129],[-86.486389000000031,79.763611000000026],[-86.49360699999994,79.768326000000059],[-86.502227999999945,79.775269000000037],[-86.47193900000002,79.890549000000021],[-86.460281000000009,79.919708000000014],[-86.450286999999889,79.931091000000038],[-86.43638599999997,79.942474000000004],[-86.424437999999952,79.948029000000076],[-86.389724999999999,79.958038000000101],[-86.36721799999998,79.962769000000037],[-86.300277999999935,79.968596999999988],[-86.263335999999924,79.969147000000021],[-86.230285999999978,79.96804800000001],[-86.083892999999989,79.95748900000001],[-85.885833999999988,79.941086000000098],[-85.819732999999928,79.938582999999937],[-85.785003999999958,79.938034000000016],[-85.711394999999925,79.937485000000038],[-85.65695199999999,79.938034000000016],[-85.519454999999994,79.924988000000042],[-85.460006999999905,79.910812000000078],[-85.416397000000018,79.901382000000012],[-85.389998999999932,79.897491000000116],[-85.365829000000019,79.896378000000027],[-85.308334000000002,79.900543000000027],[-85.289168999999958,79.904984000000127],[-85.275008999999955,79.909424000000001],[-85.262511999999958,79.914992999999981],[-85.255004999999926,79.920821999999987],[-85.271118000000001,79.923874000000069],[-85.440826000000015,79.938309000000004],[-85.640839000000028,79.962769000000037],[-86.190552000000025,80],[-86.301940999999943,79.998322000000087],[-86.341384999999946,79.99693300000007],[-86.413329999999974,79.99803200000008],[-86.442763999999954,79.999709999999993],[-86.466400000000021,80.003876000000048],[-86.482773000000009,80.0086060000001],[-86.565551999999968,80.035812000000135],[-86.579452999999944,80.04304500000012],[-86.642501999999922,80.098037999999974],[-86.658614999999884,80.117752000000053],[-86.65943900000002,80.128036000000066],[-86.65583799999996,80.135269000000108],[-86.514724999999942,80.299149000000114],[-86.493057000000022,80.304428000000087],[-86.46833799999996,80.308594000000028],[-86.434432999999956,80.312485000000095],[-86.345001000000025,80.319153000000028],[-86.11610399999995,80.333602999999982],[-86.076110999999912,80.333602999999982],[-85.897507000000019,80.333054000000004],[-85.745269999999948,80.320267000000001],[-85.717498999999975,80.316375999999934],[-85.671936000000017,80.306931000000077],[-85.616652999999928,80.298874000000126],[-85.509170999999981,80.285812000000078],[-85.479171999999949,80.28276100000005],[-85.354171999999892,80.273041000000148],[-85.290832999999964,80.268600000000049],[-85.256957999999997,80.267211999999972],[-85.095839999999953,80.262207000000103],[-84.9375,80.267211999999972],[-84.898346000000004,80.269440000000088],[-84.779174999999952,80.272491000000116],[-84.702498999999932,80.273315000000082],[-84.589721999999995,80.273605000000089],[-84.196655000000021,80.271378000000027],[-84.049437999999896,80.267761000000121],[-83.989440999999999,80.264435000000049],[-83.926392000000021,80.259720000000016],[-83.811110999999983,80.249145999999996],[-83.78195199999999,80.24581900000004],[-83.716110000000015,80.233871000000022],[-83.626389000000017,80.213608000000136],[-83.560821999999973,80.195816000000093],[-83.546386999999982,80.189423000000147],[-83.478058000000033,80.164428999999984],[-83.461394999999925,80.15914900000007],[-83.42471299999994,80.148331000000098],[-83.40306099999998,80.142212000000086],[-83.24499499999996,80.103591999999935],[-83.138901000000033,80.078323000000125],[-83.029723999999987,80.053314],[-82.89805599999994,80.02526899999998],[-82.803329000000019,80.006377999999984],[-82.736114999999984,79.992476999999951],[-82.605835000000013,79.964431999999988],[-82.283889999999985,79.893051000000071],[-82.15306099999998,79.858870999999965],[-82.101943999999946,79.839706000000035],[-82.091675000000009,79.834717000000069],[-82.062499999999943,79.816086000000041],[-82.046386999999982,79.801651000000106],[-81.976944000000003,79.735809000000074],[-81.981673999999998,79.723877000000073],[-81.978881999999999,79.718323000000112],[-81.916655999999989,79.703323000000125],[-81.853057999999976,79.693588000000034],[-81.799438000000009,79.686645999999939],[-81.767501999999922,79.684981999999934],[-81.733886999999925,79.686371000000122],[-81.68472300000002,79.675812000000064],[-81.6163939999999,79.623305999999957],[-81.61860699999994,79.61831699999999],[-81.628052000000025,79.614700000000028],[-81.651671999999905,79.610260000000039],[-81.678054999999972,79.607208000000128],[-81.687774999999874,79.608032000000094],[-81.694716999999969,79.609711000000061],[-81.709732000000031,79.615540000000124],[-81.734160999999972,79.619705000000124],[-81.748610999999983,79.621094000000085],[-81.767501999999922,79.62052900000009],[-81.777221999999995,79.619140999999956],[-81.785277999999892,79.614990000000091],[-81.786117999999931,79.609146000000067],[-81.782227000000034,79.604979999999955],[-81.768616000000009,79.600266000000033],[-81.750290000000007,79.594711000000132],[-81.728333000000021,79.589706000000092],[-81.706664999999987,79.586655000000064],[-81.675277999999992,79.584991000000059],[-81.639450000000011,79.584991000000059],[-81.605835000000013,79.588593000000003],[-81.578613000000018,79.59304800000001],[-81.56361400000003,79.597763000000043],[-81.544998000000021,79.609146000000067],[-81.509444999999914,79.624145999999996],[-81.495270000000005,79.629425000000026],[-81.476395000000025,79.634155000000021],[-81.457229999999981,79.636932000000115],[-81.424712999999997,79.636658000000011],[-81.368056999999965,79.634430000000066],[-81.279998999999918,79.628310999999997],[-81.253615999999965,79.624694999999974],[-81.013061999999877,79.598877000000016],[-80.69027699999998,79.56860400000005],[-80.630554000000018,79.564147999999989],[-80.598052999999993,79.566086000000098],[-80.589721999999995,79.568054000000018],[-80.591949,79.573608000000036],[-80.60861199999988,79.576096000000007],[-80.625274999999931,79.580826000000059],[-80.641953000000001,79.588042999999971],[-80.634170999999981,79.592758000000003],[-80.618606999999884,79.597214000000122],[-80.598052999999993,79.601379000000122],[-80.569167999999877,79.605255],[-80.50167799999997,79.61192299999999],[-80.100280999999995,79.644440000000145],[-80.056655999999975,79.646942000000024],[-80.025283999999942,79.647217000000069],[-79.972778000000005,79.644440000000145],[-79.93638599999997,79.644440000000145],[-79.904723999999987,79.646942000000024],[-79.892501999999922,79.649155000000007],[-79.761947999999961,79.695816000000036],[-79.751403999999923,79.701385000000016],[-79.768616000000009,79.701935000000049],[-80.041381999999999,79.697479000000101],[-80.356658999999979,79.685256999999979],[-80.389724999999999,79.68331900000004],[-80.432220000000029,79.677765000000022],[-80.473617999999988,79.669708000000071],[-80.516113000000018,79.664429000000098],[-80.618057000000022,79.654160000000047],[-80.658889999999928,79.652481000000023],[-80.795273000000009,79.648041000000035],[-80.827498999999989,79.648331000000042],[-80.910552999999993,79.651932000000102],[-80.942215000000033,79.653594999999996],[-80.955275999999969,79.658600000000035],[-80.958892999999932,79.664993000000038],[-80.970839999999953,79.671370999999965],[-80.978333000000021,79.67303499999997],[-81.076110999999969,79.688873000000001],[-81.171936000000017,79.703323000000125],[-81.227782999999988,79.709427000000005],[-81.291945999999882,79.713608000000079],[-81.385559000000001,79.713608000000079],[-81.424437999999952,79.712769000000094],[-81.519729999999925,79.730820000000108],[-81.569457999999941,79.819717000000082],[-81.582779000000016,79.836929000000112],[-81.587783999999942,79.841660000000047],[-81.59973100000002,79.851929000000098],[-81.608337000000006,79.858597000000032],[-81.631377999999984,79.872208000000001],[-81.651947000000007,79.882750999999985],[-81.65972899999997,79.888596000000064],[-81.665008999999941,79.897765999999933],[-81.663054999999986,79.903046000000018],[-81.643616000000009,79.909988000000112],[-81.540557999999919,79.922760000000096],[-81.515839000000028,79.924988000000042],[-81.416945999999939,79.927199999999971],[-81.402221999999995,79.932479999999998],[-81.400283999999942,79.937758999999971],[-81.420272999999952,79.943587999999977],[-81.557495000000017,79.960815000000025],[-81.589721999999995,79.962494000000049],[-81.639450000000011,79.962204000000042],[-81.643341000000021,79.962204000000042],[-81.710555999999997,79.964706000000092],[-81.743056999999965,79.966385000000116],[-81.833068999999966,79.973877000000016],[-82.005004999999983,79.993042000000003],[-82.168334999999956,80.013610999999969],[-82.191101000000003,80.018600000000106],[-82.285827999999981,80.046097000000088],[-82.34333799999996,80.063873000000058],[-82.359160999999915,80.069153000000085],[-82.619155999999975,80.150542999999971],[-82.948043999999982,80.247481999999991],[-83.12110899999999,80.292755000000056],[-83.166655999999932,80.301376000000005],[-83.186934999999949,80.30664100000007],[-83.201400999999976,80.313309000000061],[-83.203887999999949,80.318054000000075],[-83.196654999999964,80.320830999999998],[-83.166945999999939,80.326934999999992],[-83.131942999999978,80.330551000000071],[-82.942764000000011,80.345535000000098],[-82.854720999999984,80.350815000000011],[-82.787780999999939,80.352203000000088],[-82.706664999999987,80.352767999999969],[-82.579726999999878,80.358322000000101],[-82.273330999999928,80.377472000000068],[-82.031386999999938,80.398331000000042],[-81.987212999999997,80.40026899999998],[-81.899170000000026,80.401657000000114],[-81.882216999999969,80.401932000000102],[-81.673888999999974,80.406097000000102],[-81.334441999999967,80.420532000000037],[-81.204726999999991,80.427200000000028],[-81.079726999999991,80.436096000000134],[-80.98611499999987,80.443588000000091],[-80.835007000000019,80.452774000000034],[-80.660004000000015,80.460815000000082],[-80.481110000000001,80.462494000000106],[-80.412216000000001,80.460541000000148],[-80.367766999999958,80.462204000000099],[-80.336120999999991,80.465819999999951],[-80.318893000000003,80.470534999999984],[-80.306655999999919,80.47526600000009],[-80.294158999999866,80.486649000000114],[-80.297775000000001,80.488876000000005],[-80.312209999999936,80.491653000000099],[-80.343338000000017,80.49414100000007],[-80.354996000000028,80.498031999999967],[-80.357223999999917,80.501389000000074],[-80.227492999999924,80.519713999999965],[-80.195540999999935,80.523605000000032],[-80.153335999999967,80.526382000000126],[-80.116394000000014,80.527771000000143],[-80.058608999999933,80.527206000000092],[-79.940276999999924,80.528869999999927],[-79.558043999999995,80.536377000000073],[-79.490554999999915,80.539703000000088],[-79.339995999999928,80.549988000000042],[-79.232773000000009,80.553314000000057],[-79.190552000000025,80.55386400000009],[-79.011123999999995,80.553314000000057],[-78.815551999999911,80.555817000000047],[-78.592772999999966,80.562195000000031],[-78.46556099999998,80.563873000000115],[-78.345276000000013,80.564423000000147],[-78.098891999999921,80.562485000000038],[-78.063889000000017,80.564697000000081],[-78.038054999999929,80.567215000000033],[-78.015014999999948,80.586655000000007],[-78.013625999999988,80.591095000000053],[-78.019164999999987,80.594436999999971],[-78.030838000000017,80.596100000000092],[-78.088608000000022,80.596939000000077],[-78.357773000000009,80.60165400000011],[-78.741378999999938,80.60914600000001],[-78.851944000000003,80.612487999999985],[-78.925277999999992,80.616652999999985],[-78.981109999999944,80.616089000000045],[-79.114440999999999,80.612487999999985],[-79.255004999999983,80.605819999999994],[-79.347228999999913,80.601089000000059],[-79.392226999999934,80.599715999999944],[-79.565276999999924,80.596100000000092],[-79.634170999999981,80.595535000000041],[-79.86332699999997,80.603043000000071],[-79.934433000000013,80.606094000000098],[-79.960555999999883,80.608032000000037],[-79.960280999999952,80.614700000000028],[-79.907226999999978,80.623871000000008],[-79.847777999999948,80.631927000000076],[-79.559433000000013,80.669983000000059],[-79.353607000000011,80.696640000000116],[-79.291945999999996,80.703872999999987],[-79.172501000000011,80.713043000000027],[-78.990829000000019,80.729706000000078],[-78.809432999999956,80.746933000000126],[-78.62388599999997,80.769149999999968],[-78.585280999999952,80.772217000000069],[-78.50556899999998,80.77748100000008],[-78.236664000000019,80.793319999999994],[-77.894454999999994,80.813309000000118],[-77.805832000000009,80.818603999999993],[-77.733062999999959,80.825546000000088],[-77.639175000000023,80.83027600000014],[-77.287780999999939,80.83526599999999],[-76.926392000000021,80.841933999999981],[-76.845001000000025,80.841094999999996],[-76.729172000000005,80.838043000000084],[-76.681380999999931,80.838593000000117],[-76.590835999999967,80.842758000000117],[-76.556655999999975,80.84637500000008],[-76.511672999999973,80.854430999999977],[-76.484725999999966,80.86554000000001],[-76.485000999999897,80.871094000000028],[-76.490829000000019,80.874985000000095],[-76.526672000000019,80.88638300000008],[-76.621108999999933,80.900818000000015],[-76.656661999999983,80.898041000000148],[-76.699432000000002,80.891372999999987],[-76.738892000000021,80.888321000000019],[-76.797500999999954,80.886108000000092],[-76.841675000000009,80.885543999999982],[-77.168883999999935,80.886932000000058],[-77.201675000000023,80.887772000000098],[-77.308884000000035,80.893051000000071],[-77.428329000000019,80.903046000000018],[-77.454726999999991,80.90525800000006],[-77.581115999999895,80.911377000000073],[-77.766113000000018,80.906937000000084],[-77.980285999999921,80.90109300000006],[-78.421111999999994,80.879424999999912],[-78.836394999999982,80.85386699999998],[-78.869445999999925,80.852202999999975],[-78.885283999999956,80.853591999999992],[-78.896118000000001,80.854705999999965],[-78.908614999999998,80.858871000000136],[-78.922225999999966,80.866088999999988],[-78.93499799999995,80.875534000000016],[-78.93638599999997,80.881363000000079],[-78.930556999999965,80.981933999999967],[-78.928604000000007,80.990540000000067],[-78.839721999999995,81.016098],[-78.799987999999985,81.026382000000069],[-78.757781999999906,81.035537999999974],[-78.636672999999973,81.058594000000028],[-78.528884999999946,81.081940000000088],[-78.501113999999973,81.09165999999999],[-78.457503999999972,81.107758000000047],[-78.426101999999958,81.120818999999983],[-78.416396999999961,81.125259000000142],[-78.397231999999917,81.137497000000053],[-78.393065999999919,81.142761000000007],[-78.406386999999938,81.144988999999953],[-78.461945000000014,81.147491000000059],[-78.475280999999939,81.149719000000005],[-78.475829999999974,81.15248100000008],[-78.472777999999948,81.158325000000104],[-78.463622999999927,81.160812000000021],[-78.438598999999954,81.164703000000088],[-78.411391999999921,81.167479999999955],[-78.290833000000021,81.174698000000149],[-78.254729999999995,81.177765000000079],[-78.225005999999894,81.181930999999963],[-78.15943900000002,81.193862999999965],[-78.051102000000014,81.218597000000102],[-78.03694200000001,81.223312000000135],[-78.016662999999994,81.232758000000103],[-78.009170999999981,81.238585999999998],[-77.976943999999889,81.249145999999939],[-77.875274999999874,81.272766000000104],[-77.850829999999917,81.277205999999978],[-77.612503000000004,81.318877999999984],[-77.576949999999897,81.322494999999947],[-77.50306699999993,81.328323000000069],[-77.366394000000014,81.336105000000032],[-77.233611999999994,81.351089000000115],[-77.116942999999935,81.367751999999996],[-76.955275999999969,81.393874999999923],[-76.765014999999948,81.428588999999988],[-76.748610999999983,81.4327550000001],[-76.745269999999948,81.439148000000046],[-76.761123999999995,81.442749000000106],[-76.777785999999878,81.444427000000019],[-76.803328999999962,81.445526000000029],[-76.855835000000013,81.445526000000029],[-76.951110999999969,81.440536000000122],[-77.028609999999958,81.43331900000004],[-77.208617999999944,81.409424000000058],[-77.264450000000011,81.400818000000129],[-77.41722099999987,81.380538999999999],[-77.571395999999993,81.366652999999985],[-77.609726000000023,81.364425999999924],[-77.829177999999899,81.34248400000007],[-77.896117999999944,81.335541000000092],[-78.174163999999962,81.30053700000002],[-78.228333000000021,81.291656000000046],[-78.273620999999935,81.283599999999979],[-78.29222099999987,81.278320000000122],[-78.305557000000022,81.272766000000104],[-78.325835999999924,81.261383000000137],[-78.351944000000003,81.250275000000101],[-78.370270000000005,81.2452550000001],[-78.410004000000015,81.236374000000126],[-78.433883999999921,81.231934000000138],[-78.487212999999997,81.223038000000031],[-78.604996000000028,81.206375000000094],[-78.652495999999928,81.197205000000054],[-78.675277999999935,81.191925000000026],[-78.701950000000011,81.181655999999975],[-78.721114999999998,81.172211000000061],[-78.728333000000021,81.166382000000056],[-78.75111400000003,81.141663000000108],[-78.754181000000017,81.135818000000029],[-78.745833999999945,81.129150000000038],[-78.71665999999999,81.123306000000014],[-78.690552000000025,81.12164300000012],[-78.690825999999959,81.11943100000002],[-78.817504999999926,81.106093999999985],[-78.895019999999931,81.098999000000049],[-78.916945999999996,81.098037999999917],[-78.941375999999934,81.101088999999945],[-78.963622999999984,81.107758000000047],[-79.015014999999948,81.115539999999953],[-79.075287000000003,81.122757000000092],[-79.162780999999939,81.13220199999995],[-79.218062999999972,81.136932000000002],[-79.242767000000015,81.139984000000084],[-79.399170000000026,81.174698000000149],[-79.463622999999984,81.193313999999987],[-79.486114999999984,81.194977000000108],[-79.50167799999997,81.193588000000091],[-79.499434999999949,81.189972000000068],[-79.491669000000002,81.186095999999964],[-79.475829999999974,81.180542000000003],[-79.275283999999999,81.12359600000002],[-79.218886999999938,81.111099000000081],[-79.172501000000011,81.10386699999998],[-79.088837000000012,81.094757000000072],[-79.073623999999995,81.090820000000122],[-79.063613999999916,81.085541000000148],[-79.072783999999956,81.080826000000116],[-79.087783999999999,81.076660000000004],[-79.142226999999991,81.069153000000085],[-79.226944000000003,81.063034000000073],[-79.255279999999914,81.058868000000132],[-79.305266999999958,81.029984000000013],[-79.315826000000015,81.023880000000133],[-79.323623999999938,81.018326000000002],[-79.33666999999997,81.0086060000001],[-79.343886999999995,80.99832200000003],[-79.336945000000014,80.992203000000018],[-79.321120999999891,80.988586000000055],[-79.291381999999885,80.984984999999995],[-79.258347000000015,80.984421000000054],[-79.205275999999969,80.987762000000089],[-79.18472300000002,80.986374000000012],[-79.164718999999991,80.983047000000056],[-79.158889999999985,80.977768000000083],[-79.15834000000001,80.972763000000043],[-79.165282999999931,80.966660000000104],[-79.265288999999996,80.924149000000057],[-79.600829999999917,80.824432000000115],[-79.618056999999965,80.819442999999978],[-79.883621000000005,80.783325000000104],[-80.065552000000025,80.759720000000129],[-80.247498000000007,80.73692299999999],[-80.511123999999938,80.705826000000059],[-80.651947000000007,80.691925000000083],[-80.720551,80.684142999999949],[-80.855559999999969,80.663315000000068],[-80.919448999999929,80.655548000000124],[-80.956664999999987,80.651932000000045],[-81.336394999999925,80.623306000000127],[-81.533324999999991,80.607208000000071],[-81.575561999999991,80.604155999999989],[-81.808884000000035,80.59304800000001],[-81.966110000000015,80.579712000000029],[-82.353881999999942,80.556365999999969],[-82.434998000000007,80.553040000000124],[-82.798889000000031,80.539428999999984],[-82.881103999999937,80.536652000000061],[-82.956389999999999,80.536377000000073],[-83.027495999999928,80.538589000000115],[-83.096664000000033,80.541656000000046],[-83.151946999999893,80.546371000000079],[-83.165008999999998,80.55192599999998],[-83.170272999999895,80.564147999999932],[-83.168059999999912,80.576660000000118],[-83.165282999999931,80.589432000000102],[-83.161391999999864,80.601089000000059],[-83.156112999999948,80.606644000000131],[-83.146666999999979,80.612198000000149],[-83.096953999999982,80.639435000000049],[-83.078063999999927,80.644989000000066],[-83.056380999999988,80.649154999999951],[-82.773055999999997,80.68664600000011],[-82.527495999999985,80.703323000000125],[-82.431945999999982,80.708878000000027],[-82.250838999999928,80.716385000000116],[-82.216399999999965,80.719147000000021],[-82.135833999999875,80.729431000000091],[-82.025009000000011,80.746643000000063],[-81.948333999999932,80.759155000000078],[-81.908614999999941,80.767761000000007],[-81.762786999999889,80.810806000000127],[-81.758895999999993,80.813034000000073],[-81.767501999999922,80.821381000000088],[-81.943603999999993,80.833054000000118],[-81.961120999999935,80.833054000000118],[-81.996108999999933,80.83027600000014],[-82.05221599999993,80.822768999999994],[-82.099730999999906,80.813599000000124],[-82.146118000000001,80.803589000000045],[-82.193877999999984,80.796646000000067],[-82.332229999999981,80.781372000000147],[-82.513061999999934,80.763046000000145],[-82.526107999999965,80.752777000000094],[-82.535827999999867,80.747208000000114],[-82.543334999999956,80.74443100000002],[-82.567229999999995,80.740814000000057],[-82.601669000000015,80.738036999999963],[-82.940551999999968,80.714431999999988],[-83.311934999999949,80.687759000000028],[-83.356948999999929,80.685531999999967],[-83.516113000000018,80.701384999999959],[-83.541107000000011,80.704162999999994],[-83.547226000000023,80.706940000000088],[-83.569457999999997,80.739150999999993],[-83.5625,80.743866000000025],[-83.529723999999987,80.747482000000048],[-83.456664999999987,80.751099000000011],[-83.422500999999954,80.753876000000105],[-83.391387999999949,80.758041000000105],[-83.261947999999961,80.786377000000016],[-83.133057000000008,80.818878000000097],[-83.120270000000005,80.823317999999972],[-83.132492000000013,80.828598],[-83.158051,80.833603000000039],[-83.191100999999946,80.835815000000139],[-83.256957999999997,80.838593000000117],[-83.297225999999966,80.836104999999975],[-83.323333999999932,80.8316650000001],[-83.329177999999956,80.828323000000012],[-83.331954999999937,80.823883000000137],[-83.353881999999999,80.813599000000124],[-83.381377999999984,80.803864000000033],[-83.407226999999978,80.799422999999933],[-83.493332000000009,80.787766000000033],[-83.587218999999891,80.775269000000037],[-83.610549999999932,80.771652000000074],[-83.630828999999949,80.766937000000041],[-83.645554000000004,80.761658000000068],[-83.64916999999997,80.755554000000018],[-83.658889999999872,80.751937999999996],[-83.667769999999905,80.75],[-83.696655000000021,80.746643000000063],[-83.712783999999999,80.747757000000092],[-83.827498999999932,80.761383000000023],[-83.859160999999972,80.759155000000078],[-83.863892000000021,80.757492000000127],[-83.836394999999982,80.719710999999961],[-83.821670999999981,80.705826000000059],[-83.812499999999943,80.698318000000086],[-83.801391999999964,80.691925000000083],[-83.783065999999963,80.684142999999949],[-83.757232999999928,80.669708000000014],[-83.734436000000017,80.654160000000047],[-83.723327999999924,80.643875000000094],[-83.720000999999911,80.636658000000011],[-83.719726999999978,80.630813999999987],[-83.73582499999992,80.613037000000077],[-83.779175000000009,80.570831000000112],[-83.794723999999974,80.560257000000036],[-83.821120999999948,80.550536999999963],[-83.840560999999866,80.545532000000094],[-83.871108999999933,80.541367000000093],[-83.93472300000002,80.534424000000115],[-83.973327999999981,80.531937000000028],[-84.313323999999909,80.513611000000026],[-84.381103999999993,80.512207000000046],[-84.48971599999993,80.514434999999992],[-84.551392000000021,80.517761000000064],[-84.689437999999996,80.524994000000049],[-84.763625999999988,80.525818000000015],[-84.846664000000033,80.523315000000025],[-84.890563999999983,80.521102999999982],[-84.964447000000007,80.514434999999992],[-85.027221999999995,80.507217000000026],[-85.066956000000005,80.505264000000068],[-85.232772999999952,80.508881000000031],[-85.334731999999974,80.513611000000026],[-85.366652999999985,80.517487000000131],[-85.42582699999997,80.523041000000092],[-85.462218999999948,80.524994000000049],[-85.594727000000034,80.529159999999933],[-85.809433000000013,80.531937000000028],[-85.864165999999898,80.535538000000088],[-85.865829000000019,80.541367000000093],[-85.812774999999931,80.559143000000063],[-85.705841000000021,80.589706000000035],[-85.689162999999951,80.593872000000147],[-85.665008999999941,80.598601999999971],[-85.613051999999982,80.606368999999972],[-85.571945000000028,80.615265000000079],[-85.564712999999927,80.619431000000134],[-85.594451999999933,80.6202550000001],[-85.636397999999986,80.619141000000127],[-85.694716999999969,80.613602000000128],[-85.744719999999916,80.606368999999972],[-85.793059999999855,80.596939000000077],[-85.854720999999984,80.582214000000135],[-85.889724999999999,80.573044000000039],[-85.925277999999992,80.562485000000038],[-85.950606999999991,80.552947999999958],[-85.95666499999993,80.548325000000091],[-85.982773000000009,80.537491000000045],[-86.011947999999961,80.533324999999934],[-86.037215999999944,80.530823000000055],[-86.080840999999964,80.528320000000065],[-86.148345999999947,80.53166200000004],[-86.177490000000034,80.534149000000127],[-86.428329000000019,80.560257000000036],[-86.639998999999932,80.583054000000004],[-86.718062999999972,80.59304800000001],[-86.739165999999898,80.597487999999998],[-86.744995000000017,80.603043000000071],[-86.732498000000021,80.615265000000079],[-86.680282999999974,80.654984000000013],[-86.660003999999958,80.666091999999992],[-86.638061999999991,80.676651000000049],[-86.514724999999942,80.729431000000091],[-86.497771999999941,80.735260000000096],[-86.466110000000015,80.74552900000009],[-86.410004000000015,80.760818000000029],[-86.338333000000034,80.775542999999971],[-86.244719999999973,80.794144000000131],[-86.225554999999929,80.799149],[-86.174438000000009,80.81442300000009],[-86.050277999999992,80.856644000000074],[-85.964171999999962,80.886932000000058],[-85.846114999999998,80.928589000000102],[-85.828339000000028,80.93414300000012],[-85.77416999999997,80.948868000000061],[-85.698607999999922,80.962769000000037],[-85.605835000000013,80.975815000000125],[-85.556106999999997,80.981933999999967],[-85.003066999999874,81.028320000000008],[-84.928878999999995,81.030822999999941],[-84.726669000000015,81.031097000000102],[-84.404998999999918,81.043869000000086],[-84.368332000000009,81.046097000000032],[-84.20666499999993,81.060531999999967],[-84.119994999999903,81.067490000000134],[-84.025009000000011,81.070830999999998],[-83.908050999999944,81.071381000000031],[-83.823623999999938,81.073608000000092],[-83.529998999999918,81.090271000000143],[-83.31138599999997,81.103317000000118],[-83.15055799999999,81.120529000000147],[-83.12332200000003,81.12303200000008],[-83.053328999999962,81.123306000000014],[-82.943603999999993,81.120818999999983],[-82.869445999999925,81.121368000000075],[-82.826401000000033,81.12303200000008],[-82.785004000000015,81.125534000000016],[-82.760283999999956,81.129150000000038],[-82.738891999999964,81.133880999999974],[-82.707229999999981,81.144440000000031],[-82.688323999999966,81.148331000000098],[-82.64416499999993,81.151657000000114],[-82.599166999999966,81.152771000000087],[-82.531386999999938,81.149993999999992],[-82.50306699999993,81.147766000000047],[-82.466659999999933,81.148331000000098],[-82.37222300000002,81.174698000000149],[-82.364440999999999,81.17942800000003],[-82.389998999999989,81.180266999999958],[-82.420837000000006,81.17942800000003],[-82.484160999999972,81.169983000000116],[-82.52305599999994,81.166382000000056],[-82.565276999999924,81.166092000000049],[-82.665008999999998,81.17442299999999],[-82.828063999999983,81.173308999999961],[-82.866652999999928,81.169708000000128],[-82.894164999999987,81.165268000000083],[-82.926940999999999,81.161102000000028],[-82.962783999999942,81.158325000000104],[-83.14973399999991,81.151382000000126],[-83.453338999999971,81.13220199999995],[-83.757507000000032,81.113312000000008],[-84.116104000000007,81.0977630000001],[-84.372771999999941,81.092209000000082],[-84.58555599999994,81.086380000000077],[-84.797500999999954,81.078323000000125],[-85.065551999999911,81.066375999999991],[-85.211944999999901,81.056931000000077],[-85.25,81.05525200000011],[-85.291381999999999,81.054703000000131],[-85.404448999999943,81.057755000000043],[-85.482773000000009,81.058594000000028],[-85.572509999999966,81.05664100000007],[-85.681670999999938,81.049423000000104],[-85.75556899999998,81.041367000000037],[-85.817779999999971,81.032761000000107],[-85.988602000000014,81.006653000000142],[-86.143340999999907,80.978317000000061],[-86.30972300000002,80.940811000000053],[-86.351944000000003,80.930542000000059],[-87.061935000000005,80.727478000000133],[-87.076401000000033,80.7227630000001],[-87.083618000000001,80.716934000000094],[-87.079078999999979,80.707024000000104],[-87.080291999999986,80.699142000000052],[-87.121383999999921,80.677475000000015],[-87.180557000000022,80.649154999999951],[-87.215011999999945,80.638321000000076],[-87.240554999999972,80.634155000000021],[-87.273055999999997,80.630813999999987],[-87.315001999999936,80.629424999999969],[-87.458054000000004,80.627762000000075],[-87.489715999999873,80.627472000000012],[-87.559433000000013,80.627472000000012],[-87.594726999999978,80.628586000000041],[-87.628051999999968,80.632202000000063],[-87.777221999999938,80.648880000000133],[-87.864166000000012,80.659424000000001],[-87.954726999999878,80.671645999999953],[-88.139724999999999,80.685256999999922],[-88.17721599999993,80.686920000000043],[-88.196105999999986,80.688582999999994],[-88.22222899999997,80.691085999999984],[-88.348891999999921,80.708602999999982],[-88.406661999999926,80.716934000000094],[-88.488601999999958,80.731934000000024],[-88.566956000000005,80.74859600000002],[-88.706116000000009,80.772766000000047],[-88.967498999999862,80.808594000000085],[-89.034163999999976,80.816376000000048],[-89.125823999999966,80.825821000000076],[-89.290557999999976,80.849426000000108],[-89.334731999999917,80.857483000000059],[-89.382492000000013,80.86970500000001],[-89.398055999999997,80.876082999999994],[-89.450561999999934,80.903320000000122],[-89.462218999999948,80.909988000000055],[-89.466110000000015,80.914153999999996],[-89.462218999999948,80.919144000000017],[-89.442763999999897,80.923599000000024],[-89.380828999999892,80.933044000000109],[-89.235274999999945,80.948318000000029],[-89.18638599999997,80.953048999999965],[-88.905563000000029,80.977768000000083],[-88.858611999999994,80.981368999999972],[-88.766861000000006,80.986801000000014],[-88.590285999999992,80.996368000000018],[-88.513901000000033,80.99832200000003],[-88.283324999999991,81.002213000000097],[-88.089721999999938,81.003601000000003],[-88.011397999999986,81.003326000000015],[-87.826674999999966,80.998032000000023],[-87.755004999999983,80.994980000000112],[-87.689437999999939,80.990814],[-87.628051999999968,80.984711000000061],[-87.597504000000015,80.980819999999994],[-87.524169999999913,80.977203000000031],[-87.446380999999974,80.976928999999927],[-87.279448999999943,80.981933999999967],[-87.15943900000002,80.986922999999933],[-87.119719999999973,80.989700000000028],[-87.089172000000019,80.994141000000127],[-87.064712999999983,80.998871000000008],[-87.030562999999972,81.001938000000109],[-86.983062999999902,81.003876000000048],[-86.946105999999986,81.004166000000055],[-86.755004999999983,81.001099000000124],[-86.711670000000026,81.002487000000031],[-86.671936000000017,81.005264000000125],[-86.635559000000001,81.009430000000066],[-86.541945999999996,81.020264000000111],[-86.419448999999986,81.036102000000142],[-86.061110999999983,81.082764000000054],[-85.916396999999961,81.104980000000012],[-85.916396999999961,81.110260000000096],[-85.907227000000034,81.113875999999948],[-85.887512000000015,81.118866000000025],[-85.562774999999988,81.17942800000003],[-85.483063000000016,81.192748999999992],[-85.425277999999935,81.201660000000061],[-85.297500999999954,81.218597000000102],[-85.22193900000002,81.226379000000065],[-85.02027899999996,81.244980000000055],[-84.976394999999968,81.248596000000134],[-84.876388999999961,81.254715000000147],[-84.832503999999972,81.258330999999998],[-84.802490000000034,81.261658000000125],[-84.776108000000022,81.266097999999943],[-84.733886999999982,81.281097000000045],[-84.735549999999989,81.285537999999974],[-84.745834000000002,81.289429000000041],[-84.899993999999936,81.304977000000008],[-84.936660999999958,81.307755000000043],[-84.975554999999986,81.307479999999998],[-85.029175000000009,81.305817000000047],[-85.279174999999952,81.289978000000133],[-85.361388999999974,81.28276100000005],[-85.768340999999964,81.244705000000067],[-85.950561999999991,81.224701000000096],[-86.018341000000021,81.215820000000008],[-86.077498999999932,81.207489000000066],[-86.154174999999952,81.193313999999987],[-86.225006000000008,81.173874000000012],[-86.240829000000019,81.16914399999996],[-86.256957999999941,81.162766000000033],[-86.299437999999896,81.148605000000032],[-86.338333000000034,81.138596000000007],[-86.404998999999975,81.129700000000071],[-86.438048999999921,81.126083000000108],[-86.472777999999892,81.122757000000092],[-86.521118000000001,81.119704999999954],[-86.650833000000034,81.115814000000114],[-86.956389999999999,81.099426000000051],[-87.111388999999917,81.087769000000094],[-87.297225999999966,81.076935000000049],[-87.637512000000015,81.059417999999994],[-87.678878999999995,81.058594000000028],[-87.720000999999911,81.059417999999994],[-87.841385000000002,81.062759000000028],[-88.0625,81.069992000000013],[-88.217772999999852,81.071381000000031],[-88.339995999999985,81.069717000000026],[-88.43499799999995,81.064148000000046],[-88.571670999999924,81.054703000000131],[-88.65834000000001,81.051376000000005],[-88.740828999999962,81.049713000000111],[-88.889998999999932,81.051926000000037],[-88.964721999999938,81.049423000000104],[-89.041672000000005,81.041091999999992],[-89.210555999999997,81.026657000000057],[-89.25556899999998,81.023880000000133],[-89.341675000000009,81.020264000000111],[-89.629165999999998,81.009155000000021],[-89.746658000000025,81.008881000000088],[-89.787505999999951,81.009720000000073],[-89.820847000000015,81.010817999999972],[-89.87388599999997,81.016388000000006],[-90.011947999999961,81.033051000000114],[-90.06361400000003,81.039702999999975],[-90.095275999999899,81.044708000000071],[-90.149170000000026,81.054977000000065],[-90.19776899999988,81.069717000000026],[-90.210007000000019,81.07499700000011],[-90.338057999999933,81.151657000000114],[-90.351944000000003,81.167479999999955],[-90.325561999999934,81.181930999999963],[-90.277221999999995,81.197205000000054],[-90.102218999999991,81.230270000000132],[-90.043059999999969,81.239426000000037],[-90.011123999999995,81.241928000000144],[-89.972778000000005,81.24275200000011],[-89.870543999999938,81.242203000000131],[-89.74610899999999,81.236649],[-89.669158999999866,81.218048000000124],[-89.635009999999909,81.212203999999929],[-89.573059000000001,81.206940000000145],[-89.535004000000015,81.206100000000106],[-89.491104000000007,81.206375000000094],[-89.447219999999902,81.208328000000051],[-89.357223999999974,81.214432000000102],[-89.281386999999995,81.221649000000014],[-89.136672999999973,81.238876000000005],[-89.088333000000034,81.242477000000065],[-89.044448999999986,81.24275200000011],[-88.982223999999974,81.241928000000144],[-88.954178000000013,81.24275200000011],[-88.944152999999972,81.24414100000007],[-88.935821999999973,81.247756999999979],[-88.949721999999895,81.253601000000003],[-88.979445999999996,81.258330999999998],[-89.162215999999944,81.255829000000119],[-89.198607999999865,81.253326000000129],[-89.265014999999948,81.244431000000134],[-89.307220000000029,81.240540000000067],[-89.335280999999952,81.24275200000011],[-89.443603999999937,81.260543999999982],[-89.687774999999988,81.289978000000133],[-89.775008999999955,81.296371000000079],[-89.868056999999965,81.306090999999981],[-89.898620999999935,81.31053199999991],[-89.91722099999987,81.314422999999977],[-89.950287000000003,81.324158000000068],[-89.952498999999875,81.329437000000041],[-89.940552000000025,81.333328000000108],[-89.916396999999904,81.336928999999998],[-89.882216999999969,81.340271000000087],[-89.702224999999999,81.350266000000033],[-89.627212999999983,81.356644000000017],[-89.242492999999968,81.423035000000027],[-89.059158000000025,81.455551000000071],[-88.928328999999962,81.485535000000141],[-88.90943900000002,81.490814000000114],[-88.846953999999982,81.49971000000005],[-88.715835999999967,81.513045999999974],[-88.545272999999952,81.525269000000037],[-88.494995000000017,81.527206000000092],[-88.406113000000005,81.528320000000065],[-88.37110899999999,81.526931999999988],[-88.161391999999921,81.530273000000022],[-88.029998999999975,81.535812000000021],[-87.984160999999972,81.535812000000021],[-87.959732000000031,81.534714000000122],[-87.939437999999996,81.531661999999983],[-87.893699999999967,81.524712000000136],[-87.801391999999964,81.515548999999965],[-87.679442999999935,81.51388500000013],[-87.490279999999984,81.508880999999974],[-87.431380999999931,81.50471500000009],[-87.398894999999982,81.500824000000023],[-87.343063000000029,81.492752000000053],[-87.311110999999983,81.488876000000005],[-87.276672000000019,81.485809000000074],[-87.251403999999923,81.487488000000042],[-87.244719999999973,81.490265000000136],[-87.286391999999921,81.505554000000075],[-87.288329999999974,81.506104000000107],[-87.315551999999968,81.513321000000019],[-87.37860099999989,81.517212000000086],[-87.489166000000012,81.523315000000025],[-87.645844000000011,81.527480999999909],[-87.721664000000033,81.532211000000132],[-87.751952999999958,81.535263000000043],[-87.915008999999941,81.552765000000079],[-88.279449,81.579436999999984],[-88.306380999999931,81.581374999999923],[-88.352218999999991,81.579712000000029],[-88.392226999999991,81.57777400000009],[-88.446944999999971,81.572220000000073],[-88.552215999999987,81.558868000000018],[-88.642226999999934,81.551651000000106],[-88.669448999999986,81.550537000000134],[-88.769164999999987,81.551086000000112],[-88.849990999999989,81.550537000000134],[-88.900283999999886,81.548325000000091],[-88.998046999999985,81.540543000000127],[-89.073058999999944,81.532211000000132],[-89.145844000000011,81.523041000000092],[-89.282500999999911,81.505264000000011],[-89.548339999999882,81.477203000000145],[-89.585555999999997,81.473037999999974],[-89.710280999999952,81.455261000000064],[-90.011397999999929,81.416930999999977],[-90.370833999999945,81.375259000000085],[-90.443053999999961,81.366652999999985],[-90.467498999999918,81.367751999999996],[-90.500564999999938,81.371368000000018],[-90.535827999999981,81.37692300000009],[-90.553329000000019,81.38499500000006],[-90.525283999999999,81.388596000000121],[-90.517226999999934,81.389160000000061],[-90.478881999999999,81.394440000000145],[-90.481383999999991,81.396652000000017],[-90.487777999999935,81.398604999999975],[-90.516953000000001,81.402481000000023],[-90.643616000000009,81.416381999999999],[-90.678328999999962,81.417480000000126],[-90.746658000000025,81.422211000000061],[-90.779998999999975,81.425537000000077],[-90.811385999999914,81.429977000000065],[-90.841110000000015,81.435531999999967],[-90.854171999999949,81.440536000000122],[-90.856658999999922,81.444138000000066],[-90.853881999999942,81.450821000000076],[-90.848342999999943,81.454987000000131],[-90.80082699999997,81.464995999999985],[-90.770554000000004,81.469711000000018],[-90.583069000000023,81.497482000000105],[-90.540282999999988,81.501663000000008],[-90.312209999999993,81.531371999999976],[-90.130553999999904,81.564423000000147],[-89.874709999999936,81.599152000000004],[-89.797500999999954,81.602478000000019],[-89.674438000000009,81.601654000000053],[-89.632492000000013,81.604706000000022],[-89.597503999999958,81.614151000000049],[-89.585006999999962,81.619705000000067],[-89.585006999999962,81.625809000000061],[-89.601943999999889,81.627762000000018],[-89.798889000000031,81.629974000000061],[-89.868056999999965,81.630264000000125],[-89.914169000000015,81.628310999999997],[-89.962218999999948,81.625534000000073],[-90.069457999999941,81.633606000000043],[-90.111580000000004,81.656746000000112],[-90.204726999999934,81.686371000000065],[-90.271392999999989,81.697479000000101],[-90.296950999999979,81.698593000000074],[-90.330291999999986,81.696090999999967],[-90.353057999999976,81.690536000000066],[-90.36082499999992,81.685257000000092],[-90.355270000000019,81.673599000000081],[-90.337218999999948,81.662491000000102],[-90.354720999999984,81.651382000000012],[-90.511123999999995,81.65776100000005],[-90.604720999999927,81.664703000000145],[-90.638901000000033,81.668045000000063],[-90.678878999999995,81.668869000000029],[-90.718886999999938,81.666656000000103],[-90.734725999999966,81.660812000000078],[-90.74221799999998,81.655548000000067],[-90.763625999999931,81.645537999999988],[-90.779723999999987,81.641098],[-90.803878999999995,81.636108000000092],[-90.834731999999974,81.631363000000079],[-90.878052000000025,81.627472000000012],[-90.923888999999974,81.625259000000028],[-90.966948999999943,81.621094000000028],[-90.99110399999995,81.616088999999988],[-91.006957999999997,81.598876999999959],[-91.003341999999918,81.592209000000025],[-90.988602000000014,81.579436999999984],[-90.988602000000014,81.557754999999986],[-91.071670999999981,81.537200999999982],[-91.091949,81.533874999999966],[-91.104445999999996,81.534424000000115],[-91.113891999999964,81.539978000000076],[-91.236938000000009,81.543320000000051],[-91.313888999999961,81.53414900000007],[-91.401397999999972,81.526382000000126],[-91.446380999999974,81.524428999999998],[-91.463332999999977,81.526093000000003],[-91.467772999999909,81.527206000000092],[-91.452498999999932,81.531661999999983],[-91.428604000000007,81.536652000000061],[-91.411117999999988,81.541931000000034],[-91.406386999999938,81.547760000000039],[-91.444153000000028,81.583603000000096],[-91.474441999999954,81.588882000000069],[-91.654175000000009,81.605819999999994],[-91.74722300000002,81.60914600000001],[-91.85722399999986,81.612762000000089],[-91.878326000000015,81.614151000000049],[-91.900283999999999,81.616928000000144],[-91.938599000000011,81.625534000000073],[-91.948607999999922,81.631088000000091],[-91.956664999999987,81.658600000000035],[-91.949432000000002,81.662201000000096],[-91.926940999999999,81.664992999999981],[-91.902221999999938,81.666931000000091],[-91.867767000000015,81.663315000000068],[-91.838897999999858,81.658600000000035],[-91.801101999999958,81.658600000000035],[-91.770844000000011,81.663315000000068],[-91.73721299999994,81.686920000000043],[-91.725829999999917,81.706650000000025],[-91.723617999999874,81.72164900000007],[-91.485549999999989,81.769989000000123],[-91.386123999999995,81.77388000000002],[-91.351395000000025,81.770264000000111],[-91.287506000000008,81.761931999999945],[-91.255004999999983,81.759155000000078],[-91.212508999999898,81.759430000000066],[-91.053328999999906,81.761658000000011],[-91.03443900000002,81.763885000000073],[-91.033324999999991,81.76776099999995],[-91.05749499999996,81.772766000000047],[-91.090560999999923,81.777206000000035],[-91.117766999999958,81.784424000000058],[-91.140563999999983,81.791930999999977],[-91.152495999999928,81.798035000000027],[-91.147232000000031,81.803864000000033],[-91.137511999999958,81.808594000000085],[-91.101104999999961,81.818878000000097],[-91.051665999999955,81.828872999999987],[-91.001113999999973,81.832764000000054],[-90.852218999999991,81.842483999999956],[-90.727492999999981,81.841094999999996],[-90.704178000000013,81.843597000000045],[-90.689986999999917,81.848602000000085],[-90.686377999999991,81.853966000000014],[-90.678328999999962,81.858597000000032],[-90.635009999999966,81.868866000000025],[-90.610001000000011,81.873871000000065],[-90.565276999999867,81.878036000000066],[-90.436661000000015,81.887497000000053],[-90.338057999999933,81.893051000000071],[-90.245270000000005,81.896102999999982],[-90.154449,81.896652000000131],[-89.990828999999962,81.905548000000067],[-89.783324999999934,81.917206000000078],[-89.735824999999977,81.917480000000012],[-89.700835999999981,81.915543000000127],[-89.676940999999999,81.9102630000001],[-89.683051999999975,81.899437000000148],[-89.682494999999903,81.883330999999998],[-89.649445000000014,81.863312000000064],[-89.629989999999964,81.856369000000029],[-89.461394999999982,81.818054000000132],[-89.425003000000004,81.815262000000018],[-89.356383999999935,81.811096000000134],[-89.244720000000029,81.846375000000023],[-89.227218999999991,81.852203000000145],[-89.203223999999977,81.878036000000066],[-89.19923399999999,81.881537999999921],[-89.199059000000034,81.885208000000034],[-89.213218999999981,81.888382000000092],[-89.328063999999927,81.902206000000092],[-89.367217999999923,81.905548000000067],[-89.397506999999962,81.909424000000115],[-89.419158999999979,81.915543000000127],[-89.416945999999939,81.925812000000008],[-89.397780999999895,81.930817000000047],[-89.371658000000025,81.935806000000014],[-89.338897999999972,81.940262000000075],[-89.288895000000025,81.943038999999999],[-89.249724999999955,81.941086000000041],[-89.157393999999954,81.928368000000091],[-89.156218999999908,81.925201000000072],[-89.152556999999945,81.921371000000079],[-89.133057000000008,81.918533000000082],[-89.074721999999952,81.911652000000061],[-89.033324999999991,81.912201000000039],[-89.007232999999871,81.915543000000127],[-88.98971599999993,81.921097000000145],[-88.986388999999974,81.944976999999938],[-88.992767000000015,81.951385000000073],[-89.011947999999904,81.958603000000096],[-89.048339999999996,81.978043000000071],[-89.054442999999992,81.987487999999985],[-89.041106999999954,81.993041999999946],[-89.021117999999944,81.998032000000023],[-88.963897999999972,82.008041000000048],[-88.77305599999994,82.039429000000041],[-88.625548999999978,82.062759000000028],[-88.589721999999938,82.066665999999998],[-88.543059999999912,82.070540999999992],[-88.443054000000018,82.074997000000053],[-88.296660999999915,82.080276000000026],[-88.25,82.080826000000059],[-88.145003999999972,82.086928999999998],[-88.11361699999992,82.090545999999961],[-88.09973100000002,82.093048000000067],[-88.095001000000025,82.096374999999966],[-88.085281000000009,82.101379000000122],[-88.075561999999934,82.104980000000012],[-88.038329999999974,82.103867000000093],[-87.91194200000001,82.090820000000065],[-87.71833799999996,82.083878000000027],[-87.702224999999942,82.086928999999998],[-87.666396999999904,82.089431999999988],[-87.641952999999944,82.090271000000143],[-87.599730999999963,82.089157],[-87.50140399999998,82.084152000000131],[-87.402221999999938,82.07388300000008],[-87.352782999999931,82.06721500000009],[-87.333617999999888,82.063309000000061],[-87.271666999999979,82.047759999999926],[-87.230559999999969,82.036926000000051],[-87.195830999999998,82.026382000000012],[-87.183608999999933,82.022491000000116],[-87.174437999999896,82.014708999999982],[-87.173324999999977,82.011107999999922],[-87.178603999999893,82.007767000000115],[-87.197768999999937,82.002213000000097],[-87.232773000000009,81.99331699999999],[-87.258057000000008,81.989426000000094],[-87.299987999999985,81.979155999999989],[-87.314437999999996,81.973877000000016],[-87.309432999999956,81.967484000000013],[-87.265839000000028,81.958878000000141],[-87.169158999999979,81.945526000000086],[-87.101669000000015,81.937759000000142],[-87.063323999999909,81.934418000000107],[-86.939437999999996,81.918868999999972],[-86.877212999999983,81.909424000000115],[-86.828887999999949,81.897491000000059],[-86.804169000000002,81.893051000000071],[-86.768341000000021,81.890273999999977],[-86.726669000000015,81.891937000000098],[-86.726944000000003,81.897217000000126],[-86.734160999999915,81.902771000000143],[-86.745833999999945,81.906647000000021],[-86.834732000000031,81.927765000000136],[-86.86361699999992,81.933593999999971],[-86.919448999999986,81.942748999999992],[-87.066101000000003,81.954987000000074],[-87.098052999999936,81.958328000000108],[-87.127212999999927,81.963882000000069],[-87.130279999999857,81.968322999999998],[-87.00140399999998,82.036102000000085],[-86.987212999999997,82.039978000000019],[-86.931670999999938,82.049423000000047],[-86.892501999999979,82.054153000000099],[-86.84333799999996,82.05720500000001],[-86.791945999999939,82.058029000000147],[-86.583617999999944,82.053863999999976],[-86.356383999999991,82.053588999999988],[-86.27806099999998,82.050812000000064],[-86.239166000000012,82.048599000000081],[-86.202788999999996,82.04553199999998],[-86.169158999999922,82.041656000000103],[-86.016112999999962,82.016663000000051],[-85.960555999999997,82.00749200000007],[-85.914443999999946,81.997481999999991],[-85.815001999999993,81.973877000000016],[-85.767501999999922,81.961928999999941],[-85.731383999999878,81.949996999999996],[-85.628875999999991,81.916092000000106],[-85.467223999999987,81.867203000000131],[-85.422501000000011,81.857483000000059],[-85.379439999999988,81.856934000000081],[-85.371658000000025,81.859711000000004],[-85.37388599999997,81.863876000000005],[-85.385833999999932,81.874985000000095],[-85.398055999999997,81.881088000000034],[-85.441939999999988,81.893875000000037],[-85.469451999999876,81.899719000000005],[-85.566101000000003,81.924988000000042],[-85.654723999999987,81.950821000000133],[-85.731948999999986,81.983322000000044],[-85.729996000000028,81.987762000000089],[-85.726943999999946,81.990265000000079],[-85.693877999999984,81.994980000000112],[-85.650557999999933,81.99832200000003],[-85.559432999999956,82.001663000000065],[-85.258621000000005,81.996933000000013],[-85.217498999999975,81.995529000000033],[-85.188323999999909,81.99275200000011],[-85.165833000000021,81.985259999999982],[-85.160004000000015,81.979706000000022],[-85.140563999999927,81.966095000000053],[-85.096389999999985,81.945816000000093],[-85.018889999999999,81.919434000000024],[-84.984160999999915,81.911102000000028],[-84.879439999999988,81.887497000000053],[-84.838897999999915,81.882476999999994],[-84.816887000000008,81.885367999999914],[-84.821884000000011,81.888214000000062],[-84.844222999999886,81.894882000000052],[-84.863891999999964,81.900269000000037],[-84.915008999999998,81.918045000000006],[-84.994719999999973,81.948593000000017],[-85.025283999999942,81.960815000000139],[-85.037216000000001,81.966933999999981],[-85.048889000000031,81.974426000000108],[-85.066100999999946,81.987487999999985],[-85.055556999999965,81.990814],[-85.038329999999974,81.994141000000127],[-85.00111400000003,81.994141000000127],[-84.929169000000002,81.993041999999946],[-84.889174999999966,81.990265000000079],[-84.858886999999925,81.985259999999982],[-84.831680000000006,81.979430999999977],[-84.816665999999941,81.970825000000048],[-84.814437999999996,81.966385000000059],[-84.815276999999924,81.961104999999975],[-84.821945000000028,81.949141999999938],[-84.797606999999971,81.930870000000141],[-84.789267999999993,81.924698000000035],[-84.75144199999994,81.910538000000088],[-84.74227899999994,81.908378999999968],[-84.688598999999954,81.891937000000098],[-84.656113000000005,81.887772000000098],[-84.635283999999956,81.886108000000036],[-84.621933000000013,81.886932000000002],[-84.604996000000028,81.88998400000014],[-84.714721999999995,81.969986000000119],[-84.729720999999984,81.977203000000031],[-84.751677999999913,81.984711000000061],[-84.815276999999924,82.00082400000008],[-84.840835999999967,82.006103999999993],[-84.89973399999991,82.015274000000034],[-84.93249499999996,82.019440000000088],[-85.039992999999981,82.028594999999996],[-85.116942999999935,82.033051000000057],[-85.405838000000017,82.042205999999965],[-85.678328999999906,82.054428000000087],[-85.755843999999968,82.058868000000132],[-85.851669000000015,82.06721500000009],[-85.915833000000021,82.07748400000014],[-85.999725000000012,82.094147000000021],[-86.062209999999936,82.103867000000093],[-86.091109999999901,82.104431000000034],[-86.278885000000002,82.107208000000128],[-86.485001000000011,82.114150999999936],[-86.565551999999968,82.118865999999969],[-86.637511999999958,82.124419999999986],[-86.706116000000009,82.131927000000132],[-86.731383999999935,82.136383000000023],[-86.752228000000002,82.141098000000056],[-86.856658999999922,82.184708000000057],[-86.869155999999919,82.195251000000042],[-86.876099000000011,82.202208999999982],[-86.871933000000013,82.207764000000111],[-86.843613000000005,82.212494000000106],[-86.764174999999966,82.221649000000014],[-86.669448999999929,82.228316999999947],[-86.619445999999982,82.229705999999965],[-86.571670999999981,82.230270000000075],[-86.520003999999915,82.229705999999965],[-86.316665999999998,82.224701000000096],[-86.228881999999885,82.224701000000096],[-86.181106999999997,82.225266000000147],[-86.137787000000003,82.226929000000041],[-85.984436000000017,82.237488000000099],[-85.934158000000025,82.238876000000005],[-85.841384999999946,82.239151000000049],[-85.798889000000031,82.237762000000032],[-85.753890999999953,82.237488000000099],[-85.706115999999952,82.23803700000002],[-85.662215999999944,82.239699999999971],[-85.61999499999996,82.243591000000038],[-85.603881999999999,82.24914600000011],[-85.598891999999978,82.254440000000102],[-85.580565999999976,82.264434999999992],[-85.557770000000005,82.269440000000088],[-85.508347000000015,82.273041000000092],[-85.413895000000025,82.27609300000006],[-85.370833999999945,82.279984000000127],[-85.350554999999929,82.283875000000023],[-85.34722899999997,82.286377000000073],[-85.367492999999911,82.291092000000106],[-85.396392999999989,82.29693600000013],[-85.457229999999981,82.307479999999998],[-85.481673999999941,82.313599000000011],[-85.489990000000034,82.319716999999969],[-85.515015000000005,82.343322999999998],[-85.531677000000002,82.369705000000067],[-85.50167799999997,82.393600000000106],[-85.501403999999923,82.398880000000133],[-85.515288999999996,82.403320000000008],[-85.534164000000033,82.407486000000063],[-85.669448999999872,82.409424000000001],[-85.866942999999992,82.421920999999998],[-85.904998999999975,82.424988000000099],[-85.921111999999994,82.429977000000065],[-85.911941999999954,82.435806000000071],[-85.819732999999928,82.454437000000098],[-85.794723999999974,82.458602999999982],[-85.746947999999975,82.461380000000077],[-85.708617999999944,82.463608000000022],[-85.502501999999993,82.471099999999979],[-85.298614999999927,82.478042999999957],[-85.046950999999979,82.481934000000024],[-85.003066999999874,82.480820000000051],[-84.693877999999927,82.471375000000023],[-84.662780999999995,82.468596999999988],[-84.641678000000013,82.465546000000018],[-84.62222300000002,82.459152000000131],[-84.616394000000014,82.453598000000113],[-84.613326999999913,82.447204999999997],[-84.613326999999913,82.4433140000001],[-84.631377999999984,82.440262000000018],[-84.787780999999995,82.434982000000105],[-84.895279000000016,82.433594000000028],[-84.940552000000025,82.431931000000077],[-84.943877999999984,82.425812000000064],[-84.916655999999932,82.42053199999998],[-84.888610999999855,82.416930999999977],[-84.714721999999995,82.405822999999941],[-84.559722999999906,82.394989000000066],[-84.482498000000021,82.389435000000105],[-84.449996999999996,82.386107999999979],[-84.418334999999956,82.381088000000091],[-84.388061999999991,82.371094000000085],[-84.384170999999924,82.366089000000045],[-84.387221999999952,82.361649],[-84.378600999999946,82.356933999999967],[-84.34445199999999,82.352768000000083],[-84.303329000000019,82.355819999999994],[-84.228881999999999,82.363876000000062],[-84.180556999999965,82.368042000000003],[-84.146956999999986,82.369705000000067],[-84.095550999999944,82.371094000000085],[-84.047226000000023,82.371368000000018],[-83.961394999999925,82.368591000000094],[-83.876937999999939,82.364151000000106],[-83.841948999999943,82.361374000000012],[-83.767501999999979,82.353043000000071],[-83.606383999999935,82.33137499999998],[-83.516402999999968,82.316940000000045],[-83.384734999999978,82.282210999999961],[-83.36860699999994,82.276381999999955],[-83.360001000000011,82.269440000000088],[-83.360001000000011,82.263611000000026],[-83.369155999999975,82.251663000000008],[-83.371933000000013,82.24470500000001],[-83.371933000000013,82.239151000000049],[-83.344451999999933,82.227203000000145],[-83.308334000000002,82.218323000000112],[-83.24221799999998,82.204163000000051],[-83.184157999999968,82.194702000000063],[-83.130553999999961,82.184981999999991],[-83.083892999999932,82.175812000000121],[-83.022781000000009,82.159424000000058],[-83,82.151093000000003],[-82.976669000000015,82.138321000000133],[-82.953063999999983,82.119979999999998],[-82.95666499999993,82.109711000000118],[-82.958617999999944,82.104431000000034],[-82.968338000000017,82.098038000000088],[-82.978058000000033,82.093872000000033],[-83.001953000000015,82.089157],[-83.0625,82.080276000000026],[-83.126098999999954,82.072495000000004],[-83.128051999999968,82.06721500000009],[-83.111937999999952,82.065261999999962],[-83.076400999999919,82.061920000000043],[-82.974166999999966,82.064986999999974],[-82.888335999999981,82.072495000000004],[-82.797501000000011,82.077773999999977],[-82.758057000000008,82.076934999999992],[-82.674438000000009,82.073043999999925],[-82.636397999999986,82.070540999999992],[-82.421660999999972,82.066940000000102],[-82.284163999999976,82.066375999999991],[-82.199432000000002,82.064147999999989],[-82.122222999999906,82.058594000000028],[-82.055556999999965,82.050812000000064],[-81.963622999999927,82.037201000000096],[-81.926101999999958,82.034714000000008],[-81.889998999999989,82.034988000000112],[-81.878051999999968,82.03637700000013],[-81.884734999999921,82.041091999999992],[-81.924164000000019,82.058868000000132],[-81.966110000000015,82.071105999999986],[-82.020844000000011,82.082213999999965],[-82.05860899999999,82.084717000000126],[-82.102492999999981,82.085541000000092],[-82.243056999999965,82.084991000000059],[-82.417496000000028,82.087204000000042],[-82.546386999999982,82.090271000000143],[-82.58444199999991,82.09275800000006],[-82.619719999999916,82.096099999999979],[-82.651947000000007,82.100266000000033],[-82.676940999999943,82.10775799999999],[-82.683884000000035,82.118317000000047],[-82.688599000000011,82.126083000000108],[-82.697495000000004,82.131362999999965],[-82.717223999999931,82.142761000000007],[-82.731383999999935,82.149993999999992],[-82.772232000000031,82.163315000000125],[-82.860275000000001,82.187759000000085],[-82.886947999999961,82.193862999999908],[-82.94027699999998,82.203598],[-82.987503000000004,82.214995999999985],[-83.011397999999986,82.221649000000014],[-83.027785999999878,82.235259999999982],[-83.028884999999946,82.264998999999989],[-83.028884999999946,82.276657],[-83.02555799999999,82.283324999999991],[-83.019164999999873,82.288879000000122],[-82.990829000000019,82.292480000000012],[-82.735549999999932,82.286102000000028],[-82.693603999999937,82.284714000000122],[-82.654448999999886,82.282210999999961],[-82.621658000000025,82.278045999999961],[-82.508895999999936,82.258040999999992],[-82.452788999999939,82.249420000000043],[-82.286666999999966,82.229156000000103],[-82.263061999999991,82.222214000000008],[-82.211120999999991,82.204711999999972],[-82.160278000000005,82.193313999999987],[-82.101943999999946,82.183044000000052],[-82.011123999999995,82.168594000000098],[-81.918059999999912,82.15498400000007],[-81.608886999999982,82.118590999999981],[-81.425277999999935,82.0977630000001],[-81.353057999999976,82.091659999999933],[-81.249161000000015,82.081375000000037],[-81.150283999999999,82.068878000000041],[-81.091110000000015,82.059417999999994],[-80.868332000000009,82.03137200000009],[-80.640288999999996,82.018326000000116],[-80.43249499999996,81.997481999999991],[-80.225829999999974,81.986098999999967],[-80.153609999999958,81.981368999999916],[-80.085006999999905,81.973602000000142],[-80.035277999999948,81.963042999999914],[-79.883056999999951,81.924698000000035],[-79.610000999999897,81.851089000000002],[-79.589721999999938,81.844147000000078],[-79.587783999999999,81.838318000000072],[-79.577224999999942,81.828872999999987],[-79.564163000000008,81.825271999999927],[-79.53443900000002,81.820831000000055],[-79.492217999999923,81.819717000000026],[-79.244445999999925,81.816085999999984],[-79.229171999999949,81.816085999999984],[-79.452224999999999,81.88998400000014],[-79.489989999999977,81.900269000000037],[-79.521117999999888,81.905548000000067],[-79.579726999999934,81.913605000000018],[-79.670837000000006,81.927475000000072],[-79.844451999999933,81.97137499999991],[-79.837783999999942,82.007217000000082],[-79.832229999999868,82.013885000000016],[-79.853333000000021,82.018875000000094],[-79.880829000000006,82.021927000000005],[-79.916397000000018,82.023880000000133],[-80.213897999999858,82.032211000000018],[-80.331680000000006,82.038589000000002],[-80.368606999999997,82.041091999999992],[-80.624435000000005,82.061920000000043],[-80.657226999999921,82.064697000000137],[-80.725554999999986,82.071655000000135],[-80.791107000000011,82.079437000000098],[-80.822234999999921,82.083878000000027],[-80.878326000000015,82.094147000000021],[-80.922226000000023,82.103592000000106],[-80.948607999999979,82.110260000000096],[-80.962783999999999,82.116379000000109],[-80.975554999999986,82.12359600000002],[-80.975554999999986,82.127762000000132],[-80.956664999999987,82.137206999999989],[-80.931380999999988,82.142212000000029],[-80.89973399999991,82.146378000000141],[-80.874435000000005,82.151093000000003],[-80.868056999999965,82.15498400000007],[-80.909163999999976,82.156647000000135],[-81.051391999999964,82.154709000000025],[-81.171111999999994,82.156372000000147],[-81.253341999999918,82.159714000000065],[-81.324722000000008,82.164993000000038],[-81.423324999999977,82.176926000000094],[-81.799728000000016,82.222762999999986],[-81.825561999999934,82.226654000000053],[-81.887786999999946,82.23803700000002],[-82.170546999999999,82.286652000000061],[-82.454726999999991,82.328048999999965],[-82.513061999999934,82.337769000000037],[-82.625548999999921,82.359146000000067],[-82.679992999999968,82.37081900000004],[-82.711670000000026,82.382477000000108],[-82.722778000000005,82.388321000000076],[-82.7308349999999,82.395264000000111],[-82.732223999999974,82.401657000000057],[-82.728881999999942,82.408325000000048],[-82.710281000000009,82.419434000000081],[-82.698333999999988,82.424988000000099],[-82.539444000000003,82.497208000000114],[-82.520553999999947,82.502487000000087],[-82.498336999999992,82.506377999999984],[-82.458892999999989,82.508331000000112],[-82.406386999999881,82.509155000000078],[-82.316956000000005,82.506943000000035],[-82.091675000000009,82.501389000000017],[-81.669997999999907,82.492477000000008],[-81.541672000000005,82.496093999999971],[-81.542220999999927,82.504990000000078],[-81.713332999999977,82.51527400000009],[-81.75140399999998,82.516937000000041],[-81.84722899999997,82.515548999999965],[-81.880554000000018,82.517761000000007],[-81.927489999999977,82.522766000000047],[-81.966400000000021,82.528870000000097],[-82.263901000000033,82.576660000000061],[-82.321121000000005,82.589157000000057],[-82.343886999999938,82.595261000000107],[-82.390288999999996,82.611923000000104],[-82.394729999999925,82.617477000000065],[-82.392226999999934,82.622756999999979],[-82.38110399999988,82.634720000000016],[-82.371933000000013,82.639708999999982],[-82.354445999999996,82.645537999999988],[-82.335281000000009,82.650543000000027],[-82.288054999999986,82.659988000000112],[-82.255004999999926,82.664428999999984],[-82.215285999999992,82.668593999999985],[-82.154998999999918,82.671097000000145],[-82.060271999999998,82.669708000000014],[-81.97222899999997,82.666382000000112],[-81.931380999999931,82.663878999999952],[-81.543335000000013,82.637207000000046],[-81.432495000000017,82.629150000000095],[-81.359725999999966,82.62081900000004],[-81.30082699999997,82.611098999999911],[-81.136123999999995,82.578049000000078],[-80.989440999999999,82.547211000000061],[-80.949721999999952,82.538040000000137],[-80.891952999999944,82.532760999999994],[-80.581679999999949,82.543045000000006],[-80.578063999999983,82.546097000000088],[-80.599166999999966,82.55442800000003],[-80.87388599999997,82.629700000000128],[-80.994445999999925,82.650269000000094],[-81.049987999999985,82.660812000000078],[-81.077224999999999,82.666931000000091],[-81.097503999999958,82.672485000000052],[-81.124709999999993,82.686919999999986],[-81.223617999999988,82.715820000000065],[-81.305831999999953,82.733871000000022],[-81.449996999999996,82.755553999999961],[-81.508620999999948,82.764709000000039],[-81.573623999999938,82.788315000000068],[-81.58444199999991,82.794434000000138],[-81.585006999999962,82.800812000000064],[-81.571670999999924,82.806366000000082],[-81.556655999999975,82.811371000000122],[-81.536391999999921,82.816665999999998],[-81.514175000000023,82.821106000000043],[-81.473052999999993,82.82499700000011],[-81.411391999999921,82.827773999999977],[-81.359725999999966,82.827773999999977],[-81.022232000000031,82.821930000000009],[-80.977218999999934,82.820267000000058],[-80.801940999999999,82.812485000000095],[-80.500564999999995,82.797484999999938],[-80.418334999999956,82.792205999999965],[-80.381103999999993,82.788879000000065],[-80.318618999999956,82.779984000000013],[-80.2933349999999,82.774429000000112],[-80.15834000000001,82.727768000000083],[-80.138901000000033,82.719986000000119],[-80.139449999999954,82.715820000000065],[-80.178329000000019,82.699997000000053],[-80.182495000000017,82.69470199999995],[-80.181380999999931,82.687759000000142],[-80.160277999999948,82.681366000000025],[-80.070846999999901,82.665543000000014],[-80.003066999999987,82.656372000000033],[-79.941665999999998,82.649429000000055],[-79.861664000000019,82.644150000000081],[-79.817779999999914,82.644440000000088],[-79.800827000000027,82.646652000000131],[-79.803604000000007,82.649994000000049],[-79.822509999999966,82.65776100000005],[-79.848617999999988,82.663878999999952],[-79.966949,82.684708000000114],[-79.983321999999987,82.689147999999989],[-79.977492999999981,82.695815999999922],[-79.961394999999925,82.700821000000019],[-79.928604000000007,82.705551000000014],[-79.885833999999875,82.708602999999925],[-79.829726999999991,82.708878000000141],[-79.787505999999894,82.707763999999997],[-79.74749799999995,82.704987000000074],[-79.684158000000025,82.699706999999989],[-79.617492999999911,82.693039000000056],[-79.468338000000017,82.677475000000129],[-79.384734999999978,82.672760000000096],[-79.149993999999936,82.667755000000056],[-78.843613000000005,82.664992999999981],[-78.565552000000025,82.674698000000035],[-78.521118000000001,82.67692599999998],[-78.502791999999999,82.681090999999981],[-78.53195199999999,82.684418000000107],[-78.576675000000023,82.686919999999986],[-78.840835999999967,82.680817000000047],[-78.895003999999858,82.680267000000015],[-78.931945999999982,82.681656000000032],[-79.243057000000022,82.695251000000098],[-79.331680000000006,82.699706999999989],[-79.40306099999998,82.70637499999998],[-79.623046999999985,82.727768000000083],[-79.836944999999901,82.750549000000092],[-79.886948000000018,82.759430000000066],[-79.913329999999917,82.765274000000034],[-79.93638599999997,82.772217000000069],[-79.996947999999975,82.803314],[-79.975829999999974,82.808594000000028],[-79.942489999999964,82.811371000000122],[-79.692215000000033,82.818054000000075],[-79.674437999999952,82.820267000000058],[-79.67222599999991,82.823883000000137],[-79.673889000000031,82.824707000000103],[-79.847777999999948,82.834991000000116],[-79.896118000000001,82.835815000000082],[-80.006667999999934,82.834427000000005],[-80.110000999999954,82.834717000000012],[-80.15834000000001,82.835541000000148],[-80.194153000000028,82.838318000000072],[-80.219727000000034,82.84165999999999],[-80.277221999999938,82.850815000000011],[-80.393065999999976,82.875534000000016],[-80.430282999999974,82.887497000000053],[-80.42971799999998,82.894150000000025],[-80.398055999999997,82.899719000000005],[-80.095839999999953,82.937194999999974],[-79.904723999999987,82.951096000000121],[-79.793335000000013,82.957489000000123],[-79.458344000000011,82.974152000000004],[-79.414444000000003,82.975266000000147],[-79.370543999999995,82.974152000000004],[-79.177489999999977,82.951935000000105],[-79.073333999999988,82.901931999999988],[-79.064437999999882,82.895828000000108],[-79.066101000000003,82.889434999999992],[-78.928054999999972,82.898605000000032],[-78.825287000000003,82.928040000000124],[-78.780288999999982,82.93803400000013],[-78.756118999999956,82.942474000000118],[-78.719726999999978,82.946640000000059],[-78.671111999999937,82.945526000000086],[-78.631942999999978,82.941360000000145],[-78.546111999999994,82.926651000000106],[-78.521666999999923,82.921097000000088],[-78.503341999999918,82.913314999999955],[-78.501953000000015,82.907760999999994],[-78.504180999999903,82.901093000000003],[-78.521941999999967,82.889159999999947],[-78.538605000000018,82.876647999999989],[-78.557770000000005,82.860535000000141],[-78.553328999999906,82.853592000000106],[-78.53443900000002,82.8477630000001],[-78.500564999999938,82.845534999999984],[-78.341674999999952,82.850540000000024],[-78.175551999999982,82.827208999999982],[-78.14416499999993,82.823318000000086],[-78.109160999999972,82.825272000000098],[-78.106658999999979,82.831940000000088],[-78.128875999999877,82.836655000000121],[-78.194442999999922,82.845824999999991],[-78.223617999999988,82.851088999999945],[-78.241378999999938,82.858871000000079],[-78.238891999999964,82.865265000000136],[-78.108337000000006,82.893326000000059],[-78.080291999999986,82.898331000000098],[-77.986663999999962,82.909988000000055],[-77.949996999999883,82.91415400000011],[-77.863327000000027,82.921371000000022],[-77.813048999999864,82.92442299999999],[-77.768340999999964,82.922485000000052],[-77.708344000000011,82.916092000000049],[-77.688889000000017,82.912490999999989],[-77.616652999999985,82.902771000000087],[-77.528060999999923,82.891098000000113],[-77.467223999999987,82.883880999999974],[-77.405272999999909,82.878860000000032],[-77.319457999999997,82.873306000000014],[-77.128325999999959,82.863312000000008],[-77.108046999999999,82.859146000000123],[-77.089171999999962,82.852767999999969],[-76.96665999999999,82.804703000000131],[-76.959166999999923,82.774155000000007],[-76.941665999999998,82.768326000000002],[-76.898346000000004,82.766098],[-76.851104999999961,82.764999000000046],[-76.815552000000025,82.761107999999979],[-76.789168999999958,82.756377999999927],[-76.766662999999994,82.750823999999966],[-76.708617999999944,82.733047000000056],[-76.674438000000009,82.721374999999966],[-76.644164999999987,82.709152000000074],[-76.612503000000004,82.696091000000138],[-76.598052999999993,82.688873000000115],[-76.570556999999951,82.666656000000046],[-76.538329999999974,82.664153999999996],[-76.387221999999952,82.651382000000012],[-76.09333799999996,82.62081900000004],[-76.058884000000035,82.616928000000144],[-75.913895000000025,82.597487999999942],[-75.892226999999991,82.591933999999981],[-75.896392999999989,82.588318000000072],[-75.918610000000001,82.579987000000017],[-75.938323999999966,82.575821000000133],[-75.972778000000005,82.571381000000088],[-76.038895000000025,82.557205000000067],[-76.194716999999969,82.511108000000036],[-76.207503999999972,82.506377999999984],[-76.217772999999909,82.500548999999978],[-76.255279999999971,82.471924000000115],[-76.261002000000019,82.466552999999976],[-76.236937999999896,82.445250999999985],[-76.230835000000013,82.444702000000007],[-76.184158000000025,82.453872999999987],[-76.102782999999874,82.470534999999984],[-76.037780999999939,82.484421000000111],[-75.975006000000008,82.499709999999993],[-75.887221999999952,82.522217000000126],[-75.802779999999984,82.546371000000022],[-75.773894999999925,82.557205000000067],[-75.671386999999925,82.586929000000112],[-75.648055999999997,82.591660000000047],[-75.606383999999935,82.595825000000048],[-75.500838999999928,82.600266000000147],[-75.451675000000023,82.603317000000004],[-75.420273000000009,82.606934000000138],[-75.396118000000001,82.614699999999971],[-75.40972899999997,82.61914100000007],[-75.43472300000002,82.623871000000122],[-75.468886999999881,82.627762000000018],[-75.503615999999852,82.628860000000088],[-75.55749499999996,82.628585999999984],[-75.625548999999978,82.633040999999992],[-75.670546999999999,82.642761000000064],[-75.807495000000017,82.654709000000082],[-76.103057999999976,82.68609600000002],[-76.235824999999977,82.712203999999986],[-76.256392999999946,82.717209000000025],[-76.275557999999933,82.724425999999994],[-76.299987999999871,82.739700000000028],[-76.306655999999919,82.745819000000097],[-76.309158000000025,82.752777000000094],[-76.269454999999994,82.760817999999972],[-76.226395000000025,82.764435000000105],[-76.176391999999964,82.767212000000029],[-76.056945999999982,82.771652000000017],[-76.014724999999999,82.775818000000129],[-75.989440999999999,82.779984000000013],[-75.976104999999961,82.784714000000065],[-75.998336999999935,82.787490999999932],[-76.18638599999997,82.78387500000008],[-76.241378999999995,82.783600000000035],[-76.288605000000018,82.784714000000065],[-76.375274999999988,82.789154000000053],[-76.447495000000004,82.797484999999938],[-76.50167799999997,82.8077550000001],[-76.525283999999942,82.813873000000001],[-76.545272999999952,82.821106000000043],[-76.586394999999982,82.83859300000006],[-76.629165999999998,82.859710999999947],[-76.666655999999989,82.872482000000048],[-76.710830999999985,82.885818000000029],[-76.752791999999999,82.894988999999953],[-76.844161999999983,82.90914900000007],[-76.881942999999978,82.913605000000018],[-77.025832999999977,82.927765000000079],[-77.066390999999953,82.93081699999999],[-77.131667999999991,82.939972000000068],[-77.344726999999978,82.972487999999998],[-77.385283999999899,82.983046999999999],[-77.381377999999984,82.994431000000134],[-77.364440999999999,83.000000000000114],[-77.341949,83.005554000000132],[-77.276108000000022,83.020264000000054],[-77.252227999999945,83.025269000000094],[-77.222777999999948,83.030548000000067],[-77.183883999999978,83.033875000000023],[-77.134734999999978,83.032486000000006],[-77.137221999999895,83.028320000000122],[-77.171386999999982,83.017211999999972],[-77.169723999999974,83.013885000000016],[-77.135558999999944,83.011383000000137],[-76.863051999999925,83.010818000000086],[-76.559432999999956,83.011932000000058],[-76.360274999999945,83.021378000000027],[-76.266662999999994,83.02915999999999],[-76.20666499999993,83.036652000000117],[-76.113327000000027,83.05053700000002],[-76.079177999999956,83.053589000000102],[-76.028610000000015,83.054428000000087],[-75.979720999999927,83.05304000000001],[-75.948607999999922,83.051926000000037],[-75.580841000000021,83.038040000000024],[-75.313323999999909,83.027480999999966],[-75.046951000000035,83.041656000000103],[-75,83.043884000000048],[-74.956389999999999,83.04553199999998],[-74.797501000000011,83.043594000000041],[-74.706664999999987,83.041091999999935],[-74.43582200000003,83.027205999999978],[-74.408050999999887,83.024704000000099],[-74.279175000000009,83.009995000000004],[-74.172774999999888,82.991088999999988],[-74.084166999999979,82.972487999999998],[-74.018065999999976,82.956940000000145],[-73.879439999999875,82.897217000000126],[-73.851668999999958,82.866653000000042],[-73.817779999999971,82.852767999999969],[-73.607772999999952,82.81581099999994],[-73.548339999999939,82.806091000000038],[-73.281951999999933,82.766388000000063],[-73.247222999999963,82.761658000000011],[-73.160278000000005,82.751388999999961],[-73.075011999999958,82.745819000000097],[-72.949721999999952,82.738876000000062],[-72.906661999999983,82.735808999999961],[-72.835830999999985,82.728592000000049],[-72.75,82.714706000000092],[-72.700835999999981,82.703323000000069],[-72.672225999999966,82.698593000000017],[-72.633895999999936,82.694427000000132],[-72.603332999999964,82.695815999999922],[-72.594727000000034,82.697479000000044],[-72.49888599999997,82.718323000000055],[-72.502501999999936,82.724425999999994],[-72.648894999999925,82.746643000000063],[-72.716659999999933,82.755553999999961],[-72.912216000000001,82.776657000000057],[-72.983886999999982,82.78387500000008],[-73.027221999999881,82.786926000000108],[-73.211394999999925,82.813873000000001],[-73.257506999999919,82.825821000000076],[-73.401397999999915,82.874985000000038],[-73.420272999999952,82.890548999999965],[-73.430556999999908,82.893599999999992],[-73.460830999999928,82.898605000000032],[-73.49499499999996,82.90248100000008],[-73.577224999999999,82.908035000000098],[-73.607498000000021,82.913040000000137],[-73.633330999999998,82.918593999999985],[-73.65055799999999,82.925811999999951],[-73.644164999999873,82.932205000000124],[-73.634444999999971,82.936646000000053],[-73.619155999999975,82.941086000000041],[-73.261948000000018,83.007767000000058],[-73.033889999999928,83.036652000000117],[-72.948607999999979,83.055252000000053],[-72.927489999999977,83.067490000000078],[-72.650557999999933,83.096374999999966],[-72.59973100000002,83.096939000000077],[-72.57028200000002,83.092758000000003],[-72.568619000000012,83.087769000000037],[-72.556655999999975,83.079712000000086],[-72.523894999999925,83.076934999999992],[-72.477492999999868,83.076659999999947],[-72.424163999999962,83.079163000000108],[-72.407776000000013,83.083602999999982],[-72.393616000000009,83.089431999999988],[-72.365829000000019,83.094147000000021],[-72.336394999999925,83.097763000000043],[-72.226943999999946,83.101379000000122],[-72.111938000000009,83.101089000000115],[-72.005568999999866,83.099152000000061],[-71.831680000000006,83.097763000000043],[-71.712783999999886,83.098877000000016],[-71.611663999999905,83.096099999999979],[-71.581679999999949,83.091095000000109],[-71.596953999999869,83.085266000000047],[-71.654448999999943,83.068878000000041],[-71.696380999999917,83.057755000000043],[-71.75,83.043045000000063],[-71.775008999999898,83.032211000000018],[-71.7933349999999,83.020537999999988],[-71.794998000000021,83.013611000000083],[-71.792220999999984,83.00749200000007],[-71.778335999999911,83.001663000000065],[-71.567229999999938,82.941086000000041],[-71.493606999999997,82.932205000000124],[-71.33666999999997,82.914703000000088],[-71.219726999999978,82.914993000000095],[-71.144164999999987,82.908325000000104],[-71.084166999999979,82.900542999999971],[-71.018340999999964,82.891937000000041],[-70.952224999999999,82.883605999999986],[-70.871384000000035,82.881087999999977],[-70.835006999999962,82.883041000000105],[-70.84333799999996,82.889984000000084],[-70.857773000000009,82.897217000000126],[-70.904174999999952,82.908035000000098],[-70.961944999999957,82.918593999999985],[-71.080841000000021,82.937484999999981],[-71.306380999999931,82.982208000000071],[-71.472777999999948,83.001663000000065],[-71.497498000000007,83.007217000000026],[-71.489990000000034,83.014435000000049],[-71.474166999999852,83.019440000000088],[-71.425002999999947,83.029434000000094],[-71.125274999999988,83.087494000000049],[-70.887221999999895,83.098038000000088],[-70.694152999999972,83.103592000000049],[-70.585280999999952,83.103317000000061],[-70.470000999999968,83.107482999999945],[-70.37388599999997,83.113311999999951],[-70.260009999999966,83.113876000000118],[-70.160003999999958,83.111374000000012],[-70.111937999999952,83.109421000000111]]]} -} -] -} diff --git a/resources/3rdparty/modernjson/benchmarks/files/nativejson-benchmark/citm_catalog.json b/resources/3rdparty/modernjson/benchmarks/files/nativejson-benchmark/citm_catalog.json deleted file mode 100755 index 245fdbbed..000000000 --- a/resources/3rdparty/modernjson/benchmarks/files/nativejson-benchmark/citm_catalog.json +++ /dev/null @@ -1,50469 +0,0 @@ -{ - "areaNames": { - "205705993": "Arrière-scène central", - "205705994": "1er balcon central", - "205705995": "2ème balcon bergerie cour", - "205705996": "2ème balcon bergerie jardin", - "205705998": "1er balcon bergerie jardin", - "205705999": "1er balcon bergerie cour", - "205706000": "Arrière-scène jardin", - "205706001": "Arrière-scène cour", - "205706002": "2ème balcon jardin", - "205706003": "2ème balcon cour", - "205706004": "2ème Balcon central", - "205706005": "1er balcon jardin", - "205706006": "1er balcon cour", - "205706007": "Orchestre central", - "205706008": "Orchestre jardin", - "205706009": "Orchestre cour", - "342752287": "Zone physique secrète" - }, - "audienceSubCategoryNames": { - "337100890": "Abonné" - }, - "blockNames": {}, - "events": { - "138586341": { - "description": null, - "id": 138586341, - "logo": null, - "name": "30th Anniversary Tour", - "subTopicIds": [ - 337184269, - 337184283 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604 - ] - }, - "138586345": { - "description": null, - "id": 138586345, - "logo": "/images/UE0AAAAACEKo6QAAAAZDSVRN", - "name": "Berliner Philharmoniker", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586349": { - "description": null, - "id": 138586349, - "logo": "/images/UE0AAAAACEKo7QAAAAZDSVRN", - "name": "Berliner Philharmoniker", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586353": { - "description": null, - "id": 138586353, - "logo": "/images/UE0AAAAACEKo8QAAAAZDSVRN", - "name": "Pittsburgh Symphony Orchestra", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586357": { - "description": null, - "id": 138586357, - "logo": "/images/UE0AAAAACEKo9QAAAAhDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586361": { - "description": null, - "id": 138586361, - "logo": "/images/UE0AAAAACEKo+QAAAAVDSVRN", - "name": "WDR Sinfonieorchester Köln", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586365": { - "description": null, - "id": 138586365, - "logo": "/images/UE0AAAAACEKo/QAAAAVDSVRN", - "name": "Alessandro - G.F. Haendel", - "subTopicIds": [ - 337184284, - 337184263, - 337184298, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586369": { - "description": null, - "id": 138586369, - "logo": "/images/UE0AAAAACEKpAQAAAAVDSVRN", - "name": "Orchestre Colonne", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586373": { - "description": null, - "id": 138586373, - "logo": "/images/UE0AAAAACEKpBQAAAAdDSVRN", - "name": "Christophe", - "subTopicIds": [ - 337184280, - 337184297, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586377": { - "description": null, - "id": 138586377, - "logo": "/images/UE0AAAAACEKpCQAAAAVDSVRN", - "name": "Joshua Redman Quartet", - "subTopicIds": [ - 337184269, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586381": { - "description": null, - "id": 138586381, - "logo": "/images/UE0AAAAACEKpDQAAAAVDSVRN", - "name": "Orchestre Symphonique d'Etat de São Paulo", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586385": { - "description": null, - "id": 138586385, - "logo": "/images/UE0AAAAACEKpEQAAAAVDSVRN", - "name": "Le génie italien", - "subTopicIds": [ - 337184284, - 337184298, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586389": { - "description": null, - "id": 138586389, - "logo": "/images/UE0AAAAACEKpFQAAAAVDSVRN", - "name": "Les Noces de Figaro - W.A. Mozart (version de concert)", - "subTopicIds": [ - 337184284, - 337184298, - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586393": { - "description": null, - "id": 138586393, - "logo": "/images/UE0AAAAACEKpGQAAAAhDSVRN", - "name": "Orchestre Pasdeloup", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586397": { - "description": null, - "id": 138586397, - "logo": null, - "name": "The Saxophone Summit", - "subTopicIds": [ - 337184269, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586401": { - "description": null, - "id": 138586401, - "logo": "/images/UE0AAAAACEKpIQAAAAVDSVRN", - "name": "Patricia Petibon - Nouveau Monde", - "subTopicIds": [ - 337184263, - 337184298, - 337184283, - 337184292 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586405": { - "description": null, - "id": 138586405, - "logo": "/images/UE0AAAAACEKpJQAAAAVDSVRN", - "name": "Russian National Orchestra", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586409": { - "description": null, - "id": 138586409, - "logo": "/images/UE0AAAAACEKpKQAAAAZDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586413": { - "description": null, - "id": 138586413, - "logo": "/images/UE0AAAAACEKpLQAAAAVDSVRN", - "name": "Evgeny Kissin", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586417": { - "description": null, - "id": 138586417, - "logo": "/images/UE0AAAAACEKpMQAAAAZDSVRN", - "name": "Bach, concertos pour piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586421": { - "description": null, - "id": 138586421, - "logo": "/images/UE0AAAAACEKpNQAAAAVDSVRN", - "name": "Bach, concertos pour piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586425": { - "description": null, - "id": 138586425, - "logo": null, - "name": "Orchestre National d'Île-de-France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586429": { - "description": null, - "id": 138586429, - "logo": "/images/UE0AAAAACEKpPQAAAAVDSVRN", - "name": "Gewandhausorchester Leipzig", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586433": { - "description": null, - "id": 138586433, - "logo": "/images/UE0AAAAACEKpQQAAAAVDSVRN", - "name": "Gewandhausorchester Leipzig", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586437": { - "description": null, - "id": 138586437, - "logo": "/images/UE0AAAAACEKpRQAAAAVDSVRN", - "name": "Budapest Festival Orchestra", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586441": { - "description": null, - "id": 138586441, - "logo": "/images/UE0AAAAACEKpSQAAAAVDSVRN", - "name": "Orchestre National du Capitole de Toulouse", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586445": { - "description": null, - "id": 138586445, - "logo": "/images/UE0AAAAACEKpTQAAAAVDSVRN", - "name": "Gewandhausorchester Leipzig", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586449": { - "description": null, - "id": 138586449, - "logo": "/images/UE0AAAAACEKpUQAAAAVDSVRN", - "name": "Gewandhausorchester Leipzig", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586453": { - "description": null, - "id": 138586453, - "logo": "/images/UE0AAAAACEKpVQAAAAVDSVRN", - "name": "Remember Shakti", - "subTopicIds": [ - 337184269, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586457": { - "description": null, - "id": 138586457, - "logo": "/images/UE0AAAAACEKpWQAAAAVDSVRN", - "name": "Menahem Pressler - Quatuor Ebène", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586461": { - "description": null, - "id": 138586461, - "logo": "/images/UE0AAAAACEKpXQAAAAZDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586465": { - "description": null, - "id": 138586465, - "logo": "/images/UE0AAAAACEKpYQAAAAVDSVRN", - "name": "Orquesta Buena Vista Social Club", - "subTopicIds": [ - 337184279, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586469": { - "description": null, - "id": 138586469, - "logo": "/images/UE0AAAAACEKpZQAAAAVDSVRN", - "name": "The Cleveland Orchestra", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586473": { - "description": null, - "id": 138586473, - "logo": "/images/UE0AAAAACEKpaQAAAAVDSVRN", - "name": "The Cleveland Orchestra", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586477": { - "description": null, - "id": 138586477, - "logo": "/images/UE0AAAAACEKpbQAAAAZDSVRN", - "name": "Orchestre Philharmonique du Luxembourg", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586481": { - "description": null, - "id": 138586481, - "logo": "/images/UE0AAAAACEKpcQAAAAVDSVRN", - "name": "Maurizio Pollini, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586485": { - "description": null, - "id": 138586485, - "logo": "/images/UE0AAAAACEKpdQAAAAZDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586501": { - "description": null, - "id": 138586501, - "logo": "/images/UE0AAAAACEKphQAAAAVDSVRN", - "name": "Antonio Meneses - Maria-João Pires", - "subTopicIds": [ - 337184268, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586505": { - "description": null, - "id": 138586505, - "logo": "/images/UE0AAAAACEKpiQAAAAVDSVRN", - "name": "Musiques pour la reine Caroline", - "subTopicIds": [ - 337184284, - 337184263, - 337184298, - 337184283, - 337184292 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586509": { - "description": null, - "id": 138586509, - "logo": null, - "name": "Orchestre National d'Île-de-France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586513": { - "description": null, - "id": 138586513, - "logo": "/images/UE0AAAAACEKpkQAAAAVDSVRN", - "name": "Les Mystères d'Isis - W.A. Mozart (cersion de concert)", - "subTopicIds": [ - 337184284, - 337184298, - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586517": { - "description": null, - "id": 138586517, - "logo": "/images/UE0AAAAACEKplQAAAAdDSVRN", - "name": "Martha Argerich - Gidon Kremer", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586521": { - "description": null, - "id": 138586521, - "logo": "/images/UE0AAAAACEKpmQAAAAVDSVRN", - "name": "Cecilia Bartoli - Mozart et la Vienne classique", - "subTopicIds": [ - 337184298, - 337184268, - 337184283, - 337184292 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586525": { - "description": null, - "id": 138586525, - "logo": "/images/UE0AAAAACEKpnQAAAAVDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586529": { - "description": null, - "id": 138586529, - "logo": null, - "name": "Orchestre Pasdeloup", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586533": { - "description": null, - "id": 138586533, - "logo": "/images/UE0AAAAACEKppQAAAAVDSVRN", - "name": "Orchestre du Théâtre Mariinsky", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586537": { - "description": null, - "id": 138586537, - "logo": "/images/UE0AAAAACEKpqQAAAAVDSVRN", - "name": "Orchestre du Théâtre Mariinsky", - "subTopicIds": [ - 337184298, - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586541": { - "description": null, - "id": 138586541, - "logo": "/images/UE0AAAAACEKprQAAAAVDSVRN", - "name": "Orchestre du Théâtre Mariinsky", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586545": { - "description": null, - "id": 138586545, - "logo": "/images/UE0AAAAACEKpsQAAAAVDSVRN", - "name": "Academy of Saint Martin in the Fields", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586549": { - "description": null, - "id": 138586549, - "logo": "/images/UE0AAAAACEKptQAAAAVDSVRN", - "name": "Quatuor Hagen", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586553": { - "description": null, - "id": 138586553, - "logo": "/images/UE0AAAAACEKpuQAAAAVDSVRN", - "name": "Quatuor Hagen", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586557": { - "description": null, - "id": 138586557, - "logo": "/images/UE0AAAAACEKpvQAAAAVDSVRN", - "name": "Quatuor Hagen", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586561": { - "description": null, - "id": 138586561, - "logo": "/images/UE0AAAAACEKpwQAAAAVDSVRN", - "name": "Sunwook Kim, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586565": { - "description": null, - "id": 138586565, - "logo": null, - "name": "Orchestre Colonne", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586569": { - "description": null, - "id": 138586569, - "logo": "/images/UE0AAAAACEKpyQAAAAVDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586581": { - "description": null, - "id": 138586581, - "logo": null, - "name": "Orchestre National de France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586585": { - "description": null, - "id": 138586585, - "logo": "/images/UE0AAAAACEKp2QAAAAVDSVRN", - "name": "Messe en si mineur - J.S. Bach", - "subTopicIds": [ - 337184296, - 337184263, - 337184298, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586589": { - "description": null, - "id": 138586589, - "logo": null, - "name": "Le Messie - G.F. Haendel", - "subTopicIds": [ - 337184263, - 337184298, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586593": { - "description": null, - "id": 138586593, - "logo": "/images/UE0AAAAACEKp4QAAAAdDSVRN", - "name": "Orchestre National d'Île-de-France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586597": { - "description": null, - "id": 138586597, - "logo": "/images/UE0AAAAACEKp5QAAAAVDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586601": { - "description": null, - "id": 138586601, - "logo": "/images/UE0AAAAACEKp6QAAAAdDSVRN", - "name": "Orchestre Pasdeloup", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586605": { - "description": null, - "id": 138586605, - "logo": null, - "name": "Orchestre Colonne", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586609": { - "description": null, - "id": 138586609, - "logo": null, - "name": "Ciné-concert - Le Cuirassé Potemkine", - "subTopicIds": [ - 337184267, - 337184262, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 107888604, - 324846100 - ] - }, - "138586613": { - "description": null, - "id": 138586613, - "logo": "/images/UE0AAAAACEKp9QAAAAVDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586617": { - "description": null, - "id": 138586617, - "logo": "/images/UE0AAAAACEKp+QAAAAVDSVRN", - "name": "London Symphony Orchestra", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586625": { - "description": null, - "id": 138586625, - "logo": null, - "name": "Orchestre National d'Île-de-France", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586629": { - "description": null, - "id": 138586629, - "logo": "/images/UE0AAAAACEKqBQAAAAVDSVRN", - "name": "Orquesta Sinfonica Simón Bolívar de Venezuela", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586633": { - "description": null, - "id": 138586633, - "logo": "/images/UE0AAAAACEKqCQAAAAVDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184298, - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586641": { - "description": null, - "id": 138586641, - "logo": "/images/UE0AAAAACEKqEQAAAAVDSVRN", - "name": "Edita Gruberova - Airs de concert", - "subTopicIds": [ - 337184284, - 337184298, - 337184283, - 337184292 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586645": { - "description": null, - "id": 138586645, - "logo": "/images/UE0AAAAACEKqFQAAAAdDSVRN", - "name": "Orchestre National d'Île-de-France", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586649": { - "description": null, - "id": 138586649, - "logo": "/images/UE0AAAAACEKqGQAAAAZDSVRN", - "name": "Alexei Volodin, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586653": { - "description": null, - "id": 138586653, - "logo": null, - "name": "Sonya Yoncheva - Diva !", - "subTopicIds": [ - 337184284, - 337184263, - 337184298, - 337184283, - 337184292 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586657": { - "description": null, - "id": 138586657, - "logo": "/images/UE0AAAAACEKqIQAAAAVDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586661": { - "description": null, - "id": 138586661, - "logo": null, - "name": "Le Ramayana balinais - L'Enlèvement de Sita", - "subTopicIds": [ - 337184279, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586667": { - "description": null, - "id": 138586667, - "logo": null, - "name": "Dave Holland & friends", - "subTopicIds": [ - 337184269, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586671": { - "description": null, - "id": 138586671, - "logo": "/images/UE0AAAAACEKqLwAAAAlDSVRN", - "name": "Boris Godounov - M.Moussorgski (version de concert)", - "subTopicIds": [ - 337184284, - 337184298, - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586675": { - "description": null, - "id": 138586675, - "logo": "/images/UE0AAAAACEKqMwAAAAVDSVRN", - "name": "Insula orchestra - Accentus", - "subTopicIds": [ - 337184298, - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586679": { - "description": null, - "id": 138586679, - "logo": "/images/UE0AAAAACEKqNwAAAAVDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586687": { - "description": null, - "id": 138586687, - "logo": "/images/UE0AAAAACEKqPwAAAAVDSVRN", - "name": "Bryn Terfel - Héros légendaires", - "subTopicIds": [ - 337184284, - 337184298, - 337184283, - 337184292 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586691": { - "description": null, - "id": 138586691, - "logo": null, - "name": "Les Siècles", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586695": { - "description": null, - "id": 138586695, - "logo": "/images/UE0AAAAACEKqRwAAAAVDSVRN", - "name": "Gautier Capuçon - Frank Braley", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586699": { - "description": null, - "id": 138586699, - "logo": null, - "name": "Festival Présences 2014 \"Paris Berlin\"", - "subTopicIds": [ - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586703": { - "description": null, - "id": 138586703, - "logo": "/images/UE0AAAAACEKqTwAAAAZDSVRN", - "name": "Autour de Tristan", - "subTopicIds": [ - 337184284, - 337184298, - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586707": { - "description": null, - "id": 138586707, - "logo": "/images/UE0AAAAACEKqUwAAAAVDSVRN", - "name": "Orchestre du Théâtre Mariinsky", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586711": { - "description": null, - "id": 138586711, - "logo": "/images/UE0AAAAACEKqVwAAAAVDSVRN", - "name": "Orchestre du Théâtre Mariinsky", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586715": { - "description": null, - "id": 138586715, - "logo": "/images/UE0AAAAACEKqWwAAAAVDSVRN", - "name": "Orchestre du Théâtre Mariinsky", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586719": { - "description": null, - "id": 138586719, - "logo": "/images/UE0AAAAACEKqXwAAAAVDSVRN", - "name": "Etienne Daho et invités", - "subTopicIds": [ - 337184280, - 337184297, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586723": { - "description": null, - "id": 138586723, - "logo": null, - "name": "Fantasia in concert", - "subTopicIds": [ - 337184299, - 337184268, - 337184267, - 337184275, - 337184282 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846098, - 324846099, - 107888604, - 324846100 - ] - }, - "138586731": { - "description": null, - "id": 138586731, - "logo": "/images/UE0AAAAACEKqawAAAAVDSVRN", - "name": "Khatia Buniatishvili, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586735": { - "description": null, - "id": 138586735, - "logo": "/images/UE0AAAAACEKqbwAAAAVDSVRN", - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586743": { - "description": null, - "id": 138586743, - "logo": null, - "name": "Guy Braunstein - Zvi Plesser - Sunwook Kim", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586747": { - "description": null, - "id": 138586747, - "logo": "/images/UE0AAAAACEKqewAAAAVDSVRN", - "name": "Janine Jansen and friends", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586751": { - "description": null, - "id": 138586751, - "logo": "/images/UE0AAAAACEKqfwAAAAVDSVRN", - "name": "Elena Bashkirova, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586755": { - "description": null, - "id": 138586755, - "logo": null, - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184284, - 337184298, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586759": { - "description": null, - "id": 138586759, - "logo": null, - "name": "San Francisco Symphony", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586771": { - "description": null, - "id": 138586771, - "logo": null, - "name": "Passion selon saint Jean - J.S. Bach", - "subTopicIds": [ - 337184296, - 337184263, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586775": { - "description": null, - "id": 138586775, - "logo": null, - "name": "Yundi Li , piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586779": { - "description": null, - "id": 138586779, - "logo": null, - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586783": { - "description": null, - "id": 138586783, - "logo": null, - "name": "Orchestre Pasdeloup", - "subTopicIds": [ - 337184268, - 337184269, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586787": { - "description": null, - "id": 138586787, - "logo": null, - "name": "Orchestre du Conservatoire de Paris", - "subTopicIds": [ - 337184284, - 337184298, - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586795": { - "description": null, - "id": 138586795, - "logo": null, - "name": "Orchestre National d'Île-de-France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586799": { - "description": null, - "id": 138586799, - "logo": null, - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586803": { - "description": null, - "id": 138586803, - "logo": null, - "name": "Royal Concertgebouw Orchestra Amsterdam", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586807": { - "description": null, - "id": 138586807, - "logo": null, - "name": "Royal Concertgebouw Orchestra Amsterdam", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586811": { - "description": null, - "id": 138586811, - "logo": null, - "name": "Royal Concertgebouw Orchestra Amsterdam", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586815": { - "description": null, - "id": 138586815, - "logo": null, - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586823": { - "description": null, - "id": 138586823, - "logo": null, - "name": "London Symphony Orchestra", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586827": { - "description": null, - "id": 138586827, - "logo": null, - "name": "London Symphony Orchestra", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586831": { - "description": null, - "id": 138586831, - "logo": null, - "name": "Le Concert des Nations - Jordi Savall", - "subTopicIds": [ - 337184263, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586835": { - "description": null, - "id": 138586835, - "logo": null, - "name": "Leonidas Kavakos - Yuja Wang", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586839": { - "description": null, - "id": 138586839, - "logo": null, - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586843": { - "description": null, - "id": 138586843, - "logo": null, - "name": "Quatuor Artemis - Gautier Capuçon", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586847": { - "description": null, - "id": 138586847, - "logo": null, - "name": "Quatuor Artemis - Quatuor Ébène", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586851": { - "description": null, - "id": 138586851, - "logo": null, - "name": "Quatuor Artemis - Elisabeth Leonskaja", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586855": { - "description": null, - "id": 138586855, - "logo": null, - "name": "Russian National Orchestra", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586859": { - "description": null, - "id": 138586859, - "logo": null, - "name": "Passion selon saint Matthieu", - "subTopicIds": [ - 337184296, - 337184263, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586863": { - "description": null, - "id": 138586863, - "logo": null, - "name": "Les Arts Florissants - Concert de Pâques", - "subTopicIds": [ - 337184263, - 337184298, - 337184283, - 337184292 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586867": { - "description": null, - "id": 138586867, - "logo": null, - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586871": { - "description": null, - "id": 138586871, - "logo": null, - "name": "Leylâ et Majnûn ou L'Amour mystique", - "subTopicIds": [ - 337184279, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586875": { - "description": null, - "id": 138586875, - "logo": null, - "name": "Stephen Kovacevich, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586879": { - "description": null, - "id": 138586879, - "logo": null, - "name": "Orchestra Mozart Bologna - Mahler Chamber Orchestra", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586883": { - "description": null, - "id": 138586883, - "logo": null, - "name": "Ballet Royal du Cambodge", - "subTopicIds": [ - 337184279, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586889": { - "description": null, - "id": 138586889, - "logo": null, - "name": "MDR Sinfonieorchester Leipzig", - "subTopicIds": [ - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586893": { - "description": null, - "id": 138586893, - "logo": null, - "name": "Orchestre Colonne", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586897": { - "description": null, - "id": 138586897, - "logo": null, - "name": "Elisabeth Leonskaja, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586901": { - "description": null, - "id": 138586901, - "logo": null, - "name": "Yuja Wang, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586905": { - "description": null, - "id": 138586905, - "logo": null, - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586909": { - "description": null, - "id": 138586909, - "logo": null, - "name": "Anne-Sophie Mutter - Lambert Orkis", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586917": { - "description": null, - "id": 138586917, - "logo": null, - "name": "Orchestre National d'Île-de-France", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586921": { - "description": null, - "id": 138586921, - "logo": null, - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586929": { - "description": null, - "id": 138586929, - "logo": null, - "name": "Orchestre Pasdeloup", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586933": { - "description": null, - "id": 138586933, - "logo": null, - "name": "Gilberto Gil", - "subTopicIds": [ - 337184279, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586937": { - "description": null, - "id": 138586937, - "logo": null, - "name": "Nelson Freire, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586941": { - "description": null, - "id": 138586941, - "logo": null, - "name": "Orchestre Philharmonique de Radio France", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586945": { - "description": null, - "id": 138586945, - "logo": null, - "name": "Orfeo - C. Monteverdi (version de concert)", - "subTopicIds": [ - 337184284, - 337184263, - 337184298, - 337184283, - 337184292 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586949": { - "description": null, - "id": 138586949, - "logo": null, - "name": "Bamberger Symphoniker", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586953": { - "description": null, - "id": 138586953, - "logo": null, - "name": "Murray Perahia, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586957": { - "description": null, - "id": 138586957, - "logo": null, - "name": "Orchestre National du Capitole de Toulouse", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586961": { - "description": null, - "id": 138586961, - "logo": null, - "name": "Krystian Zimerman, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586965": { - "description": null, - "id": 138586965, - "logo": null, - "name": "Rafal Blechacz, piano", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586969": { - "description": null, - "id": 138586969, - "logo": null, - "name": "Les Voyages musicaux de Marco Polo", - "subTopicIds": [ - 337184279, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586973": { - "description": null, - "id": 138586973, - "logo": null, - "name": "Orchestre National de Lyon", - "subTopicIds": [ - 337184298, - 337184268, - 337184283, - 337184292, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586977": { - "description": null, - "id": 138586977, - "logo": null, - "name": "Guy Braunstein - Zvi Plesser - Sunwook Kim", - "subTopicIds": [ - 337184281, - 337184283, - 337184273 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586981": { - "description": null, - "id": 138586981, - "logo": null, - "name": "La Bohème - G. Puccini (version de concert)", - "subTopicIds": [ - 337184284, - 337184298, - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586989": { - "description": null, - "id": 138586989, - "logo": null, - "name": "Otello - G. Verdi (version de concert)", - "subTopicIds": [ - 337184284, - 337184298, - 337184268, - 337184283, - 337184292 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586993": { - "description": null, - "id": 138586993, - "logo": null, - "name": "Staatskapelle Berlin", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "138586997": { - "description": null, - "id": 138586997, - "logo": null, - "name": "Staatskapelle Berlin", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "151183114": { - "description": null, - "id": 151183114, - "logo": null, - "name": "San Francisco Symphony", - "subTopicIds": [ - 337184298, - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "339420802": { - "description": null, - "id": 339420802, - "logo": null, - "name": "Lou Doillon", - "subTopicIds": [ - 337184280, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "339420805": { - "description": null, - "id": 339420805, - "logo": null, - "name": "Patrick Watson & Orchestre National d'Ile-de-France", - "subTopicIds": [ - 337184280, - 337184283, - 337184262 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341069930": { - "description": null, - "id": 341069930, - "logo": "/images/UE0AAAAAFFRQagAAAAlDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181232": { - "description": null, - "id": 341181232, - "logo": null, - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181233": { - "description": null, - "id": 341181233, - "logo": "/images/UE0AAAAAFFYDMQAAAAhDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181234": { - "description": null, - "id": 341181234, - "logo": "/images/UE0AAAAAFFYDMgAAAAdDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181235": { - "description": null, - "id": 341181235, - "logo": "/images/UE0AAAAAFFYDMwAAAAZDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181236": { - "description": null, - "id": 341181236, - "logo": "/images/UE0AAAAAFFYDNAAAAAZDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181237": { - "description": null, - "id": 341181237, - "logo": "/images/UE0AAAAAFFYDNQAAAAhDSVRN", - "name": "Paavo Järvi, direction", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181238": { - "description": null, - "id": 341181238, - "logo": "/images/UE0AAAAAFFYDNgAAAAdDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181239": { - "description": null, - "id": 341181239, - "logo": "/images/UE0AAAAAFFYDNwAAAAdDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181240": { - "description": null, - "id": 341181240, - "logo": "/images/UE0AAAAAFFYDOAAAAAhDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181241": { - "description": null, - "id": 341181241, - "logo": "/images/UE0AAAAAFFYDOQAAAAZDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181242": { - "description": null, - "id": 341181242, - "logo": "/images/UE0AAAAAFFYDOgAAAAdDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181243": { - "description": null, - "id": 341181243, - "logo": "/images/UE0AAAAAFFYDOwAAAAdDSVRN", - "name": "Concert anniversaire des 90 ans de Menahem Pressler", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181244": { - "description": null, - "id": 341181244, - "logo": "/images/UE0AAAAAFFYDPAAAAAZDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181245": { - "description": null, - "id": 341181245, - "logo": "/images/UE0AAAAAFFYDPQAAAAZDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181246": { - "description": null, - "id": 341181246, - "logo": null, - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181247": { - "description": null, - "id": 341181247, - "logo": null, - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181248": { - "description": null, - "id": 341181248, - "logo": "/images/UE0AAAAAFFYDQAAAAAZDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181249": { - "description": null, - "id": 341181249, - "logo": "/images/UE0AAAAAFFYDQQAAAAdDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181250": { - "description": null, - "id": 341181250, - "logo": "/images/UE0AAAAAFFYDQgAAAAdDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181251": { - "description": null, - "id": 341181251, - "logo": null, - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181252": { - "description": null, - "id": 341181252, - "logo": "/images/UE0AAAAAFFYDRAAAAAdDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181253": { - "description": null, - "id": 341181253, - "logo": null, - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181254": { - "description": null, - "id": 341181254, - "logo": "/images/UE0AAAAAFFYDRgAAAAlDSVRN", - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181255": { - "description": null, - "id": 341181255, - "logo": null, - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181256": { - "description": null, - "id": 341181256, - "logo": null, - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181257": { - "description": null, - "id": 341181257, - "logo": null, - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181258": { - "description": null, - "id": 341181258, - "logo": null, - "name": "Orchestre de Paris", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "341181259": { - "description": null, - "id": 341181259, - "logo": null, - "name": "14052122 JARVI / GOERNE / SOLBERG / CHŒUR", - "subTopicIds": [ - 337184268, - 337184288, - 337184283, - 337184275 - ], - "subjectCode": null, - "subtitle": null, - "topicIds": [ - 324846099, - 107888604, - 324846100 - ] - }, - "342742592": { - "description": null, - "id": 342742592, - "logo": null, - "name": "event secret 2", - "subTopicIds": [], - "subjectCode": null, - "subtitle": null, - "topicIds": [] - }, - "342742593": { - "description": null, - "id": 342742593, - "logo": null, - "name": "event secret 3", - "subTopicIds": [], - "subjectCode": null, - "subtitle": null, - "topicIds": [] - }, - "342742594": { - "description": null, - "id": 342742594, - "logo": null, - "name": "event secret 4", - "subTopicIds": [], - "subjectCode": null, - "subtitle": null, - "topicIds": [] - }, - "342742595": { - "description": null, - "id": 342742595, - "logo": null, - "name": "event secret 5", - "subTopicIds": [], - "subjectCode": null, - "subtitle": null, - "topicIds": [] - }, - "342742596": { - "description": null, - "id": 342742596, - "logo": null, - "name": "event secret 6", - "subTopicIds": [], - "subjectCode": null, - "subtitle": null, - "topicIds": [] - } - }, - "performances": [ - { - "eventId": 138586341, - "id": 339887544, - "logo": null, - "name": null, - "prices": [ - { - "amount": 90250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937295 - }, - { - "amount": 66500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937296 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937295 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937296 - } - ], - "seatMapImage": null, - "start": 1372701600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 339420802, - "id": 339430296, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937295 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937296 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937295 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937296 - } - ], - "seatMapImage": null, - "start": 1372788000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 339420805, - "id": 339430301, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937295 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937296 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937295 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937296 - } - ], - "seatMapImage": null, - "start": 1373220000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586345, - "id": 138586347, - "logo": "/images/UE0AAAAACEKo6QAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 152000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 104500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1377972000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586349, - "id": 138586351, - "logo": "/images/UE0AAAAACEKo7QAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 152000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 104500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1378044000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586353, - "id": 138586355, - "logo": "/images/UE0AAAAACEKo8QAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 90250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 71250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1378490400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341069930, - "id": 341070133, - "logo": "/images/UE0AAAAAFFRQagAAAAlDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - } - ], - "seatMapImage": null, - "start": 1378922400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341069930, - "id": 341070132, - "logo": "/images/UE0AAAAAFFRQagAAAAlDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - } - ], - "seatMapImage": null, - "start": 1379008800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586357, - "id": 138586359, - "logo": "/images/UE0AAAAACEKo9QAAAAhDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1379095200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586361, - "id": 138586363, - "logo": "/images/UE0AAAAACEKo+QAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1379440800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586365, - "id": 138586367, - "logo": "/images/UE0AAAAACEKo/QAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1379959200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181254, - "id": 341181470, - "logo": "/images/UE0AAAAAFFYDRgAAAAlDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - } - ], - "seatMapImage": null, - "start": 1380132000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181254, - "id": 341181469, - "logo": "/images/UE0AAAAAFFYDRgAAAAlDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - } - ], - "seatMapImage": null, - "start": 1380218400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586369, - "id": 138586371, - "logo": "/images/UE0AAAAACEKpAQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1380650400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181252, - "id": 341181467, - "logo": "/images/UE0AAAAAFFYDRAAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1380736800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586373, - "id": 138586375, - "logo": "/images/UE0AAAAACEKpBQAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1380996000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586377, - "id": 138586379, - "logo": "/images/UE0AAAAACEKpCQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1381082400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586381, - "id": 138586383, - "logo": "/images/UE0AAAAACEKpDQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1381168800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586385, - "id": 138586387, - "logo": "/images/UE0AAAAACEKpEQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1381255200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181234, - "id": 341181437, - "logo": "/images/UE0AAAAAFFYDMgAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1381341600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181234, - "id": 341181436, - "logo": "/images/UE0AAAAAFFYDMgAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1381428000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586389, - "id": 138586391, - "logo": "/images/UE0AAAAACEKpFQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1381512600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586393, - "id": 138586395, - "logo": "/images/UE0AAAAACEKpGQAAAAhDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937241 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937242 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937244 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937245 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937246 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937241 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937242 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937244 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937245 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937246 - } - ], - "seatMapImage": null, - "start": 1381586400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586397, - "id": 138586399, - "logo": null, - "name": null, - "prices": [ - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1381672800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586401, - "id": 138586403, - "logo": "/images/UE0AAAAACEKpIQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1381773600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586405, - "id": 138586407, - "logo": "/images/UE0AAAAACEKpJQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1381860000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181233, - "id": 341181435, - "logo": "/images/UE0AAAAAFFYDMQAAAAhDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1381946400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181237, - "id": 341181442, - "logo": "/images/UE0AAAAAFFYDNQAAAAhDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1382032800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586409, - "id": 138586411, - "logo": "/images/UE0AAAAACEKpKQAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1382119200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586413, - "id": 138586415, - "logo": "/images/UE0AAAAACEKpLQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1382277600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586417, - "id": 138586419, - "logo": "/images/UE0AAAAACEKpMQAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1382378400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586421, - "id": 138586423, - "logo": "/images/UE0AAAAACEKpNQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1382464800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181238, - "id": 341181444, - "logo": "/images/UE0AAAAAFFYDNgAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1382551200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181238, - "id": 341181443, - "logo": "/images/UE0AAAAAFFYDNgAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1382637600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586425, - "id": 138586427, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937235 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937236 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937238 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937239 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937240 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937235 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937236 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937238 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937239 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937240 - } - ], - "seatMapImage": null, - "start": 1382724000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586429, - "id": 138586431, - "logo": "/images/UE0AAAAACEKpPQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1382810400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586433, - "id": 138586435, - "logo": "/images/UE0AAAAACEKpQQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1382886000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586437, - "id": 138586439, - "logo": "/images/UE0AAAAACEKpRQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1383073200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586441, - "id": 138586443, - "logo": "/images/UE0AAAAACEKpSQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1383246000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586445, - "id": 138586447, - "logo": "/images/UE0AAAAACEKpTQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1383332400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586449, - "id": 138586451, - "logo": "/images/UE0AAAAACEKpUQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1383418800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742592, - "id": 342742708, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1383555600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742592, - "id": 342742709, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1383562800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586453, - "id": 138586455, - "logo": "/images/UE0AAAAACEKpVQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937295 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937296 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937295 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937296 - } - ], - "seatMapImage": null, - "start": 1383591600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742592, - "id": 342742710, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1383642000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742592, - "id": 342742711, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1383649200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742592, - "id": 342742712, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1383728400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742592, - "id": 342742713, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1383735600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742592, - "id": 342742714, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1383814800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742592, - "id": 342742715, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1383822000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586457, - "id": 138586459, - "logo": "/images/UE0AAAAACEKpWQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1383850800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586461, - "id": 138586463, - "logo": "/images/UE0AAAAACEKpXQAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1383937200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586465, - "id": 138586467, - "logo": "/images/UE0AAAAACEKpYQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1384110000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586469, - "id": 138586471, - "logo": "/images/UE0AAAAACEKpZQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 90250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937289 - }, - { - "amount": 71250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937290 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937292 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937293 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937289 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937290 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937292 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937293 - } - ], - "seatMapImage": null, - "start": 1384196400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586473, - "id": 138586475, - "logo": "/images/UE0AAAAACEKpaQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1384282800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586477, - "id": 138586479, - "logo": "/images/UE0AAAAACEKpbQAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1384369200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586481, - "id": 138586483, - "logo": "/images/UE0AAAAACEKpcQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1384455600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586485, - "id": 138586487, - "logo": "/images/UE0AAAAACEKpdQAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1384542000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586501, - "id": 138586503, - "logo": "/images/UE0AAAAACEKphQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1384801200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586505, - "id": 138586507, - "logo": "/images/UE0AAAAACEKpiQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1384887600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586509, - "id": 138586511, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937235 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937236 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937238 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937239 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937240 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937235 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937236 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937238 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937239 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937240 - } - ], - "seatMapImage": null, - "start": 1385146800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586513, - "id": 138586515, - "logo": "/images/UE0AAAAACEKpkQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1385231400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586517, - "id": 138586519, - "logo": "/images/UE0AAAAACEKplQAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1385305200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586521, - "id": 138586523, - "logo": "/images/UE0AAAAACEKpmQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 152000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 104500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1385492400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181235, - "id": 341181439, - "logo": "/images/UE0AAAAAFFYDMwAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826019 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826019 - } - ], - "seatMapImage": null, - "start": 1385665200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586525, - "id": 138586527, - "logo": "/images/UE0AAAAACEKpnQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1385751600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586529, - "id": 138586531, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937241 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937242 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937244 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937245 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937246 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937241 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937242 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937244 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937245 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937246 - } - ], - "seatMapImage": null, - "start": 1385823600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181235, - "id": 341181438, - "logo": "/images/UE0AAAAAFFYDMwAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826019 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826019 - } - ], - "seatMapImage": null, - "start": 1385838000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586533, - "id": 138586535, - "logo": "/images/UE0AAAAACEKppQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1385910000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586537, - "id": 138586539, - "logo": "/images/UE0AAAAACEKpqQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1386010800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586541, - "id": 138586543, - "logo": "/images/UE0AAAAACEKprQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1386097200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181236, - "id": 341181440, - "logo": "/images/UE0AAAAAFFYDNAAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1386183600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181236, - "id": 341181441, - "logo": "/images/UE0AAAAAFFYDNAAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1386270000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586545, - "id": 138586547, - "logo": "/images/UE0AAAAACEKpsQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 104500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1386356400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586549, - "id": 138586551, - "logo": "/images/UE0AAAAACEKptQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1386428400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586553, - "id": 138586555, - "logo": "/images/UE0AAAAACEKpuQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1386442800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586557, - "id": 138586559, - "logo": "/images/UE0AAAAACEKpvQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1386514800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742593, - "id": 342742716, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1386579600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742593, - "id": 342742717, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1386586800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586561, - "id": 138586563, - "logo": "/images/UE0AAAAACEKpwQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1386615600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742593, - "id": 342742718, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1386666000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742593, - "id": 342742719, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1386673200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586565, - "id": 138586567, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1386702000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742593, - "id": 342742720, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1386752400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742593, - "id": 342742721, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1386759600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181241, - "id": 341181449, - "logo": "/images/UE0AAAAAFFYDOQAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1386788400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742593, - "id": 342742722, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1386838800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742593, - "id": 342742723, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1386846000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181241, - "id": 341181450, - "logo": "/images/UE0AAAAAFFYDOQAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1386874800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586569, - "id": 138586571, - "logo": "/images/UE0AAAAACEKpyQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1386961200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742594, - "id": 342742724, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387184400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742594, - "id": 342742725, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387191600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586581, - "id": 138586583, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264860 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264861 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264863 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264864 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264860 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264861 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264863 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264864 - } - ], - "seatMapImage": null, - "start": 1387220400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742594, - "id": 342742726, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387270800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742594, - "id": 342742727, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387278000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586585, - "id": 138586587, - "logo": "/images/UE0AAAAACEKp2QAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1387306800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742594, - "id": 342742728, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387357200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742594, - "id": 342742729, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387364400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181250, - "id": 341181465, - "logo": "/images/UE0AAAAAFFYDQgAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1387393200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742594, - "id": 342742730, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387443600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742594, - "id": 342742731, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387450800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586589, - "id": 138586591, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1387566000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586593, - "id": 138586595, - "logo": "/images/UE0AAAAACEKp4QAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937235 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937236 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937238 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937239 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937240 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937235 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937236 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937238 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937239 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937240 - } - ], - "seatMapImage": null, - "start": 1387724400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742595, - "id": 342742732, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387789200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742595, - "id": 342742733, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387796400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742595, - "id": 342742734, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387875600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742595, - "id": 342742735, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387882800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742595, - "id": 342742736, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387962000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742595, - "id": 342742737, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1387969200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742595, - "id": 342742738, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1388048400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742595, - "id": 342742739, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1388055600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742596, - "id": 342742740, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1388998800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742596, - "id": 342742741, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1389006000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742596, - "id": 342742742, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1389085200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742596, - "id": 342742743, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1389092400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742596, - "id": 342742744, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1389171600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742596, - "id": 342742745, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1389178800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181245, - "id": 341181458, - "logo": "/images/UE0AAAAAFFYDPQAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1389207600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742596, - "id": 342742746, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1389258000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 342742596, - "id": 342742747, - "logo": null, - "name": null, - "prices": [ - { - "amount": 180500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 342752792 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 342752287, - "blockIds": [] - } - ], - "seatCategoryId": 342752792 - } - ], - "seatMapImage": null, - "start": 1389265200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181245, - "id": 341181457, - "logo": "/images/UE0AAAAAFFYDPQAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1389294000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586597, - "id": 138586599, - "logo": "/images/UE0AAAAACEKp5QAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1389380400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586601, - "id": 138586603, - "logo": "/images/UE0AAAAACEKp6QAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937241 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937242 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937244 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937245 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937246 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937241 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937242 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937244 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937245 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937246 - } - ], - "seatMapImage": null, - "start": 1389452400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586605, - "id": 138586607, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1389538800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586609, - "id": 138586611, - "logo": null, - "name": null, - "prices": [ - { - "amount": 15000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937314 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937314 - } - ], - "seatMapImage": null, - "start": 1389726000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181242, - "id": 341181451, - "logo": "/images/UE0AAAAAFFYDOgAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1389812400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181242, - "id": 341181452, - "logo": "/images/UE0AAAAAFFYDOgAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1389898800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586613, - "id": 138586615, - "logo": "/images/UE0AAAAACEKp9QAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086215 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086215 - } - ], - "seatMapImage": null, - "start": 1389985200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586617, - "id": 138586619, - "logo": "/images/UE0AAAAACEKp+QAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 90250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 71250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1390071600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586625, - "id": 138586627, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937235 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937236 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937238 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937239 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937240 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937235 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937236 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937238 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937239 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937240 - } - ], - "seatMapImage": null, - "start": 1390143600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586629, - "id": 138586631, - "logo": "/images/UE0AAAAACEKqBQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 90250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937271 - }, - { - "amount": 71250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937272 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937274 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937275 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937271 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937272 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937274 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937275 - } - ], - "seatMapImage": null, - "start": 1390159800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181239, - "id": 341181446, - "logo": "/images/UE0AAAAAFFYDNwAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826019 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826019 - } - ], - "seatMapImage": null, - "start": 1390417200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181239, - "id": 341181445, - "logo": "/images/UE0AAAAAFFYDNwAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826019 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826019 - } - ], - "seatMapImage": null, - "start": 1390503600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586633, - "id": 138586635, - "logo": "/images/UE0AAAAACEKqCQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1390590000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586641, - "id": 138586643, - "logo": "/images/UE0AAAAACEKqEQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1390676400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586645, - "id": 138586647, - "logo": "/images/UE0AAAAACEKqFQAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937235 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937236 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937238 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937239 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937240 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937235 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937236 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937238 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937239 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937240 - } - ], - "seatMapImage": null, - "start": 1390748400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586649, - "id": 138586651, - "logo": "/images/UE0AAAAACEKqGQAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1390849200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586653, - "id": 138586655, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1390935600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181243, - "id": 341181453, - "logo": "/images/UE0AAAAAFFYDOwAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - } - ], - "seatMapImage": null, - "start": 1391022000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181243, - "id": 341181454, - "logo": "/images/UE0AAAAAFFYDOwAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - } - ], - "seatMapImage": null, - "start": 1391108400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586657, - "id": 138586659, - "logo": "/images/UE0AAAAACEKqIQAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1391194800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586661, - "id": 138586663, - "logo": null, - "name": null, - "prices": [ - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1391353200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586661, - "id": 138586665, - "logo": null, - "name": null, - "prices": [ - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1391367600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586667, - "id": 138586669, - "logo": null, - "name": null, - "prices": [ - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937295 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937296 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937295 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937296 - } - ], - "seatMapImage": null, - "start": 1391540400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586671, - "id": 138586673, - "logo": "/images/UE0AAAAACEKqLwAAAAlDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937289 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937290 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937292 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937293 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937289 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937290 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937292 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937293 - } - ], - "seatMapImage": null, - "start": 1391626800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586675, - "id": 138586677, - "logo": "/images/UE0AAAAACEKqMwAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1391713200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586679, - "id": 138586681, - "logo": "/images/UE0AAAAACEKqNwAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1391799600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586687, - "id": 138586689, - "logo": "/images/UE0AAAAACEKqPwAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 90250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 71250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1391886000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586691, - "id": 138586693, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1391958000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586695, - "id": 138586697, - "logo": "/images/UE0AAAAACEKqRwAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1392145200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181240, - "id": 341181448, - "logo": "/images/UE0AAAAAFFYDOAAAAAhDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1392231600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181240, - "id": 341181447, - "logo": "/images/UE0AAAAAFFYDOAAAAAhDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1392318000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586699, - "id": 138586701, - "logo": null, - "name": null, - "prices": [ - { - "amount": 15000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264872 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264872 - } - ], - "seatMapImage": null, - "start": 1392404400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586703, - "id": 138586705, - "logo": "/images/UE0AAAAACEKqTwAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1392490800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586707, - "id": 138586709, - "logo": "/images/UE0AAAAACEKqUwAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1392562800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586711, - "id": 138586713, - "logo": "/images/UE0AAAAACEKqVwAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1392663600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586715, - "id": 138586717, - "logo": "/images/UE0AAAAACEKqWwAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1392750000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181248, - "id": 341181462, - "logo": "/images/UE0AAAAAFFYDQAAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1392836400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586719, - "id": 138586721, - "logo": "/images/UE0AAAAACEKqXwAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1393095600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586723, - "id": 138586729, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937307 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937308 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937310 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937311 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937312 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937307 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937308 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937310 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937311 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937312 - } - ], - "seatMapImage": null, - "start": 1393678800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586723, - "id": 138586725, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937307 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937308 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937310 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937311 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937312 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937307 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937308 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937310 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937311 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937312 - } - ], - "seatMapImage": null, - "start": 1393693200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586723, - "id": 138586727, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937307 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937308 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937310 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937311 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937312 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937307 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937308 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937310 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937311 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937312 - } - ], - "seatMapImage": null, - "start": 1393754400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586731, - "id": 138586733, - "logo": "/images/UE0AAAAACEKqawAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1393959600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181249, - "id": 341181463, - "logo": "/images/UE0AAAAAFFYDQQAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826019 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826019 - } - ], - "seatMapImage": null, - "start": 1394046000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181249, - "id": 341181464, - "logo": "/images/UE0AAAAAFFYDQQAAAAdDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826019 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826019 - } - ], - "seatMapImage": null, - "start": 1394132400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586735, - "id": 138586737, - "logo": "/images/UE0AAAAACEKqbwAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1394218800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586743, - "id": 138586745, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1394305200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586747, - "id": 138586749, - "logo": "/images/UE0AAAAACEKqewAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1394377200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586751, - "id": 138586753, - "logo": "/images/UE0AAAAACEKqfwAAAAVDSVRN", - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1394478000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181244, - "id": 341181455, - "logo": "/images/UE0AAAAAFFYDPAAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1394650800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181244, - "id": 341181456, - "logo": "/images/UE0AAAAAFFYDPAAAAAZDSVRN", - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1394737200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586755, - "id": 138586757, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264866 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264867 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264869 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264870 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264866 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264867 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264869 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264870 - } - ], - "seatMapImage": null, - "start": 1394823600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586759, - "id": 138586761, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1395082800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 151183114, - "id": 151183116, - "logo": null, - "name": null, - "prices": [ - { - "amount": 90250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937289 - }, - { - "amount": 71250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937290 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937292 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937293 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937289 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937290 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937292 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937293 - } - ], - "seatMapImage": null, - "start": 1395169200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586771, - "id": 138586773, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1395255600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586775, - "id": 138586777, - "logo": null, - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1395342000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586779, - "id": 138586781, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1395428400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586783, - "id": 138586785, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937241 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937242 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937244 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937245 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937246 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937241 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937242 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937244 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937245 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937246 - } - ], - "seatMapImage": null, - "start": 1395500400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586787, - "id": 138586789, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1395514800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586795, - "id": 138586797, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937235 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937236 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937238 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937239 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937240 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937235 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937236 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937238 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937239 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937240 - } - ], - "seatMapImage": null, - "start": 1395586800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181246, - "id": 341181459, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826019 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826019 - } - ], - "seatMapImage": null, - "start": 1395860400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181246, - "id": 341181460, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826019 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826019 - } - ], - "seatMapImage": null, - "start": 1395946800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586799, - "id": 138586801, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1396033200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586803, - "id": 138586805, - "logo": null, - "name": null, - "prices": [ - { - "amount": 90250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 71250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1396191600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586807, - "id": 138586809, - "logo": null, - "name": null, - "prices": [ - { - "amount": 104500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1396288800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586811, - "id": 138586813, - "logo": null, - "name": null, - "prices": [ - { - "amount": 90250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 71250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1396375200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181255, - "id": 341181472, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - } - ], - "seatMapImage": null, - "start": 1396461600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181255, - "id": 341181471, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - } - ], - "seatMapImage": null, - "start": 1396548000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586815, - "id": 138586817, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1396634400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586823, - "id": 138586825, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1396720800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586827, - "id": 138586829, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1396792800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586831, - "id": 138586833, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1396893600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586835, - "id": 138586837, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1396980000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181256, - "id": 341181473, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1397066400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181256, - "id": 341181474, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1397152800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586839, - "id": 138586841, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264866 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264867 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264869 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264870 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264866 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264867 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264869 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264870 - } - ], - "seatMapImage": null, - "start": 1397239200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586843, - "id": 138586845, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1397311200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586847, - "id": 138586849, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1397325600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586851, - "id": 138586853, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1397397600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586855, - "id": 138586857, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1397498400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586859, - "id": 138586861, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1397584800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586863, - "id": 138586865, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1397930400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181251, - "id": 341181466, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - } - ], - "seatMapImage": null, - "start": 1398276000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181253, - "id": 341181468, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - } - ], - "seatMapImage": null, - "start": 1398362400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586867, - "id": 138586869, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1398448800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586871, - "id": 138586873, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1398607200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586875, - "id": 138586877, - "logo": null, - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1398708000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586879, - "id": 138586881, - "logo": null, - "name": null, - "prices": [ - { - "amount": 171000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 123500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 66500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1398794400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586883, - "id": 138586887, - "logo": null, - "name": null, - "prices": [ - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1399125600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586883, - "id": 138586885, - "logo": null, - "name": null, - "prices": [ - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1399140000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586889, - "id": 138586891, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937307 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937308 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937310 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937311 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937307 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937308 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937310 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937311 - } - ], - "seatMapImage": null, - "start": 1399312800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586893, - "id": 138586895, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1399399200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181232, - "id": 341181434, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1399485600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586897, - "id": 138586899, - "logo": null, - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1399917600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586901, - "id": 138586903, - "logo": null, - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1400176800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586905, - "id": 138586907, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1400263200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586909, - "id": 138586911, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1400349600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586917, - "id": 138586919, - "logo": null, - "name": null, - "prices": [ - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937235 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937236 - }, - { - "amount": 19000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937238 - }, - { - "amount": 14250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937239 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937240 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937235 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937236 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937238 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937239 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937240 - } - ], - "seatMapImage": null, - "start": 1400421600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181259, - "id": 341181480, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - } - ], - "seatMapImage": null, - "start": 1400695200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181259, - "id": 341181479, - "logo": null, - "name": null, - "prices": [ - { - "amount": 80750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826016 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826017 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826015 - }, - { - "amount": 28500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 340826018 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826016 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826017 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 340826015 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 340826018 - } - ], - "seatMapImage": null, - "start": 1400781600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586921, - "id": 138586923, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086210 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086211 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086213 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086214 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086210 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086211 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086214 - } - ], - "seatMapImage": null, - "start": 1400868000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586929, - "id": 138586931, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937241 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937242 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937244 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937245 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937246 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937241 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937242 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937244 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937245 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937246 - } - ], - "seatMapImage": null, - "start": 1400940000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586933, - "id": 138586935, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1401026400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586937, - "id": 138586939, - "logo": null, - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1401127200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586941, - "id": 138586943, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264860 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264861 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264863 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341264864 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264860 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264861 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264863 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341264864 - } - ], - "seatMapImage": null, - "start": 1401472800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586945, - "id": 138586947, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1401730200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586949, - "id": 138586951, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1401818400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586953, - "id": 138586955, - "logo": null, - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1401904800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586957, - "id": 138586959, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - } - ], - "seatMapImage": null, - "start": 1401991200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586961, - "id": 138586963, - "logo": null, - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1402077600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586965, - "id": 138586967, - "logo": null, - "name": null, - "prices": [ - { - "amount": 95000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1402423200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181258, - "id": 341181477, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1402509600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181258, - "id": 341181478, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1402596000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586969, - "id": 138586971, - "logo": null, - "name": null, - "prices": [ - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086196 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 339086197 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086196 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 339086197 - } - ], - "seatMapImage": null, - "start": 1402768800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586973, - "id": 138586975, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - } - ], - "seatMapImage": null, - "start": 1402840800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586977, - "id": 138586979, - "logo": null, - "name": null, - "prices": [ - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 33250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 23750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 16150, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1402941600000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586981, - "id": 138586983, - "logo": null, - "name": null, - "prices": [ - { - "amount": 123500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937289 - }, - { - "amount": 85500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937290 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937292 - }, - { - "amount": 38000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937293 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937294 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937289 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937290 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937292 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937293 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937294 - } - ], - "seatMapImage": null, - "start": 1403028000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181257, - "id": 341181475, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1403114400000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181257, - "id": 341181476, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1403200800000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 341181247, - "id": 341181461, - "logo": null, - "name": null, - "prices": [ - { - "amount": 57000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179212 - }, - { - "amount": 42750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179213 - }, - { - "amount": 32300, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179214 - }, - { - "amount": 20900, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179215 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 341179216 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179212 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179213 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179214 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - } - ], - "seatCategoryId": 341179215 - }, - { - "areas": [ - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 341179216 - } - ], - "seatMapImage": null, - "start": 1403719200000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586989, - "id": 138586991, - "logo": null, - "name": null, - "prices": [ - { - "amount": 152000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937284 - }, - { - "amount": 104500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937285 - }, - { - "amount": 76000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937287 - }, - { - "amount": 52250, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937288 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937283 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937284 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937285 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937287 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937288 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937283 - } - ], - "seatMapImage": null, - "start": 1403892000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586993, - "id": 138586995, - "logo": null, - "name": null, - "prices": [ - { - "amount": 123500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 85500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 38000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1404324000000, - "venueCode": "PLEYEL_PLEYEL" - }, - { - "eventId": 138586997, - "id": 138586999, - "logo": null, - "name": null, - "prices": [ - { - "amount": 123500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937277 - }, - { - "amount": 85500, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937278 - }, - { - "amount": 61750, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937280 - }, - { - "amount": 38000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937281 - }, - { - "amount": 10000, - "audienceSubCategoryId": 337100890, - "seatCategoryId": 338937282 - } - ], - "seatCategories": [ - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937277 - }, - { - "areas": [ - { - "areaId": 205705999, - "blockIds": [] - }, - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937278 - }, - { - "areas": [ - { - "areaId": 205705998, - "blockIds": [] - }, - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205705995, - "blockIds": [] - }, - { - "areaId": 205705996, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205705993, - "blockIds": [] - }, - { - "areaId": 205706007, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937280 - }, - { - "areas": [ - { - "areaId": 205705994, - "blockIds": [] - }, - { - "areaId": 205706006, - "blockIds": [] - }, - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706001, - "blockIds": [] - }, - { - "areaId": 205706000, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937281 - }, - { - "areas": [ - { - "areaId": 205706005, - "blockIds": [] - }, - { - "areaId": 205706004, - "blockIds": [] - }, - { - "areaId": 205706003, - "blockIds": [] - }, - { - "areaId": 205706002, - "blockIds": [] - }, - { - "areaId": 205706009, - "blockIds": [] - }, - { - "areaId": 205706008, - "blockIds": [] - } - ], - "seatCategoryId": 338937282 - } - ], - "seatMapImage": null, - "start": 1404410400000, - "venueCode": "PLEYEL_PLEYEL" - } - ], - "seatCategoryNames": { - "338937235": "1ère catégorie", - "338937236": "2ème catégorie", - "338937238": "3ème catégorie", - "338937239": "4ème catégorie", - "338937240": "5ème catégorie", - "338937241": "1ère catégorie", - "338937242": "2ème catégorie", - "338937244": "3ème catégorie", - "338937245": "4ème catégorie", - "338937246": "5ème catégorie", - "338937271": "1ère catégorie", - "338937272": "2ème catégorie", - "338937274": "3ème catégorie", - "338937275": "4ème catégorie", - "338937277": "1ère catégorie", - "338937278": "2ème catégorie", - "338937280": "3ème catégorie", - "338937281": "4ème catégorie", - "338937282": "5ème catégorie", - "338937283": "5ème catégorie", - "338937284": "1ère catégorie", - "338937285": "2ème catégorie", - "338937287": "3ème catégorie", - "338937288": "4ème catégorie", - "338937289": "1ère catégorie", - "338937290": "2ème catégorie", - "338937292": "3ème catégorie", - "338937293": "4ème catégorie", - "338937294": "5ème catégorie", - "338937295": "1ère catégorie", - "338937296": "2ème catégorie", - "338937307": "1ère catégorie", - "338937308": "2ème catégorie", - "338937310": "3ème catégorie", - "338937311": "4ème catégorie", - "338937312": "5ème catégorie", - "338937314": "Catégorie unique", - "339086196": "1ère catégorie", - "339086197": "2ème catégorie", - "339086210": "1ère catégorie", - "339086211": "2ème catégorie", - "339086213": "3ème catégorie", - "339086214": "4ème catégorie", - "339086215": "5ème catégorie", - "340826015": "Catégorie 3", - "340826016": "Catégorie 1", - "340826017": "Catégorie 2", - "340826018": "Catégorie 4", - "340826019": "Catégorie 5", - "341179212": "CAT1", - "341179213": "CAT2", - "341179214": "CAT3", - "341179215": "CAT4", - "341179216": "CAT5", - "341264860": "1ère catégorie", - "341264861": "2ème catégorie", - "341264863": "3ème catégorie", - "341264864": "4ème catégorie", - "341264866": "1ère catégorie", - "341264867": "2ème catégorie", - "341264869": "3ème catégorie", - "341264870": "4ème catégorie", - "341264872": "1ère catégorie", - "342752792": "catétgorie unique" - }, - "subTopicNames": { - "337184262": "Musique amplifiée", - "337184263": "Musique baroque", - "337184267": "Ciné-concert", - "337184268": "Musique classique", - "337184269": "Jazz", - "337184273": "Musique de chambre", - "337184275": "Musique dirigée", - "337184279": "Musique du monde", - "337184280": "Pop/rock", - "337184281": "Musique de chambre", - "337184282": "Famille", - "337184283": "Concert", - "337184284": "Opéra (version de concert)", - "337184288": "Musique contemporaine", - "337184292": "Musique vocale", - "337184296": "Musique ancienne", - "337184297": "Chanson", - "337184298": "Voix", - "337184299": "famille" - }, - "subjectNames": {}, - "topicNames": { - "107888604": "Activité", - "324846098": "Type de public", - "324846099": "Genre", - "324846100": "Formations musicales" - }, - "topicSubTopics": { - "107888604": [ - 337184283, - 337184267 - ], - "324846098": [ - 337184299 - ], - "324846099": [ - 337184268, - 337184288, - 337184284, - 337184263, - 337184298, - 337184269, - 337184280, - 337184297, - 337184281, - 337184296, - 337184279 - ], - "324846100": [ - 337184275, - 337184262, - 337184292, - 337184273, - 337184282 - ] - }, - "venueNames": { - "PLEYEL_PLEYEL": "Salle Pleyel" - } -} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/benchmarks/files/nativejson-benchmark/twitter.json b/resources/3rdparty/modernjson/benchmarks/files/nativejson-benchmark/twitter.json deleted file mode 100755 index 137fb5162..000000000 --- a/resources/3rdparty/modernjson/benchmarks/files/nativejson-benchmark/twitter.json +++ /dev/null @@ -1,15482 +0,0 @@ -{ - "statuses": [ - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:15 +0000 2014", - "id": 505874924095815700, - "id_str": "505874924095815681", - "text": "@aym0566x \n\n名前:前田あゆみ\n第一印象:なんか怖っ!\n今の印象:とりあえずキモい。噛み合わない\n好きなところ:ぶすでキモいとこ😋✨✨\n思い出:んーーー、ありすぎ😊❤️\nLINE交換できる?:あぁ……ごめん✋\nトプ画をみて:照れますがな😘✨\n一言:お前は一生もんのダチ💖", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": 866260188, - "in_reply_to_user_id_str": "866260188", - "in_reply_to_screen_name": "aym0566x", - "user": { - "id": 1186275104, - "id_str": "1186275104", - "name": "AYUMI", - "screen_name": "ayuu0123", - "location": "", - "description": "元野球部マネージャー❤︎…最高の夏をありがとう…❤︎", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 262, - "friends_count": 252, - "listed_count": 0, - "created_at": "Sat Feb 16 13:40:25 +0000 2013", - "favourites_count": 235, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 1769, - "lang": "en", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/497760886795153410/LDjAwR_y_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/497760886795153410/LDjAwR_y_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1186275104/1409318784", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "aym0566x", - "name": "前田あゆみ", - "id": 866260188, - "id_str": "866260188", - "indices": [ - 0, - 9 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:14 +0000 2014", - "id": 505874922023837700, - "id_str": "505874922023837696", - "text": "RT @KATANA77: えっそれは・・・(一同) http://t.co/PkCJAcSuYK", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 903487807, - "id_str": "903487807", - "name": "RT&ファボ魔のむっつんさっm", - "screen_name": "yuttari1998", - "location": "関西 ↓詳しいプロ↓", - "description": "無言フォローはあまり好みません ゲームと動画が好きですシモ野郎ですがよろしく…最近はMGSとブレイブルー、音ゲーをプレイしてます", - "url": "http://t.co/Yg9e1Fl8wd", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/Yg9e1Fl8wd", - "expanded_url": "http://twpf.jp/yuttari1998", - "display_url": "twpf.jp/yuttari1998", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 95, - "friends_count": 158, - "listed_count": 1, - "created_at": "Thu Oct 25 08:27:13 +0000 2012", - "favourites_count": 3652, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 10276, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/500268849275494400/AoXHZ7Ij_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/500268849275494400/AoXHZ7Ij_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/903487807/1409062272", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sat Aug 30 23:49:35 +0000 2014", - "id": 505864943636197400, - "id_str": "505864943636197376", - "text": "えっそれは・・・(一同) http://t.co/PkCJAcSuYK", - "source": "Twitter Web Client", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 77915997, - "id_str": "77915997", - "name": "(有)刀", - "screen_name": "KATANA77", - "location": "", - "description": "プリキュア好きのサラリーマンです。好きなプリキュアシリーズはハートキャッチ、最愛のキャラクターは月影ゆりさんです。 http://t.co/QMLJeFmfMTご質問、お問い合わせはこちら http://t.co/LU8T7vmU3h", - "url": null, - "entities": { - "description": { - "urls": [ - { - "url": "http://t.co/QMLJeFmfMT", - "expanded_url": "http://www.pixiv.net/member.php?id=4776", - "display_url": "pixiv.net/member.php?id=…", - "indices": [ - 58, - 80 - ] - }, - { - "url": "http://t.co/LU8T7vmU3h", - "expanded_url": "http://ask.fm/KATANA77", - "display_url": "ask.fm/KATANA77", - "indices": [ - 95, - 117 - ] - } - ] - } - }, - "protected": false, - "followers_count": 1095, - "friends_count": 740, - "listed_count": 50, - "created_at": "Mon Sep 28 03:41:27 +0000 2009", - "favourites_count": 3741, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": true, - "verified": false, - "statuses_count": 19059, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/808597451/45b82f887085d32bd4b87dfc348fe22a.png", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/808597451/45b82f887085d32bd4b87dfc348fe22a.png", - "profile_background_tile": true, - "profile_image_url": "http://pbs.twimg.com/profile_images/480210114964504577/MjVIEMS4_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/480210114964504577/MjVIEMS4_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/77915997/1404661392", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "FFFFFF", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 82, - "favorite_count": 42, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [], - "media": [ - { - "id": 505864942575034400, - "id_str": "505864942575034369", - "indices": [ - 13, - 35 - ], - "media_url": "http://pbs.twimg.com/media/BwUxfC6CIAEr-Ye.jpg", - "media_url_https": "https://pbs.twimg.com/media/BwUxfC6CIAEr-Ye.jpg", - "url": "http://t.co/PkCJAcSuYK", - "display_url": "pic.twitter.com/PkCJAcSuYK", - "expanded_url": "http://twitter.com/KATANA77/status/505864943636197376/photo/1", - "type": "photo", - "sizes": { - "medium": { - "w": 600, - "h": 338, - "resize": "fit" - }, - "small": { - "w": 340, - "h": 192, - "resize": "fit" - }, - "thumb": { - "w": 150, - "h": 150, - "resize": "crop" - }, - "large": { - "w": 765, - "h": 432, - "resize": "fit" - } - } - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - "retweet_count": 82, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "KATANA77", - "name": "(有)刀", - "id": 77915997, - "id_str": "77915997", - "indices": [ - 3, - 12 - ] - } - ], - "media": [ - { - "id": 505864942575034400, - "id_str": "505864942575034369", - "indices": [ - 27, - 49 - ], - "media_url": "http://pbs.twimg.com/media/BwUxfC6CIAEr-Ye.jpg", - "media_url_https": "https://pbs.twimg.com/media/BwUxfC6CIAEr-Ye.jpg", - "url": "http://t.co/PkCJAcSuYK", - "display_url": "pic.twitter.com/PkCJAcSuYK", - "expanded_url": "http://twitter.com/KATANA77/status/505864943636197376/photo/1", - "type": "photo", - "sizes": { - "medium": { - "w": 600, - "h": 338, - "resize": "fit" - }, - "small": { - "w": 340, - "h": 192, - "resize": "fit" - }, - "thumb": { - "w": 150, - "h": 150, - "resize": "crop" - }, - "large": { - "w": 765, - "h": 432, - "resize": "fit" - } - }, - "source_status_id": 505864943636197400, - "source_status_id_str": "505864943636197376" - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:14 +0000 2014", - "id": 505874920140591100, - "id_str": "505874920140591104", - "text": "@longhairxMIURA 朝一ライカス辛目だよw", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": 505874728897085440, - "in_reply_to_status_id_str": "505874728897085440", - "in_reply_to_user_id": 114188950, - "in_reply_to_user_id_str": "114188950", - "in_reply_to_screen_name": "longhairxMIURA", - "user": { - "id": 114786346, - "id_str": "114786346", - "name": "PROTECT-T", - "screen_name": "ttm_protect", - "location": "静岡県長泉町", - "description": "24 / XXX / @andprotector / @lifefocus0545 potato design works", - "url": "http://t.co/5EclbQiRX4", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/5EclbQiRX4", - "expanded_url": "http://ap.furtherplatonix.net/index.html", - "display_url": "ap.furtherplatonix.net/index.html", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 1387, - "friends_count": 903, - "listed_count": 25, - "created_at": "Tue Feb 16 16:13:41 +0000 2010", - "favourites_count": 492, - "utc_offset": 32400, - "time_zone": "Osaka", - "geo_enabled": false, - "verified": false, - "statuses_count": 12679, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/481360383253295104/4B9Rcfys_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/481360383253295104/4B9Rcfys_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/114786346/1403600232", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "longhairxMIURA", - "name": "miura desu", - "id": 114188950, - "id_str": "114188950", - "indices": [ - 0, - 15 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:14 +0000 2014", - "id": 505874919020699650, - "id_str": "505874919020699648", - "text": "RT @omo_kko: ラウワン脱出→友達が家に連んで帰ってって言うから友達ん家に乗せて帰る(1度も行ったことない田舎道)→友達おろして迷子→500メートルくらい続く変な一本道進む→墓地で行き止まりでUターン出来ずバックで500メートル元のところまで進まないといけない←今ここ", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 392585658, - "id_str": "392585658", - "name": "原稿", - "screen_name": "chibu4267", - "location": "キミの部屋の燃えるゴミ箱", - "description": "RTしてTLに濁流を起こすからフォローしない方が良いよ 言ってることもつまらないし 詳細→http://t.co/ANSFlYXERJ 相方@1life_5106_hshd 葛西教徒その壱", - "url": "http://t.co/JTFjV89eaN", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/JTFjV89eaN", - "expanded_url": "http://www.pixiv.net/member.php?id=1778417", - "display_url": "pixiv.net/member.php?id=…", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [ - { - "url": "http://t.co/ANSFlYXERJ", - "expanded_url": "http://twpf.jp/chibu4267", - "display_url": "twpf.jp/chibu4267", - "indices": [ - 45, - 67 - ] - } - ] - } - }, - "protected": false, - "followers_count": 1324, - "friends_count": 1165, - "listed_count": 99, - "created_at": "Mon Oct 17 08:23:46 +0000 2011", - "favourites_count": 9542, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": true, - "verified": false, - "statuses_count": 369420, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/453106940822814720/PcJIZv43.png", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/453106940822814720/PcJIZv43.png", - "profile_background_tile": true, - "profile_image_url": "http://pbs.twimg.com/profile_images/505731759216943107/pzhnkMEg_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/505731759216943107/pzhnkMEg_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/392585658/1362383911", - "profile_link_color": "5EB9FF", - "profile_sidebar_border_color": "FFFFFF", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sat Aug 30 16:51:09 +0000 2014", - "id": 505759640164892700, - "id_str": "505759640164892673", - "text": "ラウワン脱出→友達が家に連んで帰ってって言うから友達ん家に乗せて帰る(1度も行ったことない田舎道)→友達おろして迷子→500メートルくらい続く変な一本道進む→墓地で行き止まりでUターン出来ずバックで500メートル元のところまで進まないといけない←今ここ", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 309565423, - "id_str": "309565423", - "name": "おもっこ", - "screen_name": "omo_kko", - "location": "", - "description": "ぱんすと", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 730, - "friends_count": 200, - "listed_count": 23, - "created_at": "Thu Jun 02 09:15:51 +0000 2011", - "favourites_count": 5441, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": true, - "verified": false, - "statuses_count": 30012, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/499126939378929664/GLWpIKTW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/499126939378929664/GLWpIKTW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/309565423/1409418370", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 67, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "omo_kko", - "name": "おもっこ", - "id": 309565423, - "id_str": "309565423", - "indices": [ - 3, - 11 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:13 +0000 2014", - "id": 505874918198624260, - "id_str": "505874918198624256", - "text": "RT @thsc782_407: #LEDカツカツ選手権\n漢字一文字ぶんのスペースに「ハウステンボス」を収める狂気 http://t.co/vmrreDMziI", - "source": "Twitter for Android", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 753161754, - "id_str": "753161754", - "name": "ねこねこみかん*", - "screen_name": "nekonekomikan", - "location": "ソーダ水のあふれるビンの中", - "description": "猫×6、大学・高校・旦那各1と暮らしています。猫、子供、日常思った事をつぶやいています/今年の目標:読書、庭の手入れ、ランニング、手芸/猫*花*写真*詩*林ももこさん*鉄道など好きな方をフォローさせていただいています。よろしくお願いします♬", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 217, - "friends_count": 258, - "listed_count": 8, - "created_at": "Sun Aug 12 14:00:47 +0000 2012", - "favourites_count": 7650, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": false, - "verified": false, - "statuses_count": 20621, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/470627990271848448/m83uy6Vc_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/470627990271848448/m83uy6Vc_normal.jpeg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Fri Feb 28 16:04:13 +0000 2014", - "id": 439430848190742500, - "id_str": "439430848190742528", - "text": "#LEDカツカツ選手権\n漢字一文字ぶんのスペースに「ハウステンボス」を収める狂気 http://t.co/vmrreDMziI", - "source": "Twitter Web Client", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 82900665, - "id_str": "82900665", - "name": "[90]青葉台 芦 (第二粟屋) 屋", - "screen_name": "thsc782_407", - "location": "かんましき", - "description": "湯の街の元勃酩姦なんちゃら大 赤い犬の犬(外資系) 肥後で緑ナンバー屋さん勤め\nくだらないことしかつぶやかないし、いちいち訳のわからない記号を連呼するので相当邪魔になると思います。害はないと思います。のりものの画像とかたくさん上げます。さみしい。車輪のついたものならだいたい好き。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 587, - "friends_count": 623, - "listed_count": 30, - "created_at": "Fri Oct 16 15:13:32 +0000 2009", - "favourites_count": 1405, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": true, - "verified": false, - "statuses_count": 60427, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "352726", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/154137819/__813-1103.jpg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/154137819/__813-1103.jpg", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/493760276676620289/32oLiTtT_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/493760276676620289/32oLiTtT_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/82900665/1398865798", - "profile_link_color": "D02B55", - "profile_sidebar_border_color": "829D5E", - "profile_sidebar_fill_color": "99CC33", - "profile_text_color": "3E4415", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 3291, - "favorite_count": 1526, - "entities": { - "hashtags": [ - { - "text": "LEDカツカツ選手権", - "indices": [ - 0, - 11 - ] - } - ], - "symbols": [], - "urls": [], - "user_mentions": [], - "media": [ - { - "id": 439430848194936800, - "id_str": "439430848194936832", - "indices": [ - 41, - 63 - ], - "media_url": "http://pbs.twimg.com/media/BhksBzoCAAAJeDS.jpg", - "media_url_https": "https://pbs.twimg.com/media/BhksBzoCAAAJeDS.jpg", - "url": "http://t.co/vmrreDMziI", - "display_url": "pic.twitter.com/vmrreDMziI", - "expanded_url": "http://twitter.com/thsc782_407/status/439430848190742528/photo/1", - "type": "photo", - "sizes": { - "medium": { - "w": 600, - "h": 450, - "resize": "fit" - }, - "large": { - "w": 1024, - "h": 768, - "resize": "fit" - }, - "thumb": { - "w": 150, - "h": 150, - "resize": "crop" - }, - "small": { - "w": 340, - "h": 255, - "resize": "fit" - } - } - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - "retweet_count": 3291, - "favorite_count": 0, - "entities": { - "hashtags": [ - { - "text": "LEDカツカツ選手権", - "indices": [ - 17, - 28 - ] - } - ], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "thsc782_407", - "name": "[90]青葉台 芦 (第二粟屋) 屋", - "id": 82900665, - "id_str": "82900665", - "indices": [ - 3, - 15 - ] - } - ], - "media": [ - { - "id": 439430848194936800, - "id_str": "439430848194936832", - "indices": [ - 58, - 80 - ], - "media_url": "http://pbs.twimg.com/media/BhksBzoCAAAJeDS.jpg", - "media_url_https": "https://pbs.twimg.com/media/BhksBzoCAAAJeDS.jpg", - "url": "http://t.co/vmrreDMziI", - "display_url": "pic.twitter.com/vmrreDMziI", - "expanded_url": "http://twitter.com/thsc782_407/status/439430848190742528/photo/1", - "type": "photo", - "sizes": { - "medium": { - "w": 600, - "h": 450, - "resize": "fit" - }, - "large": { - "w": 1024, - "h": 768, - "resize": "fit" - }, - "thumb": { - "w": 150, - "h": 150, - "resize": "crop" - }, - "small": { - "w": 340, - "h": 255, - "resize": "fit" - } - }, - "source_status_id": 439430848190742500, - "source_status_id_str": "439430848190742528" - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:13 +0000 2014", - "id": 505874918039228400, - "id_str": "505874918039228416", - "text": "【金一地区太鼓台】川関と小山の見分けがつかない", - "source": "twittbot.net", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2530194984, - "id_str": "2530194984", - "name": "川之江中高生あるある", - "screen_name": "kw_aru", - "location": "DMにてネタ提供待ってますよ", - "description": "川之江中高生の川之江中高生による川之江中高生のためのあるあるアカウントです。タイムリーなネタはお気に入りにあります。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 113, - "friends_count": 157, - "listed_count": 0, - "created_at": "Wed May 28 15:01:43 +0000 2014", - "favourites_count": 30, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 4472, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/471668359314948097/XbIyXiZK_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/471668359314948097/XbIyXiZK_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2530194984/1401289473", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:13 +0000 2014", - "id": 505874915338104800, - "id_str": "505874915338104833", - "text": "おはようございますん♪ SSDSのDVDが朝一で届いた〜(≧∇≦)", - "source": "TweetList!", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 428179337, - "id_str": "428179337", - "name": "サラ", - "screen_name": "sala_mgn", - "location": "東京都", - "description": "bot遊びと実況が主目的の趣味アカウント。成人済♀。時々TLお騒がせします。リフォ率低いですがF/Bご自由に。スパムはブロック![HOT]K[アニメ]タイバニ/K/薄桜鬼/トライガン/進撃[小説]冲方丁/森博嗣[漫画]内藤泰弘/高河ゆん[他]声優/演劇 ※@sano_bot1二代目管理人", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 104, - "friends_count": 421, - "listed_count": 2, - "created_at": "Sun Dec 04 12:51:18 +0000 2011", - "favourites_count": 3257, - "utc_offset": -36000, - "time_zone": "Hawaii", - "geo_enabled": false, - "verified": false, - "statuses_count": 25303, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "1A1B1F", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/601682567/put73jtg48ytjylq00if.jpeg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/601682567/put73jtg48ytjylq00if.jpeg", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/3350624721/755920942e4f512e6ba489df7eb1147e_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/3350624721/755920942e4f512e6ba489df7eb1147e_normal.jpeg", - "profile_link_color": "2FC2EF", - "profile_sidebar_border_color": "181A1E", - "profile_sidebar_fill_color": "252429", - "profile_text_color": "666666", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:13 +0000 2014", - "id": 505874914897690600, - "id_str": "505874914897690624", - "text": "@ran_kirazuki そのようなお言葉を頂けるとは……!この雨太郎、誠心誠意を持って姉御の足の指の第一関節を崇め奉りとうございます", - "source": "Twitter for Android", - "truncated": false, - "in_reply_to_status_id": 505874276692406300, - "in_reply_to_status_id_str": "505874276692406272", - "in_reply_to_user_id": 531544559, - "in_reply_to_user_id_str": "531544559", - "in_reply_to_screen_name": "ran_kirazuki", - "user": { - "id": 2364828518, - "id_str": "2364828518", - "name": "雨", - "screen_name": "tear_dice", - "location": "変態/日常/創作/室町/たまに版権", - "description": "アイコンは兄さんから!", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 28, - "friends_count": 28, - "listed_count": 0, - "created_at": "Fri Feb 28 00:28:40 +0000 2014", - "favourites_count": 109, - "utc_offset": 32400, - "time_zone": "Seoul", - "geo_enabled": false, - "verified": false, - "statuses_count": 193, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "000000", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/504434510675443713/lvW7ad5b.jpeg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/504434510675443713/lvW7ad5b.jpeg", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/505170142284640256/rnW4XeEJ_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/505170142284640256/rnW4XeEJ_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2364828518/1409087198", - "profile_link_color": "0D31BF", - "profile_sidebar_border_color": "000000", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "ran_kirazuki", - "name": "蘭ぴよの日常", - "id": 531544559, - "id_str": "531544559", - "indices": [ - 0, - 13 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:13 +0000 2014", - "id": 505874914591514600, - "id_str": "505874914591514626", - "text": "RT @AFmbsk: @samao21718 \n呼び方☞まおちゃん\n呼ばれ方☞あーちゃん\n第一印象☞平野から?!\n今の印象☞おとなっぽい!!\nLINE交換☞もってるん\\( ˆoˆ )/\nトプ画について☞楽しそうでいーな😳\n家族にするなら☞おねぇちゃん\n最後に一言☞全然会えない…", - "source": "Twitter for Android", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2179759316, - "id_str": "2179759316", - "name": "まお", - "screen_name": "samao21718", - "location": "埼玉 UK留学してました✈", - "description": "゚.*97line おさらに貢いでる系女子*.゜ DISH// ✯ 佐野悠斗 ✯ 読モ ✯ WEGO ✯ 嵐 I met @OTYOfficial in the London ;)", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 111, - "friends_count": 121, - "listed_count": 0, - "created_at": "Thu Nov 07 09:47:41 +0000 2013", - "favourites_count": 321, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 1777, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501535615351926784/c5AAh6Sz_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501535615351926784/c5AAh6Sz_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2179759316/1407640217", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sat Aug 30 14:59:49 +0000 2014", - "id": 505731620456771600, - "id_str": "505731620456771584", - "text": "@samao21718 \n呼び方☞まおちゃん\n呼ばれ方☞あーちゃん\n第一印象☞平野から?!\n今の印象☞おとなっぽい!!\nLINE交換☞もってるん\\( ˆoˆ )/\nトプ画について☞楽しそうでいーな😳\n家族にするなら☞おねぇちゃん\n最後に一言☞全然会えないねー今度会えたらいいな!", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": 2179759316, - "in_reply_to_user_id_str": "2179759316", - "in_reply_to_screen_name": "samao21718", - "user": { - "id": 1680668713, - "id_str": "1680668713", - "name": "★Shiiiii!☆", - "screen_name": "AFmbsk", - "location": "埼玉", - "description": "2310*basketball#41*UVERworld*Pooh☪Bell +.。*弱さを知って強くなれ*゚", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 429, - "friends_count": 434, - "listed_count": 0, - "created_at": "Sun Aug 18 12:45:00 +0000 2013", - "favourites_count": 2488, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 6352, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/504643170886365185/JN_dlwUd_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/504643170886365185/JN_dlwUd_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1680668713/1408805886", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 1, - "favorite_count": 1, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "samao21718", - "name": "まお", - "id": 2179759316, - "id_str": "2179759316", - "indices": [ - 0, - 11 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 1, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "AFmbsk", - "name": "★Shiiiii!☆", - "id": 1680668713, - "id_str": "1680668713", - "indices": [ - 3, - 10 - ] - }, - { - "screen_name": "samao21718", - "name": "まお", - "id": 2179759316, - "id_str": "2179759316", - "indices": [ - 12, - 23 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:10 +0000 2014", - "id": 505874905712189440, - "id_str": "505874905712189440", - "text": "一、常に身一つ簡素にして、美食を好んではならない", - "source": "twittbot.net", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1330420010, - "id_str": "1330420010", - "name": "獨行道bot", - "screen_name": "dokkodo_bot", - "location": "", - "description": "宮本武蔵の自誓書、「獨行道」に記された二十一箇条をランダムにつぶやくbotです。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 4, - "friends_count": 5, - "listed_count": 1, - "created_at": "Sat Apr 06 01:19:55 +0000 2013", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 9639, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/3482551671/d9e749f7658b523bdd50b7584ed4ba6a_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/3482551671/d9e749f7658b523bdd50b7584ed4ba6a_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1330420010/1365212335", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:10 +0000 2014", - "id": 505874903094939650, - "id_str": "505874903094939648", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "モテモテ大作戦★男子編", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2714526565, - "id_str": "2714526565", - "name": "モテモテ大作戦★男子編", - "screen_name": "mote_danshi1", - "location": "", - "description": "やっぱりモテモテ男子になりたい!自分を磨くヒントをみつけたい!応援してくれる人は RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 664, - "friends_count": 1835, - "listed_count": 0, - "created_at": "Thu Aug 07 12:59:59 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 597, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/497368689386086400/7hqdKMzG_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/497368689386086400/7hqdKMzG_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2714526565/1407416898", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:10 +0000 2014", - "id": 505874902390276100, - "id_str": "505874902390276096", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "心に響くアツい名言集", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2699261263, - "id_str": "2699261263", - "name": "心に響くアツい名言集", - "screen_name": "kokoro_meigen11", - "location": "", - "description": "人生の格言は、人の心や人生を瞬時にに動かしてしまうことがある。\r\nそんな言葉の重みを味わおう。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 183, - "friends_count": 1126, - "listed_count": 0, - "created_at": "Fri Aug 01 22:00:00 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 749, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/495328654126112768/1rKnNuWK_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/495328654126112768/1rKnNuWK_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2699261263/1406930543", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:10 +0000 2014", - "id": 505874902247677950, - "id_str": "505874902247677954", - "text": "RT @POTENZA_SUPERGT: ありがとうございます!“@8CBR8: @POTENZA_SUPERGT 13時半ごろ一雨きそうですが、無事全車決勝レース完走出来ること祈ってます! http://t.co/FzTyFnt9xH”", - "source": "jigtwi", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1021030416, - "id_str": "1021030416", - "name": "narur", - "screen_name": "narur2", - "location": "晴れの国なのに何故か開幕戦では雨や雪や冰や霰が降る✨", - "description": "F1.GP2.Superformula.SuperGT.F3...\nスーパーGTが大好き♡車が好き!新幹線も好き!飛行機も好き!こっそり別アカです(๑´ㅂ`๑)♡*.+゜", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 257, - "friends_count": 237, - "listed_count": 2, - "created_at": "Wed Dec 19 01:14:41 +0000 2012", - "favourites_count": 547, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 55417, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/462180217574789121/1Jf6m_2L.jpeg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/462180217574789121/1Jf6m_2L.jpeg", - "profile_background_tile": true, - "profile_image_url": "http://pbs.twimg.com/profile_images/444312241395863552/FKl40ebQ_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/444312241395863552/FKl40ebQ_normal.jpeg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:05:11 +0000 2014", - "id": 505868866686169100, - "id_str": "505868866686169089", - "text": "ありがとうございます!“@8CBR8: @POTENZA_SUPERGT 13時半ごろ一雨きそうですが、無事全車決勝レース完走出来ること祈ってます! http://t.co/FzTyFnt9xH”", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": 505868690588303360, - "in_reply_to_status_id_str": "505868690588303360", - "in_reply_to_user_id": 333344408, - "in_reply_to_user_id_str": "333344408", - "in_reply_to_screen_name": "8CBR8", - "user": { - "id": 359324738, - "id_str": "359324738", - "name": "POTENZA_SUPERGT", - "screen_name": "POTENZA_SUPERGT", - "location": "", - "description": "ブリヂストンのスポーツタイヤ「POTENZA」のアカウントです。レースやタイヤの事などをつぶやきます。今シーズンも「チャンピオンタイヤの称号は譲らない」をキャッチコピーに、タイヤ供給チームを全力でサポートしていきますので、応援よろしくお願いします!なお、返信ができない場合もありますので、ご了承よろしくお願い致します。", - "url": "http://t.co/LruVPk5x4K", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/LruVPk5x4K", - "expanded_url": "http://www.bridgestone.co.jp/sc/potenza/", - "display_url": "bridgestone.co.jp/sc/potenza/", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 9612, - "friends_count": 308, - "listed_count": 373, - "created_at": "Sun Aug 21 11:33:38 +0000 2011", - "favourites_count": 26, - "utc_offset": -36000, - "time_zone": "Hawaii", - "geo_enabled": true, - "verified": false, - "statuses_count": 10032, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "131516", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme14/bg.gif", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme14/bg.gif", - "profile_background_tile": true, - "profile_image_url": "http://pbs.twimg.com/profile_images/1507885396/TW_image_normal.jpg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/1507885396/TW_image_normal.jpg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/359324738/1402546267", - "profile_link_color": "FF2424", - "profile_sidebar_border_color": "EEEEEE", - "profile_sidebar_fill_color": "EFEFEF", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 7, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "8CBR8", - "name": "CBR Rider #17 KEIHIN", - "id": 333344408, - "id_str": "333344408", - "indices": [ - 12, - 18 - ] - }, - { - "screen_name": "POTENZA_SUPERGT", - "name": "POTENZA_SUPERGT", - "id": 359324738, - "id_str": "359324738", - "indices": [ - 20, - 36 - ] - } - ], - "media": [ - { - "id": 505868690252779500, - "id_str": "505868690252779521", - "indices": [ - 75, - 97 - ], - "media_url": "http://pbs.twimg.com/media/BwU05MGCUAEY6Wu.jpg", - "media_url_https": "https://pbs.twimg.com/media/BwU05MGCUAEY6Wu.jpg", - "url": "http://t.co/FzTyFnt9xH", - "display_url": "pic.twitter.com/FzTyFnt9xH", - "expanded_url": "http://twitter.com/8CBR8/status/505868690588303360/photo/1", - "type": "photo", - "sizes": { - "medium": { - "w": 600, - "h": 399, - "resize": "fit" - }, - "thumb": { - "w": 150, - "h": 150, - "resize": "crop" - }, - "large": { - "w": 1024, - "h": 682, - "resize": "fit" - }, - "small": { - "w": 340, - "h": 226, - "resize": "fit" - } - }, - "source_status_id": 505868690588303360, - "source_status_id_str": "505868690588303360" - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - "retweet_count": 7, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "POTENZA_SUPERGT", - "name": "POTENZA_SUPERGT", - "id": 359324738, - "id_str": "359324738", - "indices": [ - 3, - 19 - ] - }, - { - "screen_name": "8CBR8", - "name": "CBR Rider #17 KEIHIN", - "id": 333344408, - "id_str": "333344408", - "indices": [ - 33, - 39 - ] - }, - { - "screen_name": "POTENZA_SUPERGT", - "name": "POTENZA_SUPERGT", - "id": 359324738, - "id_str": "359324738", - "indices": [ - 41, - 57 - ] - } - ], - "media": [ - { - "id": 505868690252779500, - "id_str": "505868690252779521", - "indices": [ - 96, - 118 - ], - "media_url": "http://pbs.twimg.com/media/BwU05MGCUAEY6Wu.jpg", - "media_url_https": "https://pbs.twimg.com/media/BwU05MGCUAEY6Wu.jpg", - "url": "http://t.co/FzTyFnt9xH", - "display_url": "pic.twitter.com/FzTyFnt9xH", - "expanded_url": "http://twitter.com/8CBR8/status/505868690588303360/photo/1", - "type": "photo", - "sizes": { - "medium": { - "w": 600, - "h": 399, - "resize": "fit" - }, - "thumb": { - "w": 150, - "h": 150, - "resize": "crop" - }, - "large": { - "w": 1024, - "h": 682, - "resize": "fit" - }, - "small": { - "w": 340, - "h": 226, - "resize": "fit" - } - }, - "source_status_id": 505868690588303360, - "source_status_id_str": "505868690588303360" - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:09 +0000 2014", - "id": 505874901689851900, - "id_str": "505874901689851904", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "ここだけの本音★男子編", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2762136439, - "id_str": "2762136439", - "name": "ここだけの本音★男子編", - "screen_name": "danshi_honne1", - "location": "", - "description": "思ってるけど言えない!でもホントは言いたいこと、実はいっぱいあるんです! \r\nそんな男子の本音を、つぶやきます。 \r\nその気持わかるって人は RT & フォローお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 101, - "friends_count": 985, - "listed_count": 0, - "created_at": "Sun Aug 24 11:11:30 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 209, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503500282840354816/CEv8UMay_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503500282840354816/CEv8UMay_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2762136439/1408878822", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:09 +0000 2014", - "id": 505874900939046900, - "id_str": "505874900939046912", - "text": "RT @UARROW_Y: ようかい体操第一を踊る国見英 http://t.co/SXoYWH98as", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2454426158, - "id_str": "2454426158", - "name": "ぴかりん", - "screen_name": "gncnToktTtksg", - "location": "", - "description": "銀魂/黒バス/進撃/ハイキュー/BLEACH/うたプリ/鈴木達央さん/神谷浩史さん 気軽にフォローしてください(^∇^)✨", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 1274, - "friends_count": 1320, - "listed_count": 17, - "created_at": "Sun Apr 20 07:48:53 +0000 2014", - "favourites_count": 2314, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 5868, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/457788684146716672/KCOy0S75_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/457788684146716672/KCOy0S75_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2454426158/1409371302", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:45 +0000 2014", - "id": 505871779949051900, - "id_str": "505871779949051904", - "text": "ようかい体操第一を踊る国見英 http://t.co/SXoYWH98as", - "source": "Twitter for Android", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1261662588, - "id_str": "1261662588", - "name": "ゆう矢", - "screen_name": "UARROW_Y", - "location": "つくり出そう国影の波 広げよう国影の輪", - "description": "HQ!! 成人済腐女子。日常ツイート多いです。赤葦京治夢豚クソツイ含みます注意。フォローをお考えの際はプロフご一読お願い致します。FRBお気軽に", - "url": "http://t.co/LFX2XOzb0l", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/LFX2XOzb0l", - "expanded_url": "http://twpf.jp/UARROW_Y", - "display_url": "twpf.jp/UARROW_Y", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 265, - "friends_count": 124, - "listed_count": 12, - "created_at": "Tue Mar 12 10:42:17 +0000 2013", - "favourites_count": 6762, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": true, - "verified": false, - "statuses_count": 55946, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/502095104618663937/IzuPYx3E_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/502095104618663937/IzuPYx3E_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1261662588/1408618604", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 29, - "favorite_count": 54, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/SXoYWH98as", - "expanded_url": "http://twitter.com/UARROW_Y/status/505871779949051904/photo/1", - "display_url": "pic.twitter.com/SXoYWH98as", - "indices": [ - 15, - 37 - ] - } - ], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - "retweet_count": 29, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/SXoYWH98as", - "expanded_url": "http://twitter.com/UARROW_Y/status/505871779949051904/photo/1", - "display_url": "pic.twitter.com/SXoYWH98as", - "indices": [ - 29, - 51 - ] - } - ], - "user_mentions": [ - { - "screen_name": "UARROW_Y", - "name": "ゆう矢", - "id": 1261662588, - "id_str": "1261662588", - "indices": [ - 3, - 12 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:09 +0000 2014", - "id": 505874900561580000, - "id_str": "505874900561580032", - "text": "今日は一高と三桜(・θ・)\n光梨ちゃんに会えないかな〜", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1366375976, - "id_str": "1366375976", - "name": "ゆいの", - "screen_name": "yuino1006", - "location": "", - "description": "さんおう 男バスマネ2ねん(^ω^)", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 270, - "friends_count": 260, - "listed_count": 0, - "created_at": "Sat Apr 20 07:02:08 +0000 2013", - "favourites_count": 1384, - "utc_offset": 32400, - "time_zone": "Irkutsk", - "geo_enabled": false, - "verified": false, - "statuses_count": 5202, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/505354401448349696/nxVFEQQ4_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/505354401448349696/nxVFEQQ4_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1366375976/1399989379", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:09 +0000 2014", - "id": 505874899324248060, - "id_str": "505874899324248064", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "共感★絶対あるあるww", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2704420069, - "id_str": "2704420069", - "name": "共感★絶対あるあるww", - "screen_name": "kyoukan_aru", - "location": "", - "description": "みんなにもわかってもらえる、あるあるを見つけたい。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 857, - "friends_count": 1873, - "listed_count": 0, - "created_at": "Sun Aug 03 15:50:40 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 682, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/495960812670836737/1LqkoyvU_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/495960812670836737/1LqkoyvU_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2704420069/1407081298", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:09 +0000 2014", - "id": 505874898493796350, - "id_str": "505874898493796352", - "text": "RT @assam_house: 泉田新潟県知事は、東電の申請書提出を容認させられただけで、再稼働に必要な「同意」はまだ与えていません。今まで柏崎刈羽の再稼働を抑え続けてきた知事に、もう一踏ん張りをお願いする意見を送って下さい。全国の皆様、お願いします!\nhttp://t.co…", - "source": "jigtwi for Android", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 960765968, - "id_str": "960765968", - "name": "さち", - "screen_name": "sachitaka_dears", - "location": "宮城県", - "description": "動物関連のアカウントです。サブアカウント@sachi_dears (さち ❷) もあります。『心あるものは皆、愛し愛されるために生まれてきた。そして愛情を感じながら生を全うするべきなんだ』", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 3212, - "friends_count": 3528, - "listed_count": 91, - "created_at": "Tue Nov 20 16:30:53 +0000 2012", - "favourites_count": 3180, - "utc_offset": 32400, - "time_zone": "Irkutsk", - "geo_enabled": false, - "verified": false, - "statuses_count": 146935, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/3659653229/5b698df67f5d105400e9077f5ea50e91_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/3659653229/5b698df67f5d105400e9077f5ea50e91_normal.png", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Tue Aug 19 11:00:53 +0000 2014", - "id": 501685228427964400, - "id_str": "501685228427964417", - "text": "泉田新潟県知事は、東電の申請書提出を容認させられただけで、再稼働に必要な「同意」はまだ与えていません。今まで柏崎刈羽の再稼働を抑え続けてきた知事に、もう一踏ん張りをお願いする意見を送って下さい。全国の皆様、お願いします!\nhttp://t.co/9oH5cgpy1q", - "source": "twittbot.net", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1104771276, - "id_str": "1104771276", - "name": "アッサム山中(殺処分ゼロに一票)", - "screen_name": "assam_house", - "location": "新潟県柏崎市", - "description": "アッサム山中の趣味用アカ。当分の間、選挙啓発用としても使っていきます。このアカウントがアッサム山中本人のものである事は @assam_yamanaka のプロフでご確認下さい。\r\n公選法に係る表示\r\n庶民新党 #脱原発 http://t.co/96UqoCo0oU\r\nonestep.revival@gmail.com", - "url": "http://t.co/AEOCATaNZc", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/AEOCATaNZc", - "expanded_url": "http://www.assam-house.net/", - "display_url": "assam-house.net", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [ - { - "url": "http://t.co/96UqoCo0oU", - "expanded_url": "http://blog.assam-house.net/datsu-genpatsu/index.html", - "display_url": "blog.assam-house.net/datsu-genpatsu…", - "indices": [ - 110, - 132 - ] - } - ] - } - }, - "protected": false, - "followers_count": 2977, - "friends_count": 3127, - "listed_count": 64, - "created_at": "Sat Jan 19 22:10:13 +0000 2013", - "favourites_count": 343, - "utc_offset": 32400, - "time_zone": "Irkutsk", - "geo_enabled": false, - "verified": false, - "statuses_count": 18021, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/378800000067217575/e0a85b440429ff50430a41200327dcb8_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000067217575/e0a85b440429ff50430a41200327dcb8_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1104771276/1408948288", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 2, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/9oH5cgpy1q", - "expanded_url": "http://www.pref.niigata.lg.jp/kouhou/info.html", - "display_url": "pref.niigata.lg.jp/kouhou/info.ht…", - "indices": [ - 111, - 133 - ] - } - ], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - "retweet_count": 2, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/9oH5cgpy1q", - "expanded_url": "http://www.pref.niigata.lg.jp/kouhou/info.html", - "display_url": "pref.niigata.lg.jp/kouhou/info.ht…", - "indices": [ - 139, - 140 - ] - } - ], - "user_mentions": [ - { - "screen_name": "assam_house", - "name": "アッサム山中(殺処分ゼロに一票)", - "id": 1104771276, - "id_str": "1104771276", - "indices": [ - 3, - 15 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:09 +0000 2014", - "id": 505874898468630500, - "id_str": "505874898468630528", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "おしゃれ★ペアルック", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2708607692, - "id_str": "2708607692", - "name": "おしゃれ★ペアルック", - "screen_name": "osyare_pea", - "location": "", - "description": "ラブラブ度がアップする、素敵なペアルックを見つけて紹介します♪ 気に入ったら RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 129, - "friends_count": 1934, - "listed_count": 0, - "created_at": "Tue Aug 05 07:09:31 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 641, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/496554257676382208/Zgg0bmNu_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/496554257676382208/Zgg0bmNu_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2708607692/1407222776", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:08 +0000 2014", - "id": 505874897633951740, - "id_str": "505874897633951745", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "LOVE ♥ ラブライブ", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745389137, - "id_str": "2745389137", - "name": "LOVE ♥ ラブライブ", - "screen_name": "love_live55", - "location": "", - "description": "とにかく「ラブライブが好きで~す♥」 \r\nラブライブファンには、たまらない内容ばかり集めています♪ \r\n気に入ったら RT & 相互フォローお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 251, - "friends_count": 969, - "listed_count": 0, - "created_at": "Tue Aug 19 15:45:40 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 348, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501757482448850944/x2uPpqRx_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501757482448850944/x2uPpqRx_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745389137/1408463342", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:08 +0000 2014", - "id": 505874896795086850, - "id_str": "505874896795086848", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "恋する♡ドレスシリーズ", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2726346560, - "id_str": "2726346560", - "name": "恋する♡ドレスシリーズ", - "screen_name": "koisurudoress", - "location": "", - "description": "どれもこれも、見ているだけで欲しくなっちゃう♪ \r\n特別な日に着る素敵なドレスを見つけたいです。 \r\n着てみたいと思ったら RT & フォローお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 314, - "friends_count": 1900, - "listed_count": 0, - "created_at": "Tue Aug 12 14:10:35 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 471, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/499199619465621504/fg7sVusT_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/499199619465621504/fg7sVusT_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2726346560/1407853688", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:08 +0000 2014", - "id": 505874895964626940, - "id_str": "505874895964626944", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "胸キュン♥動物図鑑", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2759192574, - "id_str": "2759192574", - "name": "胸キュン♥動物図鑑", - "screen_name": "doubutuzukan", - "location": "", - "description": "ふとした表情に思わずキュンとしてしまう♪ \r\nそんな愛しの動物たちの写真を見つけます。 \r\n気に入ったら RT & フォローを、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 80, - "friends_count": 959, - "listed_count": 1, - "created_at": "Sat Aug 23 15:47:36 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 219, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503211559552688128/Ej_bixna_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503211559552688128/Ej_bixna_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2759192574/1408809101", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:08 +0000 2014", - "id": 505874895079608300, - "id_str": "505874895079608320", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "ディズニー★パラダイス", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2719228561, - "id_str": "2719228561", - "name": "ディズニー★パラダイス", - "screen_name": "disney_para", - "location": "", - "description": "ディズニーのかわいい画像、ニュース情報、あるあるなどをお届けします♪\r\nディズニーファンは RT & フォローもお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 331, - "friends_count": 1867, - "listed_count": 0, - "created_at": "Sat Aug 09 12:01:32 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 540, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/498076922488696832/Ti2AEuOT_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/498076922488696832/Ti2AEuOT_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2719228561/1407585841", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:08 +0000 2014", - "id": 505874894135898100, - "id_str": "505874894135898112", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "生々しい風刺画", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2714772727, - "id_str": "2714772727", - "name": "生々しい風刺画", - "screen_name": "nama_fuushi", - "location": "", - "description": "深い意味が込められた「生々しい風刺画」を見つけます。\r\n考えさせられたら RT & 相互フォローでみなさん、お願いします", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 298, - "friends_count": 1902, - "listed_count": 1, - "created_at": "Thu Aug 07 15:04:45 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 595, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/497398363352875011/tS-5FPJB_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/497398363352875011/tS-5FPJB_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2714772727/1407424091", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:07 +0000 2014", - "id": 505874893347377150, - "id_str": "505874893347377152", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "嵐★大好きっ娘", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2721682579, - "id_str": "2721682579", - "name": "嵐★大好きっ娘", - "screen_name": "arashi_suki1", - "location": "", - "description": "なんだかんだ言って、やっぱり嵐が好きなんです♪\r\nいろいろ集めたいので、嵐好きな人に見てほしいです。\r\n気に入ったら RT & 相互フォローお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 794, - "friends_count": 1913, - "listed_count": 2, - "created_at": "Sun Aug 10 13:43:56 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 504, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/498465364733198336/RO6wupdc_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/498465364733198336/RO6wupdc_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2721682579/1407678436", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:07 +0000 2014", - "id": 505874893154426900, - "id_str": "505874893154426881", - "text": "RT @Takashi_Shiina: テレビで「成人男性のカロリー摂取量は1900kcal」とか言ってて、それはいままさに私がダイエットのために必死でキープしようとしている量で、「それが普通なら人はいつ天一やココイチに行って大盛りを食えばいいんだ!」と思った。", - "source": "twicca", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 353516742, - "id_str": "353516742", - "name": "おしんこー@土曜西え41a", - "screen_name": "oshin_koko", - "location": "こたつ", - "description": "ROMって楽しんでいる部分もあり無言フォロー多めですすみません…。ツイート数多め・あらぶり多めなのでフォロー非推奨です。最近は早兵・兵部受け中心ですがBLNLなんでも好きです。地雷少ないため雑多に呟きます。腐・R18・ネタバレ有るのでご注意。他好きなジャンルはプロフ参照願います。 主催→@chounou_antholo", - "url": "http://t.co/mM1dG54NiO", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/mM1dG54NiO", - "expanded_url": "http://twpf.jp/oshin_koko", - "display_url": "twpf.jp/oshin_koko", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 479, - "friends_count": 510, - "listed_count": 43, - "created_at": "Fri Aug 12 05:53:13 +0000 2011", - "favourites_count": 3059, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": false, - "verified": false, - "statuses_count": 104086, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "000000", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/799871497/01583a031f83a45eba881c8acde729ee.jpeg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/799871497/01583a031f83a45eba881c8acde729ee.jpeg", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/484347196523835393/iHaYxm-2_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/484347196523835393/iHaYxm-2_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/353516742/1369039651", - "profile_link_color": "FF96B0", - "profile_sidebar_border_color": "FFFFFF", - "profile_sidebar_fill_color": "95E8EC", - "profile_text_color": "3C3940", - "profile_use_background_image": false, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sat Aug 30 09:58:30 +0000 2014", - "id": 505655792733650940, - "id_str": "505655792733650944", - "text": "テレビで「成人男性のカロリー摂取量は1900kcal」とか言ってて、それはいままさに私がダイエットのために必死でキープしようとしている量で、「それが普通なら人はいつ天一やココイチに行って大盛りを食えばいいんだ!」と思った。", - "source": "Janetter", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 126573583, - "id_str": "126573583", - "name": "椎名高志", - "screen_name": "Takashi_Shiina", - "location": "BABEL(超能力支援研究局)", - "description": "漫画家。週刊少年サンデーで『絶対可憐チルドレン』連載中。TVアニメ『THE UNLIMITED 兵部京介』公式サイト>http://t.co/jVqBoBEc", - "url": "http://t.co/K3Oi83wM3w", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/K3Oi83wM3w", - "expanded_url": "http://cnanews.asablo.jp/blog/", - "display_url": "cnanews.asablo.jp/blog/", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [ - { - "url": "http://t.co/jVqBoBEc", - "expanded_url": "http://unlimited-zc.jp/index.html", - "display_url": "unlimited-zc.jp/index.html", - "indices": [ - 59, - 79 - ] - } - ] - } - }, - "protected": false, - "followers_count": 110756, - "friends_count": 61, - "listed_count": 8159, - "created_at": "Fri Mar 26 08:54:51 +0000 2010", - "favourites_count": 25, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": false, - "verified": false, - "statuses_count": 27364, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "EDECE9", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme3/bg.gif", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme3/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/504597210772688896/Uvt4jgf5_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/504597210772688896/Uvt4jgf5_normal.png", - "profile_link_color": "088253", - "profile_sidebar_border_color": "D3D2CF", - "profile_sidebar_fill_color": "E3E2DE", - "profile_text_color": "634047", - "profile_use_background_image": false, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 221, - "favorite_count": 109, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 221, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "Takashi_Shiina", - "name": "椎名高志", - "id": 126573583, - "id_str": "126573583", - "indices": [ - 3, - 18 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:07 +0000 2014", - "id": 505874892567244800, - "id_str": "505874892567244801", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "下ネタ&笑変態雑学", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2762581922, - "id_str": "2762581922", - "name": "下ネタ&笑変態雑学", - "screen_name": "shimo_hentai", - "location": "", - "description": "普通の人には思いつかない、ちょっと変態チックな 笑える下ネタ雑学をお届けします。 \r\nおもしろかったら RT & フォローお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 37, - "friends_count": 990, - "listed_count": 0, - "created_at": "Sun Aug 24 14:13:20 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 212, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503545991950114816/K9yQbh1Q_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503545991950114816/K9yQbh1Q_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2762581922/1408889893", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:07 +0000 2014", - "id": 505874891778703360, - "id_str": "505874891778703360", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "超簡単★初心者英語", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2744544025, - "id_str": "2744544025", - "name": "超簡単★初心者英語", - "screen_name": "kantaneigo1", - "location": "", - "description": "すぐに使えるフレーズや簡単な会話を紹介します。 \r\n少しづつ練習して、どんどん使ってみよう☆ \r\n使ってみたいと思ったら RT & フォローお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 147, - "friends_count": 970, - "listed_count": 1, - "created_at": "Tue Aug 19 10:11:48 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 345, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501676136321929216/4MLpyHe3_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501676136321929216/4MLpyHe3_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744544025/1408443928", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:07 +0000 2014", - "id": 505874891032121340, - "id_str": "505874891032121344", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "現代のハンドサイン", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2762816814, - "id_str": "2762816814", - "name": "現代のハンドサイン", - "screen_name": "ima_handsign", - "location": "", - "description": "イザという時や、困った時に、必ず役に立つハンドサインのオンパレードです♪ \r\n使ってみたくなったら RT & フォローお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 95, - "friends_count": 996, - "listed_count": 0, - "created_at": "Sun Aug 24 15:33:58 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 210, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503566188253687809/7wtdp1AC_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503566188253687809/7wtdp1AC_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2762816814/1408894540", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:07 +0000 2014", - "id": 505874890247782400, - "id_str": "505874890247782401", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "今日からアナタもイイ女♪", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2714167411, - "id_str": "2714167411", - "name": "今日からアナタもイイ女♪", - "screen_name": "anata_iionna", - "location": "", - "description": "みんなが知りたい イイ女の秘密を見つけます♪ いいな~と思ってくれた人は RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 390, - "friends_count": 1425, - "listed_count": 0, - "created_at": "Thu Aug 07 09:27:59 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 609, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/497314455655436288/dz7P3-fy_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/497314455655436288/dz7P3-fy_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2714167411/1407404214", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:07 +0000 2014", - "id": 505874890218434560, - "id_str": "505874890218434560", - "text": "@kohecyan3 \n名前:上野滉平\n呼び方:うえの\n呼ばれ方:ずるかわ\n第一印象:過剰な俺イケメンですアピール\n今の印象:バーバリーの時計\n好きなところ:あの自信さ、笑いが絶えない\n一言:大学受かったの?応援してる〜(*^^*)!\n\n#RTした人にやる\nちょっとやってみる笑", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": 2591363659, - "in_reply_to_user_id_str": "2591363659", - "in_reply_to_screen_name": "kohecyan3", - "user": { - "id": 2613282517, - "id_str": "2613282517", - "name": "K", - "screen_name": "kawazurukenna", - "location": "", - "description": "# I surprise even my self", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 113, - "friends_count": 185, - "listed_count": 0, - "created_at": "Wed Jul 09 09:39:13 +0000 2014", - "favourites_count": 157, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 242, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/502436858135973888/PcUU0lov_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/502436858135973888/PcUU0lov_normal.jpeg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [ - { - "text": "RTした人にやる", - "indices": [ - 119, - 128 - ] - } - ], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "kohecyan3", - "name": "上野滉平", - "id": 2591363659, - "id_str": "2591363659", - "indices": [ - 0, - 10 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:07 +0000 2014", - "id": 505874889392156700, - "id_str": "505874889392156672", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "IQ★力だめし", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2709308887, - "id_str": "2709308887", - "name": "IQ★力だめし", - "screen_name": "iq_tameshi", - "location": "", - "description": "解けると楽しい気分になれる問題を見つけて紹介します♪面白かったら RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 443, - "friends_count": 1851, - "listed_count": 1, - "created_at": "Tue Aug 05 13:14:30 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 664, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/496646485266558977/W_W--qV__normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/496646485266558977/W_W--qV__normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2709308887/1407244754", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:06 +0000 2014", - "id": 505874888817532900, - "id_str": "505874888817532928", - "text": "第一三軍から2個師団が北へ移動中らしい     この調子では満州に陸軍兵力があふれかえる", - "source": "如月克己", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1171299612, - "id_str": "1171299612", - "name": "如月 克己", - "screen_name": "kisaragi_katumi", - "location": "満州", - "description": "GパングのA型K月克己中尉の非公式botです。 主に七巻と八巻が中心の台詞をつぶやきます。 4/18.台詞追加しました/現在試運転中/現在軽い挨拶だけTL反応。/追加したい台詞や何おかしい所がありましたらDMやリプライで/フォロー返しは手動です/", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 65, - "friends_count": 63, - "listed_count": 0, - "created_at": "Tue Feb 12 08:21:38 +0000 2013", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 27219, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/3242847112/0ce536444c94cbec607229022d43a27a_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/3242847112/0ce536444c94cbec607229022d43a27a_normal.jpeg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:06 +0000 2014", - "id": 505874888616181760, - "id_str": "505874888616181760", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "徳田有希★応援隊", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2766021865, - "id_str": "2766021865", - "name": "徳田有希★応援隊", - "screen_name": "tokuda_ouen1", - "location": "", - "description": "女子中高生に大人気ww いやされるイラストを紹介します。 \r\nみんなで RTして応援しよう~♪ \r\n「非公式アカウントです」", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 123, - "friends_count": 978, - "listed_count": 0, - "created_at": "Mon Aug 25 10:48:41 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 210, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503857235802333184/YS0sDN6q_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503857235802333184/YS0sDN6q_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2766021865/1408963998", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:06 +0000 2014", - "id": 505874887802511360, - "id_str": "505874887802511361", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "腐女子の☆部屋", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2744683982, - "id_str": "2744683982", - "name": "腐女子の☆部屋", - "screen_name": "fujyoshinoheya", - "location": "", - "description": "腐女子にしかわからないネタや、あるあるを見つけていきます。 \r\n他には、BL~萌えキュン系まで、腐のための画像を集めています♪ \r\n同じ境遇の人には、わかってもらえると思うので、気軽に RT & フォローお願いします☆", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 241, - "friends_count": 990, - "listed_count": 0, - "created_at": "Tue Aug 19 11:47:21 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 345, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501697365590306817/GLP_QH_b_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501697365590306817/GLP_QH_b_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744683982/1408448984", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:06 +0000 2014", - "id": 505874887009767400, - "id_str": "505874887009767424", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "萌え芸術★ラテアート", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2763178045, - "id_str": "2763178045", - "name": "萌え芸術★ラテアート", - "screen_name": "moe_rate", - "location": "", - "description": "ここまで来ると、もはや芸術!! 見てるだけで楽しい♪ \r\nそんなラテアートを、とことん探します。 \r\nスゴイと思ったら RT & フォローお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 187, - "friends_count": 998, - "listed_count": 0, - "created_at": "Sun Aug 24 16:53:16 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 210, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503586151764992000/RC80it20_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503586151764992000/RC80it20_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2763178045/1408899447", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:06 +0000 2014", - "id": 505874886225448960, - "id_str": "505874886225448960", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "全部★ジャニーズ図鑑", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2724158970, - "id_str": "2724158970", - "name": "全部★ジャニーズ図鑑", - "screen_name": "zenbu_johnnys", - "location": "", - "description": "ジャニーズのカッコイイ画像、おもしろエピソードなどを発信します。\r\n「非公式アカウントです」\r\nジャニーズ好きな人は、是非 RT & フォローお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 738, - "friends_count": 1838, - "listed_count": 0, - "created_at": "Mon Aug 11 15:50:08 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 556, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/498859581057945600/ncMKwdvC_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/498859581057945600/ncMKwdvC_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2724158970/1407772462", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:06 +0000 2014", - "id": 505874885810200600, - "id_str": "505874885810200576", - "text": "RT @naopisu_: 呼び方:\n呼ばれ方:\n第一印象:\n今の印象:\n好きなところ:\n家族にするなら:\n最後に一言:\n#RTした人にやる\n\nお腹痛くて寝れないからやるww\nだれでもどうぞ〜😏🙌", - "source": "Twitter for Android", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2347898072, - "id_str": "2347898072", - "name": "にたにた", - "screen_name": "syo6660129", - "location": "", - "description": "", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 64, - "friends_count": 70, - "listed_count": 1, - "created_at": "Mon Feb 17 04:29:46 +0000 2014", - "favourites_count": 58, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 145, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/485603672118669314/73uh_xRS_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/485603672118669314/73uh_xRS_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2347898072/1396957619", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sat Aug 30 14:19:31 +0000 2014", - "id": 505721480261300200, - "id_str": "505721480261300224", - "text": "呼び方:\n呼ばれ方:\n第一印象:\n今の印象:\n好きなところ:\n家族にするなら:\n最後に一言:\n#RTした人にやる\n\nお腹痛くて寝れないからやるww\nだれでもどうぞ〜😏🙌", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 856045488, - "id_str": "856045488", - "name": "なおぴす", - "screen_name": "naopisu_", - "location": "Fujino 65th ⇢ Sagaso 12A(LJK", - "description": "\ もうすぐ18歳 “Only One”になる /", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 267, - "friends_count": 259, - "listed_count": 2, - "created_at": "Mon Oct 01 08:36:23 +0000 2012", - "favourites_count": 218, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 1790, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/496321592553525249/tuzX9ByR_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/496321592553525249/tuzX9ByR_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/856045488/1407118111", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 23, - "favorite_count": 1, - "entities": { - "hashtags": [ - { - "text": "RTした人にやる", - "indices": [ - 47, - 56 - ] - } - ], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 23, - "favorite_count": 0, - "entities": { - "hashtags": [ - { - "text": "RTした人にやる", - "indices": [ - 61, - 70 - ] - } - ], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "naopisu_", - "name": "なおぴす", - "id": 856045488, - "id_str": "856045488", - "indices": [ - 3, - 12 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:06 +0000 2014", - "id": 505874885474656260, - "id_str": "505874885474656256", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "爆笑★LINE あるある", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2709561589, - "id_str": "2709561589", - "name": "爆笑★LINE あるある", - "screen_name": "line_aru1", - "location": "", - "description": "思わず笑ってしまうLINEでのやりとりや、あるあるを見つけたいです♪面白かったら RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 496, - "friends_count": 1875, - "listed_count": 1, - "created_at": "Tue Aug 05 15:01:30 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 687, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/496673793939492867/p1BN4YaW_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/496673793939492867/p1BN4YaW_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2709561589/1407251270", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:05 +0000 2014", - "id": 505874884627410940, - "id_str": "505874884627410944", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "全力★ミサワ的w発言", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2734455415, - "id_str": "2734455415", - "name": "全力★ミサワ的w発言!!", - "screen_name": "misawahatugen", - "location": "", - "description": "ウザすぎて笑えるミサワ的名言や、おもしろミサワ画像を集めています。 \r\nミサワを知らない人でも、いきなりツボにハマっちゃう内容をお届けします。 \r\nウザいwと思ったら RT & 相互フォローお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 144, - "friends_count": 1915, - "listed_count": 1, - "created_at": "Fri Aug 15 13:20:04 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 436, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/500271070834749444/HvengMe5_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/500271070834749444/HvengMe5_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2734455415/1408108944", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:05 +0000 2014", - "id": 505874883809521660, - "id_str": "505874883809521664", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "お宝ww有名人卒アル特集", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2708183557, - "id_str": "2708183557", - "name": "お宝ww有名人卒アル特集", - "screen_name": "otakara_sotuaru", - "location": "", - "description": "みんな昔は若かったんですね。今からは想像もつかない、あの有名人を見つけます。\r\n面白かったら RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 286, - "friends_count": 1938, - "listed_count": 0, - "created_at": "Tue Aug 05 03:26:54 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 650, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/496499121276985344/hC8RoebP_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/496499121276985344/hC8RoebP_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2708183557/1407318758", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:05 +0000 2014", - "id": 505874883322970100, - "id_str": "505874883322970112", - "text": "レッドクリフのキャラのこと女装ってくそわろたwww朝一で面白かった( ˘ω゜)笑", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1620730616, - "id_str": "1620730616", - "name": "ひーちゃん@橘芋健ぴ", - "screen_name": "2nd_8hkr", - "location": "北の大地.95年組 ☞ 9/28.10/2(5).12/28", - "description": "THE SECOND/劇団EXILE/EXILE/二代目JSB ☞KENCHI.AKIRA.青柳翔.小森隼.石井杏奈☜ Big Love ♡ Respect ..... ✍ MATSU Origin✧ .た ち ば な '' い も '' け ん い ち ろ う さ んTEAM NACS 安田.戸次 Liebe !", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 109, - "friends_count": 148, - "listed_count": 0, - "created_at": "Thu Jul 25 16:09:29 +0000 2013", - "favourites_count": 783, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 9541, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/458760951060123648/Cocoxi-2_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/458760951060123648/Cocoxi-2_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1620730616/1408681982", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:05 +0000 2014", - "id": 505874883067129860, - "id_str": "505874883067129857", - "text": "【状態良好】ペンタックス・デジタル一眼レフカメラ・K20D 入札数=38 現在価格=15000円 http://t.co/4WK1f6V2n6終了=2014年08月31日 20:47:53 #一眼レフ http://t.co/PcSaXzfHMW", - "source": "YahooAuction Degicame", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2278053589, - "id_str": "2278053589", - "name": "AuctionCamera", - "screen_name": "AuctionCamera", - "location": "", - "description": "Yahooオークションのデジカメカテゴリから商品を抽出するボットです。", - "url": "https://t.co/3sB1NDnd0m", - "entities": { - "url": { - "urls": [ - { - "url": "https://t.co/3sB1NDnd0m", - "expanded_url": "https://github.com/AKB428/YahooAuctionBot", - "display_url": "github.com/AKB428/YahooAu…", - "indices": [ - 0, - 23 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 5, - "friends_count": 24, - "listed_count": 0, - "created_at": "Sun Jan 05 20:10:56 +0000 2014", - "favourites_count": 1, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 199546, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/419927606146789376/vko-kd6Q_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/419927606146789376/vko-kd6Q_normal.jpeg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [ - { - "text": "一眼レフ", - "indices": [ - 95, - 100 - ] - } - ], - "symbols": [], - "urls": [ - { - "url": "http://t.co/4WK1f6V2n6", - "expanded_url": "http://atq.ck.valuecommerce.com/servlet/atq/referral?sid=2219441&pid=877510753&vcptn=auct/p/RJH492.PLqoLQQx1Jy8U9LE-&vc_url=http://page8.auctions.yahoo.co.jp/jp/auction/h192024356", - "display_url": "atq.ck.valuecommerce.com/servlet/atq/re…", - "indices": [ - 49, - 71 - ] - } - ], - "user_mentions": [], - "media": [ - { - "id": 505874882828046340, - "id_str": "505874882828046336", - "indices": [ - 101, - 123 - ], - "media_url": "http://pbs.twimg.com/media/BwU6hpPCEAAxnpq.jpg", - "media_url_https": "https://pbs.twimg.com/media/BwU6hpPCEAAxnpq.jpg", - "url": "http://t.co/PcSaXzfHMW", - "display_url": "pic.twitter.com/PcSaXzfHMW", - "expanded_url": "http://twitter.com/AuctionCamera/status/505874883067129857/photo/1", - "type": "photo", - "sizes": { - "large": { - "w": 600, - "h": 450, - "resize": "fit" - }, - "medium": { - "w": 600, - "h": 450, - "resize": "fit" - }, - "thumb": { - "w": 150, - "h": 150, - "resize": "crop" - }, - "small": { - "w": 340, - "h": 255, - "resize": "fit" - } - } - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:05 +0000 2014", - "id": 505874882995826700, - "id_str": "505874882995826689", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "ヤバすぎる!!ギネス世界記録", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2762405780, - "id_str": "2762405780", - "name": "ヤバすぎる!!ギネス世界記録", - "screen_name": "yabai_giness", - "location": "", - "description": "世の中には、まだまだ知られていないスゴイ記録があるんです! \r\nそんなギネス世界記録を見つけます☆ \r\nどんどん友達にも教えてあげてくださいねww \r\nヤバイと思ったら RT & フォローを、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 36, - "friends_count": 985, - "listed_count": 0, - "created_at": "Sun Aug 24 13:17:03 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 210, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503531782919045121/NiIC25wL_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503531782919045121/NiIC25wL_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2762405780/1408886328", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:05 +0000 2014", - "id": 505874882870009860, - "id_str": "505874882870009856", - "text": "すごく面白い夢見た。魔法科高校通ってて(別に一科二科の区別ない)クラスメイトにヨセアツメ面子や赤僕の拓也がいて、学校対抗合唱コンクールが開催されたり会場入りの際他校の妨害工作受けたり、拓也が連れてきてた実が人質に取られたりとにかくてんこ盛りだった楽しかった赤僕読みたい手元にない", - "source": "Twitter for Android", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 597357105, - "id_str": "597357105", - "name": "ふじよし", - "screen_name": "fuji_mark", - "location": "多摩動物公園", - "description": "成人腐女子", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 128, - "friends_count": 126, - "listed_count": 6, - "created_at": "Sat Jun 02 10:06:05 +0000 2012", - "favourites_count": 2842, - "utc_offset": 32400, - "time_zone": "Irkutsk", - "geo_enabled": false, - "verified": false, - "statuses_count": 10517, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "0099B9", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme4/bg.gif", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme4/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503553738569560065/D_JW2dCJ_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503553738569560065/D_JW2dCJ_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/597357105/1408864355", - "profile_link_color": "0099B9", - "profile_sidebar_border_color": "5ED4DC", - "profile_sidebar_fill_color": "95E8EC", - "profile_text_color": "3C3940", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:05 +0000 2014", - "id": 505874882228281340, - "id_str": "505874882228281345", - "text": "RT @oen_yakyu: ●継続試合(中京対崇徳)46回~ 9時~\n 〈ラジオ中継〉\n らじる★らじる→大阪放送局を選択→NHK-FM\n●決勝戦(三浦対中京or崇徳) 12時30分~\n 〈ラジオ中継〉\n らじる★らじる→大阪放送局を選択→NHK第一\n ※神奈川の方は普通のラ…", - "source": "twicca", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 18477566, - "id_str": "18477566", - "name": "Natit(なち)@そうだ、トップ行こう", - "screen_name": "natit_yso", - "location": "福岡市の端っこ", - "description": "ヤー・チャイカ。紫宝勢の末席くらいでQMAやってます。\r\n9/13(土)「九州杯」今年も宜しくお願いします!キーワードは「そうだ、トップ、行こう。」\r\nmore → http://t.co/ezuHyjF4Qy \r\n【旅の予定】9/20-22 関西 → 9/23-28 北海道ぐるり", - "url": "http://t.co/ll2yu78DGR", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/ll2yu78DGR", - "expanded_url": "http://qma-kyushu.sakura.ne.jp/", - "display_url": "qma-kyushu.sakura.ne.jp", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [ - { - "url": "http://t.co/ezuHyjF4Qy", - "expanded_url": "http://twpf.jp/natit_yso", - "display_url": "twpf.jp/natit_yso", - "indices": [ - 83, - 105 - ] - } - ] - } - }, - "protected": false, - "followers_count": 591, - "friends_count": 548, - "listed_count": 93, - "created_at": "Tue Dec 30 14:11:44 +0000 2008", - "favourites_count": 11676, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": false, - "verified": false, - "statuses_count": 130145, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "131516", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme14/bg.gif", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme14/bg.gif", - "profile_background_tile": true, - "profile_image_url": "http://pbs.twimg.com/profile_images/1556202861/chibi-Leon_normal.jpg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/1556202861/chibi-Leon_normal.jpg", - "profile_link_color": "009999", - "profile_sidebar_border_color": "EEEEEE", - "profile_sidebar_fill_color": "EFEFEF", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sat Aug 30 23:12:39 +0000 2014", - "id": 505855649196953600, - "id_str": "505855649196953600", - "text": "●継続試合(中京対崇徳)46回~ 9時~\n 〈ラジオ中継〉\n らじる★らじる→大阪放送局を選択→NHK-FM\n●決勝戦(三浦対中京or崇徳) 12時30分~\n 〈ラジオ中継〉\n らじる★らじる→大阪放送局を選択→NHK第一\n ※神奈川の方は普通のラジオのNHK-FMでも", - "source": "Twitter Web Client", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2761692762, - "id_str": "2761692762", - "name": "三浦学苑軟式野球部応援団!", - "screen_name": "oen_yakyu", - "location": "", - "description": "兵庫県で開催される「もう一つの甲子園」こと全国高校軟式野球選手権大会に南関東ブロックから出場する三浦学苑軟式野球部を応援する非公式アカウントです。", - "url": "http://t.co/Cn1tPTsBGY", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/Cn1tPTsBGY", - "expanded_url": "http://www.miura.ed.jp/index.html", - "display_url": "miura.ed.jp/index.html", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 464, - "friends_count": 117, - "listed_count": 4, - "created_at": "Sun Aug 24 07:47:29 +0000 2014", - "favourites_count": 69, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 553, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/504299474445811712/zsxJUmL0_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/504299474445811712/zsxJUmL0_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2761692762/1409069337", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 7, - "favorite_count": 2, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 7, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "oen_yakyu", - "name": "三浦学苑軟式野球部応援団!", - "id": 2761692762, - "id_str": "2761692762", - "indices": [ - 3, - 13 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:05 +0000 2014", - "id": 505874882110824450, - "id_str": "505874882110824448", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "スマホに密封★アニメ画像", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2725976444, - "id_str": "2725976444", - "name": "スマホに密封★アニメ画像", - "screen_name": "sumahoanime", - "location": "", - "description": "なんともめずらしい、いろんなキャラがスマホに閉じ込められています。 \r\nあなたのスマホにマッチする画像が見つかるかも♪ \r\n気に入ったら是非 RT & フォローお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 227, - "friends_count": 1918, - "listed_count": 0, - "created_at": "Tue Aug 12 11:27:54 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 527, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/499155646164393984/l5vSz5zu_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/499155646164393984/l5vSz5zu_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2725976444/1407843121", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:05 +0000 2014", - "id": 505874881297133600, - "id_str": "505874881297133568", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "アナタのそばの身近な危険", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2713926078, - "id_str": "2713926078", - "name": "アナタのそばの身近な危険", - "screen_name": "mijika_kiken", - "location": "", - "description": "知らないうちにやっている危険な行動を見つけて自分を守りましょう。 役に立つと思ったら RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 301, - "friends_count": 1871, - "listed_count": 0, - "created_at": "Thu Aug 07 07:12:50 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 644, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/497279579245907968/Ftvms_HR_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/497279579245907968/Ftvms_HR_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2713926078/1407395683", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:04 +0000 2014", - "id": 505874880294682600, - "id_str": "505874880294682624", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "人気者♥デイジー大好き", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2726199583, - "id_str": "2726199583", - "name": "人気者♥デイジー大好き", - "screen_name": "ninkimono_daosy", - "location": "", - "description": "デイジーの想いを、代わりにつぶやきます♪ \r\nデイジーのかわいい画像やグッズも大好きw \r\n可愛いと思ったら RT & フォローお願いします。 \r\n「非公式アカウントです」", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 190, - "friends_count": 474, - "listed_count": 0, - "created_at": "Tue Aug 12 12:58:33 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 469, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/499178622494576640/EzWKdR_p_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/499178622494576640/EzWKdR_p_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2726199583/1407848478", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:04 +0000 2014", - "id": 505874879392919550, - "id_str": "505874879392919552", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "幸せ話でフル充電しよう", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2721453846, - "id_str": "2721453846", - "name": "幸せ話でフル充電しようww", - "screen_name": "shiawasehanashi", - "location": "", - "description": "私が聞いて心に残った感動エピソードをお届けします。\r\n少しでも多くの人へ届けたいと思います。\r\nいいなと思ったら RT & フォローお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 302, - "friends_count": 1886, - "listed_count": 0, - "created_at": "Sun Aug 10 12:16:25 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 508, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/498444554916216832/ml8EiQka_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/498444554916216832/ml8EiQka_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2721453846/1407673555", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:04 +0000 2014", - "id": 505874879103520800, - "id_str": "505874879103520768", - "text": "RT @Ang_Angel73: 逢坂「くっ…僕の秘められし右目が…!」\n一同「……………。」", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2571968509, - "id_str": "2571968509", - "name": "イイヒト", - "screen_name": "IwiAlohomora", - "location": "草葉の陰", - "description": "大人です。気軽に絡んでくれるとうれしいです! イラスト大好き!(≧∇≦) BF(仮)逢坂紘夢くんにお熱です! マンガも好き♡欲望のままにつぶやきますのでご注意を。雑食♡", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 156, - "friends_count": 165, - "listed_count": 14, - "created_at": "Tue Jun 17 01:18:34 +0000 2014", - "favourites_count": 11926, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 7234, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/504990074862178304/DoBvOb9c_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/504990074862178304/DoBvOb9c_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2571968509/1409106012", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:27:01 +0000 2014", - "id": 505874364596621300, - "id_str": "505874364596621313", - "text": "逢坂「くっ…僕の秘められし右目が…!」\n一同「……………。」", - "source": "Twitter for Android", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1600750194, - "id_str": "1600750194", - "name": "臙脂", - "screen_name": "Ang_Angel73", - "location": "逢坂紘夢のそばに", - "description": "自由、気ままに。詳しくはツイプロ。アイコンはまめせろりちゃんからだよ☆~(ゝ。∂)", - "url": "http://t.co/kKCCwHTaph", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/kKCCwHTaph", - "expanded_url": "http://twpf.jp/Ang_Angel73", - "display_url": "twpf.jp/Ang_Angel73", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 155, - "friends_count": 154, - "listed_count": 10, - "created_at": "Wed Jul 17 11:44:31 +0000 2013", - "favourites_count": 2115, - "utc_offset": 32400, - "time_zone": "Irkutsk", - "geo_enabled": false, - "verified": false, - "statuses_count": 12342, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/378800000027871001/aa764602922050b22bf9ade3741367dc.jpeg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/378800000027871001/aa764602922050b22bf9ade3741367dc.jpeg", - "profile_background_tile": true, - "profile_image_url": "http://pbs.twimg.com/profile_images/500293786287603713/Ywyh69eG_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/500293786287603713/Ywyh69eG_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1600750194/1403879183", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "FFFFFF", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 2, - "favorite_count": 2, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 2, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "Ang_Angel73", - "name": "臙脂", - "id": 1600750194, - "id_str": "1600750194", - "indices": [ - 3, - 15 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:04 +0000 2014", - "id": 505874877933314050, - "id_str": "505874877933314048", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "秘密の本音♥女子編", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2762237088, - "id_str": "2762237088", - "name": "秘密の本音♥女子編", - "screen_name": "honne_jyoshi1", - "location": "", - "description": "普段は言えない「お・ん・なの建前と本音」をつぶやきます。 気になる あの人の本音も、わかるかも!? \r\nわかるって人は RT & フォローを、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 123, - "friends_count": 988, - "listed_count": 0, - "created_at": "Sun Aug 24 12:27:07 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 211, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503519190364332032/BVjS_XBD_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503519190364332032/BVjS_XBD_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2762237088/1408883328", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:04 +0000 2014", - "id": 505874877148958700, - "id_str": "505874877148958721", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "美し過ぎる★色鉛筆アート", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2740047343, - "id_str": "2740047343", - "name": "美し過ぎる★色鉛筆アート", - "screen_name": "bi_iroenpitu", - "location": "", - "description": "ほんとにコレ色鉛筆なの~? \r\n本物と見間違える程のリアリティを御覧ください。 \r\n気に入ったら RT & 相互フォローお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 321, - "friends_count": 1990, - "listed_count": 0, - "created_at": "Sun Aug 17 16:15:05 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 396, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501039950972739585/isigil4V_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501039950972739585/isigil4V_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2740047343/1408292283", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:03 +0000 2014", - "id": 505874876465295360, - "id_str": "505874876465295361", - "text": "【H15-9-4】道路を利用する利益は反射的利益であり、建築基準法に基づいて道路一の指定がなされている私道の敷地所有者に対し、通行妨害行為の排除を求める人格的権利を認めることはできない。→誤。", - "source": "twittbot.net", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1886570281, - "id_str": "1886570281", - "name": "行政法過去問", - "screen_name": "gyosei_goukaku", - "location": "", - "description": "行政書士の本試験問題の過去問(行政法分野)をランダムにつぶやきます。問題は随時追加中です。基本的に相互フォローします。※140字制限の都合上、表現は一部変えてあります。解説も文字数が可能であればなるべく…。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 1554, - "friends_count": 1772, - "listed_count": 12, - "created_at": "Fri Sep 20 13:24:29 +0000 2013", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 14565, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/378800000487791870/0e45e3c089c6b641cdd8d1b6f1ceb8a4_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000487791870/0e45e3c089c6b641cdd8d1b6f1ceb8a4_normal.jpeg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:03 +0000 2014", - "id": 505874876318511100, - "id_str": "505874876318511104", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "K点越えの発想力!!", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2744863153, - "id_str": "2744863153", - "name": "K点越えの発想力!!", - "screen_name": "kgoehassou", - "location": "", - "description": "いったいどうやったら、その領域にたどりつけるのか!? \r\nそんな思わず笑ってしまう別世界の発想力をお届けします♪ \r\nおもしろかったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 76, - "friends_count": 957, - "listed_count": 0, - "created_at": "Tue Aug 19 13:00:08 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 341, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501715651686178816/Fgpe0B8M_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501715651686178816/Fgpe0B8M_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744863153/1408453328", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:03 +0000 2014", - "id": 505874875521581060, - "id_str": "505874875521581056", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "血液型の真実2", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2698625690, - "id_str": "2698625690", - "name": "血液型の真実", - "screen_name": "ketueki_sinjitu", - "location": "", - "description": "やっぱりそうだったのか~♪\r\n意外な、あの人の裏側を見つけます。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 193, - "friends_count": 1785, - "listed_count": 1, - "created_at": "Fri Aug 01 16:11:40 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 769, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/495241446706790400/h_0DSFPG_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/495241446706790400/h_0DSFPG_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2698625690/1406911319", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:03 +0000 2014", - "id": 505874874712072200, - "id_str": "505874874712072192", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "やっぱり神が??を作る時", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2714868440, - "id_str": "2714868440", - "name": "やっぱり神が??を作る時", - "screen_name": "yahari_kamiga", - "location": "", - "description": "やっぱり今日も、神は何かを作ろうとしています 笑。 どうやって作っているのかわかったら RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 243, - "friends_count": 1907, - "listed_count": 0, - "created_at": "Thu Aug 07 16:12:33 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 590, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/497416102108884992/NRMEbKaT_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/497416102108884992/NRMEbKaT_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2714868440/1407428237", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:03 +0000 2014", - "id": 505874874275864600, - "id_str": "505874874275864576", - "text": "RT @takuramix: 福島第一原発の構内地図がこちら。\nhttp://t.co/ZkU4TZCGPG\nどう見ても、1号機。\nRT @Lightworker19: 【大拡散】  福島第一原発 4号機 爆発動画 40秒~  http://t.co/lmlgp38fgZ", - "source": "ツイタマ", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 62525372, - "id_str": "62525372", - "name": "NANCY-MOON☆ひよこちゃん☆", - "screen_name": "nancy_moon_703", - "location": "JAPAN", - "description": "【無断転載禁止・コピペ禁止・非公式RT禁止】【必読!】⇒ http://t.co/nuUvfUVD 今現在活動中の東方神起YUNHO&CHANGMINの2人を全力で応援しています!!(^_-)-☆ ※東方神起及びYUNHO&CHANGMINを応援していない方・鍵付ユーザーのフォローお断り!", - "url": null, - "entities": { - "description": { - "urls": [ - { - "url": "http://t.co/nuUvfUVD", - "expanded_url": "http://goo.gl/SrGLb", - "display_url": "goo.gl/SrGLb", - "indices": [ - 29, - 49 - ] - } - ] - } - }, - "protected": false, - "followers_count": 270, - "friends_count": 328, - "listed_count": 4, - "created_at": "Mon Aug 03 14:22:24 +0000 2009", - "favourites_count": 3283, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": false, - "verified": false, - "statuses_count": 180310, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "642D8B", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/470849781397336064/ltM6EdFn.jpeg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/470849781397336064/ltM6EdFn.jpeg", - "profile_background_tile": true, - "profile_image_url": "http://pbs.twimg.com/profile_images/3699005246/9ba2e306518d296b68b7cbfa5e4ce4e6_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/3699005246/9ba2e306518d296b68b7cbfa5e4ce4e6_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/62525372/1401094223", - "profile_link_color": "FF0000", - "profile_sidebar_border_color": "FFFFFF", - "profile_sidebar_fill_color": "F065A8", - "profile_text_color": "080808", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sat Aug 30 21:21:33 +0000 2014", - "id": 505827689660313600, - "id_str": "505827689660313600", - "text": "福島第一原発の構内地図がこちら。\nhttp://t.co/ZkU4TZCGPG\nどう見ても、1号機。\nRT @Lightworker19: 【大拡散】  福島第一原発 4号機 爆発動画 40秒~  http://t.co/lmlgp38fgZ", - "source": "TweetDeck", - "truncated": false, - "in_reply_to_status_id": 505774460910043140, - "in_reply_to_status_id_str": "505774460910043136", - "in_reply_to_user_id": 238157843, - "in_reply_to_user_id_str": "238157843", - "in_reply_to_screen_name": "Lightworker19", - "user": { - "id": 29599253, - "id_str": "29599253", - "name": "タクラミックス", - "screen_name": "takuramix", - "location": "i7", - "description": "私の機能一覧:歌う、演劇、ネットワークエンジニア、ライター、プログラマ、翻訳、シルバーアクセサリ、……何をやってる人かは良くわからない人なので、「機能」が欲しい人は私にがっかりするでしょう。私って人間に御用があるなら別ですが。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 5136, - "friends_count": 724, - "listed_count": 335, - "created_at": "Wed Apr 08 01:10:58 +0000 2009", - "favourites_count": 21363, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": false, - "verified": false, - "statuses_count": 70897, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/2049751947/takuramix1204_normal.jpg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/2049751947/takuramix1204_normal.jpg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 1, - "favorite_count": 1, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/ZkU4TZCGPG", - "expanded_url": "http://www.tepco.co.jp/nu/fukushima-np/review/images/review1_01.gif", - "display_url": "tepco.co.jp/nu/fukushima-n…", - "indices": [ - 17, - 39 - ] - }, - { - "url": "http://t.co/lmlgp38fgZ", - "expanded_url": "http://youtu.be/gDXEhyuVSDk", - "display_url": "youtu.be/gDXEhyuVSDk", - "indices": [ - 99, - 121 - ] - } - ], - "user_mentions": [ - { - "screen_name": "Lightworker19", - "name": "Lightworker", - "id": 238157843, - "id_str": "238157843", - "indices": [ - 54, - 68 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - "retweet_count": 1, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/ZkU4TZCGPG", - "expanded_url": "http://www.tepco.co.jp/nu/fukushima-np/review/images/review1_01.gif", - "display_url": "tepco.co.jp/nu/fukushima-n…", - "indices": [ - 32, - 54 - ] - }, - { - "url": "http://t.co/lmlgp38fgZ", - "expanded_url": "http://youtu.be/gDXEhyuVSDk", - "display_url": "youtu.be/gDXEhyuVSDk", - "indices": [ - 114, - 136 - ] - } - ], - "user_mentions": [ - { - "screen_name": "takuramix", - "name": "タクラミックス", - "id": 29599253, - "id_str": "29599253", - "indices": [ - 3, - 13 - ] - }, - { - "screen_name": "Lightworker19", - "name": "Lightworker", - "id": 238157843, - "id_str": "238157843", - "indices": [ - 69, - 83 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:03 +0000 2014", - "id": 505874873961308160, - "id_str": "505874873961308160", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "やっぱりアナ雪が好き♥", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2714052962, - "id_str": "2714052962", - "name": "やっぱりアナ雪が好き♥", - "screen_name": "anayuki_suki", - "location": "", - "description": "なんだかんだ言ってもやっぱりアナ雪が好きなんですよね~♪ \r\n私も好きって人は RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 368, - "friends_count": 1826, - "listed_count": 1, - "created_at": "Thu Aug 07 08:29:13 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 670, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/497299646662705153/KMo3gkv7_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/497299646662705153/KMo3gkv7_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2714052962/1407400477", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "zh" - }, - "created_at": "Sun Aug 31 00:29:03 +0000 2014", - "id": 505874873759977500, - "id_str": "505874873759977473", - "text": "四川盆地江淮等地将有强降雨 开学日多地将有雨:   中新网8月31日电 据中央气象台消息,江淮东部、四川盆地东北部等地今天(31日)又将迎来一场暴雨或大暴雨天气。明天9月1日,是中小学生开学的日子。预计明天,内蒙古中部、... http://t.co/toQgVlXPyH", - "source": "twitterfeed", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2281979863, - "id_str": "2281979863", - "name": "News 24h China", - "screen_name": "news24hchn", - "location": "", - "description": "", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 719, - "friends_count": 807, - "listed_count": 7, - "created_at": "Wed Jan 08 10:56:04 +0000 2014", - "favourites_count": 0, - "utc_offset": 7200, - "time_zone": "Amsterdam", - "geo_enabled": false, - "verified": false, - "statuses_count": 94782, - "lang": "it", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/452558963754561536/QPID3isM.jpeg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/452558963754561536/QPID3isM.jpeg", - "profile_background_tile": true, - "profile_image_url": "http://pbs.twimg.com/profile_images/439031926569979904/SlBH9iMg_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/439031926569979904/SlBH9iMg_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2281979863/1393508427", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "FFFFFF", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/toQgVlXPyH", - "expanded_url": "http://news24h.allnews24h.com/FX54", - "display_url": "news24h.allnews24h.com/FX54", - "indices": [ - 114, - 136 - ] - } - ], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "zh" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:03 +0000 2014", - "id": 505874873248268300, - "id_str": "505874873248268288", - "text": "@Take3carnifex それは大変!一大事!命に関わります!\n是非うちに受診して下さい!", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": 505874353716600800, - "in_reply_to_status_id_str": "505874353716600832", - "in_reply_to_user_id": 535179785, - "in_reply_to_user_id_str": "535179785", - "in_reply_to_screen_name": "Take3carnifex", - "user": { - "id": 226897125, - "id_str": "226897125", - "name": "ひかり@hack", - "screen_name": "hikari_thirteen", - "location": "", - "description": "hackというバンドで、ギターを弾いています。 モンハンとポケモンが好き。 \nSPRING WATER リードギター(ヘルプ)\nROCK OUT レギュラーDJ", - "url": "http://t.co/SQLZnvjVxB", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/SQLZnvjVxB", - "expanded_url": "http://s.ameblo.jp/hikarihikarimay", - "display_url": "s.ameblo.jp/hikarihikarimay", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 296, - "friends_count": 348, - "listed_count": 3, - "created_at": "Wed Dec 15 10:51:51 +0000 2010", - "favourites_count": 33, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": false, - "verified": false, - "statuses_count": 3293, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "131516", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme14/bg.gif", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme14/bg.gif", - "profile_background_tile": true, - "profile_image_url": "http://pbs.twimg.com/profile_images/378800000504584690/8ccba98eda8c0fd1d15a74e401f621d1_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000504584690/8ccba98eda8c0fd1d15a74e401f621d1_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/226897125/1385551752", - "profile_link_color": "009999", - "profile_sidebar_border_color": "EEEEEE", - "profile_sidebar_fill_color": "EFEFEF", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "Take3carnifex", - "name": "Take3", - "id": 535179785, - "id_str": "535179785", - "indices": [ - 0, - 14 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:03 +0000 2014", - "id": 505874873223110660, - "id_str": "505874873223110656", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "今どき女子高生の謎w", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2744236873, - "id_str": "2744236873", - "name": "今どき女子高生の謎w", - "screen_name": "imadokijoshiko", - "location": "", - "description": "思わず耳を疑う男性の方の夢を壊してしまう、\r\n女子高生達のディープな世界を見てください☆ \r\nおもしろいと思ったら RT & 相互フォローでお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 79, - "friends_count": 973, - "listed_count": 0, - "created_at": "Tue Aug 19 07:06:47 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 354, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501627015980535808/avWBgkDh_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501627015980535808/avWBgkDh_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744236873/1408432455", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:02 +0000 2014", - "id": 505874872463925250, - "id_str": "505874872463925248", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "私の理想の男性像", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2761782601, - "id_str": "2761782601", - "name": "私の理想の男性像", - "screen_name": "risou_dansei", - "location": "", - "description": "こんな男性♥ ほんとにいるのかしら!? \r\n「いたらいいのになぁ」っていう理想の男性像をを、私目線でつぶやきます。 \r\nいいなと思った人は RT & フォローお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 69, - "friends_count": 974, - "listed_count": 0, - "created_at": "Sun Aug 24 08:03:32 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 208, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503452833719410688/tFU509Yk_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503452833719410688/tFU509Yk_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2761782601/1408867519", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:02 +0000 2014", - "id": 505874871713157100, - "id_str": "505874871713157120", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "激アツ★6秒動画", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2725690658, - "id_str": "2725690658", - "name": "激アツ★6秒動画", - "screen_name": "gekiatu_6byou", - "location": "", - "description": "話題の6秒動画! \r\n思わず「ほんとかよっ」てツッコんでしまう内容のオンパレード! \r\nおもしろかったら、是非 RT & フォローお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 195, - "friends_count": 494, - "listed_count": 0, - "created_at": "Tue Aug 12 08:17:29 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 477, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/499107997444886528/3rl6FrIk_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/499107997444886528/3rl6FrIk_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2725690658/1407832963", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:02 +0000 2014", - "id": 505874871616671740, - "id_str": "505874871616671744", - "text": "爆笑ww珍解答集!\n先生のツメの甘さと生徒のセンスを感じる一問一答だとFBでも話題!!\nうどん天下一決定戦ウィンドウズ9三重高校竹内由恵アナ花火保険\nhttp://t.co/jRWJt8IrSB http://t.co/okrAoxSbt0", - "source": "笑える博物館", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2748747362, - "id_str": "2748747362", - "name": "笑える博物館", - "screen_name": "waraeru_kan", - "location": "", - "description": "", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 19, - "friends_count": 10, - "listed_count": 0, - "created_at": "Wed Aug 20 11:11:04 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 15137, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://abs.twimg.com/sticky/default_profile_images/default_profile_4_normal.png", - "profile_image_url_https": "https://abs.twimg.com/sticky/default_profile_images/default_profile_4_normal.png", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": true, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/jRWJt8IrSB", - "expanded_url": "http://bit.ly/1qBa1nl", - "display_url": "bit.ly/1qBa1nl", - "indices": [ - 75, - 97 - ] - } - ], - "user_mentions": [], - "media": [ - { - "id": 505874871344066560, - "id_str": "505874871344066560", - "indices": [ - 98, - 120 - ], - "media_url": "http://pbs.twimg.com/media/BwU6g-dCcAALxAW.png", - "media_url_https": "https://pbs.twimg.com/media/BwU6g-dCcAALxAW.png", - "url": "http://t.co/okrAoxSbt0", - "display_url": "pic.twitter.com/okrAoxSbt0", - "expanded_url": "http://twitter.com/waraeru_kan/status/505874871616671744/photo/1", - "type": "photo", - "sizes": { - "small": { - "w": 340, - "h": 425, - "resize": "fit" - }, - "thumb": { - "w": 150, - "h": 150, - "resize": "crop" - }, - "large": { - "w": 600, - "h": 750, - "resize": "fit" - }, - "medium": { - "w": 600, - "h": 750, - "resize": "fit" - } - } - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:02 +0000 2014", - "id": 505874871268540400, - "id_str": "505874871268540416", - "text": "@nasan_arai \n名前→なーさん\n第一印象→誰。(´・_・`)\n今の印象→れいら♡\nLINE交換できる?→してる(「・ω・)「\n好きなところ→可愛い優しい優しい優しい\n最後に一言→なーさん好き〜(´・_・`)♡GEM現場おいでね(´・_・`)♡\n\n#ふぁぼした人にやる", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": 1717603286, - "in_reply_to_user_id_str": "1717603286", - "in_reply_to_screen_name": "nasan_arai", - "user": { - "id": 2417626784, - "id_str": "2417626784", - "name": "✩.ゆきଘ(*´꒳`)", - "screen_name": "Ymaaya_gem", - "location": "", - "description": "⁽⁽٩( ᐖ )۶⁾⁾ ❤︎ 武 田 舞 彩 ❤︎ ₍₍٩( ᐛ )۶₎₎", - "url": "http://t.co/wR0Qb76TbB", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/wR0Qb76TbB", - "expanded_url": "http://twpf.jp/Ymaaya_gem", - "display_url": "twpf.jp/Ymaaya_gem", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 198, - "friends_count": 245, - "listed_count": 1, - "created_at": "Sat Mar 29 16:03:06 +0000 2014", - "favourites_count": 3818, - "utc_offset": null, - "time_zone": null, - "geo_enabled": true, - "verified": false, - "statuses_count": 8056, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/505516858816987136/4gFGjHzu_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/505516858816987136/4gFGjHzu_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2417626784/1407764793", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [ - { - "text": "ふぁぼした人にやる", - "indices": [ - 128, - 138 - ] - } - ], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "nasan_arai", - "name": "なーさん", - "id": 1717603286, - "id_str": "1717603286", - "indices": [ - 0, - 11 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:02 +0000 2014", - "id": 505874871218225150, - "id_str": "505874871218225152", - "text": "\"ソードマスター\"剣聖カミイズミ (CV:緑川光)-「ソードマスター」のアスタリスク所持者\n第一師団団長にして「剣聖」の称号を持つ剣士。イデアの剣の師匠。 \n敵味方からも尊敬される一流の武人。", - "source": "twittbot.net", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1435517814, - "id_str": "1435517814", - "name": "俺、関係ないよ?", - "screen_name": "BDFF_LOVE", - "location": "ルクセンダルクorリングアベルさんの隣", - "description": "自分なりに生きる人、最後まであきらめないの。でも、フォローありがとう…。@ringo_BDFFLOVE ←は、妹です。時々、会話します。「現在BOTで、BDFFのこと呟くよ!」夜は、全滅 「BDFFプレイ中」詳しくは、ツイプロみてください!(絶対)", - "url": "http://t.co/5R4dzpbWX2", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/5R4dzpbWX2", - "expanded_url": "http://twpf.jp/BDFF_LOVE", - "display_url": "twpf.jp/BDFF_LOVE", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 1066, - "friends_count": 1799, - "listed_count": 6, - "created_at": "Fri May 17 12:33:23 +0000 2013", - "favourites_count": 1431, - "utc_offset": 32400, - "time_zone": "Irkutsk", - "geo_enabled": true, - "verified": false, - "statuses_count": 6333, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/505696320380612608/qvaxb_zx_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/505696320380612608/qvaxb_zx_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1435517814/1409401948", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:02 +0000 2014", - "id": 505874871130136600, - "id_str": "505874871130136576", - "text": "闇「リンと付き合うに当たって歳の差以外にもいろいろ壁があったんだよ。愛し隊の妨害とか風紀厨の生徒会長とか…」\n一号「リンちゃんを泣かせたらシメるかんね!」\n二号「リンちゃんにやましい事したら×す…」\n執行部「不純な交際は僕が取り締まろうじゃないか…」\n闇「(消される)」", - "source": "twittbot.net", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2386208737, - "id_str": "2386208737", - "name": "闇未来Bot", - "screen_name": "StxRinFbot", - "location": "DIVAルーム", - "description": "ProjectDIVAのモジュール・ストレンジダーク×鏡音リンFutureStyleの自己満足非公式Bot マセレン仕様。CP要素あります。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 7, - "friends_count": 2, - "listed_count": 0, - "created_at": "Thu Mar 13 02:58:09 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 4876, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/443948925351755776/6rmljL5C_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/443948925351755776/6rmljL5C_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2386208737/1396259004", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:02 +0000 2014", - "id": 505874870933016600, - "id_str": "505874870933016576", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "絶品!!スイーツ天国", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2725681663, - "id_str": "2725681663", - "name": "絶品!!スイーツ天国", - "screen_name": "suitestengoku", - "location": "", - "description": "美味しそうなスイーツって、見てるだけで幸せな気分になれますね♪\r\nそんな素敵なスイーツに出会いたいです。\r\n食べたいと思ったら是非 RT & フォローお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 401, - "friends_count": 1877, - "listed_count": 1, - "created_at": "Tue Aug 12 07:43:52 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 554, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/499099533507178496/g5dNpArt_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/499099533507178496/g5dNpArt_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2725681663/1407829743", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:02 +0000 2014", - "id": 505874870148669440, - "id_str": "505874870148669440", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "電車厳禁!!おもしろ話", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2699667800, - "id_str": "2699667800", - "name": "電車厳禁!!おもしろ話w", - "screen_name": "dengeki_omoro", - "location": "", - "description": "日常のオモシロくて笑える場面を探します♪\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 461, - "friends_count": 1919, - "listed_count": 0, - "created_at": "Sat Aug 02 02:16:32 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 728, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/495400387961036800/BBMb_hcG_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/495400387961036800/BBMb_hcG_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2699667800/1406947654", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:02 +0000 2014", - "id": 505874869339189250, - "id_str": "505874869339189249", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "笑えるwwランキング2", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2695745652, - "id_str": "2695745652", - "name": "笑えるwwランキング", - "screen_name": "wara_runk", - "location": "", - "description": "知ってると使えるランキングを探そう。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 314, - "friends_count": 1943, - "listed_count": 1, - "created_at": "Thu Jul 31 13:51:57 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 737, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/494844659856728064/xBQfnm5J_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/494844659856728064/xBQfnm5J_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2695745652/1406815103", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:02 +0000 2014", - "id": 505874868533854200, - "id_str": "505874868533854209", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "スニーカー大好き★図鑑", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2707963890, - "id_str": "2707963890", - "name": "スニーカー大好き★図鑑", - "screen_name": "sunikar_daisuki", - "location": "", - "description": "スニーカー好きを見つけて仲間になろう♪\r\n気に入ったら RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 394, - "friends_count": 1891, - "listed_count": 0, - "created_at": "Tue Aug 05 01:54:28 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 642, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/496474952631996416/f0C_u3_u_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/496474952631996416/f0C_u3_u_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2707963890/1407203869", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "zh" - }, - "created_at": "Sun Aug 31 00:29:01 +0000 2014", - "id": 505874867997380600, - "id_str": "505874867997380608", - "text": "\"@BelloTexto: ¿Quieres ser feliz? \n一\"No stalkees\" \n一\"No stalkees\" \n一\"No stalkees\" \n一\"No stalkees\" \n一\"No stalkees\" \n一\"No stalkees\".\"", - "source": "Twitter for Android", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2249378935, - "id_str": "2249378935", - "name": "Maggie Becerril ", - "screen_name": "maggdesie", - "location": "", - "description": "cambiando la vida de las personas.", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 120, - "friends_count": 391, - "listed_count": 0, - "created_at": "Mon Dec 16 21:56:49 +0000 2013", - "favourites_count": 314, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 1657, - "lang": "es", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/505093371665604608/K0x_LV2y_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/505093371665604608/K0x_LV2y_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2249378935/1409258479", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "BelloTexto", - "name": "Indirectas... ✉", - "id": 833083404, - "id_str": "833083404", - "indices": [ - 1, - 12 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "zh" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:01 +0000 2014", - "id": 505874867720183800, - "id_str": "505874867720183808", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "ザ・異性の裏の顔", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2719746578, - "id_str": "2719746578", - "name": "ザ・異性の裏の顔", - "screen_name": "iseiuragao", - "location": "", - "description": "異性について少し学ぶことで、必然的にモテるようになる!? 相手を理解することで見えてくるもの「それは・・・●●」 いい内容だと思ったら RT & フォローもお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 238, - "friends_count": 1922, - "listed_count": 0, - "created_at": "Sat Aug 09 17:18:43 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 532, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/498157077726900224/tW8q4di__normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/498157077726900224/tW8q4di__normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2719746578/1407604947", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:01 +0000 2014", - "id": 505874866910687200, - "id_str": "505874866910687233", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "超w美女☆アルバム", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2744054334, - "id_str": "2744054334", - "name": "超w美女☆アルバム", - "screen_name": "bijyoalbum", - "location": "", - "description": "「おお~っ!いいね~」って、思わず言ってしまう、美女を見つけます☆ \r\nタイプだと思ったら RT & 相互フォローでお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 45, - "friends_count": 966, - "listed_count": 0, - "created_at": "Tue Aug 19 05:36:48 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 352, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501604413312491520/GP66eKWr_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501604413312491520/GP66eKWr_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744054334/1408426814", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:01 +0000 2014", - "id": 505874866105376800, - "id_str": "505874866105376769", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "男に見せない女子の裏生態", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2744261238, - "id_str": "2744261238", - "name": "男に見せない女子の裏生態", - "screen_name": "jyoshiuraseitai", - "location": "", - "description": "男の知らない女子ならではのあるある☆ \r\nそんな生々しい女子の生態をつぶやきます。 \r\nわかる~って人は RT & フォローでお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 203, - "friends_count": 967, - "listed_count": 0, - "created_at": "Tue Aug 19 08:01:28 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 348, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501641354804346880/Uh1-n1LD_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501641354804346880/Uh1-n1LD_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744261238/1408435630", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:01 +0000 2014", - "id": 505874865354584060, - "id_str": "505874865354584064", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "驚きの動物たちの生態", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2759403146, - "id_str": "2759403146", - "name": "驚きの動物たちの生態", - "screen_name": "soubutu_seitai", - "location": "", - "description": "「おお~っ」と 言われるような、動物の生態をツイートします♪ \r\n知っていると、あなたも人気者に!? \r\nおもしろかったら RT & フォローを、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 67, - "friends_count": 954, - "listed_count": 0, - "created_at": "Sat Aug 23 16:39:31 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 219, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503220468128567296/Z8mGDIBS_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503220468128567296/Z8mGDIBS_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2759403146/1408812130", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:01 +0000 2014", - "id": 505874864603820000, - "id_str": "505874864603820032", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "モテ女子★ファションの秘密", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2706659820, - "id_str": "2706659820", - "name": "モテ女子★ファションの秘密", - "screen_name": "mote_woman", - "location": "", - "description": "オシャレかわいい♥モテ度UPの注目アイテムを見つけます。\r\n気に入ったら RT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 217, - "friends_count": 1806, - "listed_count": 0, - "created_at": "Mon Aug 04 14:30:24 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 682, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/496303370936668161/s7xP8rTy_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/496303370936668161/s7xP8rTy_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2706659820/1407163059", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:00 +0000 2014", - "id": 505874863874007040, - "id_str": "505874863874007040", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "男女の違いを解明する", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2761896468, - "id_str": "2761896468", - "name": "男女の違いを解明する", - "screen_name": "danjyonotigai1", - "location": "", - "description": "意外と理解できていない男女それぞれの事情。 \r\n「えっ マジで!?」と驚くような、男女の習性をつぶやきます♪ ためになったら、是非 RT & フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 82, - "friends_count": 992, - "listed_count": 0, - "created_at": "Sun Aug 24 09:47:44 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 237, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503479057380413441/zDLu5Z9o_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503479057380413441/zDLu5Z9o_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2761896468/1408873803", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:00 +0000 2014", - "id": 505874862900924400, - "id_str": "505874862900924416", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "神レベル★極限の発想", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2744950735, - "id_str": "2744950735", - "name": "神レベル★極限の発想", - "screen_name": "kamihassou", - "location": "", - "description": "見ているだけで、本気がビシバシ伝わってきます! \r\n人生のヒントになるような、そんな究極の発想を集めています。 \r\nいいなと思ったら RT & 相互フォローで、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 84, - "friends_count": 992, - "listed_count": 0, - "created_at": "Tue Aug 19 13:36:05 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 343, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501725053189226496/xZNOTYz2_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501725053189226496/xZNOTYz2_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744950735/1408455571", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:00 +0000 2014", - "id": 505874862397591550, - "id_str": "505874862397591552", - "text": "@kaoritoxx そうよ!あたしはそう思うようにしておる。いま職場一やけとる気がする(°_°)!満喫幸せ焼け!!wあー、なるほどね!毎回そうだよね!ティアラちゃんみにいってるもんね♡五月と九月恐ろしい、、、\nハリポタエリアはいった??", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": 505838547308277760, - "in_reply_to_status_id_str": "505838547308277761", - "in_reply_to_user_id": 796000214, - "in_reply_to_user_id_str": "796000214", - "in_reply_to_screen_name": "kaoritoxx", - "user": { - "id": 2256249487, - "id_str": "2256249487", - "name": "はあちゃん@海賊同盟中", - "screen_name": "onepiece_24", - "location": "どえすえろぉたんの助手兼ね妹(願望)", - "description": "ONE PIECE愛しすぎて今年23ちゃい(歴14年目)ゾロ様に一途だったのにロー、このやろー。ロビンちゃんが幸せになればいい。ルフィは無条件にすき。ゾロビン、ローロビ、ルロビ♡usj、声優さん、コナン、進撃、クレしん、H x Hも好き♩", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 415, - "friends_count": 384, - "listed_count": 3, - "created_at": "Sat Dec 21 09:37:25 +0000 2013", - "favourites_count": 1603, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 9636, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501686340564418561/hMQFN4vD_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501686340564418561/hMQFN4vD_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2256249487/1399987924", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "kaoritoxx", - "name": "かおちゃん", - "id": 796000214, - "id_str": "796000214", - "indices": [ - 0, - 10 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:00 +0000 2014", - "id": 505874861973991400, - "id_str": "505874861973991424", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "恋愛仙人", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2698885082, - "id_str": "2698885082", - "name": "恋愛仙人", - "screen_name": "renai_sennin", - "location": "", - "description": "豊富でステキな恋愛経験を、シェアしましょう。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 618, - "friends_count": 1847, - "listed_count": 1, - "created_at": "Fri Aug 01 18:09:38 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 726, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/495272204641132544/GNA18aOg_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/495272204641132544/GNA18aOg_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2698885082/1406917096", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:00 +0000 2014", - "id": 505874861881700350, - "id_str": "505874861881700353", - "text": "@itsukibot_ 一稀の俺のソーセージをペロペロする音はデカイ", - "source": "jigtwi", - "truncated": false, - "in_reply_to_status_id": 505871017428795400, - "in_reply_to_status_id_str": "505871017428795392", - "in_reply_to_user_id": 141170845, - "in_reply_to_user_id_str": "141170845", - "in_reply_to_screen_name": "itsukibot_", - "user": { - "id": 2184752048, - "id_str": "2184752048", - "name": "アンドー", - "screen_name": "55dakedayo", - "location": "", - "description": "", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 15, - "friends_count": 24, - "listed_count": 0, - "created_at": "Sat Nov 09 17:42:22 +0000 2013", - "favourites_count": 37249, - "utc_offset": 32400, - "time_zone": "Irkutsk", - "geo_enabled": false, - "verified": false, - "statuses_count": 21070, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://abs.twimg.com/sticky/default_profile_images/default_profile_3_normal.png", - "profile_image_url_https": "https://abs.twimg.com/sticky/default_profile_images/default_profile_3_normal.png", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": true, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "itsukibot_", - "name": "前田一稀", - "id": 141170845, - "id_str": "141170845", - "indices": [ - 0, - 11 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:00 +0000 2014", - "id": 505874861185437700, - "id_str": "505874861185437697", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "あの伝説の名ドラマ&名場面", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2706951979, - "id_str": "2706951979", - "name": "あの伝説の名ドラマ&名場面", - "screen_name": "densetunodorama", - "location": "", - "description": "誰にでも記憶に残る、ドラマの名場面があると思います。そんな感動のストーリーを、もう一度わかちあいたいです。\r\n「これ知ってる!」とか「あ~懐かしい」と思ったら RT & 相互フォローでみなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 300, - "friends_count": 1886, - "listed_count": 0, - "created_at": "Mon Aug 04 16:38:25 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 694, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/496335892152209408/fKzb8Nv3_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/496335892152209408/fKzb8Nv3_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2706951979/1407170704", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:29:00 +0000 2014", - "id": 505874860447260700, - "id_str": "505874860447260672", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "マジで食べたい♥ケーキ特集", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2724328646, - "id_str": "2724328646", - "name": "マジで食べたい♥ケーキ特集", - "screen_name": "tabetaicake1", - "location": "", - "description": "女性の目線から見た、美味しそうなケーキを探し求めています。\r\n見てるだけで、あれもコレも食べたくなっちゃう♪\r\n美味しそうだと思ったら、是非 RT & フォローお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 158, - "friends_count": 1907, - "listed_count": 0, - "created_at": "Mon Aug 11 17:15:22 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 493, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/498881289844293632/DAa9No9M_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/498881289844293632/DAa9No9M_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2724328646/1407777704", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:59 +0000 2014", - "id": 505874859662925800, - "id_str": "505874859662925824", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "アディダス★マニア", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2704003662, - "id_str": "2704003662", - "name": "アディダス★マニア", - "screen_name": "adi_mania11", - "location": "", - "description": "素敵なアディダスのアイテムを見つけたいです♪\r\n気に入ってもらえたららRT & 相互フォローで みなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 340, - "friends_count": 1851, - "listed_count": 0, - "created_at": "Sun Aug 03 12:26:37 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 734, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/495911561781727235/06QAMVrR_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/495911561781727235/06QAMVrR_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2704003662/1407069046", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:59 +0000 2014", - "id": 505874858920513540, - "id_str": "505874858920513537", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "萌えペット大好き", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2719061228, - "id_str": "2719061228", - "name": "萌えペット大好き", - "screen_name": "moe_pet1", - "location": "", - "description": "かわいいペットを見るのが趣味です♥そんな私と一緒にいやされたい人いませんか?かわいいと思ったら RT & フォローもお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 289, - "friends_count": 1812, - "listed_count": 0, - "created_at": "Sat Aug 09 10:20:25 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 632, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/498051549537386496/QizThq7N_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/498051549537386496/QizThq7N_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2719061228/1407581287", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:59 +0000 2014", - "id": 505874858115219460, - "id_str": "505874858115219456", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "恋愛の教科書 ", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2744344514, - "id_str": "2744344514", - "name": "恋愛の教科書", - "screen_name": "renaikyoukasyo", - "location": "", - "description": "もっと早く知っとくべきだった~!知っていればもっと上手くいく♪ \r\n今すぐ役立つ恋愛についての雑学やマメ知識をお届けします。 \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 124, - "friends_count": 955, - "listed_count": 0, - "created_at": "Tue Aug 19 08:32:45 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 346, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501655512018997248/7SznYGWi_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501655512018997248/7SznYGWi_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744344514/1408439001", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:59 +0000 2014", - "id": 505874857335074800, - "id_str": "505874857335074816", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "オモロすぎる★学生の日常", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2699365116, - "id_str": "2699365116", - "name": "オモロすぎる★学生の日常", - "screen_name": "omorogakusei", - "location": "", - "description": "楽しすぎる学生の日常を探していきます。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 289, - "friends_count": 1156, - "listed_count": 2, - "created_at": "Fri Aug 01 23:35:18 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 770, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/495353473886478336/S-4B_RVl_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/495353473886478336/S-4B_RVl_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2699365116/1406936481", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:59 +0000 2014", - "id": 505874856605257700, - "id_str": "505874856605257728", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "憧れの★インテリア図鑑", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2721907602, - "id_str": "2721907602", - "name": "憧れの★インテリア図鑑", - "screen_name": "akogareinteria", - "location": "", - "description": "自分の住む部屋もこんなふうにしてみたい♪ \r\nそんな素敵なインテリアを、日々探していますw \r\nいいなと思ったら RT & 相互フォローお願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 298, - "friends_count": 1925, - "listed_count": 0, - "created_at": "Sun Aug 10 15:59:13 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 540, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/498499374423343105/Wi_izHvT_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/498499374423343105/Wi_izHvT_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2721907602/1407686543", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:59 +0000 2014", - "id": 505874856089378800, - "id_str": "505874856089378816", - "text": "天冥の標 VI 宿怨 PART1 / 小川 一水\nhttp://t.co/fXIgRt4ffH\n \n#キンドル #天冥の標VI宿怨PART1", - "source": "waromett", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1953404612, - "id_str": "1953404612", - "name": "わろめっと", - "screen_name": "waromett", - "location": "", - "description": "たのしいついーとしょうかい", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 16980, - "friends_count": 16983, - "listed_count": 18, - "created_at": "Fri Oct 11 05:49:57 +0000 2013", - "favourites_count": 3833, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": false, - "verified": false, - "statuses_count": 98655, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "352726", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme5/bg.gif", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme5/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/378800000578908101/14c4744c7aa34b1f8bbd942b78e59385_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000578908101/14c4744c7aa34b1f8bbd942b78e59385_normal.jpeg", - "profile_link_color": "D02B55", - "profile_sidebar_border_color": "829D5E", - "profile_sidebar_fill_color": "99CC33", - "profile_text_color": "3E4415", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [ - { - "text": "キンドル", - "indices": [ - 50, - 55 - ] - }, - { - "text": "天冥の標VI宿怨PART1", - "indices": [ - 56, - 70 - ] - } - ], - "symbols": [], - "urls": [ - { - "url": "http://t.co/fXIgRt4ffH", - "expanded_url": "http://j.mp/1kHBOym", - "display_url": "j.mp/1kHBOym", - "indices": [ - 25, - 47 - ] - } - ], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "zh" - }, - "created_at": "Sun Aug 31 00:28:58 +0000 2014", - "id": 505874855770599400, - "id_str": "505874855770599425", - "text": "四川盆地江淮等地将有强降雨 开学日多地将有雨:   中新网8月31日电 据中央气象台消息,江淮东部、四川盆地东北部等地今天(31日)又将迎来一场暴雨或大暴雨天气。明天9月1日,是中小学生开学的日子。预计明天,内蒙古中部、... http://t.co/RNdqIHmTby", - "source": "twitterfeed", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 402427654, - "id_str": "402427654", - "name": "中国新闻", - "screen_name": "zhongwenxinwen", - "location": "", - "description": "中国的新闻,世界的新闻。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 2429, - "friends_count": 15, - "listed_count": 29, - "created_at": "Tue Nov 01 01:56:43 +0000 2011", - "favourites_count": 0, - "utc_offset": -28800, - "time_zone": "Alaska", - "geo_enabled": false, - "verified": false, - "statuses_count": 84564, - "lang": "zh-cn", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "709397", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme6/bg.gif", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme6/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/2700523149/5597e347b2eb880425faef54287995f2_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/2700523149/5597e347b2eb880425faef54287995f2_normal.jpeg", - "profile_link_color": "FF3300", - "profile_sidebar_border_color": "86A4A6", - "profile_sidebar_fill_color": "A0C5C7", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/RNdqIHmTby", - "expanded_url": "http://bit.ly/1tOdNsI", - "display_url": "bit.ly/1tOdNsI", - "indices": [ - 114, - 136 - ] - } - ], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "zh" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:58 +0000 2014", - "id": 505874854877200400, - "id_str": "505874854877200384", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "LDH ★大好き応援団", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2700961603, - "id_str": "2700961603", - "name": "LDH ★大好き応援団", - "screen_name": "LDH_daisuki1", - "location": "", - "description": "LDHファンは、全員仲間です♪\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 458, - "friends_count": 1895, - "listed_count": 0, - "created_at": "Sat Aug 02 14:23:46 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 735, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/495578007298252800/FOZflgYu_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/495578007298252800/FOZflgYu_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2700961603/1406989928", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:58 +0000 2014", - "id": 505874854147407900, - "id_str": "505874854147407872", - "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", - "source": "マジ!?怖いアニメ都市伝説", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2719489172, - "id_str": "2719489172", - "name": "マジ!?怖いアニメ都市伝説", - "screen_name": "anime_toshiden1", - "location": "", - "description": "あなたの知らない、怖すぎるアニメの都市伝説を集めています。\r\n「え~知らなかったよww]」って人は RT & フォローお願いします♪", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 377, - "friends_count": 1911, - "listed_count": 1, - "created_at": "Sat Aug 09 14:41:15 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 536, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/498118027322208258/h7XOTTSi_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/498118027322208258/h7XOTTSi_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2719489172/1407595513", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:06 +0000 2014", - "id": 505871615125491700, - "id_str": "505871615125491712", - "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", - "source": "幸せの☆お守り", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2745121514, - "id_str": "2745121514", - "name": "幸せの☆お守り", - "screen_name": "shiawaseomamori", - "location": "", - "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 213, - "friends_count": 991, - "listed_count": 0, - "created_at": "Tue Aug 19 14:45:19 +0000 2014", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 349, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 58, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "shiawaseomamori", - "name": "幸せの☆お守り", - "id": 2745121514, - "id_str": "2745121514", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:58 +0000 2014", - "id": 505874854134820860, - "id_str": "505874854134820864", - "text": "@vesperia1985 おはよー!\n今日までなのですよ…!!明日一生来なくていい", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": 505868030329364500, - "in_reply_to_status_id_str": "505868030329364480", - "in_reply_to_user_id": 2286548834, - "in_reply_to_user_id_str": "2286548834", - "in_reply_to_screen_name": "vesperia1985", - "user": { - "id": 2389045190, - "id_str": "2389045190", - "name": "りいこ", - "screen_name": "riiko_dq10", - "location": "", - "description": "サマーエルフです、りいこです。えるおくんラブです!随時ふれぼしゅ〜〜(っ˘ω˘c )*日常のどうでもいいことも呟いてますがよろしくね〜", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 67, - "friends_count": 69, - "listed_count": 0, - "created_at": "Fri Mar 14 13:02:27 +0000 2014", - "favourites_count": 120, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 324, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/503906346815610881/BfSrCoBr_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/503906346815610881/BfSrCoBr_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2389045190/1409232058", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "vesperia1985", - "name": "ユーリ", - "id": 2286548834, - "id_str": "2286548834", - "indices": [ - 0, - 13 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:58 +0000 2014", - "id": 505874853778685950, - "id_str": "505874853778685952", - "text": "【映画パンフレット】 永遠の0 (永遠のゼロ) 監督 山崎貴 キャスト 岡田准一、三浦春馬、井上真央東宝(2)11点の新品/中古品を見る: ¥ 500より\n(この商品の現在のランクに関する正式な情報については、アートフレーム... http://t.co/4hbyB1rbQ7", - "source": "IFTTT", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1319883571, - "id_str": "1319883571", - "name": "森林木工家具製作所", - "screen_name": "Furniturewood", - "location": "沖縄", - "description": "家具(かぐ、Furniture)は、家財道具のうち家の中に据え置いて利用する比較的大型の道具類、または元々家に作り付けられている比較的大型の道具類をさす。なお、日本の建築基準法上は、作り付け家具は、建築確認及び完了検査の対象となるが、後から置かれるものについては対象外である。", - "url": "http://t.co/V4oyL0xtZk", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/V4oyL0xtZk", - "expanded_url": "http://astore.amazon.co.jp/furniturewood-22", - "display_url": "astore.amazon.co.jp/furniturewood-…", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 677, - "friends_count": 743, - "listed_count": 1, - "created_at": "Mon Apr 01 07:55:14 +0000 2013", - "favourites_count": 0, - "utc_offset": 32400, - "time_zone": "Irkutsk", - "geo_enabled": false, - "verified": false, - "statuses_count": 17210, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/3460466135/c67d9df9b760787b9ed284fe80b1dd31_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/3460466135/c67d9df9b760787b9ed284fe80b1dd31_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1319883571/1364804982", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/4hbyB1rbQ7", - "expanded_url": "http://ift.tt/1kT55bk", - "display_url": "ift.tt/1kT55bk", - "indices": [ - 116, - 138 - ] - } - ], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:58 +0000 2014", - "id": 505874852754907140, - "id_str": "505874852754907136", - "text": "RT @siranuga_hotoke: ゴキブリは一世帯に平均して480匹いる。", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 413944345, - "id_str": "413944345", - "name": "泥酔イナバウアー", - "screen_name": "Natade_co_co_21", - "location": "", - "description": "君の瞳にうつる僕に乾杯。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 298, - "friends_count": 300, - "listed_count": 4, - "created_at": "Wed Nov 16 12:52:46 +0000 2011", - "favourites_count": 3125, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 12237, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "FFF04D", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/378800000115928444/9bf5fa13385cc80bfeb097e51af9862a.jpeg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/378800000115928444/9bf5fa13385cc80bfeb097e51af9862a.jpeg", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/500849752351600640/lMQqIzYj_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/500849752351600640/lMQqIzYj_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/413944345/1403511193", - "profile_link_color": "0099CC", - "profile_sidebar_border_color": "000000", - "profile_sidebar_fill_color": "F6FFD1", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sat Aug 30 23:24:23 +0000 2014", - "id": 505858599411666940, - "id_str": "505858599411666944", - "text": "ゴキブリは一世帯に平均して480匹いる。", - "source": "twittbot.net", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2243896200, - "id_str": "2243896200", - "name": "知らぬが仏bot", - "screen_name": "siranuga_hotoke", - "location": "奈良・京都辺り", - "description": "知らぬが仏な情報をお伝えします。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 3288, - "friends_count": 3482, - "listed_count": 7, - "created_at": "Fri Dec 13 13:16:35 +0000 2013", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 1570, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/378800000866399372/ypy5NnPe_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000866399372/ypy5NnPe_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/2243896200/1386997755", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 1, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - "retweet_count": 1, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [], - "user_mentions": [ - { - "screen_name": "siranuga_hotoke", - "name": "知らぬが仏bot", - "id": 2243896200, - "id_str": "2243896200", - "indices": [ - 3, - 19 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:58 +0000 2014", - "id": 505874852603908100, - "id_str": "505874852603908096", - "text": "RT @UARROW_Y: ようかい体操第一を踊る国見英 http://t.co/SXoYWH98as", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 2463035136, - "id_str": "2463035136", - "name": "や", - "screen_name": "yae45", - "location": "", - "description": "きもちわるいことつぶやく用", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 4, - "friends_count": 30, - "listed_count": 0, - "created_at": "Fri Apr 25 10:49:20 +0000 2014", - "favourites_count": 827, - "utc_offset": 32400, - "time_zone": "Irkutsk", - "geo_enabled": false, - "verified": false, - "statuses_count": 390, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/505345820137234433/csFeRxPm_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/505345820137234433/csFeRxPm_normal.jpeg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:16:45 +0000 2014", - "id": 505871779949051900, - "id_str": "505871779949051904", - "text": "ようかい体操第一を踊る国見英 http://t.co/SXoYWH98as", - "source": "Twitter for Android", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1261662588, - "id_str": "1261662588", - "name": "ゆう矢", - "screen_name": "UARROW_Y", - "location": "つくり出そう国影の波 広げよう国影の輪", - "description": "HQ!! 成人済腐女子。日常ツイート多いです。赤葦京治夢豚クソツイ含みます注意。フォローをお考えの際はプロフご一読お願い致します。FRBお気軽に", - "url": "http://t.co/LFX2XOzb0l", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/LFX2XOzb0l", - "expanded_url": "http://twpf.jp/UARROW_Y", - "display_url": "twpf.jp/UARROW_Y", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 265, - "friends_count": 124, - "listed_count": 12, - "created_at": "Tue Mar 12 10:42:17 +0000 2013", - "favourites_count": 6762, - "utc_offset": 32400, - "time_zone": "Tokyo", - "geo_enabled": true, - "verified": false, - "statuses_count": 55946, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/502095104618663937/IzuPYx3E_normal.png", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/502095104618663937/IzuPYx3E_normal.png", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1261662588/1408618604", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 29, - "favorite_count": 54, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/SXoYWH98as", - "expanded_url": "http://twitter.com/UARROW_Y/status/505871779949051904/photo/1", - "display_url": "pic.twitter.com/SXoYWH98as", - "indices": [ - 15, - 37 - ] - } - ], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - "retweet_count": 29, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/SXoYWH98as", - "expanded_url": "http://twitter.com/UARROW_Y/status/505871779949051904/photo/1", - "display_url": "pic.twitter.com/SXoYWH98as", - "indices": [ - 29, - 51 - ] - } - ], - "user_mentions": [ - { - "screen_name": "UARROW_Y", - "name": "ゆう矢", - "id": 1261662588, - "id_str": "1261662588", - "indices": [ - 3, - 12 - ] - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "zh" - }, - "created_at": "Sun Aug 31 00:28:57 +0000 2014", - "id": 505874848900341760, - "id_str": "505874848900341760", - "text": "RT @fightcensorship: 李克強總理的臉綠了!在前日南京青奧會閉幕式,觀眾席上一名貪玩韓國少年運動員,竟斗膽用激光筆射向中國總理李克強的臉。http://t.co/HLX9mHcQwe http://t.co/fVVOSML5s8", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 889332218, - "id_str": "889332218", - "name": "民權初步", - "screen_name": "JoeyYoungkm", - "location": "km/cn", - "description": "经历了怎样的曲折才从追求“一致通过”发展到今天人们接受“过半数通过”,正是人们认识到对“一致”甚至是“基本一致”的追求本身就会变成一种独裁。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 313, - "friends_count": 46, - "listed_count": 0, - "created_at": "Thu Oct 18 17:21:17 +0000 2012", - "favourites_count": 24, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 15707, - "lang": "en", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/378800000563062033/a7e8274752ce36a6cd5bad971ec7d416_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000563062033/a7e8274752ce36a6cd5bad971ec7d416_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/889332218/1388896916", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": true, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweeted_status": { - "metadata": { - "result_type": "recent", - "iso_language_code": "zh" - }, - "created_at": "Sat Aug 30 23:56:27 +0000 2014", - "id": 505866670356070400, - "id_str": "505866670356070401", - "text": "李克強總理的臉綠了!在前日南京青奧會閉幕式,觀眾席上一名貪玩韓國少年運動員,竟斗膽用激光筆射向中國總理李克強的臉。http://t.co/HLX9mHcQwe http://t.co/fVVOSML5s8", - "source": "Twitter Web Client", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 67661086, - "id_str": "67661086", - "name": "※范强※法特姗瑟希蒲※", - "screen_name": "fightcensorship", - "location": "Middle of Nowhere", - "description": "被人指责“封建”、“落后”、“保守”的代表,当代红卫兵攻击对象。致力于言论自由,人权; 倡导资讯公开,反对网络封锁。既不是精英分子,也不是意见领袖,本推言论不代表任何国家、党派和组织,也不标榜伟大、光荣和正确。", - "url": null, - "entities": { - "description": { - "urls": [] - } - }, - "protected": false, - "followers_count": 7143, - "friends_count": 779, - "listed_count": 94, - "created_at": "Fri Aug 21 17:16:22 +0000 2009", - "favourites_count": 364, - "utc_offset": 28800, - "time_zone": "Singapore", - "geo_enabled": false, - "verified": false, - "statuses_count": 16751, - "lang": "en", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "FFFFFF", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/611138516/toeccqnahbpmr0sw9ybv.jpeg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/611138516/toeccqnahbpmr0sw9ybv.jpeg", - "profile_background_tile": true, - "profile_image_url": "http://pbs.twimg.com/profile_images/3253137427/3524557d21ef2c04871e985d4d136bdb_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/3253137427/3524557d21ef2c04871e985d4d136bdb_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/67661086/1385608347", - "profile_link_color": "ED1313", - "profile_sidebar_border_color": "FFFFFF", - "profile_sidebar_fill_color": "E0FF92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 4, - "favorite_count": 2, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/HLX9mHcQwe", - "expanded_url": "http://is.gd/H3OgTO", - "display_url": "is.gd/H3OgTO", - "indices": [ - 57, - 79 - ] - } - ], - "user_mentions": [], - "media": [ - { - "id": 505866668485386240, - "id_str": "505866668485386241", - "indices": [ - 80, - 102 - ], - "media_url": "http://pbs.twimg.com/media/BwUzDgbIIAEgvhD.jpg", - "media_url_https": "https://pbs.twimg.com/media/BwUzDgbIIAEgvhD.jpg", - "url": "http://t.co/fVVOSML5s8", - "display_url": "pic.twitter.com/fVVOSML5s8", - "expanded_url": "http://twitter.com/fightcensorship/status/505866670356070401/photo/1", - "type": "photo", - "sizes": { - "large": { - "w": 640, - "h": 554, - "resize": "fit" - }, - "medium": { - "w": 600, - "h": 519, - "resize": "fit" - }, - "thumb": { - "w": 150, - "h": 150, - "resize": "crop" - }, - "small": { - "w": 340, - "h": 294, - "resize": "fit" - } - } - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "zh" - }, - "retweet_count": 4, - "favorite_count": 0, - "entities": { - "hashtags": [], - "symbols": [], - "urls": [ - { - "url": "http://t.co/HLX9mHcQwe", - "expanded_url": "http://is.gd/H3OgTO", - "display_url": "is.gd/H3OgTO", - "indices": [ - 78, - 100 - ] - } - ], - "user_mentions": [ - { - "screen_name": "fightcensorship", - "name": "※范强※法特姗瑟希蒲※", - "id": 67661086, - "id_str": "67661086", - "indices": [ - 3, - 19 - ] - } - ], - "media": [ - { - "id": 505866668485386240, - "id_str": "505866668485386241", - "indices": [ - 101, - 123 - ], - "media_url": "http://pbs.twimg.com/media/BwUzDgbIIAEgvhD.jpg", - "media_url_https": "https://pbs.twimg.com/media/BwUzDgbIIAEgvhD.jpg", - "url": "http://t.co/fVVOSML5s8", - "display_url": "pic.twitter.com/fVVOSML5s8", - "expanded_url": "http://twitter.com/fightcensorship/status/505866670356070401/photo/1", - "type": "photo", - "sizes": { - "large": { - "w": 640, - "h": 554, - "resize": "fit" - }, - "medium": { - "w": 600, - "h": 519, - "resize": "fit" - }, - "thumb": { - "w": 150, - "h": 150, - "resize": "crop" - }, - "small": { - "w": 340, - "h": 294, - "resize": "fit" - } - }, - "source_status_id": 505866670356070400, - "source_status_id_str": "505866670356070401" - } - ] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "zh" - }, - { - "metadata": { - "result_type": "recent", - "iso_language_code": "ja" - }, - "created_at": "Sun Aug 31 00:28:56 +0000 2014", - "id": 505874847260352500, - "id_str": "505874847260352513", - "text": "【マイリスト】【彩りりあ】妖怪体操第一 踊ってみた【反転】 http://t.co/PjL9if8OZC #sm24357625", - "source": "ニコニコ動画", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "in_reply_to_screen_name": null, - "user": { - "id": 1609789375, - "id_str": "1609789375", - "name": "食いしん坊前ちゃん", - "screen_name": "2no38mae", - "location": "ニノと二次元の間", - "description": "ニコ動で踊り手やってます!!応援本当に嬉しいですありがとうございます!! ぽっちゃりだけど前向きに頑張る腐女子です。嵐と弱虫ペダルが大好き!【お返事】りぷ(基本は)”○” DM (同業者様を除いて)”×” 動画の転載は絶対にやめてください。 ブログ→http://t.co/8E91tqoeKX  ", - "url": "http://t.co/ulD2e9mcwb", - "entities": { - "url": { - "urls": [ - { - "url": "http://t.co/ulD2e9mcwb", - "expanded_url": "http://www.nicovideo.jp/mylist/37917495", - "display_url": "nicovideo.jp/mylist/37917495", - "indices": [ - 0, - 22 - ] - } - ] - }, - "description": { - "urls": [ - { - "url": "http://t.co/8E91tqoeKX", - "expanded_url": "http://ameblo.jp/2no38mae/", - "display_url": "ameblo.jp/2no38mae/", - "indices": [ - 125, - 147 - ] - } - ] - } - }, - "protected": false, - "followers_count": 560, - "friends_count": 875, - "listed_count": 11, - "created_at": "Sun Jul 21 05:09:43 +0000 2013", - "favourites_count": 323, - "utc_offset": null, - "time_zone": null, - "geo_enabled": false, - "verified": false, - "statuses_count": 3759, - "lang": "ja", - "contributors_enabled": false, - "is_translator": false, - "is_translation_enabled": false, - "profile_background_color": "F2C6E4", - "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/378800000029400927/114b242f5d838ec7cb098ea5db6df413.jpeg", - "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/378800000029400927/114b242f5d838ec7cb098ea5db6df413.jpeg", - "profile_background_tile": false, - "profile_image_url": "http://pbs.twimg.com/profile_images/487853237723095041/LMBMGvOc_normal.jpeg", - "profile_image_url_https": "https://pbs.twimg.com/profile_images/487853237723095041/LMBMGvOc_normal.jpeg", - "profile_banner_url": "https://pbs.twimg.com/profile_banners/1609789375/1375752225", - "profile_link_color": "FF9EDD", - "profile_sidebar_border_color": "FFFFFF", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "default_profile": false, - "default_profile_image": false, - "following": false, - "follow_request_sent": false, - "notifications": false - }, - "geo": null, - "coordinates": null, - "place": null, - "contributors": null, - "retweet_count": 0, - "favorite_count": 0, - "entities": { - "hashtags": [ - { - "text": "sm24357625", - "indices": [ - 53, - 64 - ] - } - ], - "symbols": [], - "urls": [ - { - "url": "http://t.co/PjL9if8OZC", - "expanded_url": "http://nico.ms/sm24357625", - "display_url": "nico.ms/sm24357625", - "indices": [ - 30, - 52 - ] - } - ], - "user_mentions": [] - }, - "favorited": false, - "retweeted": false, - "possibly_sensitive": false, - "lang": "ja" - } - ], - "search_metadata": { - "completed_in": 0.087, - "max_id": 505874924095815700, - "max_id_str": "505874924095815681", - "next_results": "?max_id=505874847260352512&q=%E4%B8%80&count=100&include_entities=1", - "query": "%E4%B8%80", - "refresh_url": "?since_id=505874924095815681&q=%E4%B8%80&include_entities=1", - "count": 100, - "since_id": 0, - "since_id_str": "0" - } -} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/Doxyfile b/resources/3rdparty/modernjson/doc/Doxyfile deleted file mode 100755 index 11faf6d03..000000000 --- a/resources/3rdparty/modernjson/doc/Doxyfile +++ /dev/null @@ -1,317 +0,0 @@ -# Doxyfile 1.8.9.1 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = "JSON for Modern C++" -PROJECT_NUMBER = 2.0.0 -PROJECT_BRIEF = -PROJECT_LOGO = -OUTPUT_DIRECTORY = . -CREATE_SUBDIRS = NO -ALLOW_UNICODE_NAMES = NO -OUTPUT_LANGUAGE = English -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = NO -ABBREVIATE_BRIEF = -ALWAYS_DETAILED_SEC = YES -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = YES -STRIP_FROM_PATH = -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -QT_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = YES -TAB_SIZE = 4 -ALIASES = "complexity=@par Complexity\n" -ALIASES += liveexample{2}="@par Example\n \1 \n @includelineno \2.cpp \n Output (play with this example @htmlinclude \2.link):\n @verbinclude \2.output \n The example code above can be translated with @verbatim g++ -std=c++11 -Isrc doc/examples/\2.cpp -o \2 @endverbatim" -ALIASES += requirement="@par Requirements\n" -ALIASES += exceptionsafety="@par Exception safety\n" -TCL_SUBST = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -OPTIMIZE_FOR_FORTRAN = NO -OPTIMIZE_OUTPUT_VHDL = NO -EXTENSION_MAPPING = -MARKDOWN_SUPPORT = YES -AUTOLINK_SUPPORT = NO -BUILTIN_STL_SUPPORT = YES -CPP_CLI_SUPPORT = NO -SIP_SUPPORT = NO -IDL_PROPERTY_SUPPORT = YES -DISTRIBUTE_GROUP_DOC = NO -SUBGROUPING = YES -INLINE_GROUPED_CLASSES = NO -INLINE_SIMPLE_STRUCTS = NO -TYPEDEF_HIDES_STRUCT = NO -LOOKUP_CACHE_SIZE = 0 -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = YES -EXTRACT_PRIVATE = NO -EXTRACT_PACKAGE = YES -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = YES -EXTRACT_ANON_NSPACES = YES -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = NO -HIDE_SCOPE_NAMES = NO -HIDE_COMPOUND_REFERENCE= NO -SHOW_INCLUDE_FILES = YES -SHOW_GROUPED_MEMB_INC = NO -FORCE_LOCAL_INCLUDES = NO -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = YES -SORT_MEMBERS_CTORS_1ST = YES -SORT_GROUP_NAMES = NO -SORT_BY_SCOPE_NAME = NO -STRICT_PROTO_MATCHING = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = NO -SHOW_FILES = NO -SHOW_NAMESPACES = NO -FILE_VERSION_FILTER = -LAYOUT_FILE = -CITE_BIB_FILES = -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = YES -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = YES -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = ../src/json.hpp index.md -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = -RECURSIVE = NO -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXCLUDE_SYMBOLS = nlohmann::anonymous_namespace -EXAMPLE_PATH = examples -EXAMPLE_PATTERNS = -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = images -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -FILTER_SOURCE_PATTERNS = -USE_MDFILE_AS_MAINPAGE = index.md -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = YES -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = NO -REFERENCES_RELATION = NO -REFERENCES_LINK_SOURCE = NO -SOURCE_TOOLTIPS = YES -USE_HTAGS = NO -VERBATIM_HEADERS = NO -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_EXTRA_STYLESHEET = css/mylayout.css -HTML_EXTRA_FILES = -HTML_COLORSTYLE_HUE = 220 -HTML_COLORSTYLE_SAT = 100 -HTML_COLORSTYLE_GAMMA = 80 -HTML_TIMESTAMP = YES -HTML_DYNAMIC_SECTIONS = YES -HTML_INDEX_NUM_ENTRIES = 100 -GENERATE_DOCSET = YES -DOCSET_FEEDNAME = "Doxygen generated docs" -DOCSET_BUNDLE_ID = me.nlohmann.json -DOCSET_PUBLISHER_ID = me.nlohmann -DOCSET_PUBLISHER_NAME = Niels Lohmann -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -CHM_INDEX_ENCODING = -BINARY_TOC = NO -TOC_EXPAND = NO -GENERATE_QHP = NO -QCH_FILE = -QHP_NAMESPACE = org.doxygen.Project -QHP_VIRTUAL_FOLDER = doc -QHP_CUST_FILTER_NAME = -QHP_CUST_FILTER_ATTRS = -QHP_SECT_FILTER_ATTRS = -QHG_LOCATION = -GENERATE_ECLIPSEHELP = NO -ECLIPSE_DOC_ID = org.doxygen.Project -DISABLE_INDEX = NO -GENERATE_TREEVIEW = NO -ENUM_VALUES_PER_LINE = 4 -TREEVIEW_WIDTH = 250 -EXT_LINKS_IN_WINDOW = NO -FORMULA_FONTSIZE = 10 -FORMULA_TRANSPARENT = YES -USE_MATHJAX = NO -MATHJAX_FORMAT = HTML-CSS -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest -MATHJAX_EXTENSIONS = -MATHJAX_CODEFILE = -SEARCHENGINE = YES -SERVER_BASED_SEARCH = NO -EXTERNAL_SEARCH = NO -SEARCHENGINE_URL = -SEARCHDATA_FILE = searchdata.xml -EXTERNAL_SEARCH_ID = -EXTRA_SEARCH_MAPPINGS = -#--------------------------------------------------------------------------- -# Configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = NO -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4 -EXTRA_PACKAGES = -LATEX_HEADER = -LATEX_FOOTER = -LATEX_EXTRA_STYLESHEET = -LATEX_EXTRA_FILES = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -LATEX_SOURCE_CODE = NO -LATEX_BIB_STYLE = plain -#--------------------------------------------------------------------------- -# Configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -RTF_SOURCE_CODE = NO -#--------------------------------------------------------------------------- -# Configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_SUBDIR = -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# Configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# Configuration options related to the DOCBOOK output -#--------------------------------------------------------------------------- -GENERATE_DOCBOOK = NO -DOCBOOK_OUTPUT = docbook -DOCBOOK_PROGRAMLISTING = NO -#--------------------------------------------------------------------------- -# Configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# Configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration options related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -EXTERNAL_PAGES = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = NO -MSCGEN_PATH = -DIA_PATH = -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = YES -DOT_NUM_THREADS = 0 -DOT_FONTNAME = Helvetica -DOT_FONTSIZE = 10 -DOT_FONTPATH = -CLASS_GRAPH = NO -COLLABORATION_GRAPH = NO -GROUP_GRAPHS = YES -UML_LOOK = YES -UML_LIMIT_NUM_FIELDS = 10 -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = NO -INCLUDED_BY_GRAPH = NO -CALL_GRAPH = NO -CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = NO -DIRECTORY_GRAPH = NO -DOT_IMAGE_FORMAT = svg -INTERACTIVE_SVG = YES -DOT_PATH = -DOTFILE_DIRS = -MSCFILE_DIRS = -DIAFILE_DIRS = -PLANTUML_JAR_PATH = -PLANTUML_INCLUDE_PATH = -DOT_GRAPH_MAX_NODES = 50 -MAX_DOT_GRAPH_DEPTH = 0 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES diff --git a/resources/3rdparty/modernjson/doc/Makefile b/resources/3rdparty/modernjson/doc/Makefile deleted file mode 100755 index dc10f1dd1..000000000 --- a/resources/3rdparty/modernjson/doc/Makefile +++ /dev/null @@ -1,82 +0,0 @@ -SRCDIR = ../src - -all: doxygen - -clean: - rm -fr me.nlohmann.json.docset html - - -########################################################################## -# example files -########################################################################## - -# where are the example cpp files -EXAMPLES = $(wildcard examples/*.cpp) - -# create output from a stand-alone example file -%.output: %.cpp - make $(<:.cpp=) CPPFLAGS="-I $(SRCDIR)" CXXFLAGS="-std=c++11" - ./$(<:.cpp=) > $@ - rm $(<:.cpp=) - -# compare created output with current output of the example files -%.test: %.cpp - make $(<:.cpp=) CPPFLAGS="-I $(SRCDIR)" CXXFLAGS="-std=c++11" - ./$(<:.cpp=) > $@ - diff $@ $(<:.cpp=.output) - rm $(<:.cpp=) $@ - -# create links to try the code online -%.link: %.cpp - rm -fr tmp - mkdir tmp - cp $(SRCDIR)/json.hpp tmp - scripts/send_to_wandbox.py tmp $< > $@.tmp - /bin/echo -n "online" > $@ - rm -fr tmp $@.tmp - -# create output from all stand-alone example files -create_output: $(EXAMPLES:.cpp=.output) - -create_links: $(EXAMPLES:.cpp=.link) - -# check output of all stand-alone example files -check_output: $(EXAMPLES:.cpp=.test) - - -########################################################################## -# Doxygen HTML documentation -########################################################################## - -# create Doxygen documentation -doxygen: create_output create_links - doxygen - gsed -i 's@< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberFloatType, AllocatorType >@@g' html/*.html - gsed -i 's@< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberFloatType, AllocatorType >@@g' html/*.html - gsed -i 's@< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >@@g' html/*.html - gsed -i 's@< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >@@g' html/*.html - -upload: clean doxygen check_output - cd html ; ../scripts/git-update-ghpages nlohmann/json - rm -fr html - open http://nlohmann.github.io/json/ - - -########################################################################## -# docset -########################################################################## - -# create docset for Dash -docset: create_output - cp Doxyfile Doxyfile_docset - gsed -i 's/DISABLE_INDEX = NO/DISABLE_INDEX = YES/' Doxyfile_docset - gsed -i 's/SEARCHENGINE = YES/SEARCHENGINE = NO/' Doxyfile_docset - gsed -i 's@HTML_EXTRA_STYLESHEET = css/mylayout.css@HTML_EXTRA_STYLESHEET = css/mylayout_docset.css@' Doxyfile_docset - rm -fr html *.docset - doxygen Doxyfile_docset - gsed -i 's@< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberFloatType, AllocatorType >@@g' html/*.html - gsed -i 's@< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberFloatType, AllocatorType >@@g' html/*.html - make -C html - mv html/*.docset . - gsed -i 's@doxygen@json@' me.nlohmann.json.docset/Contents/Info.plist - rm -fr Doxyfile_docset html diff --git a/resources/3rdparty/modernjson/doc/css/mylayout.css b/resources/3rdparty/modernjson/doc/css/mylayout.css deleted file mode 100755 index fe20b82c5..000000000 --- a/resources/3rdparty/modernjson/doc/css/mylayout.css +++ /dev/null @@ -1,26 +0,0 @@ -/* hide lengthy template information */ -.memtemplate, .memTemplParams { - display: none; -} - -/* allow compiler information to wrap */ -/* https://css-tricks.com/snippets/css/make-pre-text-wrap/ */ -pre.fragment { - white-space: pre-wrap; /* css-3 */ - white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - word-wrap: break-word; /* Internet Explorer 5.5+ */ -} - -td.paramname { - vertical-align: top; -} - -.ok_green { - background-color: #89C35C; -} - -.nok_throws { - background-color: #ffa500; -} diff --git a/resources/3rdparty/modernjson/doc/css/mylayout_docset.css b/resources/3rdparty/modernjson/doc/css/mylayout_docset.css deleted file mode 100755 index 1a67e99df..000000000 --- a/resources/3rdparty/modernjson/doc/css/mylayout_docset.css +++ /dev/null @@ -1,27 +0,0 @@ -.memtemplate { - display: none; -} - -.memTemplParams { - display: none; -} - -.navtab { - display: none; -} - -#top, .footer { - display: none; -} - -td.paramname { - vertical-align: top; -} - -.ok_green { - background-color: #89C35C; -} - -.nok_throws { - background-color: #ffa500; -} diff --git a/resources/3rdparty/modernjson/doc/examples/README.cpp b/resources/3rdparty/modernjson/doc/examples/README.cpp deleted file mode 100755 index b928e1167..000000000 --- a/resources/3rdparty/modernjson/doc/examples/README.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON object - json j = - { - {"pi", 3.141}, - {"happy", true}, - {"name", "Niels"}, - {"nothing", nullptr}, - { - "answer", { - {"everything", 42} - } - }, - {"list", {1, 0, 2}}, - { - "object", { - {"currency", "USD"}, - {"value", 42.99} - } - } - }; - - // add new values - j["new"]["key"]["value"] = {"another", "list"}; - - // count elements - j["size"] = j.size(); - - // pretty print with indent of 4 spaces - std::cout << std::setw(4) << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/README.link b/resources/3rdparty/modernjson/doc/examples/README.link deleted file mode 100755 index a2526dc64..000000000 --- a/resources/3rdparty/modernjson/doc/examples/README.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/README.output b/resources/3rdparty/modernjson/doc/examples/README.output deleted file mode 100755 index 3226f7290..000000000 --- a/resources/3rdparty/modernjson/doc/examples/README.output +++ /dev/null @@ -1,27 +0,0 @@ -{ - "answer": { - "everything": 42 - }, - "happy": true, - "list": [ - 1, - 0, - 2 - ], - "name": "Niels", - "new": { - "key": { - "value": [ - "another", - "list" - ] - } - }, - "nothing": null, - "object": { - "currency": "USD", - "value": 42.99 - }, - "pi": 3.141, - "size": 9 -} diff --git a/resources/3rdparty/modernjson/doc/examples/array.cpp b/resources/3rdparty/modernjson/doc/examples/array.cpp deleted file mode 100755 index 3ec0a133b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/array.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON arrays - json j_no_init_list = json::array(); - json j_empty_init_list = json::array({}); - json j_nonempty_init_list = json::array({1, 2, 3, 4}); - json j_list_of_pairs = json::array({ {"one", 1}, {"two", 2} }); - - // serialize the JSON arrays - std::cout << j_no_init_list << '\n'; - std::cout << j_empty_init_list << '\n'; - std::cout << j_nonempty_init_list << '\n'; - std::cout << j_list_of_pairs << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/array.link b/resources/3rdparty/modernjson/doc/examples/array.link deleted file mode 100755 index 626dcd25c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/array.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/array.output b/resources/3rdparty/modernjson/doc/examples/array.output deleted file mode 100755 index 4e75a1b67..000000000 --- a/resources/3rdparty/modernjson/doc/examples/array.output +++ /dev/null @@ -1,4 +0,0 @@ -[] -[] -[1,2,3,4] -[["one",1],["two",2]] diff --git a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type.cpp b/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type.cpp deleted file mode 100755 index a8fc9998c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON object - json object = - { - {"the good", "il buono"}, - {"the bad", "il cativo"}, - {"the ugly", "il brutto"} - }; - - // output element with key "the ugly" - std::cout << object.at("the ugly") << '\n'; - - // change element with key "the bad" - object.at("the bad") = "il cattivo"; - - // output changed array - std::cout << object << '\n'; - - // try to write at a nonexisting key - try - { - object.at("the fast") = "il rapido"; - } - catch (std::out_of_range& e) - { - std::cout << "out of range: " << e.what() << '\n'; - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type.link b/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type.link deleted file mode 100755 index f7e44b204..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type.output b/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type.output deleted file mode 100755 index 79cff2d7f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type.output +++ /dev/null @@ -1,3 +0,0 @@ -"il brutto" -{"the bad":"il cattivo","the good":"il buono","the ugly":"il brutto"} -out of range: key 'the fast' not found diff --git a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type_const.cpp b/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type_const.cpp deleted file mode 100755 index 0686db45e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type_const.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON object - json object = - { - {"the good", "il buono"}, - {"the bad", "il cativo"}, - {"the ugly", "il brutto"} - }; - - // output element with key "the ugly" - std::cout << object.at("the ugly") << '\n'; - - // try to read from a nonexisting key - try - { - std::cout << object.at("the fast") << '\n'; - } - catch (std::out_of_range) - { - std::cout << "out of range" << '\n'; - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type_const.link b/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type_const.link deleted file mode 100755 index 8ba211662..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type_const.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type_const.output b/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type_const.output deleted file mode 100755 index b3dd11d35..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__object_t_key_type_const.output +++ /dev/null @@ -1,2 +0,0 @@ -"il brutto" -out of range diff --git a/resources/3rdparty/modernjson/doc/examples/at__size_type.cpp b/resources/3rdparty/modernjson/doc/examples/at__size_type.cpp deleted file mode 100755 index e31d61d35..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__size_type.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON array - json array = {"first", "2nd", "third", "fourth"}; - - // output element at index 2 (third element) - std::cout << array.at(2) << '\n'; - - // change element at index 1 (second element) to "second" - array.at(1) = "second"; - - // output changed array - std::cout << array << '\n'; - - // try to write beyond the array limit - try - { - array.at(5) = "sixth"; - } - catch (std::out_of_range& e) - { - std::cout << "out of range: " << e.what() << '\n'; - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/at__size_type.link b/resources/3rdparty/modernjson/doc/examples/at__size_type.link deleted file mode 100755 index 76a409c20..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__size_type.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/at__size_type.output b/resources/3rdparty/modernjson/doc/examples/at__size_type.output deleted file mode 100755 index d1f68bdb8..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__size_type.output +++ /dev/null @@ -1,3 +0,0 @@ -"third" -["first","second","third","fourth"] -out of range: array index 5 is out of range diff --git a/resources/3rdparty/modernjson/doc/examples/at__size_type_const.cpp b/resources/3rdparty/modernjson/doc/examples/at__size_type_const.cpp deleted file mode 100755 index a8a43ed8f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__size_type_const.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON array - json array = {"first", "2nd", "third", "fourth"}; - - // output element at index 2 (third element) - std::cout << array.at(2) << '\n'; - - // try to read beyond the array limit - try - { - std::cout << array.at(5) << '\n'; - } - catch (std::out_of_range) - { - std::cout << "out of range" << '\n'; - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/at__size_type_const.link b/resources/3rdparty/modernjson/doc/examples/at__size_type_const.link deleted file mode 100755 index 5a1cdde95..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__size_type_const.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/at__size_type_const.output b/resources/3rdparty/modernjson/doc/examples/at__size_type_const.output deleted file mode 100755 index d0b7a66a8..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at__size_type_const.output +++ /dev/null @@ -1,2 +0,0 @@ -"third" -out of range diff --git a/resources/3rdparty/modernjson/doc/examples/at_json_pointer.cpp b/resources/3rdparty/modernjson/doc/examples/at_json_pointer.cpp deleted file mode 100755 index 0665e608c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at_json_pointer.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value - json j = - { - {"number", 1}, {"string", "foo"}, {"array", {1, 2}} - }; - - // read-only access - - // output element with JSON pointer "/number" - std::cout << j.at("/number"_json_pointer) << '\n'; - // output element with JSON pointer "/string" - std::cout << j.at("/string"_json_pointer) << '\n'; - // output element with JSON pointer "/array" - std::cout << j.at("/array"_json_pointer) << '\n'; - // output element with JSON pointer "/array/1" - std::cout << j.at("/array/1"_json_pointer) << '\n'; - - // writing access - - // change the string - j.at("/string"_json_pointer) = "bar"; - // output the changed string - std::cout << j["string"] << '\n'; - - // change an array element - j.at("/array/1"_json_pointer) = 21; - // output the changed array - std::cout << j["array"] << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/at_json_pointer.link b/resources/3rdparty/modernjson/doc/examples/at_json_pointer.link deleted file mode 100755 index 7a7efa268..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at_json_pointer.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/at_json_pointer.output b/resources/3rdparty/modernjson/doc/examples/at_json_pointer.output deleted file mode 100755 index 11913c723..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at_json_pointer.output +++ /dev/null @@ -1,6 +0,0 @@ -1 -"foo" -[1,2] -2 -"bar" -[1,21] diff --git a/resources/3rdparty/modernjson/doc/examples/at_json_pointer_const.cpp b/resources/3rdparty/modernjson/doc/examples/at_json_pointer_const.cpp deleted file mode 100755 index e3cfc5154..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at_json_pointer_const.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value - json j = - { - {"number", 1}, {"string", "foo"}, {"array", {1, 2}} - }; - - // read-only access - - // output element with JSON pointer "/number" - std::cout << j.at("/number"_json_pointer) << '\n'; - // output element with JSON pointer "/string" - std::cout << j.at("/string"_json_pointer) << '\n'; - // output element with JSON pointer "/array" - std::cout << j.at("/array"_json_pointer) << '\n'; - // output element with JSON pointer "/array/1" - std::cout << j.at("/array/1"_json_pointer) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/at_json_pointer_const.link b/resources/3rdparty/modernjson/doc/examples/at_json_pointer_const.link deleted file mode 100755 index 9057e0b27..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at_json_pointer_const.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/at_json_pointer_const.output b/resources/3rdparty/modernjson/doc/examples/at_json_pointer_const.output deleted file mode 100755 index 7b9306bbc..000000000 --- a/resources/3rdparty/modernjson/doc/examples/at_json_pointer_const.output +++ /dev/null @@ -1,4 +0,0 @@ -1 -"foo" -[1,2] -2 diff --git a/resources/3rdparty/modernjson/doc/examples/back.cpp b/resources/3rdparty/modernjson/doc/examples/back.cpp deleted file mode 100755 index 70516e588..000000000 --- a/resources/3rdparty/modernjson/doc/examples/back.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_object_empty(json::value_t::object); - json j_array = {1, 2, 4, 8, 16}; - json j_array_empty(json::value_t::array); - json j_string = "Hello, world"; - - // call back() - //std::cout << j_null.back() << '\n'; // would throw - std::cout << j_boolean.back() << '\n'; - std::cout << j_number_integer.back() << '\n'; - std::cout << j_number_float.back() << '\n'; - std::cout << j_object.back() << '\n'; - //std::cout << j_object_empty.back() << '\n'; // undefined behavior - std::cout << j_array.back() << '\n'; - //std::cout << j_array_empty.back() << '\n'; // undefined behavior - std::cout << j_string.back() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/back.link b/resources/3rdparty/modernjson/doc/examples/back.link deleted file mode 100755 index 49d008f5b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/back.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/back.output b/resources/3rdparty/modernjson/doc/examples/back.output deleted file mode 100755 index 159ba0fc5..000000000 --- a/resources/3rdparty/modernjson/doc/examples/back.output +++ /dev/null @@ -1,6 +0,0 @@ -true -17 -23.42 -2 -16 -"Hello, world" diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json.cpp deleted file mode 100755 index 0f36e4f84..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value with default null value - json j; - - // serialize the JSON null value - std::cout << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json.link b/resources/3rdparty/modernjson/doc/examples/basic_json.link deleted file mode 100755 index 1625c487a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json.output b/resources/3rdparty/modernjson/doc/examples/basic_json.output deleted file mode 100755 index 19765bd50..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json.output +++ /dev/null @@ -1 +0,0 @@ -null diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleArrayType.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleArrayType.cpp deleted file mode 100755 index bbbf5970c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleArrayType.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include -#include -#include -#include - -using json = nlohmann::json; - -int main() -{ - // create an array from std::vector - std::vector c_vector {1, 2, 3, 4}; - json j_vec(c_vector); - - // create an array from std::deque - std::deque c_deque {1.2, 2.3, 3.4, 5.6}; - json j_deque(c_deque); - - // create an array from std::list - std::list c_list {true, true, false, true}; - json j_list(c_list); - - // create an array from std::forward_list - std::forward_list c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543}; - json j_flist(c_flist); - - // create an array from std::array - std::array c_array {{1, 2, 3, 4}}; - json j_array(c_array); - - // create an array from std::set - std::set c_set {"one", "two", "three", "four", "one"}; - json j_set(c_set); // only one entry for "one" is used - - // create an array from std::unordered_set - std::unordered_set c_uset {"one", "two", "three", "four", "one"}; - json j_uset(c_uset); // only one entry for "one" is used - - // create an array from std::multiset - std::multiset c_mset {"one", "two", "one", "four"}; - json j_mset(c_mset); // only one entry for "one" is used - - // create an array from std::unordered_multiset - std::unordered_multiset c_umset {"one", "two", "one", "four"}; - json j_umset(c_umset); // both entries for "one" are used - - // serialize the JSON arrays - std::cout << j_vec << '\n'; - std::cout << j_deque << '\n'; - std::cout << j_list << '\n'; - std::cout << j_flist << '\n'; - std::cout << j_array << '\n'; - std::cout << j_set << '\n'; - std::cout << j_uset << '\n'; - std::cout << j_mset << '\n'; - std::cout << j_umset << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleArrayType.link b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleArrayType.link deleted file mode 100755 index 313ae3fed..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleArrayType.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleArrayType.output b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleArrayType.output deleted file mode 100755 index 428505a17..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleArrayType.output +++ /dev/null @@ -1,9 +0,0 @@ -[1,2,3,4] -[1.2,2.3,3.4,5.6] -[true,true,false,true] -[12345678909876,23456789098765,34567890987654,45678909876543] -[1,2,3,4] -["four","one","three","two"] -["four","three","two","one"] -["four","one","one","two"] -["four","two","one","one"] diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleIntegerNumberType.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleIntegerNumberType.cpp deleted file mode 100755 index 50e751d11..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleIntegerNumberType.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create values of different integer types - short n42 = 42; - int n23 = 23; - long n1024 = 1024; - int_least32_t n17 = 17; - uint8_t n8 = 8; - - // create JSON numbers - json j42(n42); - json j23(n23); - json j1024(n1024); - json j17(n17); - json j8(n8); - - // serialize the JSON numbers - std::cout << j42 << '\n'; - std::cout << j23 << '\n'; - std::cout << j1024 << '\n'; - std::cout << j17 << '\n'; - std::cout << j8 << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleIntegerNumberType.link b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleIntegerNumberType.link deleted file mode 100755 index f994babb3..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleIntegerNumberType.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleIntegerNumberType.output b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleIntegerNumberType.output deleted file mode 100755 index c7f24d63d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleIntegerNumberType.output +++ /dev/null @@ -1,5 +0,0 @@ -42 -23 -1024 -17 -8 diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleNumberFloatType.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleNumberFloatType.cpp deleted file mode 100755 index 6f8d3f67a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleNumberFloatType.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create values of different floating-point types - float f42 = 42.23; - float f_nan = 1.0f / 0.0f; - double f23 = 23.42; - - // create JSON numbers - json j42(f42); - json j_nan(f_nan); - json j23(f23); - - // serialize the JSON numbers - std::cout << j42 << '\n'; - std::cout << j_nan << '\n'; - std::cout << j23 << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleNumberFloatType.link b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleNumberFloatType.link deleted file mode 100755 index 9e08b6a64..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleNumberFloatType.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleNumberFloatType.output b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleNumberFloatType.output deleted file mode 100755 index 64bb796c3..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleNumberFloatType.output +++ /dev/null @@ -1,3 +0,0 @@ -42.2299995422363 -null -23.42 diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleObjectType.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleObjectType.cpp deleted file mode 100755 index d284b697b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleObjectType.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include - -using json = nlohmann::json; - -int main() -{ - // create an object from std::map - std::map c_map - { - {"one", 1}, {"two", 2}, {"three", 3} - }; - json j_map(c_map); - - // create an object from std::unordered_map - std::unordered_map c_umap - { - {"one", 1.2}, {"two", 2.3}, {"three", 3.4} - }; - json j_umap(c_umap); - - // create an object from std::multimap - std::multimap c_mmap - { - {"one", true}, {"two", true}, {"three", false}, {"three", true} - }; - json j_mmap(c_mmap); // only one entry for key "three" is used - - // create an object from std::unordered_multimap - std::unordered_multimap c_ummap - { - {"one", true}, {"two", true}, {"three", false}, {"three", true} - }; - json j_ummap(c_ummap); // only one entry for key "three" is used - - // serialize the JSON objects - std::cout << j_map << '\n'; - std::cout << j_umap << '\n'; - std::cout << j_mmap << '\n'; - std::cout << j_ummap << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleObjectType.link b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleObjectType.link deleted file mode 100755 index 6d65b17a4..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleObjectType.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleObjectType.output b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleObjectType.output deleted file mode 100755 index c70f71848..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleObjectType.output +++ /dev/null @@ -1,4 +0,0 @@ -{"one":1,"three":3,"two":2} -{"one":1.2,"three":3.4,"two":2.3} -{"one":true,"three":false,"two":true} -{"one":true,"three":false,"two":true} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleStringType.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleStringType.cpp deleted file mode 100755 index a0f3b4f67..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleStringType.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a string value - std::string s = "The quick brown fox jumps over the lazy dog."; - - // create a JSON string value - json j = s; - - // serialize the JSON string - std::cout << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleStringType.link b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleStringType.link deleted file mode 100755 index 2131a163b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleStringType.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleStringType.output b/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleStringType.output deleted file mode 100755 index 1316dd98a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__CompatibleStringType.output +++ /dev/null @@ -1 +0,0 @@ -"The quick brown fox jumps over the lazy dog." diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__InputIt_InputIt.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__InputIt_InputIt.cpp deleted file mode 100755 index 86a0faf8c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__InputIt_InputIt.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_array = {"alpha", "bravo", "charly", "delta", "easy"}; - json j_number = 42; - json j_object = {{"one", "eins"}, {"two", "zwei"}}; - - // create copies using iterators - json j_array_range(j_array.begin() + 1, j_array.end() - 2); - json j_number_range(j_number.begin(), j_number.end()); - json j_object_range(j_object.begin(), j_object.find("two")); - - // serialize the values - std::cout << j_array_range << '\n'; - std::cout << j_number_range << '\n'; - std::cout << j_object_range << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__InputIt_InputIt.link b/resources/3rdparty/modernjson/doc/examples/basic_json__InputIt_InputIt.link deleted file mode 100755 index 3ce3686ad..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__InputIt_InputIt.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__InputIt_InputIt.output b/resources/3rdparty/modernjson/doc/examples/basic_json__InputIt_InputIt.output deleted file mode 100755 index 367142004..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__InputIt_InputIt.output +++ /dev/null @@ -1,3 +0,0 @@ -["bravo","charly"] -42 -{"one":"eins"} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__array_t.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__array_t.cpp deleted file mode 100755 index 1bb6931b2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__array_t.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an array_t value - json::array_t value = {"one", "two", 3, 4.5, false}; - - // create a JSON array from the value - json j(value); - - // serialize the JSON array - std::cout << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__array_t.link b/resources/3rdparty/modernjson/doc/examples/basic_json__array_t.link deleted file mode 100755 index 53322832d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__array_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__array_t.output b/resources/3rdparty/modernjson/doc/examples/basic_json__array_t.output deleted file mode 100755 index d379a756e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__array_t.output +++ /dev/null @@ -1 +0,0 @@ -["one","two",3,4.5,false] diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__basic_json.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__basic_json.cpp deleted file mode 100755 index 28f1fd072..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__basic_json.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON array - json j1 = {"one", "two", 3, 4.5, false}; - - // create a copy - json j2(j1); - - // serialize the JSON array - std::cout << j1 << " = " << j2 << '\n'; - std::cout << std::boolalpha << (j1 == j2) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__basic_json.link b/resources/3rdparty/modernjson/doc/examples/basic_json__basic_json.link deleted file mode 100755 index c3109d16e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__basic_json.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__basic_json.output b/resources/3rdparty/modernjson/doc/examples/basic_json__basic_json.output deleted file mode 100755 index ee93a41ca..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__basic_json.output +++ /dev/null @@ -1,2 +0,0 @@ -["one","two",3,4.5,false] = ["one","two",3,4.5,false] -true diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__boolean_t.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__boolean_t.cpp deleted file mode 100755 index 38f014e01..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__boolean_t.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create boolean values - json j_truth = true; - json j_falsity = false; - - // serialize the JSON booleans - std::cout << j_truth << '\n'; - std::cout << j_falsity << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__boolean_t.link b/resources/3rdparty/modernjson/doc/examples/basic_json__boolean_t.link deleted file mode 100755 index 9fe211e42..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__boolean_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__boolean_t.output b/resources/3rdparty/modernjson/doc/examples/basic_json__boolean_t.output deleted file mode 100755 index da29283aa..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__boolean_t.output +++ /dev/null @@ -1,2 +0,0 @@ -true -false diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__const_int.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__const_int.cpp deleted file mode 100755 index 7e38544bf..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__const_int.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // an anonymous enum - enum { t = 17 }; - - // create a JSON number from the enum - json j(t); - - // serialize the JSON numbers - std::cout << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__const_int.link b/resources/3rdparty/modernjson/doc/examples/basic_json__const_int.link deleted file mode 100755 index 73d286286..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__const_int.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__const_int.output b/resources/3rdparty/modernjson/doc/examples/basic_json__const_int.output deleted file mode 100755 index 98d9bcb75..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__const_int.output +++ /dev/null @@ -1 +0,0 @@ -17 diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__copyassignment.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__copyassignment.cpp deleted file mode 100755 index 9e9c2eccf..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__copyassignment.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json a = 23; - json b = 42; - - // copy-assign a to b - b = a; - - // serialize the JSON arrays - std::cout << a << '\n'; - std::cout << b << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__copyassignment.link b/resources/3rdparty/modernjson/doc/examples/basic_json__copyassignment.link deleted file mode 100755 index 96679cf45..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__copyassignment.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__copyassignment.output b/resources/3rdparty/modernjson/doc/examples/basic_json__copyassignment.output deleted file mode 100755 index c1eee2105..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__copyassignment.output +++ /dev/null @@ -1,2 +0,0 @@ -23 -23 diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__istream.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__istream.cpp deleted file mode 100755 index 71f16ed34..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__istream.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // a JSON text - auto text = R"( - { - "Image": { - "Width": 800, - "Height": 600, - "Title": "View from 15th Floor", - "Thumbnail": { - "Url": "http://www.example.com/image/481989943", - "Height": 125, - "Width": 100 - }, - "Animated" : false, - "IDs": [116, 943, 234, 38793] - } - } - )"; - - // fill a stream with JSON text - std::stringstream ss; - ss << text; - - // create JSON from stream - json j_complete(ss); - std::cout << std::setw(4) << j_complete << "\n\n"; - - - // define parser callback - json::parser_callback_t cb = [](int depth, json::parse_event_t event, json & parsed) - { - // skip object elements with key "Thumbnail" - if (event == json::parse_event_t::key and parsed == json("Thumbnail")) - { - return false; - } - else - { - return true; - } - }; - - // fill a stream with JSON text - ss.clear(); - ss << text; - - // create JSON from stream (with callback) - json j_filtered(ss, cb); - std::cout << std::setw(4) << j_filtered << '\n'; -} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__istream.link b/resources/3rdparty/modernjson/doc/examples/basic_json__istream.link deleted file mode 100755 index 20d1033c3..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__istream.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__istream.output b/resources/3rdparty/modernjson/doc/examples/basic_json__istream.output deleted file mode 100755 index 279a7ff74..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__istream.output +++ /dev/null @@ -1,34 +0,0 @@ -{ - "Image": { - "Animated": false, - "Height": 600, - "IDs": [ - 116, - 943, - 234, - 38793 - ], - "Thumbnail": { - "Height": 125, - "Url": "http://www.example.com/image/481989943", - "Width": 100 - }, - "Title": "View from 15th Floor", - "Width": 800 - } -} - -{ - "Image": { - "Animated": false, - "Height": 600, - "IDs": [ - 116, - 943, - 234, - 38793 - ], - "Title": "View from 15th Floor", - "Width": 800 - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__list_init_t.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__list_init_t.cpp deleted file mode 100755 index 8734dff15..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__list_init_t.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_empty_init_list = json({}); - json j_object = { {"one", 1}, {"two", 2} }; - json j_array = {1, 2, 3, 4}; - json j_nested_object = { {"one", {1}}, {"two", {1, 2}} }; - json j_nested_array = { {{1}, "one"}, {{1, 2}, "two"} }; - - // serialize the JSON value - std::cout << j_empty_init_list << '\n'; - std::cout << j_object << '\n'; - std::cout << j_array << '\n'; - std::cout << j_nested_object << '\n'; - std::cout << j_nested_array << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__list_init_t.link b/resources/3rdparty/modernjson/doc/examples/basic_json__list_init_t.link deleted file mode 100755 index 5eca20502..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__list_init_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__list_init_t.output b/resources/3rdparty/modernjson/doc/examples/basic_json__list_init_t.output deleted file mode 100755 index d38f5b842..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__list_init_t.output +++ /dev/null @@ -1,5 +0,0 @@ -{} -{"one":1,"two":2} -[1,2,3,4] -{"one":[1],"two":[1,2]} -[[[1],"one"],[[1,2],"two"]] diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__moveconstructor.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__moveconstructor.cpp deleted file mode 100755 index e470c95b1..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__moveconstructor.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value - json a = 23; - - // move contents of a to b - json b(std::move(a)); - - // serialize the JSON arrays - std::cout << a << '\n'; - std::cout << b << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__moveconstructor.link b/resources/3rdparty/modernjson/doc/examples/basic_json__moveconstructor.link deleted file mode 100755 index 88002bbd8..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__moveconstructor.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__moveconstructor.output b/resources/3rdparty/modernjson/doc/examples/basic_json__moveconstructor.output deleted file mode 100755 index 911b5b1ac..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__moveconstructor.output +++ /dev/null @@ -1,2 +0,0 @@ -null -23 diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__nullptr_t.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__nullptr_t.cpp deleted file mode 100755 index 426afabc6..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__nullptr_t.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON null value - json j(nullptr); - - // serialize the JSON null value - std::cout << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__nullptr_t.link b/resources/3rdparty/modernjson/doc/examples/basic_json__nullptr_t.link deleted file mode 100755 index bb26af46d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__nullptr_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__nullptr_t.output b/resources/3rdparty/modernjson/doc/examples/basic_json__nullptr_t.output deleted file mode 100755 index 19765bd50..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__nullptr_t.output +++ /dev/null @@ -1 +0,0 @@ -null diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__number_float_t.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__number_float_t.cpp deleted file mode 100755 index 92533b7d0..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__number_float_t.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create values of different floating-point types - json::number_float_t v_ok = 3.141592653589793; - json::number_float_t v_nan = NAN; - json::number_float_t v_infinity = INFINITY; - - // create JSON numbers - json j_ok(v_ok); - json j_nan(v_nan); - json j_infinity(v_infinity); - - // serialize the JSON numbers - std::cout << j_ok << '\n'; - std::cout << j_nan << '\n'; - std::cout << j_infinity << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__number_float_t.link b/resources/3rdparty/modernjson/doc/examples/basic_json__number_float_t.link deleted file mode 100755 index a7c6b6074..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__number_float_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__number_float_t.output b/resources/3rdparty/modernjson/doc/examples/basic_json__number_float_t.output deleted file mode 100755 index 964a7b1f2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__number_float_t.output +++ /dev/null @@ -1,3 +0,0 @@ -3.14159265358979 -null -null diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__number_integer_t.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__number_integer_t.cpp deleted file mode 100755 index 1078f360e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__number_integer_t.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON number from number_integer_t - json::number_integer_t value = 42; - - json j(value); - - // serialize the JSON numbers - std::cout << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__number_integer_t.link b/resources/3rdparty/modernjson/doc/examples/basic_json__number_integer_t.link deleted file mode 100755 index 764aa649d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__number_integer_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__number_integer_t.output b/resources/3rdparty/modernjson/doc/examples/basic_json__number_integer_t.output deleted file mode 100755 index d81cc0710..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__number_integer_t.output +++ /dev/null @@ -1 +0,0 @@ -42 diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__object_t.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__object_t.cpp deleted file mode 100755 index 39e2fcc0c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__object_t.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an object_t value - json::object_t value = { {"one", 1}, {"two", 2} }; - - // create a JSON object from the value - json j(value); - - // serialize the JSON object - std::cout << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__object_t.link b/resources/3rdparty/modernjson/doc/examples/basic_json__object_t.link deleted file mode 100755 index f6bad665a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__object_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__object_t.output b/resources/3rdparty/modernjson/doc/examples/basic_json__object_t.output deleted file mode 100755 index 62376d83e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__object_t.output +++ /dev/null @@ -1 +0,0 @@ -{"one":1,"two":2} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__size_type_basic_json.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__size_type_basic_json.cpp deleted file mode 100755 index 15f8c0d5c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__size_type_basic_json.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an array by creating copies of a JSON value - json value = "Hello"; - json array_0 = json(0, value); - json array_1 = json(1, value); - json array_5 = json(5, value); - - // serialize the JSON arrays - std::cout << array_0 << '\n'; - std::cout << array_1 << '\n'; - std::cout << array_5 << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__size_type_basic_json.link b/resources/3rdparty/modernjson/doc/examples/basic_json__size_type_basic_json.link deleted file mode 100755 index 6ae76b6f2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__size_type_basic_json.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__size_type_basic_json.output b/resources/3rdparty/modernjson/doc/examples/basic_json__size_type_basic_json.output deleted file mode 100755 index f4c59b348..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__size_type_basic_json.output +++ /dev/null @@ -1,3 +0,0 @@ -[] -["Hello"] -["Hello","Hello","Hello","Hello","Hello"] diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__string_t.cpp deleted file mode 100755 index 3205f623d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an string_t value - json::string_t value = "The quick brown fox jumps over the lazy doc"; - - // create a JSON string from the value - json j(value); - - // serialize the JSON array - std::cout << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t.link b/resources/3rdparty/modernjson/doc/examples/basic_json__string_t.link deleted file mode 100755 index a5051e582..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t.output b/resources/3rdparty/modernjson/doc/examples/basic_json__string_t.output deleted file mode 100755 index 89990044c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t.output +++ /dev/null @@ -1 +0,0 @@ -"The quick brown fox jumps over the lazy doc" diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t_value_type.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__string_t_value_type.cpp deleted file mode 100755 index 5379ca064..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t_value_type.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON string directly from a string literal - json j("The quick brown fox jumps over the lazy doc"); - - // serialize the JSON array - std::cout << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t_value_type.link b/resources/3rdparty/modernjson/doc/examples/basic_json__string_t_value_type.link deleted file mode 100755 index 4646b5b2a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t_value_type.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t_value_type.output b/resources/3rdparty/modernjson/doc/examples/basic_json__string_t_value_type.output deleted file mode 100755 index 89990044c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__string_t_value_type.output +++ /dev/null @@ -1 +0,0 @@ -"The quick brown fox jumps over the lazy doc" diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__value.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__value.cpp deleted file mode 100755 index dfb91d840..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__value.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON object with different entry types - json j = - { - {"integer", 1}, - {"floating", 42.23}, - {"string", "hello world"}, - {"boolean", true}, - {"object", {{"key1", 1}, {"key2", 2}}}, - {"array", {1, 2, 3}} - }; - - // access existing values - int v_integer = j.value("integer", 0); - double v_floating = j.value("floating", 47.11); - - // access nonexisting values and rely on default value - std::string v_string = j.value("nonexisting", "oops"); - bool v_boolean = j.value("nonexisting", false); - - // output values - std::cout << std::boolalpha << v_integer << " " << v_floating - << " " << v_string << " " << v_boolean << "\n"; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__value.link b/resources/3rdparty/modernjson/doc/examples/basic_json__value.link deleted file mode 100755 index 452a1fe4f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__value.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__value.output b/resources/3rdparty/modernjson/doc/examples/basic_json__value.output deleted file mode 100755 index dfc40e58c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__value.output +++ /dev/null @@ -1 +0,0 @@ -1 42.23 oops false diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__value_t.cpp b/resources/3rdparty/modernjson/doc/examples/basic_json__value_t.cpp deleted file mode 100755 index faf5dfaec..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__value_t.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create the different JSON values with default values - json j_null(json::value_t::null); - json j_boolean(json::value_t::boolean); - json j_number_integer(json::value_t::number_integer); - json j_number_float(json::value_t::number_float); - json j_object(json::value_t::object); - json j_array(json::value_t::array); - json j_string(json::value_t::string); - - // serialize the JSON values - std::cout << j_null << '\n'; - std::cout << j_boolean << '\n'; - std::cout << j_number_integer << '\n'; - std::cout << j_number_float << '\n'; - std::cout << j_object << '\n'; - std::cout << j_array << '\n'; - std::cout << j_string << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__value_t.link b/resources/3rdparty/modernjson/doc/examples/basic_json__value_t.link deleted file mode 100755 index 774aaa255..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__value_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/basic_json__value_t.output b/resources/3rdparty/modernjson/doc/examples/basic_json__value_t.output deleted file mode 100755 index ea542caeb..000000000 --- a/resources/3rdparty/modernjson/doc/examples/basic_json__value_t.output +++ /dev/null @@ -1,7 +0,0 @@ -null -false -0 -0.0 -{} -[] -"" diff --git a/resources/3rdparty/modernjson/doc/examples/begin.cpp b/resources/3rdparty/modernjson/doc/examples/begin.cpp deleted file mode 100755 index 46c17218d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/begin.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an array value - json array = {1, 2, 3, 4, 5}; - - // get am iterator to the first element - json::iterator it = array.begin(); - - // serialize the element that the iterator points to - std::cout << *it << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/begin.link b/resources/3rdparty/modernjson/doc/examples/begin.link deleted file mode 100755 index 6a76a5887..000000000 --- a/resources/3rdparty/modernjson/doc/examples/begin.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/begin.output b/resources/3rdparty/modernjson/doc/examples/begin.output deleted file mode 100755 index d00491fd7..000000000 --- a/resources/3rdparty/modernjson/doc/examples/begin.output +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/resources/3rdparty/modernjson/doc/examples/cbegin.cpp b/resources/3rdparty/modernjson/doc/examples/cbegin.cpp deleted file mode 100755 index fe45e49b0..000000000 --- a/resources/3rdparty/modernjson/doc/examples/cbegin.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an array value - const json array = {1, 2, 3, 4, 5}; - - // get am iterator to the first element - json::const_iterator it = array.cbegin(); - - // serialize the element that the iterator points to - std::cout << *it << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/cbegin.link b/resources/3rdparty/modernjson/doc/examples/cbegin.link deleted file mode 100755 index 83c75dd3c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/cbegin.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/cbegin.output b/resources/3rdparty/modernjson/doc/examples/cbegin.output deleted file mode 100755 index d00491fd7..000000000 --- a/resources/3rdparty/modernjson/doc/examples/cbegin.output +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/resources/3rdparty/modernjson/doc/examples/cend.cpp b/resources/3rdparty/modernjson/doc/examples/cend.cpp deleted file mode 100755 index a140fb0b5..000000000 --- a/resources/3rdparty/modernjson/doc/examples/cend.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an array value - json array = {1, 2, 3, 4, 5}; - - // get am iterator to one past the last element - json::const_iterator it = array.cend(); - - // decrement the iterator to point to the last element - --it; - - // serialize the element that the iterator points to - std::cout << *it << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/cend.link b/resources/3rdparty/modernjson/doc/examples/cend.link deleted file mode 100755 index acca215d2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/cend.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/cend.output b/resources/3rdparty/modernjson/doc/examples/cend.output deleted file mode 100755 index 7ed6ff82d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/cend.output +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/resources/3rdparty/modernjson/doc/examples/clear.cpp b/resources/3rdparty/modernjson/doc/examples/clear.cpp deleted file mode 100755 index 60016753b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/clear.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call clear() - j_null.clear(); - j_boolean.clear(); - j_number_integer.clear(); - j_number_float.clear(); - j_object.clear(); - j_array.clear(); - j_string.clear(); - - // serialize the cleared values() - std::cout << j_null << '\n'; - std::cout << j_boolean << '\n'; - std::cout << j_number_integer << '\n'; - std::cout << j_number_float << '\n'; - std::cout << j_object << '\n'; - std::cout << j_array << '\n'; - std::cout << j_string << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/clear.link b/resources/3rdparty/modernjson/doc/examples/clear.link deleted file mode 100755 index 8defa668d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/clear.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/clear.output b/resources/3rdparty/modernjson/doc/examples/clear.output deleted file mode 100755 index ea542caeb..000000000 --- a/resources/3rdparty/modernjson/doc/examples/clear.output +++ /dev/null @@ -1,7 +0,0 @@ -null -false -0 -0.0 -{} -[] -"" diff --git a/resources/3rdparty/modernjson/doc/examples/count.cpp b/resources/3rdparty/modernjson/doc/examples/count.cpp deleted file mode 100755 index a805eeb6a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/count.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON object - json j_object = {{"one", 1}, {"two", 2}}; - - // call find - auto count_two = j_object.count("two"); - auto count_three = j_object.count("three"); - - // print values - std::cout << std::boolalpha; - std::cout << "number of elements with key \"two\": " << count_two << '\n'; - std::cout << "number of elements with key \"three\": " << count_three << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/count.link b/resources/3rdparty/modernjson/doc/examples/count.link deleted file mode 100755 index e13caf363..000000000 --- a/resources/3rdparty/modernjson/doc/examples/count.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/count.output b/resources/3rdparty/modernjson/doc/examples/count.output deleted file mode 100755 index d816fcb24..000000000 --- a/resources/3rdparty/modernjson/doc/examples/count.output +++ /dev/null @@ -1,2 +0,0 @@ -number of elements with key "two": 1 -number of elements with key "three": 0 diff --git a/resources/3rdparty/modernjson/doc/examples/crbegin.cpp b/resources/3rdparty/modernjson/doc/examples/crbegin.cpp deleted file mode 100755 index 4ea71d973..000000000 --- a/resources/3rdparty/modernjson/doc/examples/crbegin.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an array value - json array = {1, 2, 3, 4, 5}; - - // get an iterator to the reverse-beginning - json::const_reverse_iterator it = array.crbegin(); - - // serialize the element that the iterator points to - std::cout << *it << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/crbegin.link b/resources/3rdparty/modernjson/doc/examples/crbegin.link deleted file mode 100755 index 27de8eb89..000000000 --- a/resources/3rdparty/modernjson/doc/examples/crbegin.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/crbegin.output b/resources/3rdparty/modernjson/doc/examples/crbegin.output deleted file mode 100755 index 7ed6ff82d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/crbegin.output +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/resources/3rdparty/modernjson/doc/examples/crend.cpp b/resources/3rdparty/modernjson/doc/examples/crend.cpp deleted file mode 100755 index 079eeea6c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/crend.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an array value - json array = {1, 2, 3, 4, 5}; - - // get an iterator to the reverse-end - json::const_reverse_iterator it = array.crend(); - - // increment the iterator to point to the first element - --it; - - // serialize the element that the iterator points to - std::cout << *it << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/crend.link b/resources/3rdparty/modernjson/doc/examples/crend.link deleted file mode 100755 index c678236d9..000000000 --- a/resources/3rdparty/modernjson/doc/examples/crend.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/crend.output b/resources/3rdparty/modernjson/doc/examples/crend.output deleted file mode 100755 index d00491fd7..000000000 --- a/resources/3rdparty/modernjson/doc/examples/crend.output +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/resources/3rdparty/modernjson/doc/examples/diff.cpp b/resources/3rdparty/modernjson/doc/examples/diff.cpp deleted file mode 100755 index d81a58dbd..000000000 --- a/resources/3rdparty/modernjson/doc/examples/diff.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // the source document - json source = R"( - { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // the target document - json target = R"( - { - "baz": "boo", - "hello": [ - "world" - ] - } - )"_json; - - // create the patch - json patch = json::diff(source, target); - - // roundtrip - json patched_source = source.patch(patch); - - // output patch and roundtrip result - std::cout << std::setw(4) << patch << "\n\n" - << std::setw(4) << patched_source << std::endl; -} diff --git a/resources/3rdparty/modernjson/doc/examples/diff.link b/resources/3rdparty/modernjson/doc/examples/diff.link deleted file mode 100755 index c3e3fa4d7..000000000 --- a/resources/3rdparty/modernjson/doc/examples/diff.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/diff.output b/resources/3rdparty/modernjson/doc/examples/diff.output deleted file mode 100755 index 7dc79791f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/diff.output +++ /dev/null @@ -1,25 +0,0 @@ -[ - { - "op": "replace", - "path": "/baz", - "value": "boo" - }, - { - "op": "remove", - "path": "/foo" - }, - { - "op": "add", - "path": "/hello", - "value": [ - "world" - ] - } -] - -{ - "baz": "boo", - "hello": [ - "world" - ] -} diff --git a/resources/3rdparty/modernjson/doc/examples/dump.cpp b/resources/3rdparty/modernjson/doc/examples/dump.cpp deleted file mode 100755 index 3145d4539..000000000 --- a/resources/3rdparty/modernjson/doc/examples/dump.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - - // call dump() - std::cout << j_object.dump() << "\n\n"; - std::cout << j_object.dump(-1) << "\n\n"; - std::cout << j_object.dump(0) << "\n\n"; - std::cout << j_object.dump(4) << "\n\n"; - std::cout << j_array.dump() << "\n\n"; - std::cout << j_array.dump(-1) << "\n\n"; - std::cout << j_array.dump(0) << "\n\n"; - std::cout << j_array.dump(4) << "\n\n"; -} diff --git a/resources/3rdparty/modernjson/doc/examples/dump.link b/resources/3rdparty/modernjson/doc/examples/dump.link deleted file mode 100755 index 35ef46533..000000000 --- a/resources/3rdparty/modernjson/doc/examples/dump.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/dump.output b/resources/3rdparty/modernjson/doc/examples/dump.output deleted file mode 100755 index 9b462eabe..000000000 --- a/resources/3rdparty/modernjson/doc/examples/dump.output +++ /dev/null @@ -1,34 +0,0 @@ -{"one":1,"two":2} - -{"one":1,"two":2} - -{ -"one": 1, -"two": 2 -} - -{ - "one": 1, - "two": 2 -} - -[1,2,4,8,16] - -[1,2,4,8,16] - -[ -1, -2, -4, -8, -16 -] - -[ - 1, - 2, - 4, - 8, - 16 -] - diff --git a/resources/3rdparty/modernjson/doc/examples/empty.cpp b/resources/3rdparty/modernjson/doc/examples/empty.cpp deleted file mode 100755 index 2edda6dc9..000000000 --- a/resources/3rdparty/modernjson/doc/examples/empty.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_object_empty(json::value_t::object); - json j_array = {1, 2, 4, 8, 16}; - json j_array_empty(json::value_t::array); - json j_string = "Hello, world"; - - // call empty() - std::cout << std::boolalpha; - std::cout << j_null.empty() << '\n'; - std::cout << j_boolean.empty() << '\n'; - std::cout << j_number_integer.empty() << '\n'; - std::cout << j_number_float.empty() << '\n'; - std::cout << j_object.empty() << '\n'; - std::cout << j_object_empty.empty() << '\n'; - std::cout << j_array.empty() << '\n'; - std::cout << j_array_empty.empty() << '\n'; - std::cout << j_string.empty() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/empty.link b/resources/3rdparty/modernjson/doc/examples/empty.link deleted file mode 100755 index fd22770cf..000000000 --- a/resources/3rdparty/modernjson/doc/examples/empty.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/empty.output b/resources/3rdparty/modernjson/doc/examples/empty.output deleted file mode 100755 index d071a3980..000000000 --- a/resources/3rdparty/modernjson/doc/examples/empty.output +++ /dev/null @@ -1,9 +0,0 @@ -true -false -false -false -false -true -false -true -false diff --git a/resources/3rdparty/modernjson/doc/examples/end.cpp b/resources/3rdparty/modernjson/doc/examples/end.cpp deleted file mode 100755 index 848623a4d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/end.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an array value - json array = {1, 2, 3, 4, 5}; - - // get am iterator to one past the last element - json::iterator it = array.end(); - - // decrement the iterator to point to the last element - --it; - - // serialize the element that the iterator points to - std::cout << *it << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/end.link b/resources/3rdparty/modernjson/doc/examples/end.link deleted file mode 100755 index 260696d5a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/end.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/end.output b/resources/3rdparty/modernjson/doc/examples/end.output deleted file mode 100755 index 7ed6ff82d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/end.output +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType.cpp b/resources/3rdparty/modernjson/doc/examples/erase__IteratorType.cpp deleted file mode 100755 index 5743c3274..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call erase - j_boolean.erase(j_boolean.begin()); - j_number_integer.erase(j_number_integer.begin()); - j_number_float.erase(j_number_float.begin()); - j_object.erase(j_object.find("two")); - j_array.erase(j_array.begin() + 2); - j_string.erase(j_string.begin()); - - // print values - std::cout << j_boolean << '\n'; - std::cout << j_number_integer << '\n'; - std::cout << j_number_float << '\n'; - std::cout << j_object << '\n'; - std::cout << j_array << '\n'; - std::cout << j_string << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType.link b/resources/3rdparty/modernjson/doc/examples/erase__IteratorType.link deleted file mode 100755 index b523066ed..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType.output b/resources/3rdparty/modernjson/doc/examples/erase__IteratorType.output deleted file mode 100755 index e392f8eaf..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType.output +++ /dev/null @@ -1,6 +0,0 @@ -null -null -null -{"one":1} -[1,2,8,16] -null diff --git a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType_IteratorType.cpp b/resources/3rdparty/modernjson/doc/examples/erase__IteratorType_IteratorType.cpp deleted file mode 100755 index 9250c3ca0..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType_IteratorType.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call erase - j_boolean.erase(j_boolean.begin(), j_boolean.end()); - j_number_integer.erase(j_number_integer.begin(), j_number_integer.end()); - j_number_float.erase(j_number_float.begin(), j_number_float.end()); - j_object.erase(j_object.find("two"), j_object.end()); - j_array.erase(j_array.begin() + 1, j_array.begin() + 3); - j_string.erase(j_string.begin(), j_string.end()); - - // print values - std::cout << j_boolean << '\n'; - std::cout << j_number_integer << '\n'; - std::cout << j_number_float << '\n'; - std::cout << j_object << '\n'; - std::cout << j_array << '\n'; - std::cout << j_string << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType_IteratorType.link b/resources/3rdparty/modernjson/doc/examples/erase__IteratorType_IteratorType.link deleted file mode 100755 index b7f3da724..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType_IteratorType.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType_IteratorType.output b/resources/3rdparty/modernjson/doc/examples/erase__IteratorType_IteratorType.output deleted file mode 100755 index 5d01f0089..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__IteratorType_IteratorType.output +++ /dev/null @@ -1,6 +0,0 @@ -null -null -null -{"one":1} -[1,8,16] -null diff --git a/resources/3rdparty/modernjson/doc/examples/erase__key_type.cpp b/resources/3rdparty/modernjson/doc/examples/erase__key_type.cpp deleted file mode 100755 index ca0962aaa..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__key_type.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON object - json j_object = {{"one", 1}, {"two", 2}}; - - // call erase - auto count_one = j_object.erase("one"); - auto count_three = j_object.erase("three"); - - // print values - std::cout << j_object << '\n'; - std::cout << count_one << " " << count_three << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/erase__key_type.link b/resources/3rdparty/modernjson/doc/examples/erase__key_type.link deleted file mode 100755 index bef018cab..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__key_type.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/erase__key_type.output b/resources/3rdparty/modernjson/doc/examples/erase__key_type.output deleted file mode 100755 index 28d79391a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__key_type.output +++ /dev/null @@ -1,2 +0,0 @@ -{"two":2} -1 0 diff --git a/resources/3rdparty/modernjson/doc/examples/erase__size_type.cpp b/resources/3rdparty/modernjson/doc/examples/erase__size_type.cpp deleted file mode 100755 index 7df3d0625..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__size_type.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON array - json j_array = {0, 1, 2, 3, 4, 5}; - - // call erase - j_array.erase(2); - - // print values - std::cout << j_array << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/erase__size_type.link b/resources/3rdparty/modernjson/doc/examples/erase__size_type.link deleted file mode 100755 index fe2d560d5..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__size_type.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/erase__size_type.output b/resources/3rdparty/modernjson/doc/examples/erase__size_type.output deleted file mode 100755 index 4ad74061f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/erase__size_type.output +++ /dev/null @@ -1 +0,0 @@ -[0,1,3,4,5] diff --git a/resources/3rdparty/modernjson/doc/examples/find__key_type.cpp b/resources/3rdparty/modernjson/doc/examples/find__key_type.cpp deleted file mode 100755 index 79eed509a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/find__key_type.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON object - json j_object = {{"one", 1}, {"two", 2}}; - - // call find - auto it_two = j_object.find("two"); - auto it_three = j_object.find("three"); - - // print values - std::cout << std::boolalpha; - std::cout << "\"two\" was found: " << (it_two != j_object.end()) << '\n'; - std::cout << "value at key \"two\": " << *it_two << '\n'; - std::cout << "\"three\" was found: " << (it_three != j_object.end()) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/find__key_type.link b/resources/3rdparty/modernjson/doc/examples/find__key_type.link deleted file mode 100755 index 2bc0512d1..000000000 --- a/resources/3rdparty/modernjson/doc/examples/find__key_type.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/find__key_type.output b/resources/3rdparty/modernjson/doc/examples/find__key_type.output deleted file mode 100755 index 509bb42d5..000000000 --- a/resources/3rdparty/modernjson/doc/examples/find__key_type.output +++ /dev/null @@ -1,3 +0,0 @@ -"two" was found: true -value at key "two": 2 -"three" was found: false diff --git a/resources/3rdparty/modernjson/doc/examples/flatten.cpp b/resources/3rdparty/modernjson/doc/examples/flatten.cpp deleted file mode 100755 index ace53a21b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/flatten.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON value - json j = - { - {"pi", 3.141}, - {"happy", true}, - {"name", "Niels"}, - {"nothing", nullptr}, - { - "answer", { - {"everything", 42} - } - }, - {"list", {1, 0, 2}}, - { - "object", { - {"currency", "USD"}, - {"value", 42.99} - } - } - }; - - // call flatten() - std::cout << std::setw(4) << j.flatten() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/flatten.link b/resources/3rdparty/modernjson/doc/examples/flatten.link deleted file mode 100755 index 50d3841f3..000000000 --- a/resources/3rdparty/modernjson/doc/examples/flatten.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/flatten.output b/resources/3rdparty/modernjson/doc/examples/flatten.output deleted file mode 100755 index 33bd4c4b9..000000000 --- a/resources/3rdparty/modernjson/doc/examples/flatten.output +++ /dev/null @@ -1,12 +0,0 @@ -{ - "/answer/everything": 42, - "/happy": true, - "/list/0": 1, - "/list/1": 0, - "/list/2": 2, - "/name": "Niels", - "/nothing": null, - "/object/currency": "USD", - "/object/value": 42.99, - "/pi": 3.141 -} diff --git a/resources/3rdparty/modernjson/doc/examples/front.cpp b/resources/3rdparty/modernjson/doc/examples/front.cpp deleted file mode 100755 index 7c5a2ae99..000000000 --- a/resources/3rdparty/modernjson/doc/examples/front.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_object_empty(json::value_t::object); - json j_array = {1, 2, 4, 8, 16}; - json j_array_empty(json::value_t::array); - json j_string = "Hello, world"; - - // call front() - //std::cout << j_null.front() << '\n'; // would throw - std::cout << j_boolean.front() << '\n'; - std::cout << j_number_integer.front() << '\n'; - std::cout << j_number_float.front() << '\n'; - std::cout << j_object.front() << '\n'; - //std::cout << j_object_empty.front() << '\n'; // undefined behavior - std::cout << j_array.front() << '\n'; - //std::cout << j_array_empty.front() << '\n'; // undefined behavior - std::cout << j_string.front() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/front.link b/resources/3rdparty/modernjson/doc/examples/front.link deleted file mode 100755 index 22e99c7dd..000000000 --- a/resources/3rdparty/modernjson/doc/examples/front.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/front.output b/resources/3rdparty/modernjson/doc/examples/front.output deleted file mode 100755 index 6301db533..000000000 --- a/resources/3rdparty/modernjson/doc/examples/front.output +++ /dev/null @@ -1,6 +0,0 @@ -true -17 -23.42 -1 -1 -"Hello, world" diff --git a/resources/3rdparty/modernjson/doc/examples/get__PointerType.cpp b/resources/3rdparty/modernjson/doc/examples/get__PointerType.cpp deleted file mode 100755 index 7c15c5aa3..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get__PointerType.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON number - json value = 17; - - // explicitly getting pointers - auto p1 = value.get(); - auto p2 = value.get(); - auto p3 = value.get(); - auto p4 = value.get(); - auto p5 = value.get(); - - // print the pointees - std::cout << *p1 << ' ' << *p2 << ' ' << *p3 << ' ' << *p4 << '\n'; - std::cout << std::boolalpha << (p5 == nullptr) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/get__PointerType.link b/resources/3rdparty/modernjson/doc/examples/get__PointerType.link deleted file mode 100755 index a811b26df..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get__PointerType.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/get__PointerType.output b/resources/3rdparty/modernjson/doc/examples/get__PointerType.output deleted file mode 100755 index a15dd774e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get__PointerType.output +++ /dev/null @@ -1,2 +0,0 @@ -17 17 17 17 -true diff --git a/resources/3rdparty/modernjson/doc/examples/get__ValueType_const.cpp b/resources/3rdparty/modernjson/doc/examples/get__ValueType_const.cpp deleted file mode 100755 index 40a96184b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get__ValueType_const.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value with different types - json json_types = - { - {"boolean", true}, - { - "number", { - {"integer", 42}, - {"floating-point", 17.23} - } - }, - {"string", "Hello, world!"}, - {"array", {1, 2, 3, 4, 5}}, - {"null", nullptr} - }; - - // use explicit conversions - auto v1 = json_types["boolean"].get(); - auto v2 = json_types["number"]["integer"].get(); - auto v3 = json_types["number"]["integer"].get(); - auto v4 = json_types["number"]["floating-point"].get(); - auto v5 = json_types["number"]["floating-point"].get(); - auto v6 = json_types["string"].get(); - auto v7 = json_types["array"].get>(); - auto v8 = json_types.get>(); - - // print the conversion results - std::cout << v1 << '\n'; - std::cout << v2 << ' ' << v3 << '\n'; - std::cout << v4 << ' ' << v5 << '\n'; - std::cout << v6 << '\n'; - - for (auto i : v7) - { - std::cout << i << ' '; - } - std::cout << "\n\n"; - - for (auto i : v8) - { - std::cout << i.first << ": " << i.second << '\n'; - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/get__ValueType_const.link b/resources/3rdparty/modernjson/doc/examples/get__ValueType_const.link deleted file mode 100755 index fce774b2b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get__ValueType_const.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/get__ValueType_const.output b/resources/3rdparty/modernjson/doc/examples/get__ValueType_const.output deleted file mode 100755 index 5cd9cd3aa..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get__ValueType_const.output +++ /dev/null @@ -1,11 +0,0 @@ -1 -42 42 -17.23 17 -Hello, world! -1 2 3 4 5 - -string: "Hello, world!" -number: {"floating-point":17.23,"integer":42} -null: null -boolean: true -array: [1,2,3,4,5] diff --git a/resources/3rdparty/modernjson/doc/examples/get_ptr.cpp b/resources/3rdparty/modernjson/doc/examples/get_ptr.cpp deleted file mode 100755 index 2c319dc40..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get_ptr.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON number - json value = 17; - - // explicitly getting pointers - auto p1 = value.get_ptr(); - auto p2 = value.get_ptr(); - auto p3 = value.get_ptr(); - auto p4 = value.get_ptr(); - auto p5 = value.get_ptr(); - - // print the pointees - std::cout << *p1 << ' ' << *p2 << ' ' << *p3 << ' ' << *p4 << '\n'; - std::cout << std::boolalpha << (p5 == nullptr) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/get_ptr.link b/resources/3rdparty/modernjson/doc/examples/get_ptr.link deleted file mode 100755 index e318d7780..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get_ptr.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/get_ptr.output b/resources/3rdparty/modernjson/doc/examples/get_ptr.output deleted file mode 100755 index a15dd774e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get_ptr.output +++ /dev/null @@ -1,2 +0,0 @@ -17 17 17 17 -true diff --git a/resources/3rdparty/modernjson/doc/examples/get_ref.cpp b/resources/3rdparty/modernjson/doc/examples/get_ref.cpp deleted file mode 100755 index d0ddb2d27..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get_ref.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON number - json value = 17; - - // explicitly getting references - auto r1 = value.get_ref(); - auto r2 = value.get_ref(); - - // print the values - std::cout << r1 << ' ' << r2 << '\n'; - - // incompatible type throws exception - try - { - auto r3 = value.get_ref(); - } - catch (std::domain_error& ex) - { - std::cout << ex.what() << '\n'; - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/get_ref.link b/resources/3rdparty/modernjson/doc/examples/get_ref.link deleted file mode 100755 index c0d8275a3..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get_ref.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/get_ref.output b/resources/3rdparty/modernjson/doc/examples/get_ref.output deleted file mode 100755 index 50bc0df69..000000000 --- a/resources/3rdparty/modernjson/doc/examples/get_ref.output +++ /dev/null @@ -1,2 +0,0 @@ -17 17 -incompatible ReferenceType for get_ref, actual type is number diff --git a/resources/3rdparty/modernjson/doc/examples/insert.cpp b/resources/3rdparty/modernjson/doc/examples/insert.cpp deleted file mode 100755 index 967f443ef..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON array - json v = {1, 2, 3, 4}; - - // insert number 10 before number 3 - auto new_pos = v.insert(v.begin() + 2, 10); - - // output new array and result of insert call - std::cout << *new_pos << '\n'; - std::cout << v << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/insert.link b/resources/3rdparty/modernjson/doc/examples/insert.link deleted file mode 100755 index 3886e04d5..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/insert.output b/resources/3rdparty/modernjson/doc/examples/insert.output deleted file mode 100755 index ed5cab1d0..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert.output +++ /dev/null @@ -1,2 +0,0 @@ -10 -[1,2,10,3,4] diff --git a/resources/3rdparty/modernjson/doc/examples/insert__count.cpp b/resources/3rdparty/modernjson/doc/examples/insert__count.cpp deleted file mode 100755 index 258515e68..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert__count.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON array - json v = {1, 2, 3, 4}; - - // insert number 7 copies of number 7 before number 3 - auto new_pos = v.insert(v.begin() + 2, 7, 7); - - // output new array and result of insert call - std::cout << *new_pos << '\n'; - std::cout << v << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/insert__count.link b/resources/3rdparty/modernjson/doc/examples/insert__count.link deleted file mode 100755 index b97d0d69f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert__count.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/insert__count.output b/resources/3rdparty/modernjson/doc/examples/insert__count.output deleted file mode 100755 index 294685ac4..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert__count.output +++ /dev/null @@ -1,2 +0,0 @@ -7 -[1,2,7,7,7,7,7,7,7,3,4] diff --git a/resources/3rdparty/modernjson/doc/examples/insert__ilist.cpp b/resources/3rdparty/modernjson/doc/examples/insert__ilist.cpp deleted file mode 100755 index c0138d2a0..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert__ilist.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON array - json v = {1, 2, 3, 4}; - - // insert range from v2 before the end of array v - auto new_pos = v.insert(v.end(), {7, 8, 9}); - - // output new array and result of insert call - std::cout << *new_pos << '\n'; - std::cout << v << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/insert__ilist.link b/resources/3rdparty/modernjson/doc/examples/insert__ilist.link deleted file mode 100755 index 4920588b5..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert__ilist.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/insert__ilist.output b/resources/3rdparty/modernjson/doc/examples/insert__ilist.output deleted file mode 100755 index b2fc7eeb9..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert__ilist.output +++ /dev/null @@ -1,2 +0,0 @@ -7 -[1,2,3,4,7,8,9] diff --git a/resources/3rdparty/modernjson/doc/examples/insert__range.cpp b/resources/3rdparty/modernjson/doc/examples/insert__range.cpp deleted file mode 100755 index b5d0001ba..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert__range.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON array - json v = {1, 2, 3, 4}; - - // create a JSON array to copy values from - json v2 = {"one", "two", "three", "four"}; - - // insert range from v2 before the end of array v - auto new_pos = v.insert(v.end(), v2.begin(), v2.end()); - - // output new array and result of insert call - std::cout << *new_pos << '\n'; - std::cout << v << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/insert__range.link b/resources/3rdparty/modernjson/doc/examples/insert__range.link deleted file mode 100755 index ac773f8b2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert__range.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/insert__range.output b/resources/3rdparty/modernjson/doc/examples/insert__range.output deleted file mode 100755 index d50e9f63a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/insert__range.output +++ /dev/null @@ -1,2 +0,0 @@ -"one" -[1,2,3,4,"one","two","three","four"] diff --git a/resources/3rdparty/modernjson/doc/examples/is_array.cpp b/resources/3rdparty/modernjson/doc/examples/is_array.cpp deleted file mode 100755 index 11a631150..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_array.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_unsigned_integer = 12345678987654321u; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_array() - std::cout << std::boolalpha; - std::cout << j_null.is_array() << '\n'; - std::cout << j_boolean.is_array() << '\n'; - std::cout << j_number_integer.is_array() << '\n'; - std::cout << j_number_unsigned_integer.is_array() << '\n'; - std::cout << j_number_float.is_array() << '\n'; - std::cout << j_object.is_array() << '\n'; - std::cout << j_array.is_array() << '\n'; - std::cout << j_string.is_array() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_array.link b/resources/3rdparty/modernjson/doc/examples/is_array.link deleted file mode 100755 index 8c8b9f825..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_array.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_array.output b/resources/3rdparty/modernjson/doc/examples/is_array.output deleted file mode 100755 index 5b8cc40c9..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_array.output +++ /dev/null @@ -1,8 +0,0 @@ -false -false -false -false -false -false -true -false diff --git a/resources/3rdparty/modernjson/doc/examples/is_boolean.cpp b/resources/3rdparty/modernjson/doc/examples/is_boolean.cpp deleted file mode 100755 index 9efcf6943..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_boolean.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_unsigned_integer = 12345678987654321u; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_boolean() - std::cout << std::boolalpha; - std::cout << j_null.is_boolean() << '\n'; - std::cout << j_boolean.is_boolean() << '\n'; - std::cout << j_number_integer.is_boolean() << '\n'; - std::cout << j_number_unsigned_integer.is_boolean() << '\n'; - std::cout << j_number_float.is_boolean() << '\n'; - std::cout << j_object.is_boolean() << '\n'; - std::cout << j_array.is_boolean() << '\n'; - std::cout << j_string.is_boolean() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_boolean.link b/resources/3rdparty/modernjson/doc/examples/is_boolean.link deleted file mode 100755 index 62f5fed14..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_boolean.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_boolean.output b/resources/3rdparty/modernjson/doc/examples/is_boolean.output deleted file mode 100755 index 721b3a5e2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_boolean.output +++ /dev/null @@ -1,8 +0,0 @@ -false -true -false -false -false -false -false -false diff --git a/resources/3rdparty/modernjson/doc/examples/is_discarded.cpp b/resources/3rdparty/modernjson/doc/examples/is_discarded.cpp deleted file mode 100755 index a1d42a7a8..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_discarded.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_unsigned_integer = 12345678987654321u; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_discarded() - std::cout << std::boolalpha; - std::cout << j_null.is_discarded() << '\n'; - std::cout << j_boolean.is_discarded() << '\n'; - std::cout << j_number_integer.is_discarded() << '\n'; - std::cout << j_number_unsigned_integer.is_discarded() << '\n'; - std::cout << j_number_float.is_discarded() << '\n'; - std::cout << j_object.is_discarded() << '\n'; - std::cout << j_array.is_discarded() << '\n'; - std::cout << j_string.is_discarded() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_discarded.link b/resources/3rdparty/modernjson/doc/examples/is_discarded.link deleted file mode 100755 index 7ce69a104..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_discarded.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_discarded.output b/resources/3rdparty/modernjson/doc/examples/is_discarded.output deleted file mode 100755 index 485b16967..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_discarded.output +++ /dev/null @@ -1,8 +0,0 @@ -false -false -false -false -false -false -false -false diff --git a/resources/3rdparty/modernjson/doc/examples/is_null.cpp b/resources/3rdparty/modernjson/doc/examples/is_null.cpp deleted file mode 100755 index 0d69c05c2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_null.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_unsigned_integer = 12345678987654321u; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_null() - std::cout << std::boolalpha; - std::cout << j_null.is_null() << '\n'; - std::cout << j_boolean.is_null() << '\n'; - std::cout << j_number_integer.is_null() << '\n'; - std::cout << j_number_unsigned_integer.is_null() << '\n'; - std::cout << j_number_float.is_null() << '\n'; - std::cout << j_object.is_null() << '\n'; - std::cout << j_array.is_null() << '\n'; - std::cout << j_string.is_null() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_null.link b/resources/3rdparty/modernjson/doc/examples/is_null.link deleted file mode 100755 index 6b22b9780..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_null.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_null.output b/resources/3rdparty/modernjson/doc/examples/is_null.output deleted file mode 100755 index 4cc64628d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_null.output +++ /dev/null @@ -1,8 +0,0 @@ -true -false -false -false -false -false -false -false diff --git a/resources/3rdparty/modernjson/doc/examples/is_number.cpp b/resources/3rdparty/modernjson/doc/examples/is_number.cpp deleted file mode 100755 index fd2a99b11..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_unsigned_integer = 12345678987654321u; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_number() - std::cout << std::boolalpha; - std::cout << j_null.is_number() << '\n'; - std::cout << j_boolean.is_number() << '\n'; - std::cout << j_number_integer.is_number() << '\n'; - std::cout << j_number_unsigned_integer.is_number() << '\n'; - std::cout << j_number_float.is_number() << '\n'; - std::cout << j_object.is_number() << '\n'; - std::cout << j_array.is_number() << '\n'; - std::cout << j_string.is_number() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_number.link b/resources/3rdparty/modernjson/doc/examples/is_number.link deleted file mode 100755 index bf863a1cf..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_number.output b/resources/3rdparty/modernjson/doc/examples/is_number.output deleted file mode 100755 index 06dbc2823..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number.output +++ /dev/null @@ -1,8 +0,0 @@ -false -false -true -true -true -false -false -false diff --git a/resources/3rdparty/modernjson/doc/examples/is_number_float.cpp b/resources/3rdparty/modernjson/doc/examples/is_number_float.cpp deleted file mode 100755 index 92bcfa108..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number_float.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_unsigned_integer = 12345678987654321u; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_number_float() - std::cout << std::boolalpha; - std::cout << j_null.is_number_float() << '\n'; - std::cout << j_boolean.is_number_float() << '\n'; - std::cout << j_number_integer.is_number_float() << '\n'; - std::cout << j_number_unsigned_integer.is_number_float() << '\n'; - std::cout << j_number_float.is_number_float() << '\n'; - std::cout << j_object.is_number_float() << '\n'; - std::cout << j_array.is_number_float() << '\n'; - std::cout << j_string.is_number_float() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_number_float.link b/resources/3rdparty/modernjson/doc/examples/is_number_float.link deleted file mode 100755 index 38abb5985..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number_float.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_number_float.output b/resources/3rdparty/modernjson/doc/examples/is_number_float.output deleted file mode 100755 index 09afae4c9..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number_float.output +++ /dev/null @@ -1,8 +0,0 @@ -false -false -false -false -true -false -false -false diff --git a/resources/3rdparty/modernjson/doc/examples/is_number_integer.cpp b/resources/3rdparty/modernjson/doc/examples/is_number_integer.cpp deleted file mode 100755 index ecac7cd64..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number_integer.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_unsigned_integer = 12345678987654321u; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_number_integer() - std::cout << std::boolalpha; - std::cout << j_null.is_number_integer() << '\n'; - std::cout << j_boolean.is_number_integer() << '\n'; - std::cout << j_number_integer.is_number_integer() << '\n'; - std::cout << j_number_unsigned_integer.is_number_integer() << '\n'; - std::cout << j_number_float.is_number_integer() << '\n'; - std::cout << j_object.is_number_integer() << '\n'; - std::cout << j_array.is_number_integer() << '\n'; - std::cout << j_string.is_number_integer() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_number_integer.link b/resources/3rdparty/modernjson/doc/examples/is_number_integer.link deleted file mode 100755 index d6162ab0e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number_integer.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_number_integer.output b/resources/3rdparty/modernjson/doc/examples/is_number_integer.output deleted file mode 100755 index be0f73936..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number_integer.output +++ /dev/null @@ -1,8 +0,0 @@ -false -false -true -true -false -false -false -false diff --git a/resources/3rdparty/modernjson/doc/examples/is_number_unsigned.cpp b/resources/3rdparty/modernjson/doc/examples/is_number_unsigned.cpp deleted file mode 100755 index ad457591c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number_unsigned.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_unsigned_integer = 12345678987654321u; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_number_unsigned() - std::cout << std::boolalpha; - std::cout << j_null.is_number_unsigned() << '\n'; - std::cout << j_boolean.is_number_unsigned() << '\n'; - std::cout << j_number_integer.is_number_unsigned() << '\n'; - std::cout << j_number_unsigned_integer.is_number_unsigned() << '\n'; - std::cout << j_number_float.is_number_unsigned() << '\n'; - std::cout << j_object.is_number_unsigned() << '\n'; - std::cout << j_array.is_number_unsigned() << '\n'; - std::cout << j_string.is_number_unsigned() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_number_unsigned.link b/resources/3rdparty/modernjson/doc/examples/is_number_unsigned.link deleted file mode 100755 index 41986cefa..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number_unsigned.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_number_unsigned.output b/resources/3rdparty/modernjson/doc/examples/is_number_unsigned.output deleted file mode 100755 index fdf264e0c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_number_unsigned.output +++ /dev/null @@ -1,8 +0,0 @@ -false -false -false -true -false -false -false -false diff --git a/resources/3rdparty/modernjson/doc/examples/is_object.cpp b/resources/3rdparty/modernjson/doc/examples/is_object.cpp deleted file mode 100755 index 56db66e56..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_object.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_number_unsigned_integer = 12345678987654321u; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_object() - std::cout << std::boolalpha; - std::cout << j_null.is_object() << '\n'; - std::cout << j_boolean.is_object() << '\n'; - std::cout << j_number_integer.is_object() << '\n'; - std::cout << j_number_unsigned_integer.is_object() << '\n'; - std::cout << j_number_float.is_object() << '\n'; - std::cout << j_object.is_object() << '\n'; - std::cout << j_array.is_object() << '\n'; - std::cout << j_string.is_object() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_object.link b/resources/3rdparty/modernjson/doc/examples/is_object.link deleted file mode 100755 index 1a304d09a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_object.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_object.output b/resources/3rdparty/modernjson/doc/examples/is_object.output deleted file mode 100755 index e041e3922..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_object.output +++ /dev/null @@ -1,8 +0,0 @@ -false -false -false -false -false -true -false -false diff --git a/resources/3rdparty/modernjson/doc/examples/is_primitive.cpp b/resources/3rdparty/modernjson/doc/examples/is_primitive.cpp deleted file mode 100755 index 48872ab5a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_primitive.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_number_unsigned_integer = 12345678987654321u; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_primitive() - std::cout << std::boolalpha; - std::cout << j_null.is_primitive() << '\n'; - std::cout << j_boolean.is_primitive() << '\n'; - std::cout << j_number_integer.is_primitive() << '\n'; - std::cout << j_number_unsigned_integer.is_primitive() << '\n'; - std::cout << j_number_float.is_primitive() << '\n'; - std::cout << j_object.is_primitive() << '\n'; - std::cout << j_array.is_primitive() << '\n'; - std::cout << j_string.is_primitive() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_primitive.link b/resources/3rdparty/modernjson/doc/examples/is_primitive.link deleted file mode 100755 index eb73ffb1b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_primitive.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_primitive.output b/resources/3rdparty/modernjson/doc/examples/is_primitive.output deleted file mode 100755 index 635db6e34..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_primitive.output +++ /dev/null @@ -1,8 +0,0 @@ -true -true -true -true -true -false -false -true diff --git a/resources/3rdparty/modernjson/doc/examples/is_string.cpp b/resources/3rdparty/modernjson/doc/examples/is_string.cpp deleted file mode 100755 index 2d6ed0698..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_string.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_number_unsigned_integer = 12345678987654321u; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_string() - std::cout << std::boolalpha; - std::cout << j_null.is_string() << '\n'; - std::cout << j_boolean.is_string() << '\n'; - std::cout << j_number_integer.is_string() << '\n'; - std::cout << j_number_unsigned_integer.is_string() << '\n'; - std::cout << j_number_float.is_string() << '\n'; - std::cout << j_object.is_string() << '\n'; - std::cout << j_array.is_string() << '\n'; - std::cout << j_string.is_string() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_string.link b/resources/3rdparty/modernjson/doc/examples/is_string.link deleted file mode 100755 index 6af78b0ba..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_string.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_string.output b/resources/3rdparty/modernjson/doc/examples/is_string.output deleted file mode 100755 index 672eb4385..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_string.output +++ /dev/null @@ -1,8 +0,0 @@ -false -false -false -false -false -false -false -true diff --git a/resources/3rdparty/modernjson/doc/examples/is_structured.cpp b/resources/3rdparty/modernjson/doc/examples/is_structured.cpp deleted file mode 100755 index ed573e3cc..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_structured.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_number_unsigned_integer = 12345678987654321u; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call is_structured() - std::cout << std::boolalpha; - std::cout << j_null.is_structured() << '\n'; - std::cout << j_boolean.is_structured() << '\n'; - std::cout << j_number_integer.is_structured() << '\n'; - std::cout << j_number_unsigned_integer.is_structured() << '\n'; - std::cout << j_number_float.is_structured() << '\n'; - std::cout << j_object.is_structured() << '\n'; - std::cout << j_array.is_structured() << '\n'; - std::cout << j_string.is_structured() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/is_structured.link b/resources/3rdparty/modernjson/doc/examples/is_structured.link deleted file mode 100755 index 8ae6fd044..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_structured.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/is_structured.output b/resources/3rdparty/modernjson/doc/examples/is_structured.output deleted file mode 100755 index e1186dd8f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/is_structured.output +++ /dev/null @@ -1,8 +0,0 @@ -false -false -false -false -false -true -true -false diff --git a/resources/3rdparty/modernjson/doc/examples/json_pointer.cpp b/resources/3rdparty/modernjson/doc/examples/json_pointer.cpp deleted file mode 100755 index 140eac3b6..000000000 --- a/resources/3rdparty/modernjson/doc/examples/json_pointer.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // correct JSON pointers - json::json_pointer p1; - json::json_pointer p2(""); - json::json_pointer p3("/"); - json::json_pointer p4("//"); - json::json_pointer p5("/foo/bar"); - json::json_pointer p6("/foo/bar/-"); - json::json_pointer p7("/foo/~0"); - json::json_pointer p8("/foo/~1"); - - // error: JSON pointer does not begin with a slash - try - { - json::json_pointer p9("foo"); - } - catch (std::domain_error& e) - { - std::cout << "domain_error: " << e.what() << '\n'; - } - - // error: JSON pointer uses escape symbol ~ not followed by 0 or 1 - try - { - json::json_pointer p10("/foo/~"); - } - catch (std::domain_error& e) - { - std::cout << "domain_error: " << e.what() << '\n'; - } - - // error: JSON pointer uses escape symbol ~ not followed by 0 or 1 - try - { - json::json_pointer p11("/foo/~3"); - } - catch (std::domain_error& e) - { - std::cout << "domain_error: " << e.what() << '\n'; - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/json_pointer.link b/resources/3rdparty/modernjson/doc/examples/json_pointer.link deleted file mode 100755 index 6602f0cf4..000000000 --- a/resources/3rdparty/modernjson/doc/examples/json_pointer.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/json_pointer.output b/resources/3rdparty/modernjson/doc/examples/json_pointer.output deleted file mode 100755 index b81c8a201..000000000 --- a/resources/3rdparty/modernjson/doc/examples/json_pointer.output +++ /dev/null @@ -1,3 +0,0 @@ -domain_error: JSON pointer must be empty or begin with '/' -domain_error: escape error: '~' must be followed with '0' or '1' -domain_error: escape error: '~' must be followed with '0' or '1' diff --git a/resources/3rdparty/modernjson/doc/examples/json_pointer__to_string.cpp b/resources/3rdparty/modernjson/doc/examples/json_pointer__to_string.cpp deleted file mode 100755 index 4cb053c53..000000000 --- a/resources/3rdparty/modernjson/doc/examples/json_pointer__to_string.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // different JSON Pointers - json::json_pointer ptr1(""); - json::json_pointer ptr2("/foo"); - json::json_pointer ptr3("/foo/0"); - json::json_pointer ptr4("/"); - json::json_pointer ptr5("/a~1b"); - json::json_pointer ptr6("/c%d"); - json::json_pointer ptr7("/e^f"); - json::json_pointer ptr8("/g|h"); - json::json_pointer ptr9("/i\\j"); - json::json_pointer ptr10("/k\"l"); - json::json_pointer ptr11("/ "); - json::json_pointer ptr12("/m~0n"); - - - std::cout << ptr1.to_string() << '\n' - << ptr2.to_string() << '\n' - << ptr3.to_string() << '\n' - << ptr4.to_string() << '\n' - << ptr5.to_string() << '\n' - << ptr6.to_string() << '\n' - << ptr7.to_string() << '\n' - << ptr8.to_string() << '\n' - << ptr9.to_string() << '\n' - << ptr10.to_string() << '\n' - << ptr11.to_string() << '\n' - << ptr12.to_string() << std::endl; -} diff --git a/resources/3rdparty/modernjson/doc/examples/json_pointer__to_string.link b/resources/3rdparty/modernjson/doc/examples/json_pointer__to_string.link deleted file mode 100755 index 407609b20..000000000 --- a/resources/3rdparty/modernjson/doc/examples/json_pointer__to_string.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/json_pointer__to_string.output b/resources/3rdparty/modernjson/doc/examples/json_pointer__to_string.output deleted file mode 100755 index c4b5ea8fa..000000000 --- a/resources/3rdparty/modernjson/doc/examples/json_pointer__to_string.output +++ /dev/null @@ -1,12 +0,0 @@ - -/foo -/foo/0 -/ -/a~1b -/c%d -/e^f -/g|h -/i\j -/k"l -/ -/m~0n diff --git a/resources/3rdparty/modernjson/doc/examples/max_size.cpp b/resources/3rdparty/modernjson/doc/examples/max_size.cpp deleted file mode 100755 index d2f1b727d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/max_size.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call max_size() - std::cout << j_null.max_size() << '\n'; - std::cout << j_boolean.max_size() << '\n'; - std::cout << j_number_integer.max_size() << '\n'; - std::cout << j_number_float.max_size() << '\n'; - std::cout << j_object.max_size() << '\n'; - std::cout << j_array.max_size() << '\n'; - std::cout << j_string.max_size() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/max_size.link b/resources/3rdparty/modernjson/doc/examples/max_size.link deleted file mode 100755 index d91bc8cda..000000000 --- a/resources/3rdparty/modernjson/doc/examples/max_size.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/max_size.output b/resources/3rdparty/modernjson/doc/examples/max_size.output deleted file mode 100755 index 8c79995ba..000000000 --- a/resources/3rdparty/modernjson/doc/examples/max_size.output +++ /dev/null @@ -1,7 +0,0 @@ -0 -1 -1 -1 -256204778801521550 -1152921504606846975 -1 diff --git a/resources/3rdparty/modernjson/doc/examples/object.cpp b/resources/3rdparty/modernjson/doc/examples/object.cpp deleted file mode 100755 index 54f3ca3b8..000000000 --- a/resources/3rdparty/modernjson/doc/examples/object.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON objects - json j_no_init_list = json::object(); - json j_empty_init_list = json::object({}); - json j_list_of_pairs = json::object({ {"one", 1}, {"two", 2} }); - //json j_invalid_list = json::object({ "one", 1 }); // would throw - - // serialize the JSON objects - std::cout << j_no_init_list << '\n'; - std::cout << j_empty_init_list << '\n'; - std::cout << j_list_of_pairs << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/object.link b/resources/3rdparty/modernjson/doc/examples/object.link deleted file mode 100755 index 575473b35..000000000 --- a/resources/3rdparty/modernjson/doc/examples/object.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/object.output b/resources/3rdparty/modernjson/doc/examples/object.output deleted file mode 100755 index f6c27ee8f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/object.output +++ /dev/null @@ -1,3 +0,0 @@ -{} -{} -{"one":1,"two":2} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__ValueType.cpp b/resources/3rdparty/modernjson/doc/examples/operator__ValueType.cpp deleted file mode 100755 index 9307e69bb..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__ValueType.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value with different types - json json_types = - { - {"boolean", true}, - { - "number", { - {"integer", 42}, - {"floating-point", 17.23} - } - }, - {"string", "Hello, world!"}, - {"array", {1, 2, 3, 4, 5}}, - {"null", nullptr} - }; - - // use implicit conversions - bool v1 = json_types["boolean"]; - int v2 = json_types["number"]["integer"]; - short v3 = json_types["number"]["integer"]; - float v4 = json_types["number"]["floating-point"]; - int v5 = json_types["number"]["floating-point"]; - std::string v6 = json_types["string"]; - std::vector v7 = json_types["array"]; - std::unordered_map v8 = json_types; - - // print the conversion results - std::cout << v1 << '\n'; - std::cout << v2 << ' ' << v3 << '\n'; - std::cout << v4 << ' ' << v5 << '\n'; - std::cout << v6 << '\n'; - - for (auto i : v7) - { - std::cout << i << ' '; - } - std::cout << "\n\n"; - - for (auto i : v8) - { - std::cout << i.first << ": " << i.second << '\n'; - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__ValueType.link b/resources/3rdparty/modernjson/doc/examples/operator__ValueType.link deleted file mode 100755 index 204d8f5e3..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__ValueType.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator__ValueType.output b/resources/3rdparty/modernjson/doc/examples/operator__ValueType.output deleted file mode 100755 index 5cd9cd3aa..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__ValueType.output +++ /dev/null @@ -1,11 +0,0 @@ -1 -42 42 -17.23 17 -Hello, world! -1 2 3 4 5 - -string: "Hello, world!" -number: {"floating-point":17.23,"integer":42} -null: null -boolean: true -array: [1,2,3,4,5] diff --git a/resources/3rdparty/modernjson/doc/examples/operator__equal.cpp b/resources/3rdparty/modernjson/doc/examples/operator__equal.cpp deleted file mode 100755 index 12bf92ed5..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__equal.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create several JSON values - json array_1 = {1, 2, 3}; - json array_2 = {1, 2, 4}; - json object_1 = {{"A", "a"}, {"B", "b"}}; - json object_2 = {{"B", "b"}, {"A", "a"}}; - json number_1 = 17; - json number_2 = 17.000000000000001L; - json string_1 = "foo"; - json string_2 = "bar"; - - // output values and comparisons - std::cout << std::boolalpha; - std::cout << array_1 << " == " << array_2 << " " << (array_1 == array_2) << '\n'; - std::cout << object_1 << " == " << object_2 << " " << (object_1 == object_2) << '\n'; - std::cout << number_1 << " == " << number_2 << " " << (number_1 == number_2) << '\n'; - std::cout << string_1 << " == " << string_2 << " " << (string_1 == string_2) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__equal.link b/resources/3rdparty/modernjson/doc/examples/operator__equal.link deleted file mode 100755 index 41ae20ce3..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__equal.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator__equal.output b/resources/3rdparty/modernjson/doc/examples/operator__equal.output deleted file mode 100755 index e9dfd7551..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__equal.output +++ /dev/null @@ -1,4 +0,0 @@ -[1,2,3] == [1,2,4] false -{"A":"a","B":"b"} == {"A":"a","B":"b"} true -17 == 17 true -"foo" == "bar" false diff --git a/resources/3rdparty/modernjson/doc/examples/operator__equal.test b/resources/3rdparty/modernjson/doc/examples/operator__equal.test deleted file mode 100755 index e9dfd7551..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__equal.test +++ /dev/null @@ -1,4 +0,0 @@ -[1,2,3] == [1,2,4] false -{"A":"a","B":"b"} == {"A":"a","B":"b"} true -17 == 17 true -"foo" == "bar" false diff --git a/resources/3rdparty/modernjson/doc/examples/operator__equal__nullptr_t.cpp b/resources/3rdparty/modernjson/doc/examples/operator__equal__nullptr_t.cpp deleted file mode 100755 index 49c632cfd..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__equal__nullptr_t.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create several JSON values - json array = {1, 2, 3}; - json object = {{"A", "a"}, {"B", "b"}}; - json number = 17; - json string = "foo"; - json null; - - // output values and comparisons - std::cout << std::boolalpha; - std::cout << array << " == nullptr " << (array == nullptr) << '\n'; - std::cout << object << " == nullptr " << (object == nullptr) << '\n'; - std::cout << number << " == nullptr " << (number == nullptr) << '\n'; - std::cout << string << " == nullptr " << (string == nullptr) << '\n'; - std::cout << null << " == nullptr " << (null == nullptr) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__equal__nullptr_t.link b/resources/3rdparty/modernjson/doc/examples/operator__equal__nullptr_t.link deleted file mode 100755 index 49e46fd65..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__equal__nullptr_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator__equal__nullptr_t.output b/resources/3rdparty/modernjson/doc/examples/operator__equal__nullptr_t.output deleted file mode 100755 index b7128e13d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__equal__nullptr_t.output +++ /dev/null @@ -1,5 +0,0 @@ -[1,2,3] == nullptr false -{"A":"a","B":"b"} == nullptr false -17 == nullptr false -"foo" == nullptr false -null == nullptr true diff --git a/resources/3rdparty/modernjson/doc/examples/operator__greater.cpp b/resources/3rdparty/modernjson/doc/examples/operator__greater.cpp deleted file mode 100755 index bee3b2b5a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__greater.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create several JSON values - json array_1 = {1, 2, 3}; - json array_2 = {1, 2, 4}; - json object_1 = {{"A", "a"}, {"B", "b"}}; - json object_2 = {{"B", "b"}, {"A", "a"}}; - json number_1 = 17; - json number_2 = 17.0000000000001L; - json string_1 = "foo"; - json string_2 = "bar"; - - // output values and comparisons - std::cout << std::boolalpha; - std::cout << array_1 << " == " << array_2 << " " << (array_1 > array_2) << '\n'; - std::cout << object_1 << " == " << object_2 << " " << (object_1 > object_2) << '\n'; - std::cout << number_1 << " == " << number_2 << " " << (number_1 > number_2) << '\n'; - std::cout << string_1 << " == " << string_2 << " " << (string_1 > string_2) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__greater.link b/resources/3rdparty/modernjson/doc/examples/operator__greater.link deleted file mode 100755 index 2299d6102..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__greater.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator__greater.output b/resources/3rdparty/modernjson/doc/examples/operator__greater.output deleted file mode 100755 index 045847c38..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__greater.output +++ /dev/null @@ -1,4 +0,0 @@ -[1,2,3] == [1,2,4] false -{"A":"a","B":"b"} == {"A":"a","B":"b"} false -17 == 17.0000000000001 false -"foo" == "bar" true diff --git a/resources/3rdparty/modernjson/doc/examples/operator__greaterequal.cpp b/resources/3rdparty/modernjson/doc/examples/operator__greaterequal.cpp deleted file mode 100755 index cd3989669..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__greaterequal.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create several JSON values - json array_1 = {1, 2, 3}; - json array_2 = {1, 2, 4}; - json object_1 = {{"A", "a"}, {"B", "b"}}; - json object_2 = {{"B", "b"}, {"A", "a"}}; - json number_1 = 17; - json number_2 = 17.0000000000001L; - json string_1 = "foo"; - json string_2 = "bar"; - - // output values and comparisons - std::cout << std::boolalpha; - std::cout << array_1 << " >= " << array_2 << " " << (array_1 >= array_2) << '\n'; - std::cout << object_1 << " >= " << object_2 << " " << (object_1 >= object_2) << '\n'; - std::cout << number_1 << " >= " << number_2 << " " << (number_1 >= number_2) << '\n'; - std::cout << string_1 << " >= " << string_2 << " " << (string_1 >= string_2) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__greaterequal.link b/resources/3rdparty/modernjson/doc/examples/operator__greaterequal.link deleted file mode 100755 index fdd676e6e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__greaterequal.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator__greaterequal.output b/resources/3rdparty/modernjson/doc/examples/operator__greaterequal.output deleted file mode 100755 index c7b91514e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__greaterequal.output +++ /dev/null @@ -1,4 +0,0 @@ -[1,2,3] >= [1,2,4] false -{"A":"a","B":"b"} >= {"A":"a","B":"b"} true -17 >= 17.0000000000001 false -"foo" >= "bar" true diff --git a/resources/3rdparty/modernjson/doc/examples/operator__less.cpp b/resources/3rdparty/modernjson/doc/examples/operator__less.cpp deleted file mode 100755 index d4a7b7941..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__less.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create several JSON values - json array_1 = {1, 2, 3}; - json array_2 = {1, 2, 4}; - json object_1 = {{"A", "a"}, {"B", "b"}}; - json object_2 = {{"B", "b"}, {"A", "a"}}; - json number_1 = 17; - json number_2 = 17.0000000000001L; - json string_1 = "foo"; - json string_2 = "bar"; - - // output values and comparisons - std::cout << std::boolalpha; - std::cout << array_1 << " == " << array_2 << " " << (array_1 < array_2) << '\n'; - std::cout << object_1 << " == " << object_2 << " " << (object_1 < object_2) << '\n'; - std::cout << number_1 << " == " << number_2 << " " << (number_1 < number_2) << '\n'; - std::cout << string_1 << " == " << string_2 << " " << (string_1 < string_2) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__less.link b/resources/3rdparty/modernjson/doc/examples/operator__less.link deleted file mode 100755 index 5d7f6f566..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__less.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator__less.output b/resources/3rdparty/modernjson/doc/examples/operator__less.output deleted file mode 100755 index abbbc455e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__less.output +++ /dev/null @@ -1,4 +0,0 @@ -[1,2,3] == [1,2,4] true -{"A":"a","B":"b"} == {"A":"a","B":"b"} false -17 == 17.0000000000001 true -"foo" == "bar" false diff --git a/resources/3rdparty/modernjson/doc/examples/operator__lessequal.cpp b/resources/3rdparty/modernjson/doc/examples/operator__lessequal.cpp deleted file mode 100755 index 20654d9e8..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__lessequal.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create several JSON values - json array_1 = {1, 2, 3}; - json array_2 = {1, 2, 4}; - json object_1 = {{"A", "a"}, {"B", "b"}}; - json object_2 = {{"B", "b"}, {"A", "a"}}; - json number_1 = 17; - json number_2 = 17.0000000000001L; - json string_1 = "foo"; - json string_2 = "bar"; - - // output values and comparisons - std::cout << std::boolalpha; - std::cout << array_1 << " <= " << array_2 << " " << (array_1 <= array_2) << '\n'; - std::cout << object_1 << " <= " << object_2 << " " << (object_1 <= object_2) << '\n'; - std::cout << number_1 << " <= " << number_2 << " " << (number_1 <= number_2) << '\n'; - std::cout << string_1 << " <= " << string_2 << " " << (string_1 <= string_2) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__lessequal.link b/resources/3rdparty/modernjson/doc/examples/operator__lessequal.link deleted file mode 100755 index 620b6aa8a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__lessequal.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator__lessequal.output b/resources/3rdparty/modernjson/doc/examples/operator__lessequal.output deleted file mode 100755 index f7f0327ec..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__lessequal.output +++ /dev/null @@ -1,4 +0,0 @@ -[1,2,3] <= [1,2,4] true -{"A":"a","B":"b"} <= {"A":"a","B":"b"} true -17 <= 17.0000000000001 true -"foo" <= "bar" false diff --git a/resources/3rdparty/modernjson/doc/examples/operator__notequal.cpp b/resources/3rdparty/modernjson/doc/examples/operator__notequal.cpp deleted file mode 100755 index 499a00d17..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__notequal.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create several JSON values - json array_1 = {1, 2, 3}; - json array_2 = {1, 2, 4}; - json object_1 = {{"A", "a"}, {"B", "b"}}; - json object_2 = {{"B", "b"}, {"A", "a"}}; - json number_1 = 17; - json number_2 = 17.000000000000001L; - json string_1 = "foo"; - json string_2 = "bar"; - - // output values and comparisons - std::cout << std::boolalpha; - std::cout << array_1 << " == " << array_2 << " " << (array_1 != array_2) << '\n'; - std::cout << object_1 << " == " << object_2 << " " << (object_1 != object_2) << '\n'; - std::cout << number_1 << " == " << number_2 << " " << (number_1 != number_2) << '\n'; - std::cout << string_1 << " == " << string_2 << " " << (string_1 != string_2) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__notequal.link b/resources/3rdparty/modernjson/doc/examples/operator__notequal.link deleted file mode 100755 index 482b97212..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__notequal.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator__notequal.output b/resources/3rdparty/modernjson/doc/examples/operator__notequal.output deleted file mode 100755 index ddd838b4a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__notequal.output +++ /dev/null @@ -1,4 +0,0 @@ -[1,2,3] == [1,2,4] true -{"A":"a","B":"b"} == {"A":"a","B":"b"} false -17 == 17 false -"foo" == "bar" true diff --git a/resources/3rdparty/modernjson/doc/examples/operator__notequal.test b/resources/3rdparty/modernjson/doc/examples/operator__notequal.test deleted file mode 100755 index ddd838b4a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__notequal.test +++ /dev/null @@ -1,4 +0,0 @@ -[1,2,3] == [1,2,4] true -{"A":"a","B":"b"} == {"A":"a","B":"b"} false -17 == 17 false -"foo" == "bar" true diff --git a/resources/3rdparty/modernjson/doc/examples/operator__notequal__nullptr_t.cpp b/resources/3rdparty/modernjson/doc/examples/operator__notequal__nullptr_t.cpp deleted file mode 100755 index 014e6343a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__notequal__nullptr_t.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create several JSON values - json array = {1, 2, 3}; - json object = {{"A", "a"}, {"B", "b"}}; - json number = 17; - json string = "foo"; - json null; - - // output values and comparisons - std::cout << std::boolalpha; - std::cout << array << " != nullptr " << (array != nullptr) << '\n'; - std::cout << object << " != nullptr " << (object != nullptr) << '\n'; - std::cout << number << " != nullptr " << (number != nullptr) << '\n'; - std::cout << string << " != nullptr " << (string != nullptr) << '\n'; - std::cout << null << " != nullptr " << (null != nullptr) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__notequal__nullptr_t.link b/resources/3rdparty/modernjson/doc/examples/operator__notequal__nullptr_t.link deleted file mode 100755 index 40f6bb4fe..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__notequal__nullptr_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator__notequal__nullptr_t.output b/resources/3rdparty/modernjson/doc/examples/operator__notequal__nullptr_t.output deleted file mode 100755 index 0fc36dcf5..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__notequal__nullptr_t.output +++ /dev/null @@ -1,5 +0,0 @@ -[1,2,3] != nullptr true -{"A":"a","B":"b"} != nullptr true -17 != nullptr true -"foo" != nullptr true -null != nullptr false diff --git a/resources/3rdparty/modernjson/doc/examples/operator__value_t.cpp b/resources/3rdparty/modernjson/doc/examples/operator__value_t.cpp deleted file mode 100755 index d281df0d8..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__value_t.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call operator value_t() - json::value_t t_null = j_null; - json::value_t t_boolean = j_boolean; - json::value_t t_number_integer = j_number_integer; - json::value_t t_number_float = j_number_float; - json::value_t t_object = j_object; - json::value_t t_array = j_array; - json::value_t t_string = j_string; - - // print types - std::cout << std::boolalpha; - std::cout << (t_null == json::value_t::null) << '\n'; - std::cout << (t_boolean == json::value_t::boolean) << '\n'; - std::cout << (t_number_integer == json::value_t::number_integer) << '\n'; - std::cout << (t_number_float == json::value_t::number_float) << '\n'; - std::cout << (t_object == json::value_t::object) << '\n'; - std::cout << (t_array == json::value_t::array) << '\n'; - std::cout << (t_string == json::value_t::string) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator__value_t.link b/resources/3rdparty/modernjson/doc/examples/operator__value_t.link deleted file mode 100755 index a97072328..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__value_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator__value_t.output b/resources/3rdparty/modernjson/doc/examples/operator__value_t.output deleted file mode 100755 index 814ccfee2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator__value_t.output +++ /dev/null @@ -1,7 +0,0 @@ -true -true -true -true -true -true -true diff --git a/resources/3rdparty/modernjson/doc/examples/operator_deserialize.cpp b/resources/3rdparty/modernjson/doc/examples/operator_deserialize.cpp deleted file mode 100755 index a43cdf0fb..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator_deserialize.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create stream with serialized JSON - std::stringstream ss; - ss << R"({ - "number": 23, - "string": "Hello, world!", - "array": [1, 2, 3, 4, 5], - "boolean": false, - "null": null - })"; - - // create JSON value and read the serialization from the stream - json j; - j << ss; - - // serialize JSON - std::cout << std::setw(2) << j << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator_deserialize.link b/resources/3rdparty/modernjson/doc/examples/operator_deserialize.link deleted file mode 100755 index 27e998d9a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator_deserialize.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator_deserialize.output b/resources/3rdparty/modernjson/doc/examples/operator_deserialize.output deleted file mode 100755 index 81a203fb0..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator_deserialize.output +++ /dev/null @@ -1,13 +0,0 @@ -{ - "array": [ - 1, - 2, - 3, - 4, - 5 - ], - "boolean": false, - "null": null, - "number": 23, - "string": "Hello, world!" -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator_serialize.cpp b/resources/3rdparty/modernjson/doc/examples/operator_serialize.cpp deleted file mode 100755 index c1568d99d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator_serialize.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - - // serialize without indentation - std::cout << j_object << "\n\n"; - std::cout << j_array << "\n\n"; - - // serialize with indentation - std::cout << std::setw(4) << j_object << "\n\n"; - std::cout << std::setw(2) << j_array << "\n\n"; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operator_serialize.link b/resources/3rdparty/modernjson/doc/examples/operator_serialize.link deleted file mode 100755 index 231306ac2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator_serialize.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operator_serialize.output b/resources/3rdparty/modernjson/doc/examples/operator_serialize.output deleted file mode 100755 index 712a58da6..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operator_serialize.output +++ /dev/null @@ -1,17 +0,0 @@ -{"one":1,"two":2} - -[1,2,4,8,16] - -{ - "one": 1, - "two": 2 -} - -[ - 1, - 2, - 4, - 8, - 16 -] - diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type.cpp b/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type.cpp deleted file mode 100755 index e83a2ac00..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON object - json object = - { - {"one", 1}, {"two", 2}, {"three", 2.9} - }; - - // output element with key "two" - std::cout << object["two"] << "\n\n"; - - // change element with key "three" - object["three"] = 3; - - // output changed array - std::cout << std::setw(4) << object << "\n\n"; - - // mention nonexisting key - object["four"]; - - // write to nonexisting key - object["five"]["really"]["nested"] = true; - - // output changed object - std::cout << std::setw(4) << object << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type.link b/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type.link deleted file mode 100755 index 40df071bf..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type.output b/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type.output deleted file mode 100755 index b643587f1..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type.output +++ /dev/null @@ -1,19 +0,0 @@ -2 - -{ - "one": 1, - "three": 3, - "two": 2 -} - -{ - "five": { - "really": { - "nested": true - } - }, - "four": null, - "one": 1, - "three": 3, - "two": 2 -} diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type_const.cpp b/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type_const.cpp deleted file mode 100755 index 5ad97355e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type_const.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON object - const json object = - { - {"one", 1}, {"two", 2}, {"three", 2.9} - }; - - // output element with key "two" - std::cout << object["two"] << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type_const.link b/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type_const.link deleted file mode 100755 index bba664a5c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type_const.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type_const.output b/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type_const.output deleted file mode 100755 index 0cfbf0888..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__key_type_const.output +++ /dev/null @@ -1 +0,0 @@ -2 diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type.cpp b/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type.cpp deleted file mode 100755 index 4ccbf2704..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON array - json array = {1, 2, 3, 4, 5}; - - // output element at index 3 (fourth element) - std::cout << array[3] << '\n'; - - // change last element to 6 - array[array.size() - 1] = 6; - - // output changed array - std::cout << array << '\n'; - - // write beyond array limit - array[10] = 11; - - // output changed array - std::cout << array << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type.link b/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type.link deleted file mode 100755 index b9d578810..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type.output b/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type.output deleted file mode 100755 index a91a10698..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type.output +++ /dev/null @@ -1,3 +0,0 @@ -4 -[1,2,3,4,6] -[1,2,3,4,6,null,null,null,null,null,11] diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type_const.cpp b/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type_const.cpp deleted file mode 100755 index 2ef794781..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type_const.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON array - json array = {"first", "2nd", "third", "fourth"}; - - // output element at index 2 (third element) - std::cout << array.at(2) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type_const.link b/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type_const.link deleted file mode 100755 index a1f8c98b7..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type_const.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type_const.output b/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type_const.output deleted file mode 100755 index 4450c9f00..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorarray__size_type_const.output +++ /dev/null @@ -1 +0,0 @@ -"third" diff --git a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer.cpp b/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer.cpp deleted file mode 100755 index 18e41c1f5..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value - json j = - { - {"number", 1}, {"string", "foo"}, {"array", {1, 2}} - }; - - // read-only access - - // output element with JSON pointer "/number" - std::cout << j["/number"_json_pointer] << '\n'; - // output element with JSON pointer "/string" - std::cout << j["/string"_json_pointer] << '\n'; - // output element with JSON pointer "/array" - std::cout << j["/array"_json_pointer] << '\n'; - // output element with JSON pointer "/array/1" - std::cout << j["/array/1"_json_pointer] << '\n'; - - // writing access - - // change the string - j["/string"_json_pointer] = "bar"; - // output the changed string - std::cout << j["string"] << '\n'; - - // "change" a nonexisting object entry - j["/boolean"_json_pointer] = true; - // output the changed object - std::cout << j << '\n'; - - // change an array element - j["/array/1"_json_pointer] = 21; - // "change" an array element with nonexisting index - j["/array/4"_json_pointer] = 44; - // output the changed array - std::cout << j["array"] << '\n'; - - // "change" the arry element past the end - j["/array/-"_json_pointer] = 55; - // output the changed array - std::cout << j["array"] << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer.link b/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer.link deleted file mode 100755 index 3a60e8a65..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer.output b/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer.output deleted file mode 100755 index 1fd1b032d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer.output +++ /dev/null @@ -1,8 +0,0 @@ -1 -"foo" -[1,2] -2 -"bar" -{"array":[1,2],"boolean":true,"number":1,"string":"bar"} -[1,21,null,null,44] -[1,21,null,null,44,55] diff --git a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer_const.cpp b/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer_const.cpp deleted file mode 100755 index 20ac36cb2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer_const.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value - const json j = - { - {"number", 1}, {"string", "foo"}, {"array", {1, 2}} - }; - - // read-only access - - // output element with JSON pointer "/number" - std::cout << j["/number"_json_pointer] << '\n'; - // output element with JSON pointer "/string" - std::cout << j["/string"_json_pointer] << '\n'; - // output element with JSON pointer "/array" - std::cout << j["/array"_json_pointer] << '\n'; - // output element with JSON pointer "/array/1" - std::cout << j["/array/1"_json_pointer] << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer_const.link b/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer_const.link deleted file mode 100755 index 1bc14234d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer_const.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer_const.output b/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer_const.output deleted file mode 100755 index 7b9306bbc..000000000 --- a/resources/3rdparty/modernjson/doc/examples/operatorjson_pointer_const.output +++ /dev/null @@ -1,4 +0,0 @@ -1 -"foo" -[1,2] -2 diff --git a/resources/3rdparty/modernjson/doc/examples/parse__istream__parser_callback_t.cpp b/resources/3rdparty/modernjson/doc/examples/parse__istream__parser_callback_t.cpp deleted file mode 100755 index 6812a5e2e..000000000 --- a/resources/3rdparty/modernjson/doc/examples/parse__istream__parser_callback_t.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // a JSON text - auto text = R"( - { - "Image": { - "Width": 800, - "Height": 600, - "Title": "View from 15th Floor", - "Thumbnail": { - "Url": "http://www.example.com/image/481989943", - "Height": 125, - "Width": 100 - }, - "Animated" : false, - "IDs": [116, 943, 234, 38793] - } - } - )"; - - // fill a stream with JSON text - std::stringstream ss; - ss << text; - - // parse and serialize JSON - json j_complete = json::parse(ss); - std::cout << std::setw(4) << j_complete << "\n\n"; - - - // define parser callback - json::parser_callback_t cb = [](int depth, json::parse_event_t event, json & parsed) - { - // skip object elements with key "Thumbnail" - if (event == json::parse_event_t::key and parsed == json("Thumbnail")) - { - return false; - } - else - { - return true; - } - }; - - // fill a stream with JSON text - ss.clear(); - ss << text; - - // parse (with callback) and serialize JSON - json j_filtered = json::parse(ss, cb); - std::cout << std::setw(4) << j_filtered << '\n'; -} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/parse__istream__parser_callback_t.link b/resources/3rdparty/modernjson/doc/examples/parse__istream__parser_callback_t.link deleted file mode 100755 index 85960e159..000000000 --- a/resources/3rdparty/modernjson/doc/examples/parse__istream__parser_callback_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/parse__istream__parser_callback_t.output b/resources/3rdparty/modernjson/doc/examples/parse__istream__parser_callback_t.output deleted file mode 100755 index 279a7ff74..000000000 --- a/resources/3rdparty/modernjson/doc/examples/parse__istream__parser_callback_t.output +++ /dev/null @@ -1,34 +0,0 @@ -{ - "Image": { - "Animated": false, - "Height": 600, - "IDs": [ - 116, - 943, - 234, - 38793 - ], - "Thumbnail": { - "Height": 125, - "Url": "http://www.example.com/image/481989943", - "Width": 100 - }, - "Title": "View from 15th Floor", - "Width": 800 - } -} - -{ - "Image": { - "Animated": false, - "Height": 600, - "IDs": [ - 116, - 943, - 234, - 38793 - ], - "Title": "View from 15th Floor", - "Width": 800 - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/parse__string__parser_callback_t.cpp b/resources/3rdparty/modernjson/doc/examples/parse__string__parser_callback_t.cpp deleted file mode 100755 index 62982ca6f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/parse__string__parser_callback_t.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // a JSON text - std::string text = R"( - { - "Image": { - "Width": 800, - "Height": 600, - "Title": "View from 15th Floor", - "Thumbnail": { - "Url": "http://www.example.com/image/481989943", - "Height": 125, - "Width": 100 - }, - "Animated" : false, - "IDs": [116, 943, 234, 38793] - } - } - )"; - - // parse and serialize JSON - json j_complete = json::parse(text); - std::cout << std::setw(4) << j_complete << "\n\n"; - - - // define parser callback - json::parser_callback_t cb = [](int depth, json::parse_event_t event, json & parsed) - { - // skip object elements with key "Thumbnail" - if (event == json::parse_event_t::key and parsed == json("Thumbnail")) - { - return false; - } - else - { - return true; - } - }; - - // parse (with callback) and serialize JSON - json j_filtered = json::parse(text, cb); - std::cout << std::setw(4) << j_filtered << '\n'; -} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/parse__string__parser_callback_t.link b/resources/3rdparty/modernjson/doc/examples/parse__string__parser_callback_t.link deleted file mode 100755 index 9db1c3b83..000000000 --- a/resources/3rdparty/modernjson/doc/examples/parse__string__parser_callback_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/parse__string__parser_callback_t.output b/resources/3rdparty/modernjson/doc/examples/parse__string__parser_callback_t.output deleted file mode 100755 index 279a7ff74..000000000 --- a/resources/3rdparty/modernjson/doc/examples/parse__string__parser_callback_t.output +++ /dev/null @@ -1,34 +0,0 @@ -{ - "Image": { - "Animated": false, - "Height": 600, - "IDs": [ - 116, - 943, - 234, - 38793 - ], - "Thumbnail": { - "Height": 125, - "Url": "http://www.example.com/image/481989943", - "Width": 100 - }, - "Title": "View from 15th Floor", - "Width": 800 - } -} - -{ - "Image": { - "Animated": false, - "Height": 600, - "IDs": [ - 116, - 943, - 234, - 38793 - ], - "Title": "View from 15th Floor", - "Width": 800 - } -} diff --git a/resources/3rdparty/modernjson/doc/examples/patch.cpp b/resources/3rdparty/modernjson/doc/examples/patch.cpp deleted file mode 100755 index 24a52d596..000000000 --- a/resources/3rdparty/modernjson/doc/examples/patch.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // the original document - json doc = R"( - { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // the patch - json patch = R"( - [ - { "op": "replace", "path": "/baz", "value": "boo" }, - { "op": "add", "path": "/hello", "value": ["world"] }, - { "op": "remove", "path": "/foo"} - ] - )"_json; - - // apply the patch - json patched_doc = doc.patch(patch); - - // output original and patched document - std::cout << std::setw(4) << doc << "\n\n" - << std::setw(4) << patched_doc << std::endl; -} diff --git a/resources/3rdparty/modernjson/doc/examples/patch.link b/resources/3rdparty/modernjson/doc/examples/patch.link deleted file mode 100755 index 5d5032b7b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/patch.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/patch.output b/resources/3rdparty/modernjson/doc/examples/patch.output deleted file mode 100755 index eb558fe25..000000000 --- a/resources/3rdparty/modernjson/doc/examples/patch.output +++ /dev/null @@ -1,11 +0,0 @@ -{ - "baz": "qux", - "foo": "bar" -} - -{ - "baz": "boo", - "hello": [ - "world" - ] -} diff --git a/resources/3rdparty/modernjson/doc/examples/push_back.cpp b/resources/3rdparty/modernjson/doc/examples/push_back.cpp deleted file mode 100755 index 5d0877f0a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/push_back.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json array = {1, 2, 3, 4, 5}; - json null; - - // print values - std::cout << array << '\n'; - std::cout << null << '\n'; - - // add values - array.push_back(6); - array += 7; - null += "first"; - null += "second"; - - // print values - std::cout << array << '\n'; - std::cout << null << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/push_back.link b/resources/3rdparty/modernjson/doc/examples/push_back.link deleted file mode 100755 index 8ec17dbac..000000000 --- a/resources/3rdparty/modernjson/doc/examples/push_back.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/push_back.output b/resources/3rdparty/modernjson/doc/examples/push_back.output deleted file mode 100755 index 3306b60e3..000000000 --- a/resources/3rdparty/modernjson/doc/examples/push_back.output +++ /dev/null @@ -1,4 +0,0 @@ -[1,2,3,4,5] -null -[1,2,3,4,5,6,7] -["first","second"] diff --git a/resources/3rdparty/modernjson/doc/examples/push_back__initializer_list.cpp b/resources/3rdparty/modernjson/doc/examples/push_back__initializer_list.cpp deleted file mode 100755 index 9fe01ad79..000000000 --- a/resources/3rdparty/modernjson/doc/examples/push_back__initializer_list.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json object = {{"one", 1}, {"two", 2}}; - json null; - - // print values - std::cout << object << '\n'; - std::cout << null << '\n'; - - // add values: - object.push_back({"three", 3}); // object is extended - object += {"four", 4}; // object is extended - null.push_back({"five", 5}); // null is converted to array - - // print values - std::cout << object << '\n'; - std::cout << null << '\n'; - - // would throw: - //object.push_back({1, 2, 3}); -} diff --git a/resources/3rdparty/modernjson/doc/examples/push_back__initializer_list.link b/resources/3rdparty/modernjson/doc/examples/push_back__initializer_list.link deleted file mode 100755 index 2b5abaeda..000000000 --- a/resources/3rdparty/modernjson/doc/examples/push_back__initializer_list.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/push_back__initializer_list.output b/resources/3rdparty/modernjson/doc/examples/push_back__initializer_list.output deleted file mode 100755 index 668eb25d7..000000000 --- a/resources/3rdparty/modernjson/doc/examples/push_back__initializer_list.output +++ /dev/null @@ -1,4 +0,0 @@ -{"one":1,"two":2} -null -{"four":4,"one":1,"three":3,"two":2} -[["five",5]] diff --git a/resources/3rdparty/modernjson/doc/examples/push_back__object_t__value.cpp b/resources/3rdparty/modernjson/doc/examples/push_back__object_t__value.cpp deleted file mode 100755 index b55ee6402..000000000 --- a/resources/3rdparty/modernjson/doc/examples/push_back__object_t__value.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json object = {{"one", 1}, {"two", 2}}; - json null; - - // print values - std::cout << object << '\n'; - std::cout << null << '\n'; - - // add values - object.push_back(json::object_t::value_type("three", 3)); - object += json::object_t::value_type("four", 4); - null += json::object_t::value_type("A", "a"); - null += json::object_t::value_type("B", "b"); - - // print values - std::cout << object << '\n'; - std::cout << null << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/push_back__object_t__value.link b/resources/3rdparty/modernjson/doc/examples/push_back__object_t__value.link deleted file mode 100755 index 24882e38c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/push_back__object_t__value.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/push_back__object_t__value.output b/resources/3rdparty/modernjson/doc/examples/push_back__object_t__value.output deleted file mode 100755 index b8a7d3560..000000000 --- a/resources/3rdparty/modernjson/doc/examples/push_back__object_t__value.output +++ /dev/null @@ -1,4 +0,0 @@ -{"one":1,"two":2} -null -{"four":4,"one":1,"three":3,"two":2} -{"A":"a","B":"b"} diff --git a/resources/3rdparty/modernjson/doc/examples/rbegin.cpp b/resources/3rdparty/modernjson/doc/examples/rbegin.cpp deleted file mode 100755 index 2ced56d3c..000000000 --- a/resources/3rdparty/modernjson/doc/examples/rbegin.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an array value - json array = {1, 2, 3, 4, 5}; - - // get an iterator to the reverse-beginning - json::reverse_iterator it = array.rbegin(); - - // serialize the element that the iterator points to - std::cout << *it << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/rbegin.link b/resources/3rdparty/modernjson/doc/examples/rbegin.link deleted file mode 100755 index de269d74b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/rbegin.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/rbegin.output b/resources/3rdparty/modernjson/doc/examples/rbegin.output deleted file mode 100755 index 7ed6ff82d..000000000 --- a/resources/3rdparty/modernjson/doc/examples/rbegin.output +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/resources/3rdparty/modernjson/doc/examples/rend.cpp b/resources/3rdparty/modernjson/doc/examples/rend.cpp deleted file mode 100755 index ece1c5517..000000000 --- a/resources/3rdparty/modernjson/doc/examples/rend.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create an array value - json array = {1, 2, 3, 4, 5}; - - // get an iterator to the reverse-end - json::reverse_iterator it = array.rend(); - - // increment the iterator to point to the first element - --it; - - // serialize the element that the iterator points to - std::cout << *it << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/rend.link b/resources/3rdparty/modernjson/doc/examples/rend.link deleted file mode 100755 index 17faa9117..000000000 --- a/resources/3rdparty/modernjson/doc/examples/rend.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/rend.output b/resources/3rdparty/modernjson/doc/examples/rend.output deleted file mode 100755 index d00491fd7..000000000 --- a/resources/3rdparty/modernjson/doc/examples/rend.output +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/resources/3rdparty/modernjson/doc/examples/size.cpp b/resources/3rdparty/modernjson/doc/examples/size.cpp deleted file mode 100755 index 5949ed63f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/size.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_object_empty(json::value_t::object); - json j_array = {1, 2, 4, 8, 16}; - json j_array_empty(json::value_t::array); - json j_string = "Hello, world"; - - // call size() - std::cout << j_null.size() << '\n'; - std::cout << j_boolean.size() << '\n'; - std::cout << j_number_integer.size() << '\n'; - std::cout << j_number_float.size() << '\n'; - std::cout << j_object.size() << '\n'; - std::cout << j_object_empty.size() << '\n'; - std::cout << j_array.size() << '\n'; - std::cout << j_array_empty.size() << '\n'; - std::cout << j_string.size() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/size.link b/resources/3rdparty/modernjson/doc/examples/size.link deleted file mode 100755 index 4cc0afa10..000000000 --- a/resources/3rdparty/modernjson/doc/examples/size.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/size.output b/resources/3rdparty/modernjson/doc/examples/size.output deleted file mode 100755 index 3831387b1..000000000 --- a/resources/3rdparty/modernjson/doc/examples/size.output +++ /dev/null @@ -1,9 +0,0 @@ -0 -1 -1 -1 -2 -0 -5 -0 -1 diff --git a/resources/3rdparty/modernjson/doc/examples/swap__array_t.cpp b/resources/3rdparty/modernjson/doc/examples/swap__array_t.cpp deleted file mode 100755 index 3c2cc6b76..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__array_t.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value - json value = {{"array", {1, 2, 3, 4}}}; - - // create an array_t - json::array_t array = {"Snap", "Crackle", "Pop"}; - - // swap the array stored in the JSON value - value["array"].swap(array); - - // output the values - std::cout << "value = " << value << '\n'; - std::cout << "array = " << array << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/swap__array_t.link b/resources/3rdparty/modernjson/doc/examples/swap__array_t.link deleted file mode 100755 index 8851fdb98..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__array_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/swap__array_t.output b/resources/3rdparty/modernjson/doc/examples/swap__array_t.output deleted file mode 100755 index 365302cc1..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__array_t.output +++ /dev/null @@ -1,2 +0,0 @@ -value = {"array":["Snap","Crackle","Pop"]} -array = [1,2,3,4] diff --git a/resources/3rdparty/modernjson/doc/examples/swap__object_t.cpp b/resources/3rdparty/modernjson/doc/examples/swap__object_t.cpp deleted file mode 100755 index d3a0bae25..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__object_t.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value - json value = { {"translation", {{"one", "eins"}, {"two", "zwei"}}} }; - - // create an object_t - json::object_t object = {{"cow", "Kuh"}, {"dog", "Hund"}}; - - // swap the object stored in the JSON value - value["translation"].swap(object); - - // output the values - std::cout << "value = " << value << '\n'; - std::cout << "object = " << object << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/swap__object_t.link b/resources/3rdparty/modernjson/doc/examples/swap__object_t.link deleted file mode 100755 index 8bd7495ef..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__object_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/swap__object_t.output b/resources/3rdparty/modernjson/doc/examples/swap__object_t.output deleted file mode 100755 index b5c9791bf..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__object_t.output +++ /dev/null @@ -1,2 +0,0 @@ -value = {"translation":{"cow":"Kuh","dog":"Hund"}} -object = {"one":"eins","two":"zwei"} diff --git a/resources/3rdparty/modernjson/doc/examples/swap__reference.cpp b/resources/3rdparty/modernjson/doc/examples/swap__reference.cpp deleted file mode 100755 index 178a60bec..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__reference.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create two JSON values - json j1 = {1, 2, 3, 4, 5}; - json j2 = {{"pi", 3.141592653589793}, {"e", 2.718281828459045}}; - - // swap the values - j1.swap(j2); - - // output the values - std::cout << "j1 = " << j1 << '\n'; - std::cout << "j2 = " << j2 << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/swap__reference.link b/resources/3rdparty/modernjson/doc/examples/swap__reference.link deleted file mode 100755 index 3ee4c0df8..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__reference.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/swap__reference.output b/resources/3rdparty/modernjson/doc/examples/swap__reference.output deleted file mode 100755 index f5495bd55..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__reference.output +++ /dev/null @@ -1,2 +0,0 @@ -j1 = {"e":2.71828182845905,"pi":3.14159265358979} -j2 = [1,2,3,4,5] diff --git a/resources/3rdparty/modernjson/doc/examples/swap__string_t.cpp b/resources/3rdparty/modernjson/doc/examples/swap__string_t.cpp deleted file mode 100755 index af166849f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__string_t.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create a JSON value - json value = { "the good", "the bad", "the ugly" }; - - // create string_t - json::string_t string = "the fast"; - - // swap the object stored in the JSON value - value[1].swap(string); - - // output the values - std::cout << "value = " << value << '\n'; - std::cout << "string = " << string << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/swap__string_t.link b/resources/3rdparty/modernjson/doc/examples/swap__string_t.link deleted file mode 100755 index 719313695..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__string_t.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/swap__string_t.output b/resources/3rdparty/modernjson/doc/examples/swap__string_t.output deleted file mode 100755 index ae2a0976b..000000000 --- a/resources/3rdparty/modernjson/doc/examples/swap__string_t.output +++ /dev/null @@ -1,2 +0,0 @@ -value = ["the good","the fast","the ugly"] -string = the bad diff --git a/resources/3rdparty/modernjson/doc/examples/type.cpp b/resources/3rdparty/modernjson/doc/examples/type.cpp deleted file mode 100755 index 07ec78856..000000000 --- a/resources/3rdparty/modernjson/doc/examples/type.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON values - json j_null; - json j_boolean = true; - json j_number_integer = 17; - json j_number_float = 23.42; - json j_object = {{"one", 1}, {"two", 2}}; - json j_array = {1, 2, 4, 8, 16}; - json j_string = "Hello, world"; - - // call type() - std::cout << std::boolalpha; - std::cout << (j_null.type() == json::value_t::null) << '\n'; - std::cout << (j_boolean.type() == json::value_t::boolean) << '\n'; - std::cout << (j_number_integer.type() == json::value_t::number_integer) << '\n'; - std::cout << (j_number_float.type() == json::value_t::number_float) << '\n'; - std::cout << (j_object.type() == json::value_t::object) << '\n'; - std::cout << (j_array.type() == json::value_t::array) << '\n'; - std::cout << (j_string.type() == json::value_t::string) << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/type.link b/resources/3rdparty/modernjson/doc/examples/type.link deleted file mode 100755 index f197d847a..000000000 --- a/resources/3rdparty/modernjson/doc/examples/type.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/type.output b/resources/3rdparty/modernjson/doc/examples/type.output deleted file mode 100755 index 814ccfee2..000000000 --- a/resources/3rdparty/modernjson/doc/examples/type.output +++ /dev/null @@ -1,7 +0,0 @@ -true -true -true -true -true -true -true diff --git a/resources/3rdparty/modernjson/doc/examples/unflatten.cpp b/resources/3rdparty/modernjson/doc/examples/unflatten.cpp deleted file mode 100755 index e2b9b6b86..000000000 --- a/resources/3rdparty/modernjson/doc/examples/unflatten.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include - -using json = nlohmann::json; - -int main() -{ - // create JSON value - json j_flattened = - { - {"/answer/everything", 42}, - {"/happy", true}, - {"/list/0", 1}, - {"/list/1", 0}, - {"/list/2", 2}, - {"/name", "Niels"}, - {"/nothing", nullptr}, - {"/object/currency", "USD"}, - {"/object/value", 42.99}, - {"/pi", 3.141} - }; - - // call unflatten() - std::cout << std::setw(4) << j_flattened.unflatten() << '\n'; -} diff --git a/resources/3rdparty/modernjson/doc/examples/unflatten.link b/resources/3rdparty/modernjson/doc/examples/unflatten.link deleted file mode 100755 index 386f5e11f..000000000 --- a/resources/3rdparty/modernjson/doc/examples/unflatten.link +++ /dev/null @@ -1 +0,0 @@ -online \ No newline at end of file diff --git a/resources/3rdparty/modernjson/doc/examples/unflatten.output b/resources/3rdparty/modernjson/doc/examples/unflatten.output deleted file mode 100755 index ed48385ae..000000000 --- a/resources/3rdparty/modernjson/doc/examples/unflatten.output +++ /dev/null @@ -1,18 +0,0 @@ -{ - "answer": { - "everything": 42 - }, - "happy": true, - "list": [ - 1, - 0, - 2 - ], - "name": "Niels", - "nothing": null, - "object": { - "currency": "USD", - "value": 42.99 - }, - "pi": 3.141 -} diff --git a/resources/3rdparty/modernjson/doc/images/range-begin-end.svg b/resources/3rdparty/modernjson/doc/images/range-begin-end.svg deleted file mode 100755 index 8e2b2fb6c..000000000 --- a/resources/3rdparty/modernjson/doc/images/range-begin-end.svg +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - Past-the-last element - - - - begin - - - - end - - - - - diff --git a/resources/3rdparty/modernjson/doc/images/range-rbegin-rend.svg b/resources/3rdparty/modernjson/doc/images/range-rbegin-rend.svg deleted file mode 100755 index dc6045fcf..000000000 --- a/resources/3rdparty/modernjson/doc/images/range-rbegin-rend.svg +++ /dev/null @@ -1,1232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - Past-the-last element - - - - begin - - - - end - - - - - - - - - - - - - - - - - - - - - - - - - Reversed sequence - - Reverse past-the-last element - - - - - - - - rend - - - - rbegin - - - Reverse iterator stores an iterator to the nextelement than the one it actually refers to - - - - - - - - - diff --git a/resources/3rdparty/modernjson/doc/index.md b/resources/3rdparty/modernjson/doc/index.md deleted file mode 100755 index 5373d4f34..000000000 --- a/resources/3rdparty/modernjson/doc/index.md +++ /dev/null @@ -1,271 +0,0 @@ -# JSON for Modern C++ - -These pages contain the API documentation of JSON for Modern C++, a C++11 header-only JSON class. - -# Contents - -- @link nlohmann::basic_json `basic_json` class @endlink -- [Functions](functions_func.html) - - object inspection - - @link nlohmann::basic_json::dump dump @endlink -- value serialization - - @link nlohmann::basic_json::type type @endlink -- type of the value - - @link nlohmann::basic_json::is_primitive is_primitive @endlink, - @link nlohmann::basic_json::is_structured is_structured @endlink, - @link nlohmann::basic_json::is_null is_null @endlink, - @link nlohmann::basic_json::is_boolean is_boolean @endlink, - @link nlohmann::basic_json::is_number is_number @endlink, - @link nlohmann::basic_json::is_number_integer is_number_integer @endlink, - @link nlohmann::basic_json::is_number_unsigned is_number_unsigned @endlink, - @link nlohmann::basic_json::is_number_float is_number_float @endlink, - @link nlohmann::basic_json::is_object is_object @endlink, - @link nlohmann::basic_json::is_array is_array @endlink, - @link nlohmann::basic_json::is_string is_string @endlink, - @link nlohmann::basic_json::is_discarded is_discarded @endlink -- check for value type - - @link nlohmann::basic_json::operator value_t() const operator value_t @endlink -- type of the value (implicit conversion) - - value access - - @link nlohmann::basic_json::get get @endlink -- get a value - - @link nlohmann::basic_json::get_ptr get_ptr @endlink -- get a value pointer - - @link nlohmann::basic_json::get_ref get_ref @endlink -- get a value reference - - @link nlohmann::basic_json::operator ValueType() const operator ValueType @endlink -- get a value (implicit conversion) - - lexicographical comparison operators - - serialization - - deserialization -- Types - - @link nlohmann::basic_json::array_t arrays @endlink - - @link nlohmann::basic_json::object_t objects @endlink - - @link nlohmann::basic_json::string_t strings @endlink - - @link nlohmann::basic_json::boolean_t booleans @endlink - - numbers - - @link nlohmann::basic_json::number_integer_t signed integers @endlink - - @link nlohmann::basic_json::number_unsigned_t unsigned integers @endlink - - @link nlohmann::basic_json::number_float_t floating-point @endlink - -# Container function overview - -The container functions known from STL have been extended to support the different value types from JSON. However, not all functions can be applied to all value types. Note that the signature of some functions differ between the types; for instance, `at` may be called with either a string to address a key in an object or with an integer to address a value in an array. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
group - function - JSON value type
objectarraystringnumberbooleannull
iterators`begin`@link nlohmann::basic_json::begin `begin` @endlink@link nlohmann::basic_json::begin `begin` @endlink@link nlohmann::basic_json::begin `begin` @endlink@link nlohmann::basic_json::begin `begin` @endlink@link nlohmann::basic_json::begin `begin` @endlink@link nlohmann::basic_json::begin `begin` @endlink (returns `end()`)
`cbegin`@link nlohmann::basic_json::cbegin `cbegin` @endlink@link nlohmann::basic_json::cbegin `cbegin` @endlink@link nlohmann::basic_json::cbegin `cbegin` @endlink@link nlohmann::basic_json::cbegin `cbegin` @endlink@link nlohmann::basic_json::cbegin `cbegin` @endlink@link nlohmann::basic_json::cbegin `cbegin` @endlink (returns `cend()`)
`end`@link nlohmann::basic_json::end `end` @endlink@link nlohmann::basic_json::end `end` @endlink@link nlohmann::basic_json::end `end` @endlink@link nlohmann::basic_json::end `end` @endlink@link nlohmann::basic_json::end `end` @endlink@link nlohmann::basic_json::end `end` @endlink
`cend`@link nlohmann::basic_json::cend `cend` @endlink@link nlohmann::basic_json::cend `cend` @endlink@link nlohmann::basic_json::cend `cend` @endlink@link nlohmann::basic_json::cend `cend` @endlink@link nlohmann::basic_json::cend `cend` @endlink@link nlohmann::basic_json::cend `cend` @endlink
`rbegin`@link nlohmann::basic_json::rbegin `rbegin` @endlink@link nlohmann::basic_json::rbegin `rbegin` @endlink@link nlohmann::basic_json::rbegin `rbegin` @endlink@link nlohmann::basic_json::rbegin `rbegin` @endlink@link nlohmann::basic_json::rbegin `rbegin` @endlink@link nlohmann::basic_json::rbegin `rbegin` @endlink
`crbegin`@link nlohmann::basic_json::crbegin `crbegin` @endlink@link nlohmann::basic_json::crbegin `crbegin` @endlink@link nlohmann::basic_json::crbegin `crbegin` @endlink@link nlohmann::basic_json::crbegin `crbegin` @endlink@link nlohmann::basic_json::crbegin `crbegin` @endlink@link nlohmann::basic_json::crbegin `crbegin` @endlink
`rend`@link nlohmann::basic_json::rend `rend` @endlink@link nlohmann::basic_json::rend `rend` @endlink@link nlohmann::basic_json::rend `rend` @endlink@link nlohmann::basic_json::rend `rend` @endlink@link nlohmann::basic_json::rend `rend` @endlink@link nlohmann::basic_json::rend `rend` @endlink
`crend`@link nlohmann::basic_json::crend `crend` @endlink@link nlohmann::basic_json::crend `crend` @endlink@link nlohmann::basic_json::crend `crend` @endlink@link nlohmann::basic_json::crend `crend` @endlink@link nlohmann::basic_json::crend `crend` @endlink@link nlohmann::basic_json::crend `crend` @endlink
element
access
`at`@link nlohmann::basic_json::at(const typename object_t::key_type & key) `at` @endlink@link nlohmann::basic_json::at(size_type) `at` @endlinkthrows `std::domain_error`throws `std::domain_error`throws `std::domain_error`throws `std::domain_error`
`operator[]`@link nlohmann::basic_json::operator[](const typename object_t::key_type &key) `operator[]` @endlink@link nlohmann::basic_json::operator[](size_type) `operator[]` @endlinkthrows `std::domain_error`throws `std::domain_error`throws `std::domain_error`@link nlohmann::basic_json::operator[](const typename object_t::key_type & key) `operator[]` @endlink (creates object)
@link nlohmann::basic_json::operator[](size_type) `operator[]` @endlink (creates array)
`front`@link nlohmann::basic_json::front `front` @endlink@link nlohmann::basic_json::front `front` @endlink@link nlohmann::basic_json::front `front` @endlink@link nlohmann::basic_json::front `front` @endlink@link nlohmann::basic_json::front `front` @endlinkthrows `std::out_of_range`
`back`@link nlohmann::basic_json::back `back` @endlink@link nlohmann::basic_json::back `back` @endlink@link nlohmann::basic_json::back `back` @endlink@link nlohmann::basic_json::back `back` @endlink@link nlohmann::basic_json::back `back` @endlinkthrows `std::out_of_range`
capacity`empty`@link nlohmann::basic_json::empty `empty` @endlink@link nlohmann::basic_json::empty `empty` @endlink@link nlohmann::basic_json::empty `empty` @endlink (returns `false`)@link nlohmann::basic_json::empty `empty` @endlink (returns `false`)@link nlohmann::basic_json::empty `empty` @endlink (returns `false`)@link nlohmann::basic_json::empty `empty` @endlink (returns `true`)
`size`@link nlohmann::basic_json::size `size` @endlink@link nlohmann::basic_json::size `size` @endlink@link nlohmann::basic_json::size `size` @endlink (returns `1`)@link nlohmann::basic_json::size `size` @endlink (returns `1`)@link nlohmann::basic_json::size `size` @endlink (returns `1`)@link nlohmann::basic_json::size `size` @endlink (returns `0`)
`max_size_`@link nlohmann::basic_json::max_size `max_size` @endlink@link nlohmann::basic_json::max_size `max_size` @endlink@link nlohmann::basic_json::max_size `max_size` @endlink (returns `1`)@link nlohmann::basic_json::max_size `max_size` @endlink (returns `1`)@link nlohmann::basic_json::max_size `max_size` @endlink (returns `1`)@link nlohmann::basic_json::max_size `max_size` @endlink (returns `0`)
modifiers`clear`@link nlohmann::basic_json::clear `clear` @endlink@link nlohmann::basic_json::clear `clear` @endlink@link nlohmann::basic_json::clear `clear` @endlink@link nlohmann::basic_json::clear `clear` @endlink@link nlohmann::basic_json::clear `clear` @endlink@link nlohmann::basic_json::clear `clear` @endlink
`insert`throws `std::domain_error`@link nlohmann::basic_json::insert `insert` @endlinkthrows `std::domain_error`throws `std::domain_error`throws `std::domain_error`throws `std::domain_error`
`erase`@link nlohmann::basic_json::erase `erase` @endlink@link nlohmann::basic_json::erase `erase` @endlink@link nlohmann::basic_json::erase `erase` @endlink (converts to null)@link nlohmann::basic_json::erase `erase` @endlink (converts to null)@link nlohmann::basic_json::erase `erase` @endlink (converts to null)throws
`push_back`@link nlohmann::basic_json::push_back(const typename object_t::value_type & val) `push_back` @endlink@link nlohmann::basic_json::push_back(const nlohmann::basic_json &) `push_back` @endlinkthrows `std::domain_error`throws `std::domain_error`throws `std::domain_error`@link nlohmann::basic_json::push_back(const typename object_t::value_type & val) `push_back` @endlink (creates object)
@link nlohmann::basic_json::push_back(const nlohmann::basic_json &) `push_back` @endlink (creates array)
`swap`@link nlohmann::basic_json::swap `swap` @endlink@link nlohmann::basic_json::swap `swap` @endlink@link nlohmann::basic_json::swap `swap` @endlink@link nlohmann::basic_json::swap `swap` @endlink@link nlohmann::basic_json::swap `swap` @endlink@link nlohmann::basic_json::swap `swap` @endlink
lookup`find`@link nlohmann::basic_json::find `find` @endlink (returns `end()`)@link nlohmann::basic_json::find `find` @endlink@link nlohmann::basic_json::find `find` @endlink (returns `end()`)@link nlohmann::basic_json::find `find` @endlink (returns `end()`)@link nlohmann::basic_json::find `find` @endlink (returns `end()`)@link nlohmann::basic_json::find `find` @endlink (returns `end()`)
`count`@link nlohmann::basic_json::count `count` @endlink (returns `0`)@link nlohmann::basic_json::count `count` @endlink@link nlohmann::basic_json::count `count` @endlink (returns `0`)@link nlohmann::basic_json::count `count` @endlink (returns `0`)@link nlohmann::basic_json::count `count` @endlink (returns `0`)@link nlohmann::basic_json::count `count` @endlink (returns `0`)
- -@copyright Copyright © 2013-2016 Niels Lohmann. The code is licensed under the [MIT License](http://opensource.org/licenses/MIT). - -@author [Niels Lohmann](http://nlohmann.me) -@see https://github.com/nlohmann/json to download the source code - -@version 2.0.0 diff --git a/resources/3rdparty/modernjson/doc/json.gif b/resources/3rdparty/modernjson/doc/json.gif deleted file mode 100755 index 7cd943717..000000000 Binary files a/resources/3rdparty/modernjson/doc/json.gif and /dev/null differ diff --git a/resources/3rdparty/modernjson/doc/scripts/git-update-ghpages b/resources/3rdparty/modernjson/doc/scripts/git-update-ghpages deleted file mode 100755 index f9760fee6..000000000 --- a/resources/3rdparty/modernjson/doc/scripts/git-update-ghpages +++ /dev/null @@ -1,221 +0,0 @@ -#!/usr/bin/env ruby -# git update-ghpages user/repo -b gh-pages -p manual/ -i - -require 'fileutils' -require 'tmpdir' - -module Params - def extract(what) i = index(what) and slice!(i, 2)[1] end; - def first_is(what) shift if what.include?(self.first); end - def self.[](*what) what.extend Params; end - def ===(argv) argv.first_is(self); end -end - -# ============================================================================ - -ARGV.extend Params - -class CLI - # CLI options - attr_reader :prefix #=> "doc/" - attr_reader :input #=> "/home/me/projects/foo" - attr_reader :message #=> "Updated" - attr_reader :repo #=> "git@github.com:me/project.git" - attr_reader :url #=> "http://me.github.com/project" - attr_reader :branch #=> "gh-pages" - - def verbose?() @verbose; end - def force?() @force; end - def simulate?() @simulate; end - - def initialize - # Switches - @verbose = !! (ARGV.extract('--verbose') || ARGV.delete('-v')) - @simulate = !! (ARGV.extract('--simulate') || ARGV.delete('-s')) - @force = !! (ARGV.delete('--force') || ARGV.delete('-f')) - - # Stuff - @prefix = ARGV.extract('--prefix') || ARGV.extract('-p') || '' - @input = File.expand_path(ARGV.extract('--input') || ARGV.extract('-i') || '.') - @message = ARGV.extract('--message') || ARGV.extract('-m') || 'Update' - - # Github info - branch = ARGV.extract('--branch') || ARGV.extract('-b') || nil - @repo, @url, @branch = get_github_info(ARGV.shift, branch) - end - - def git_current_branch - `git rev-parse --abbrev-ref HEAD`.strip - end - - def git_deploy - in_temp_path do |temppath| - status "Cloning repository" - system! "git clone #{repo} -b #{branch} #{temppath}" - - if git_current_branch != branch - status "Warning: No #{branch} branch found in repo, creating one." - return git_deploy_force - end - - copy_files input, File.join(temppath, prefix) - - status "Committing files" - system! "git add .; git add -u; git commit -m #{message.to_s.inspect}" - - unless simulate? - status "Updating repo" - system! "git push origin #{branch}" - end - true - end - end - - def git_deploy_force - in_temp_path do |temppath| - status "Creating new repository" - system! "git init ." - system! "git checkout -b gh-pages" - - copy_files input, File.join(temppath, prefix) - - status "Committing files" - system! "git add . && git commit -m #{message.to_s.inspect}" - - unless simulate? - status "Updating repo" - system! "git push #{repo} gh-pages:#{branch} --force" - end - true - end - end - - def get_github_info(repo, branch=nil, prefix=nil) - if github_format?(repo) - user, repo_name = repo.split('/') - r = "git@github.com:#{repo}.git" - - # User page or project page? - if repo_name =~ /\.github\.com/ - [r, "http://#{repo_name}/#{prefix}", branch || 'master' ] - else - [r, "http://#{user}.github.com/#{repo_name}/#{prefix}", branch || 'gh-pages' ] - end - else - [repo, nil, branch] - end - end - - def run! - unless repo - print_help - exit 128 - end - - status "Deploying to #{repo} (branch #{branch})" - msg "NOTE: Running in simulation mode." if simulate? - msg "WARNING: If the repository has gh-pages history, it with be overriden." if force? && !simulate? - - result = force? ? git_deploy_force : git_deploy - - if result - puts "" - status "Done." - msg "See: #{url}" if url && !simulate? - else - tip "Failed." - exit 1 - end - end - - def status(str) - puts "#{c('===>',34)} #{c(str, 32)}" - end - - def msg(str) - puts " #{c(str, 32)}" - end - - def c(str, color) - "\033[#{color}m#{str}\033[0m" - end - - def print_help - tip \ - %{Usage: git update-ghpages username/repository [options] - - Flags: - -f, --force Force an update (WARNING: kills the history!) - -s, --simulate Creates the repository, but doesn't push. - -v, --verbose Verbose mode - - Options: - -p PATH, --prefix The prefix - -i PATH, --input Input (defaults to current directory) - -b BRANCH, --branch The branch to deploy to (defaults to gh-pages) - -m MSG, --message Commit message (defaults to 'Update') - - Examples: - - Update the repo 'coffee' of github user 'james' with the files from the - current directory. The files will be in http://james.github.com/coffee. - - $ git update-ghpages james/coffee - - Same as above, but take the files from 'doc/'. - - $ git update-ghpages james/coffee -i doc - - Same as the first, but the files will instead be in - http://james.github.com/coffee/manual. - - $ git update-ghpages james/coffee -i doc -p manual - }.gsub(/^ {4}/, '') - end - -private # Helpers - - def tip(msg) - $stderr.write "#{msg}\n" - end - - def github_format?(str) - str =~ /^([A-Za-z0-9\-_]+)\/([A-Za-z0-9\-_\.]+)$/ - end - - # Performs actions inside a temp path. - def in_temp_path(&blk) - require 'tmpdir' - Dir.mktmpdir do |dir| - Dir.chdir(dir) { yield dir } - end - end - - def system!(str) - puts `#{str} 2>&1`.strip.gsub(/^/, " ") - raise "Failed with exit code #{$?.to_i}" unless $?.to_i == 0 - end - - # Returns the current branch name - def git_branch - `git symbolic-ref HEAD`.strip.split('/').last - end - - # Copy files from source folder to another - def copy_files(from, to) - status "Copying files #{from} => #{to}..." if verbose? - - Dir["#{from}/**/*"].each do |f| - next unless File.file?(f) - - target = File.join(to, f.gsub(/^#{Regexp.escape from}/, '')) - - FileUtils.mkdir_p File.dirname(target) - msg "%20s => %-20s" % [f, target] if verbose? - FileUtils.cp f, target - end - end - -end - -CLI.new.run! diff --git a/resources/3rdparty/modernjson/doc/scripts/send_to_wandbox.py b/resources/3rdparty/modernjson/doc/scripts/send_to_wandbox.py deleted file mode 100755 index 0158fb16a..000000000 --- a/resources/3rdparty/modernjson/doc/scripts/send_to_wandbox.py +++ /dev/null @@ -1,120 +0,0 @@ -#! /usr/bin/env python - -# This script uploads a directory to Wandbox (http://melpon.org/wandbox), -# which is an online compiler environment, and prints a permalink to the -# uploaded code. We use this to provide a "Try it online" version of the -# library to make the barrier to entry as low as possible. -# -# This script was adapted from the script proposed in -# https://github.com/melpon/wandbox/issues/153. -# -# To know how to use this script: ./wandbox.py --help -# -# Copyright Louis Dionne 2015 -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -import argparse -import fnmatch -import json -import os -import re -import urllib2 - - -# Strips C and C++ comments from the given string. -# -# Copied from http://stackoverflow.com/a/241506/627587. -def strip_comments(text): - def replacer(match): - s = match.group(0) - if s.startswith('/'): - return " " # note: a space and not an empty string - else: - return s - pattern = re.compile( - r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"', - re.DOTALL | re.MULTILINE - ) - return re.sub(pattern, replacer, text) - - -# Post the given JSON data to Wandbox's API, and return the result -# as a JSON object. -def upload(options): - request = urllib2.Request('http://melpon.org/wandbox/api/compile.json') - request.add_header('Content-Type', 'application/json') - response = urllib2.urlopen(request, json.dumps(options)) - return json.loads(response.read()) - - -# Returns a list of the '.hpp' headers in the given directory and in -# subdirectories. -# -# The path must be absolute, and the returned paths are all absolute too. -def headers(path): - return [ - os.path.join(dir, file) - for (dir, _, files) in os.walk(path) - for file in fnmatch.filter(files, "*.hpp") - ] - - -def main(): - parser = argparse.ArgumentParser(description= - """Upload a directory to Wandbox (http://melpon.org/wandbox). - - On success, the program prints a permalink to the uploaded - directory on Wandbox and returns 0. On error, it prints the - response from the Wandbox API and returns 1. - - Note that the comments are stripped from all the headers in the - uploaded directory. - """ - ) - parser.add_argument('directory', type=str, help= - """A directory to upload to Wandbox. - - The path may be either absolute or relative to the current directory. - However, the names of the files uploaded to Wandbox will all be - relative to this directory. This way, one can easily specify the - directory to be '/some/project/include', and the uploaded files - will be uploaded as-if they were rooted at '/some/project/include' - """) - parser.add_argument('main', type=str, help= - """The main source file. - - The path may be either absolute or relative to the current directory. - """ - ) - args = parser.parse_args() - directory = os.path.abspath(args.directory) - if not os.path.exists(directory): - raise Exception("'%s' is not a valid directory" % args.directory) - - cpp = os.path.abspath(args.main) - if not os.path.exists(cpp): - raise Exception("'%s' is not a valid file name" % args.main) - - response = upload({ - 'code': open(cpp).read(), - 'codes': [{ - 'file': os.path.relpath(header, directory), - #'code': strip_comments(open(header).read()) - 'code': open(header).read() - } for header in headers(directory)], - 'options': 'boost-nothing,c++11', - 'compiler': 'gcc-4.9.2', - 'save': True, - 'compiler-option-raw': '-I.' - }) - - if 'status' in response and response['status'] == '0': - print response['url'] - return 0 - else: - print response - return 1 - - -exit(main()) diff --git a/resources/3rdparty/modernjson/src/json.hpp b/resources/3rdparty/modernjson/src/json.hpp index 436467632..596095aff 100755 --- a/resources/3rdparty/modernjson/src/json.hpp +++ b/resources/3rdparty/modernjson/src/json.hpp @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ -| | |__ | | | | | | version 2.0.0 +| | |__ | | | | | | version 2.0.7 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . @@ -29,34 +29,59 @@ SOFTWARE. #ifndef NLOHMANN_JSON_HPP #define NLOHMANN_JSON_HPP -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include // all_of, for_each, transform +#include // array +#include // assert +#include // isdigit +#include // and, not, or +#include // isfinite, signbit +#include // nullptr_t, ptrdiff_t, size_t +#include // int64_t, uint64_t +#include // strtod, strtof, strtold, strtoul +#include // strlen +#include // function, hash, less +#include // initializer_list +#include // setw +#include // istream, ostream +#include // advance, begin, bidirectional_iterator_tag, distance, end, inserter, iterator, iterator_traits, next, random_access_iterator_tag, reverse_iterator +#include // numeric_limits +#include // locale, numpunct +#include // map +#include // addressof, allocator, allocator_traits, unique_ptr +#include // accumulate +#include // stringstream +#include // domain_error, invalid_argument, out_of_range +#include // getline, stoi, string, to_string +#include // add_pointer, enable_if, is_arithmetic, is_base_of, is_const, is_constructible, is_convertible, is_floating_point, is_integral, is_nothrow_move_assignable, std::is_nothrow_move_constructible, std::is_pointer, std::is_reference, std::is_same, remove_const, remove_pointer, remove_reference +#include // declval, forward, make_pair, move, pair, swap +#include // vector + +// exclude unsupported compilers +#if defined(__clang__) +#define CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) + #if CLANG_VERSION < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif +#elif defined(__GNUC__) +#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#if GCC_VERSION < 40900 +#error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" +#endif +#endif // disable float-equal warnings on GCC/clang #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wfloat-equal" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + +// allow for portable deprecation warnings +#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) +#define JSON_DEPRECATED //__attribute__((deprecated)) +#elif defined(_MSC_VER) +#define JSON_DEPRECATED __declspec(deprecated) +#else + #define JSON_DEPRECATED #endif /*! @@ -72,36 +97,52 @@ namespace nlohmann @brief unnamed namespace with internal helper functions @since version 1.0.0 */ -namespace -{ + namespace + { /*! @brief Helper to determine whether there's a key_type for T. + +Thus helper is used to tell associative containers apart from other containers +such as sequence containers. For instance, `std::map` passes the test as it +contains a `mapped_type`, whereas `std::vector` fails the test. + @sa http://stackoverflow.com/a/7728728/266378 +@since version 1.0.0, overworked in version 2.0.6 */ -template -struct has_mapped_type -{ - private: - template static char test(typename C::mapped_type*); - template static char (&test(...))[2]; - public: - static constexpr bool value = sizeof(test(0)) == 1; -}; + template + struct has_mapped_type + { + private: + template + static int detect(U&&); + + static void detect(...); + public: + static constexpr bool value = + std::is_integral()))>::value; + }; /*! @brief helper class to create locales with decimal point + +This struct is used a default locale during the JSON serialization. JSON +requires the decimal point to be `.`, so this function overloads the +`do_decimal_point()` function to return `.`. This function is called by +float-to-string conversions to retrieve the decimal separator between integer +and fractional parts. + @sa https://github.com/nlohmann/json/issues/51#issuecomment-86869315 +@since version 2.0.0 */ -class DecimalSeparator : public std::numpunct -{ - protected: - char do_decimal_point() const - { - return '.'; - } -}; + struct DecimalSeparator : std::numpunct + { + char do_decimal_point() const + { + return '.'; + } + }; -} + } /*! @brief a class to store JSON values @@ -163,6 +204,13 @@ default) JSON values can be used like STL containers and provide reverse iterator access. +@invariant The member variables @a m_value and @a m_type have the following +relationship: +- If `m_type == value_t::object`, then `m_value.object != nullptr`. +- If `m_type == value_t::array`, then `m_value.array != nullptr`. +- If `m_type == value_t::string`, then `m_value.string != nullptr`. +The invariants are checked by member function assert_invariant(). + @internal @note ObjectType trick from http://stackoverflow.com/a/9860911 @endinternal @@ -174,91 +222,90 @@ Format](http://rfc7159.net/rfc7159) @nosubgrouping */ -template < - template class ObjectType = std::map, - template class ArrayType = std::vector, - class StringType = std::string, - class BooleanType = bool, - class NumberIntegerType = std::int64_t, - class NumberUnsignedType = std::uint64_t, - class NumberFloatType = double, - template class AllocatorType = std::allocator + template < + template class ObjectType = std::map, + template class ArrayType = std::vector, + class StringType = std::string, + class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator > -class basic_json -{ - private: - /// workaround type for MSVC - using basic_json_t = basic_json; - - public: - // forward declarations - template class json_reverse_iterator; - class json_pointer; - - ///////////////////// - // container types // - ///////////////////// - - /// @name container types - /// @{ - - /// the type of elements in a basic_json container - using value_type = basic_json; - - /// the type of an element reference - using reference = value_type&; - /// the type of an element const reference - using const_reference = const value_type&; - - /// a type to represent differences between iterators - using difference_type = std::ptrdiff_t; - /// a type to represent container sizes - using size_type = std::size_t; - - /// the allocator type - using allocator_type = AllocatorType; - - /// the type of an element pointer - using pointer = typename std::allocator_traits::pointer; - /// the type of an element const pointer - using const_pointer = typename std::allocator_traits::const_pointer; - - /// an iterator for a basic_json container - class iterator; - /// a const iterator for a basic_json container - class const_iterator; - /// a reverse iterator for a basic_json container - using reverse_iterator = json_reverse_iterator; - /// a const reverse iterator for a basic_json container - using const_reverse_iterator = json_reverse_iterator; - - /// @} - - - /*! + class basic_json + { + private: + /// workaround type for MSVC + using basic_json_t = basic_json; + + public: + // forward declarations + template class json_reverse_iterator; + class json_pointer; + + ///////////////////// + // container types // + ///////////////////// + + /// @name container types + /// The canonic container types to use @ref basic_json like any other STL + /// container. + /// @{ + + /// the type of elements in a basic_json container + using value_type = basic_json; + + /// the type of an element reference + using reference = value_type&; + /// the type of an element const reference + using const_reference = const value_type&; + + /// a type to represent differences between iterators + using difference_type = std::ptrdiff_t; + /// a type to represent container sizes + using size_type = std::size_t; + + /// the allocator type + using allocator_type = AllocatorType; + + /// the type of an element pointer + using pointer = typename std::allocator_traits::pointer; + /// the type of an element const pointer + using const_pointer = typename std::allocator_traits::const_pointer; + + /// an iterator for a basic_json container + class iterator; + /// a const iterator for a basic_json container + class const_iterator; + /// a reverse iterator for a basic_json container + using reverse_iterator = json_reverse_iterator; + /// a const reverse iterator for a basic_json container + using const_reverse_iterator = json_reverse_iterator; + + /// @} + + + /*! @brief returns the allocator associated with the container */ - static allocator_type get_allocator() - { - return allocator_type(); - } + static allocator_type get_allocator() + { + return allocator_type(); + } - /////////////////////////// - // JSON value data types // - /////////////////////////// + /////////////////////////// + // JSON value data types // + /////////////////////////// - /// @name JSON value data types - /// @{ + /// @name JSON value data types + /// The data types to store a JSON value. These types are derived from + /// the template arguments passed to class @ref basic_json. + /// @{ - /*! + /*! @brief a type for an object [RFC 7159](http://rfc7159.net/rfc7159) describes JSON objects as follows: @@ -341,13 +388,13 @@ class basic_json 7159](http://rfc7159.net/rfc7159), because any order implements the specified "unordered" nature of JSON objects. */ - using object_t = ObjectType, - AllocatorType>>; + using object_t = ObjectType, + AllocatorType>>; - /*! + /*! @brief a type for an array [RFC 7159](http://rfc7159.net/rfc7159) describes JSON arrays as follows: @@ -358,7 +405,7 @@ class basic_json @tparam ArrayType container type to store arrays (e.g., `std::vector` or `std::list`) - @tparam AllocatorType allocator to use for arrays (e.g., `std::allocator`) + @tparam AllocatorType allocator to use for arrays (e.g., `std::allocator`) #### Default type @@ -391,9 +438,9 @@ class basic_json @since version 1.0.0 */ - using array_t = ArrayType>; + using array_t = ArrayType>; - /*! + /*! @brief a type for a string [RFC 7159](http://rfc7159.net/rfc7159) describes JSON strings as follows: @@ -438,9 +485,9 @@ class basic_json @since version 1.0.0 */ - using string_t = StringType; + using string_t = StringType; - /*! + /*! @brief a type for a boolean [RFC 7159](http://rfc7159.net/rfc7159) implicitly describes a boolean as a @@ -464,9 +511,9 @@ class basic_json @since version 1.0.0 */ - using boolean_t = BooleanType; + using boolean_t = BooleanType; - /*! + /*! @brief a type for a number (integer) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: @@ -536,9 +583,9 @@ class basic_json @since version 1.0.0 */ - using number_integer_t = NumberIntegerType; + using number_integer_t = NumberIntegerType; - /*! + /*! @brief a type for a number (unsigned) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: @@ -595,22 +642,21 @@ class basic_json > that implementations will agree exactly on their numeric values. As this range is a subrange (when considered in conjunction with the - number_integer_t type) of the exactly supported range [0, UINT64_MAX], this - class's integer type is interoperable. + number_integer_t type) of the exactly supported range [0, UINT64_MAX], + this class's integer type is interoperable. #### Storage Integer number values are stored directly inside a @ref basic_json type. @sa @ref number_float_t -- type for number values (floating-point) - @sa @ref number_integer_t -- type for number values (integer) @since version 2.0.0 */ - using number_unsigned_t = NumberUnsignedType; + using number_unsigned_t = NumberUnsignedType; - /*! + /*! @brief a type for a number (floating-point) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: @@ -676,273 +722,254 @@ class basic_json @since version 1.0.0 */ - using number_float_t = NumberFloatType; + using number_float_t = NumberFloatType; - /// @} + /// @} - /////////////////////////// - // JSON type enumeration // - /////////////////////////// + /////////////////////////// + // JSON type enumeration // + /////////////////////////// - /*! + /*! @brief the JSON type enumeration This enumeration collects the different JSON types. It is internally used to distinguish the stored values, and the functions @ref is_null(), @ref is_object(), @ref is_array(), @ref is_string(), @ref is_boolean(), @ref - is_number(), and @ref is_discarded() rely on it. - - @since version 1.0.0 - */ - enum class value_t : uint8_t - { - null, ///< null value - object, ///< object (unordered set of name/value pairs) - array, ///< array (ordered collection of values) - string, ///< string value - boolean, ///< boolean value - number_integer, ///< number value (integer) - number_unsigned, ///< number value (unsigned integer) - number_float, ///< number value (floating-point) - discarded ///< discarded by the the parser callback function - }; + is_number() (with @ref is_number_integer(), @ref is_number_unsigned(), and + @ref is_number_float()), @ref is_discarded(), @ref is_primitive(), and + @ref is_structured() rely on it. + @note There are three enumeration entries (number_integer, + number_unsigned, and number_float), because the library distinguishes + these three types for numbers: @ref number_unsigned_t is used for unsigned + integers, @ref number_integer_t is used for signed integers, and @ref + number_float_t is used for floating-point numbers or to approximate + integers which do not fit in the limits of their respective type. - private: + @sa @ref basic_json(const value_t value_type) -- create a JSON value with + the default value for a given type - /*! - @brief a type to hold JSON type information - - This bitfield type holds information about JSON types. It is internally - used to hold the basic JSON type enumeration, as well as additional - information in the case of values that have been parsed from a string - including whether of not it was created directly or parsed, and in the - case of floating point numbers the number of significant figures in the - original representaiton and if it was in exponential form, if a '+' was - included in the exponent and the capitilization of the exponent marker. - The sole purpose of this information is to permit accurate round trips. - - @since version 2.0.0 + @since version 1.0.0 */ - union type_data_t - { - struct - { - /// the type of the value (@ref value_t) - uint16_t type : 4; - /// whether the number was parsed from a string - uint16_t parsed : 1; - /// whether parsed number contained an exponent ('e'/'E') - uint16_t has_exp : 1; - /// whether parsed number contained a plus in the exponent - uint16_t exp_plus : 1; - /// whether parsed number's exponent was capitalized ('E') - uint16_t exp_cap : 1; - /// the number of figures for a parsed number - uint16_t precision : 8; - } bits; - uint16_t data; - - /// return the type as value_t - operator value_t() const - { - return static_cast(bits.type); - } - - /// test type for equality (ignore other fields) - bool operator==(const value_t& rhs) const - { - return static_cast(bits.type) == rhs; - } + enum class value_t : uint8_t + { + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + discarded ///< discarded by the the parser callback function + }; - /// assignment - type_data_t& operator=(value_t rhs) - { - bits.type = static_cast(rhs) & 15; // avoid overflow - return *this; - } - /// construct from value_t - type_data_t(value_t t) noexcept - { - *reinterpret_cast(this) = 0; - bits.type = static_cast(t) & 15; // avoid overflow - } + private: - /// default constructor - type_data_t() noexcept + /// helper for exception-safe object creation + template + static T* create(Args&& ... args) { - data = 0; - bits.type = reinterpret_cast(value_t::null); + AllocatorType alloc; + auto deleter = [&](T * object) + { + alloc.deallocate(object, 1); + }; + std::unique_ptr object(alloc.allocate(1), deleter); + alloc.construct(object.get(), std::forward(args)...); + assert(object.get() != nullptr); + return object.release(); } - }; - - /// helper for exception-safe object creation - template - static T* create(Args&& ... args) - { - AllocatorType alloc; - auto deleter = [&](T * object) - { - alloc.deallocate(object, 1); - }; - std::unique_ptr object(alloc.allocate(1), deleter); - alloc.construct(object.get(), std::forward(args)...); - return object.release(); - } - //////////////////////// - // JSON value storage // - //////////////////////// + //////////////////////// + // JSON value storage // + //////////////////////// - /*! + /*! @brief a JSON value - The actual storage for a JSON value of the @ref basic_json class. + The actual storage for a JSON value of the @ref basic_json class. This + union combines the different storage types for the JSON value types + defined in @ref value_t. + + JSON type | value_t type | used type + --------- | --------------- | ------------------------ + object | object | pointer to @ref object_t + array | array | pointer to @ref array_t + string | string | pointer to @ref string_t + boolean | boolean | @ref boolean_t + number | number_integer | @ref number_integer_t + number | number_unsigned | @ref number_unsigned_t + number | number_float | @ref number_float_t + null | null | *no value is stored* + + @note Variable-length types (objects, arrays, and strings) are stored as + pointers. The size of the union should not exceed 64 bits if the default + value types are used. @since version 1.0.0 */ - union json_value - { - /// object (stored with pointer to save storage) - object_t* object; - /// array (stored with pointer to save storage) - array_t* array; - /// string (stored with pointer to save storage) - string_t* string; - /// boolean - boolean_t boolean; - /// number (integer) - number_integer_t number_integer; - /// number (unsigned integer) - number_unsigned_t number_unsigned; - /// number (floating-point) - number_float_t number_float; - - /// default constructor (for null values) - json_value() = default; - /// constructor for booleans - json_value(boolean_t v) noexcept : boolean(v) {} - /// constructor for numbers (integer) - json_value(number_integer_t v) noexcept : number_integer(v) {} - /// constructor for numbers (unsigned) - json_value(number_unsigned_t v) noexcept : number_unsigned(v) {} - /// constructor for numbers (floating-point) - json_value(number_float_t v) noexcept : number_float(v) {} - /// constructor for empty values of a given type - json_value(value_t t) - { - switch (t) - { - case value_t::object: + union json_value + { + /// object (stored with pointer to save storage) + object_t* object; + /// array (stored with pointer to save storage) + array_t* array; + /// string (stored with pointer to save storage) + string_t* string; + /// boolean + boolean_t boolean; + /// number (integer) + number_integer_t number_integer; + /// number (unsigned integer) + number_unsigned_t number_unsigned; + /// number (floating-point) + number_float_t number_float; + + /// default constructor (for null values) + json_value() = default; + /// constructor for booleans + json_value(boolean_t v) noexcept : boolean(v) {} + /// constructor for numbers (integer) + json_value(number_integer_t v) noexcept : number_integer(v) {} + /// constructor for numbers (unsigned) + json_value(number_unsigned_t v) noexcept : number_unsigned(v) {} + /// constructor for numbers (floating-point) + json_value(number_float_t v) noexcept : number_float(v) {} + /// constructor for empty values of a given type + json_value(value_t t) + { + switch (t) { - object = create(); - break; - } + case value_t::object: + { + object = create(); + break; + } - case value_t::array: - { - array = create(); - break; - } + case value_t::array: + { + array = create(); + break; + } - case value_t::string: - { - string = create(""); - break; - } + case value_t::string: + { + string = create(""); + break; + } - case value_t::boolean: - { - boolean = boolean_t(false); - break; - } + case value_t::boolean: + { + boolean = boolean_t(false); + break; + } - case value_t::number_integer: - { - number_integer = number_integer_t(0); - break; - } + case value_t::number_integer: + { + number_integer = number_integer_t(0); + break; + } - case value_t::number_unsigned: - { - number_unsigned = number_unsigned_t(0); - break; - } + case value_t::number_unsigned: + { + number_unsigned = number_unsigned_t(0); + break; + } - case value_t::number_float: - { - number_float = number_float_t(0.0); - break; - } + case value_t::number_float: + { + number_float = number_float_t(0.0); + break; + } - default: - { - break; + default: + { + break; + } } } - } - /// constructor for strings - json_value(const string_t& value) - { - string = create(value); - } + /// constructor for strings + json_value(const string_t& value) + { + string = create(value); + } - /// constructor for objects - json_value(const object_t& value) - { - object = create(value); - } + /// constructor for objects + json_value(const object_t& value) + { + object = create(value); + } + + /// constructor for arrays + json_value(const array_t& value) + { + array = create(value); + } + }; + + /*! + @brief checks the class invariants - /// constructor for arrays - json_value(const array_t& value) + This function asserts the class invariants. It needs to be called at the + end of every constructor to make sure that created objects respect the + invariant. Furthermore, it has to be called each time the type of a JSON + value is changed, because the invariant expresses a relationship between + @a m_type and @a m_value. + */ + void assert_invariant() const { - array = create(value); + assert(m_type != value_t::object or m_value.object != nullptr); + assert(m_type != value_t::array or m_value.array != nullptr); + assert(m_type != value_t::string or m_value.string != nullptr); } - }; - - public: - ////////////////////////// - // JSON parser callback // - ////////////////////////// + public: + ////////////////////////// + // JSON parser callback // + ////////////////////////// - /*! + /*! @brief JSON callback events This enumeration lists the parser events that can trigger calling a callback function of type @ref parser_callback_t during parsing. + @image html callback_events.png "Example when certain parse events are triggered" + @since version 1.0.0 */ - enum class parse_event_t : uint8_t - { - /// the parser read `{` and started to process a JSON object - object_start, - /// the parser read `}` and finished processing a JSON object - object_end, - /// the parser read `[` and started to process a JSON array - array_start, - /// the parser read `]` and finished processing a JSON array - array_end, - /// the parser read a key of a value in an object - key, - /// the parser finished reading a JSON value - value - }; + enum class parse_event_t : uint8_t + { + /// the parser read `{` and started to process a JSON object + object_start, + /// the parser read `}` and finished processing a JSON object + object_end, + /// the parser read `[` and started to process a JSON array + array_start, + /// the parser read `]` and finished processing a JSON array + array_end, + /// the parser read a key of a value in an object + key, + /// the parser finished reading a JSON value + value + }; - /*! + /*! @brief per-element parser callback type With a parser callback function, the result of parsing a JSON text can be - influenced. When passed to @ref parse(std::istream&, parser_callback_t) or - @ref parse(const string_t&, parser_callback_t), it is called on certain - events (passed as @ref parse_event_t via parameter @a event) with a set - recursion depth @a depth and context JSON value @a parsed. The return - value of the callback function is a boolean indicating whether the element - that emitted the callback shall be kept or not. + influenced. When passed to @ref parse(std::istream&, const + parser_callback_t) or @ref parse(const char*, const parser_callback_t), + it is called on certain events (passed as @ref parse_event_t via parameter + @a event) with a set recursion depth @a depth and context JSON value + @a parsed. The return value of the callback function is a boolean + indicating whether the element that emitted the callback shall be kept or + not. We distinguish six scenarios (determined by the event type) in which the callback function can be called. The following table describes the values @@ -957,6 +984,8 @@ class basic_json parse_event_t::array_end | the parser read `]` and finished processing a JSON array | depth of the parent of the JSON array | the parsed JSON array parse_event_t::value | the parser finished reading a JSON value | depth of the value | the parsed JSON value + @image html callback_events.png "Example when certain parse events are triggered" + Discarding a value (i.e., returning `false`) has different effects depending on the context in which function was called: @@ -978,21 +1007,25 @@ class basic_json skipped completely or replaced by an empty discarded object. @sa @ref parse(std::istream&, parser_callback_t) or - @ref parse(const string_t&, parser_callback_t) for examples + @ref parse(const char*, parser_callback_t) for examples @since version 1.0.0 */ - using parser_callback_t = std::function; + using parser_callback_t = std::function; - ////////////////// - // constructors // - ////////////////// + ////////////////// + // constructors // + ////////////////// - /// @name constructors and destructors - /// @{ + /// @name constructors and destructors + /// Constructors of class @ref basic_json, copy/move constructor, copy + /// assignment, static functions creating objects, and the destructor. + /// @{ - /*! + /*! @brief create an empty value with a given type Create an empty JSON value with a given type. The value will be default @@ -1031,42 +1064,17 @@ class basic_json @since version 1.0.0 */ - basic_json(const value_t value_type) - : m_type(value_type), m_value(value_type) - {} - - /*! - @brief create a null object (implicitly) - - Create a `null` JSON value. This is the implicit version of the `null` - value constructor as it takes no parameters. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this constructor never throws - exceptions. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is constant. - - As postcondition, it holds: `basic_json().empty() == true`. - - @liveexample{The following code shows the constructor for a `null` JSON - value.,basic_json} - - @sa @ref basic_json(std::nullptr_t) -- create a `null` value - - @since version 1.0.0 - */ - basic_json() = default; + basic_json(const value_t value_type) + : m_type(value_type), m_value(value_type) + { + assert_invariant(); + } - /*! - @brief create a null object (explicitly) + /*! + @brief create a null object - Create a `null` JSON value. This is the explicitly version of the `null` - value constructor as it takes a null pointer as parameter. It allows to - create `null` values by explicitly assigning a `nullptr` to a JSON value. + Create a `null` JSON value. It either takes a null pointer as parameter + (explicitly creating `null`) or no parameter (implicitly creating `null`). The passed null pointer itself is not read -- it is only used to choose the right constructor. @@ -1075,19 +1083,18 @@ class basic_json @exceptionsafety No-throw guarantee: this constructor never throws exceptions. - @liveexample{The following code shows the constructor with null pointer - parameter.,basic_json__nullptr_t} - - @sa @ref basic_json() -- default constructor (implicitly creating a `null` - value) + @liveexample{The following code shows the constructor with and without a + null pointer parameter.,basic_json__nullptr_t} @since version 1.0.0 */ - basic_json(std::nullptr_t) noexcept - : basic_json(value_t::null) - {} + basic_json(std::nullptr_t = nullptr) noexcept + : basic_json(value_t::null) + { + assert_invariant(); + } - /*! + /*! @brief create an object (explicit) Create an object JSON value with a given content. @@ -1106,11 +1113,13 @@ class basic_json @since version 1.0.0 */ - basic_json(const object_t& val) - : m_type(value_t::object), m_value(val) - {} + basic_json(const object_t& val) + : m_type(value_t::object), m_value(val) + { + assert_invariant(); + } - /*! + /*! @brief create an object (implicit) Create an object JSON value with a given content. This constructor allows @@ -1136,20 +1145,19 @@ class basic_json @since version 1.0.0 */ - template ::value and - std::is_constructible::value, int>::type - = 0> - basic_json(const CompatibleObjectType& val) - : m_type(value_t::object) - { - using std::begin; - using std::end; - m_value.object = create(begin(val), end(val)); - } + template::value and + std::is_constructible::value, int>::type = 0> + basic_json(const CompatibleObjectType& val) + : m_type(value_t::object) + { + using std::begin; + using std::end; + m_value.object = create(begin(val), end(val)); + assert_invariant(); + } - /*! + /*! @brief create an array (explicit) Create an array JSON value with a given content. @@ -1168,11 +1176,13 @@ class basic_json @since version 1.0.0 */ - basic_json(const array_t& val) - : m_type(value_t::array), m_value(val) - {} + basic_json(const array_t& val) + : m_type(value_t::array), m_value(val) + { + assert_invariant(); + } - /*! + /*! @brief create an array (implicit) Create an array JSON value with a given content. This constructor allows @@ -1198,25 +1208,24 @@ class basic_json @since version 1.0.0 */ - template ::value and - not std::is_same::value and - not std::is_same::value and - not std::is_same::value and - not std::is_same::value and - not std::is_same::value and - std::is_constructible::value, int>::type - = 0> - basic_json(const CompatibleArrayType& val) - : m_type(value_t::array) - { - using std::begin; - using std::end; - m_value.array = create(begin(val), end(val)); - } + template::value and + not std::is_same::value and + not std::is_same::value and + not std::is_same::value and + not std::is_same::value and + not std::is_same::value and + std::is_constructible::value, int>::type = 0> + basic_json(const CompatibleArrayType& val) + : m_type(value_t::array) + { + using std::begin; + using std::end; + m_value.array = create(begin(val), end(val)); + assert_invariant(); + } - /*! + /*! @brief create a string (explicit) Create an string JSON value with a given content. @@ -1237,11 +1246,13 @@ class basic_json @since version 1.0.0 */ - basic_json(const string_t& val) - : m_type(value_t::string), m_value(val) - {} + basic_json(const string_t& val) + : m_type(value_t::string), m_value(val) + { + assert_invariant(); + } - /*! + /*! @brief create a string (explicit) Create a string JSON value with a given content. @@ -1261,11 +1272,13 @@ class basic_json @since version 1.0.0 */ - basic_json(const typename string_t::value_type* val) - : basic_json(string_t(val)) - {} + basic_json(const typename string_t::value_type* val) + : basic_json(string_t(val)) + { + assert_invariant(); + } - /*! + /*! @brief create a string (implicit) Create a string JSON value with a given content. @@ -1288,15 +1301,15 @@ class basic_json @since version 1.0.0 */ - template ::value, int>::type - = 0> - basic_json(const CompatibleStringType& val) - : basic_json(string_t(val)) - {} + template::value, int>::type = 0> + basic_json(const CompatibleStringType& val) + : basic_json(string_t(val)) + { + assert_invariant(); + } - /*! + /*! @brief create a boolean (explicit) Creates a JSON boolean type from a given value. @@ -1310,11 +1323,13 @@ class basic_json @since version 1.0.0 */ - basic_json(boolean_t val) noexcept - : m_type(value_t::boolean), m_value(val) - {} + basic_json(boolean_t val) noexcept + : m_type(value_t::boolean), m_value(val) + { + assert_invariant(); + } - /*! + /*! @brief create an integer number (explicit) Create an integer number JSON value with a given content. @@ -1337,17 +1352,16 @@ class basic_json @since version 1.0.0 */ - template::value) - and std::is_same::value - , int>::type - = 0> - basic_json(const number_integer_t val) noexcept - : m_type(value_t::number_integer), m_value(val) - {} - - /*! + template::value) and + std::is_same::value, int>::type = 0> + basic_json(const number_integer_t val) noexcept + : m_type(value_t::number_integer), m_value(val) + { + assert_invariant(); + } + + /*! @brief create an integer number from an enum type (explicit) Create an integer number JSON value with a given content. @@ -1372,12 +1386,14 @@ class basic_json @since version 1.0.0 */ - basic_json(const int val) noexcept - : m_type(value_t::number_integer), - m_value(static_cast(val)) - {} + basic_json(const int val) noexcept + : m_type(value_t::number_integer), + m_value(static_cast(val)) + { + assert_invariant(); + } - /*! + /*! @brief create an integer number (implicit) Create an integer number JSON value with a given content. This constructor @@ -1402,25 +1418,25 @@ class basic_json @since version 1.0.0 */ - template::value and - std::numeric_limits::is_integer and - std::numeric_limits::is_signed, - CompatibleNumberIntegerType>::type - = 0> - basic_json(const CompatibleNumberIntegerType val) noexcept - : m_type(value_t::number_integer), - m_value(static_cast(val)) - {} - - /*! + template::value and + std::numeric_limits::is_integer and + std::numeric_limits::is_signed, + CompatibleNumberIntegerType>::type = 0> + basic_json(const CompatibleNumberIntegerType val) noexcept + : m_type(value_t::number_integer), + m_value(static_cast(val)) + { + assert_invariant(); + } + + /*! @brief create an unsigned integer number (explicit) Create an unsigned integer number JSON value with a given content. - @tparam T helper type to compare number_unsigned_t and unsigned int - (not visible in) the interface. + @tparam T helper type to compare number_unsigned_t and unsigned int (not + visible in) the interface. @param[in] val an integer to create a JSON number from @@ -1431,17 +1447,16 @@ class basic_json @since version 2.0.0 */ - template::value) - and std::is_same::value - , int>::type - = 0> - basic_json(const number_unsigned_t val) noexcept - : m_type(value_t::number_unsigned), m_value(val) - {} - - /*! + template::value) and + std::is_same::value, int>::type = 0> + basic_json(const number_unsigned_t val) noexcept + : m_type(value_t::number_unsigned), m_value(val) + { + assert_invariant(); + } + + /*! @brief create an unsigned number (implicit) Create an unsigned number JSON value with a given content. This @@ -1461,19 +1476,19 @@ class basic_json @since version 2.0.0 */ - template < typename CompatibleNumberUnsignedType, typename - std::enable_if < - std::is_constructible::value and - std::numeric_limits::is_integer and - !std::numeric_limits::is_signed, - CompatibleNumberUnsignedType >::type - = 0 > - basic_json(const CompatibleNumberUnsignedType val) noexcept - : m_type(value_t::number_unsigned), - m_value(static_cast(val)) - {} - - /*! + template::value and + std::numeric_limits::is_integer and + not std::numeric_limits::is_signed, + CompatibleNumberUnsignedType>::type = 0> + basic_json(const CompatibleNumberUnsignedType val) noexcept + : m_type(value_t::number_unsigned), + m_value(static_cast(val)) + { + assert_invariant(); + } + + /*! @brief create a floating-point number (explicit) Create a floating-point number JSON value with a given content. @@ -1484,8 +1499,8 @@ class basic_json disallows NaN values: > Numeric values that cannot be represented in the grammar below (such as > Infinity and NaN) are not permitted. - In case the parameter @a val is not a number, a JSON null value is - created instead. + In case the parameter @a val is not a number, a JSON null value is created + instead. @complexity Constant. @@ -1497,18 +1512,20 @@ class basic_json @since version 1.0.0 */ - basic_json(const number_float_t val) noexcept - : m_type(value_t::number_float), m_value(val) - { - // replace infinity and NAN by null - if (not std::isfinite(val)) + basic_json(const number_float_t val) noexcept + : m_type(value_t::number_float), m_value(val) { - m_type = value_t::null; - m_value = json_value(); + // replace infinity and NAN by null + if (not std::isfinite(val)) + { + m_type = value_t::null; + m_value = json_value(); + } + + assert_invariant(); } - } - /*! + /*! @brief create an floating-point number (implicit) Create an floating-point number JSON value with a given content. This @@ -1539,16 +1556,16 @@ class basic_json @since version 1.0.0 */ - template::value and - std::is_floating_point::value>::type - > - basic_json(const CompatibleNumberFloatType val) noexcept - : basic_json(number_float_t(val)) - {} + template::value and + std::is_floating_point::value>::type> + basic_json(const CompatibleNumberFloatType val) noexcept + : basic_json(number_float_t(val)) + { + assert_invariant(); + } - /*! + /*! @brief create a container (array or object) from an initializer list Creates a JSON value of type array or object from the passed initializer @@ -1558,21 +1575,21 @@ class basic_json 1. If the list is empty, an empty JSON object value `{}` is created. 2. If the list consists of pairs whose first element is a string, a JSON - object value is created where the first elements of the pairs are treated - as keys and the second elements are as values. + object value is created where the first elements of the pairs are + treated as keys and the second elements are as values. 3. In all other cases, an array is created. The rules aim to create the best fit between a C++ initializer list and JSON values. The rationale is as follows: 1. The empty initializer list is written as `{}` which is exactly an empty - JSON object. + JSON object. 2. C++ has now way of describing mapped types other than to list a list of - pairs. As JSON requires that keys must be of type string, rule 2 is the - weakest constraint one can pose on initializer lists to interpret them as - an object. + pairs. As JSON requires that keys must be of type string, rule 2 is the + weakest constraint one can pose on initializer lists to interpret them + as an object. 3. In all other cases, the initializer list could not be interpreted as - JSON object type, so interpreting it as JSON array type is safe. + JSON object type, so interpreting it as JSON array type is safe. With the rules described above, the following JSON values cannot be expressed by an initializer list: @@ -1617,65 +1634,56 @@ class basic_json @since version 1.0.0 */ - basic_json(std::initializer_list init, - bool type_deduction = true, - value_t manual_type = value_t::array) - { - // the initializer list could describe an object - bool is_an_object = true; - - // check if each element is an array with two elements whose first - // element is a string - for (const auto& element : init) + basic_json(std::initializer_list init, + bool type_deduction = true, + value_t manual_type = value_t::array) { - if (not element.is_array() or element.size() != 2 - or not element[0].is_string()) - { - // we found an element that makes it impossible to use the - // initializer list as object - is_an_object = false; - break; - } - } + // check if each element is an array with two elements whose first + // element is a string + bool is_an_object = std::all_of(init.begin(), init.end(), + [](const basic_json & element) + { + return element.is_array() and element.size() == 2 and element[0].is_string(); + }); - // adjust type if type deduction is not wanted - if (not type_deduction) - { - // if array is wanted, do not create an object though possible - if (manual_type == value_t::array) + // adjust type if type deduction is not wanted + if (not type_deduction) { - is_an_object = false; - } + // if array is wanted, do not create an object though possible + if (manual_type == value_t::array) + { + is_an_object = false; + } - // if object is wanted but impossible, throw an exception - if (manual_type == value_t::object and not is_an_object) - { - throw std::domain_error("cannot create object from initializer list"); + // if object is wanted but impossible, throw an exception + if (manual_type == value_t::object and not is_an_object) + { + throw std::domain_error("cannot create object from initializer list"); + } } - } - - if (is_an_object) - { - // the initializer list is a list of pairs -> create object - m_type = value_t::object; - m_value = value_t::object; - assert(m_value.object != nullptr); + if (is_an_object) + { + // the initializer list is a list of pairs -> create object + m_type = value_t::object; + m_value = value_t::object; - for (auto& element : init) + std::for_each(init.begin(), init.end(), [this](const basic_json & element) + { + m_value.object->emplace(*(element[0].m_value.string), element[1]); + }); + } + else { - m_value.object->emplace(*(element[0].m_value.string), element[1]); + // the initializer list describes an array -> create array + m_type = value_t::array; + m_value.array = create(init); } + + assert_invariant(); } - else - { - // the initializer list describes an array -> create array - m_type = value_t::array; - m_value.array = create(init); - } - } - /*! + /*! @brief explicitly create an array from an initializer list Creates a JSON array value from a given initializer list. That is, given a @@ -1709,13 +1717,13 @@ class basic_json @since version 1.0.0 */ - static basic_json array(std::initializer_list init = - std::initializer_list()) - { - return basic_json(init, false, value_t::array); - } + static basic_json array(std::initializer_list init = + std::initializer_list()) + { + return basic_json(init, false, value_t::array); + } - /*! + /*! @brief explicitly create an object from an initializer list Creates a JSON object value from a given initializer list. The initializer @@ -1749,13 +1757,13 @@ class basic_json @since version 1.0.0 */ - static basic_json object(std::initializer_list init = - std::initializer_list()) - { - return basic_json(init, false, value_t::object); - } + static basic_json object(std::initializer_list init = + std::initializer_list()) + { + return basic_json(init, false, value_t::object); + } - /*! + /*! @brief construct an array with count copies of given value Constructs a JSON array value by creating @a cnt copies of a passed value. @@ -1773,13 +1781,14 @@ class basic_json @since version 1.0.0 */ - basic_json(size_type cnt, const basic_json& val) - : m_type(value_t::array) - { - m_value.array = create(cnt, val); - } + basic_json(size_type cnt, const basic_json& val) + : m_type(value_t::array) + { + m_value.array = create(cnt, val); + assert_invariant(); + } - /*! + /*! @brief construct a JSON container given an iterator range Constructs the JSON value with the contents of the range `[first, last)`. @@ -1797,6 +1806,9 @@ class basic_json @param[in] first begin of the range to copy from (included) @param[in] last end of the range to copy from (excluded) + @pre Iterators @a first and @a last must be initialized. **This + precondition is enforced with an assertion.** + @throw std::domain_error if iterators are not compatible; that is, do not belong to the same JSON value; example: `"iterators are not compatible"` @throw std::out_of_range if iterators are for a primitive type (number, @@ -1813,100 +1825,99 @@ class basic_json @since version 1.0.0 */ - template ::value or - std::is_same::value - , int>::type - = 0> - basic_json(InputIT first, InputIT last) : m_type(first.m_object->m_type) - { - // make sure iterator fits the current value - if (first.m_object != last.m_object) + template::value or + std::is_same::value, int>::type = 0> + basic_json(InputIT first, InputIT last) { - throw std::domain_error("iterators are not compatible"); - } + assert(first.m_object != nullptr); + assert(last.m_object != nullptr); - // check if iterator range is complete for primitive values - switch (m_type) - { - case value_t::boolean: - case value_t::number_float: - case value_t::number_integer: - case value_t::number_unsigned: - case value_t::string: + // make sure iterator fits the current value + if (first.m_object != last.m_object) { - if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end()) - { - throw std::out_of_range("iterators out of range"); - } - break; + throw std::domain_error("iterators are not compatible"); } - default: - { - break; - } - } + // copy type from first iterator + m_type = first.m_object->m_type; - switch (m_type) - { - case value_t::number_integer: + // check if iterator range is complete for primitive values + switch (m_type) { - assert(first.m_object != nullptr); - m_value.number_integer = first.m_object->m_value.number_integer; - break; - } + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + { + if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end()) + { + throw std::out_of_range("iterators out of range"); + } + break; + } - case value_t::number_unsigned: - { - assert(first.m_object != nullptr); - m_value.number_unsigned = first.m_object->m_value.number_unsigned; - break; + default: + { + break; + } } - case value_t::number_float: + switch (m_type) { - assert(first.m_object != nullptr); - m_value.number_float = first.m_object->m_value.number_float; - break; - } + case value_t::number_integer: + { + m_value.number_integer = first.m_object->m_value.number_integer; + break; + } - case value_t::boolean: - { - assert(first.m_object != nullptr); - m_value.boolean = first.m_object->m_value.boolean; - break; - } + case value_t::number_unsigned: + { + m_value.number_unsigned = first.m_object->m_value.number_unsigned; + break; + } - case value_t::string: - { - assert(first.m_object != nullptr); - m_value = *first.m_object->m_value.string; - break; - } + case value_t::number_float: + { + m_value.number_float = first.m_object->m_value.number_float; + break; + } - case value_t::object: - { - m_value.object = create(first.m_it.object_iterator, last.m_it.object_iterator); - break; - } + case value_t::boolean: + { + m_value.boolean = first.m_object->m_value.boolean; + break; + } - case value_t::array: - { - m_value.array = create(first.m_it.array_iterator, last.m_it.array_iterator); - break; - } + case value_t::string: + { + m_value = *first.m_object->m_value.string; + break; + } - default: - { - assert(first.m_object != nullptr); - throw std::domain_error("cannot use construct with iterators from " + first.m_object->type_name()); + case value_t::object: + { + m_value.object = create(first.m_it.object_iterator, last.m_it.object_iterator); + break; + } + + case value_t::array: + { + m_value.array = create(first.m_it.array_iterator, last.m_it.array_iterator); + break; + } + + default: + { + throw std::domain_error("cannot use construct with iterators from " + first.m_object->type_name()); + } } + + assert_invariant(); } - } - /*! + /*! @brief construct a JSON value given an input stream @param[in,out] i stream to read a serialized JSON value from @@ -1920,22 +1931,32 @@ class basic_json @note A UTF-8 byte order mark is silently ignored. + @deprecated This constructor is deprecated and will be removed in version + 3.0.0 to unify the interface of the library. Deserialization will be + done by stream operators or by calling one of the `parse` functions, + e.g. @ref parse(std::istream&, const parser_callback_t). That is, calls + like `json j(i);` for an input stream @a i need to be replaced by + `json j = json::parse(i);`. See the example below. + @liveexample{The example below demonstrates constructing a JSON value from a `std::stringstream` with and without callback function.,basic_json__istream} - @since version 2.0.0 + @since version 2.0.0, deprecated in version 2.0.3, to be removed in + version 3.0.0 */ - explicit basic_json(std::istream& i, parser_callback_t cb = nullptr) - { - *this = parser(i, cb).parse(); - } + JSON_DEPRECATED + explicit basic_json(std::istream& i, const parser_callback_t cb = nullptr) + { + *this = parser(i, cb).parse(); + assert_invariant(); + } - /////////////////////////////////////// - // other constructors and destructor // - /////////////////////////////////////// + /////////////////////////////////////// + // other constructors and destructor // + /////////////////////////////////////// - /*! + /*! @brief copy constructor Creates a copy of a given JSON value. @@ -1957,64 +1978,66 @@ class basic_json @since version 1.0.0 */ - basic_json(const basic_json& other) - : m_type(other.m_type) - { - switch (m_type) + basic_json(const basic_json& other) + : m_type(other.m_type) { - case value_t::object: - { - assert(other.m_value.object != nullptr); - m_value = *other.m_value.object; - break; - } + // check of passed value is valid + other.assert_invariant(); - case value_t::array: + switch (m_type) { - assert(other.m_value.array != nullptr); - m_value = *other.m_value.array; - break; - } + case value_t::object: + { + m_value = *other.m_value.object; + break; + } - case value_t::string: - { - assert(other.m_value.string != nullptr); - m_value = *other.m_value.string; - break; - } + case value_t::array: + { + m_value = *other.m_value.array; + break; + } - case value_t::boolean: - { - m_value = other.m_value.boolean; - break; - } + case value_t::string: + { + m_value = *other.m_value.string; + break; + } - case value_t::number_integer: - { - m_value = other.m_value.number_integer; - break; - } + case value_t::boolean: + { + m_value = other.m_value.boolean; + break; + } - case value_t::number_unsigned: - { - m_value = other.m_value.number_unsigned; - break; - } + case value_t::number_integer: + { + m_value = other.m_value.number_integer; + break; + } - case value_t::number_float: - { - m_value = other.m_value.number_float; - break; - } + case value_t::number_unsigned: + { + m_value = other.m_value.number_unsigned; + break; + } - default: - { - break; + case value_t::number_float: + { + m_value = other.m_value.number_float; + break; + } + + default: + { + break; + } } + + assert_invariant(); } - } - /*! + /*! @brief move constructor Move constructor. Constructs a JSON value with the contents of the given @@ -2032,16 +2055,21 @@ class basic_json @since version 1.0.0 */ - basic_json(basic_json&& other) noexcept - : m_type(std::move(other.m_type)), - m_value(std::move(other.m_value)) - { - // invalidate payload - other.m_type = value_t::null; - other.m_value = {}; - } + basic_json(basic_json&& other) noexcept + : m_type(std::move(other.m_type)), + m_value(std::move(other.m_value)) + { + // check that passed value is valid + other.assert_invariant(); - /*! + // invalidate payload + other.m_type = value_t::null; + other.m_value = {}; + + assert_invariant(); + } + + /*! @brief copy assignment Copy assignment operator. Copies a JSON value via the "copy and swap" @@ -2064,20 +2092,25 @@ class basic_json @since version 1.0.0 */ - reference& operator=(basic_json other) noexcept ( + reference& operator=(basic_json other) noexcept ( std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value - ) - { - using std::swap; - swap(m_type, other.m_type); - swap(m_value, other.m_value); - return *this; - } + ) + { + // check that passed value is valid + other.assert_invariant(); + + using std::swap; + swap(m_type, other.m_type); + swap(m_value, other.m_value); + + assert_invariant(); + return *this; + } - /*! + /*! @brief destructor Destroys the JSON value and frees all allocated memory. @@ -2092,63 +2125,66 @@ class basic_json @since version 1.0.0 */ - ~basic_json() - { - switch (m_type) + ~basic_json() { - case value_t::object: - { - AllocatorType alloc; - alloc.destroy(m_value.object); - alloc.deallocate(m_value.object, 1); - break; - } + assert_invariant(); - case value_t::array: + switch (m_type) { - AllocatorType alloc; - alloc.destroy(m_value.array); - alloc.deallocate(m_value.array, 1); - break; - } + case value_t::object: + { + AllocatorType alloc; + alloc.destroy(m_value.object); + alloc.deallocate(m_value.object, 1); + break; + } - case value_t::string: - { - AllocatorType alloc; - alloc.destroy(m_value.string); - alloc.deallocate(m_value.string, 1); - break; - } + case value_t::array: + { + AllocatorType alloc; + alloc.destroy(m_value.array); + alloc.deallocate(m_value.array, 1); + break; + } - default: - { - // all other types need no specific destructor - break; + case value_t::string: + { + AllocatorType alloc; + alloc.destroy(m_value.string); + alloc.deallocate(m_value.string, 1); + break; + } + + default: + { + // all other types need no specific destructor + break; + } } } - } - /// @} + /// @} - public: - /////////////////////// - // object inspection // - /////////////////////// + public: + /////////////////////// + // object inspection // + /////////////////////// - /// @name object inspection - /// @{ + /// @name object inspection + /// Functions to inspect the type of a JSON value. + /// @{ - /*! + /*! @brief serialization Serialization function for JSON values. The function tries to mimic - Python's @p json.dumps() function, and currently supports its @p indent + Python's `json.dumps()` function, and currently supports its @a indent parameter. - @param[in] indent if indent is nonnegative, then array elements and object + @param[in] indent If indent is nonnegative, then array elements and object members will be pretty-printed with that indent level. An indent level of - 0 will only insert newlines. -1 (the default) selects the most compact - representation + `0` will only insert newlines. `-1` (the default) selects the most compact + representation. @return string containing the serialization of the JSON value @@ -2161,23 +2197,32 @@ class basic_json @since version 1.0.0 */ - string_t dump(const int indent = -1) const - { - std::stringstream ss; - - if (indent >= 0) - { - dump(ss, true, static_cast(indent)); - } - else + string_t dump(const int indent = -1) const { - dump(ss, false, 0); - } + std::stringstream ss; + // fix locale problems + const static std::locale loc(std::locale(), new DecimalSeparator); + ss.imbue(loc); - return ss.str(); - } + // 6, 15 or 16 digits of precision allows round-trip IEEE 754 + // string->float->string, string->double->string or string->long + // double->string; to be safe, we read this value from + // std::numeric_limits::digits10 + ss.precision(std::numeric_limits::digits10); + + if (indent >= 0) + { + dump(ss, true, static_cast(indent)); + } + else + { + dump(ss, false, 0); + } + + return ss.str(); + } - /*! + /*! @brief return the type of the JSON value (explicit) Return the type of the JSON value as a value from the @ref value_t @@ -2195,12 +2240,12 @@ class basic_json @since version 1.0.0 */ - constexpr value_t type() const noexcept - { - return m_type; - } + constexpr value_t type() const noexcept + { + return m_type; + } - /*! + /*! @brief return whether type is primitive This function returns true iff the JSON type is primitive (string, number, @@ -2225,12 +2270,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_primitive() const noexcept - { - return is_null() or is_string() or is_boolean() or is_number(); - } + constexpr bool is_primitive() const noexcept + { + return is_null() or is_string() or is_boolean() or is_number(); + } - /*! + /*! @brief return whether type is structured This function returns true iff the JSON type is structured (array or @@ -2252,12 +2297,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_structured() const noexcept - { - return is_array() or is_object(); - } + constexpr bool is_structured() const noexcept + { + return is_array() or is_object(); + } - /*! + /*! @brief return whether value is null This function returns true iff the JSON value is null. @@ -2274,12 +2319,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_null() const noexcept - { - return m_type == value_t::null; - } + constexpr bool is_null() const noexcept + { + return m_type == value_t::null; + } - /*! + /*! @brief return whether value is a boolean This function returns true iff the JSON value is a boolean. @@ -2296,12 +2341,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_boolean() const noexcept - { - return m_type == value_t::boolean; - } + constexpr bool is_boolean() const noexcept + { + return m_type == value_t::boolean; + } - /*! + /*! @brief return whether value is a number This function returns true iff the JSON value is a number. This includes @@ -2326,12 +2371,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_number() const noexcept - { - return is_number_integer() or is_number_float(); - } - - /*! + constexpr bool is_number() const noexcept + { + return is_number_integer() or is_number_float(); + } + + /*! @brief return whether value is an integer number This function returns true iff the JSON value is an integer or unsigned @@ -2355,12 +2400,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_number_integer() const noexcept - { - return m_type == value_t::number_integer or m_type == value_t::number_unsigned; - } + constexpr bool is_number_integer() const noexcept + { + return m_type == value_t::number_integer or m_type == value_t::number_unsigned; + } - /*! + /*! @brief return whether value is an unsigned integer number This function returns true iff the JSON value is an unsigned integer @@ -2383,12 +2428,12 @@ class basic_json @since version 2.0.0 */ - constexpr bool is_number_unsigned() const noexcept - { - return m_type == value_t::number_unsigned; - } + constexpr bool is_number_unsigned() const noexcept + { + return m_type == value_t::number_unsigned; + } - /*! + /*! @brief return whether value is a floating-point number This function returns true iff the JSON value is a floating-point number. @@ -2411,12 +2456,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_number_float() const noexcept - { - return m_type == value_t::number_float; - } + constexpr bool is_number_float() const noexcept + { + return m_type == value_t::number_float; + } - /*! + /*! @brief return whether value is an object This function returns true iff the JSON value is an object. @@ -2433,12 +2478,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_object() const noexcept - { - return m_type == value_t::object; - } + constexpr bool is_object() const noexcept + { + return m_type == value_t::object; + } - /*! + /*! @brief return whether value is an array This function returns true iff the JSON value is an array. @@ -2455,12 +2500,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_array() const noexcept - { - return m_type == value_t::array; - } + constexpr bool is_array() const noexcept + { + return m_type == value_t::array; + } - /*! + /*! @brief return whether value is a string This function returns true iff the JSON value is a string. @@ -2477,12 +2522,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_string() const noexcept - { - return m_type == value_t::string; - } + constexpr bool is_string() const noexcept + { + return m_type == value_t::string; + } - /*! + /*! @brief return whether value is discarded This function returns true iff the JSON value was discarded during parsing @@ -2504,12 +2549,12 @@ class basic_json @since version 1.0.0 */ - constexpr bool is_discarded() const noexcept - { - return m_type == value_t::discarded; - } + constexpr bool is_discarded() const noexcept + { + return m_type == value_t::discarded; + } - /*! + /*! @brief return the type of the JSON value (implicit) Implicitly return the type of the JSON value as a value from the @ref @@ -2527,280 +2572,261 @@ class basic_json @since version 1.0.0 */ - constexpr operator value_t() const noexcept - { - return m_type; - } + constexpr operator value_t() const noexcept + { + return m_type; + } - /// @} + /// @} - private: - ////////////////// - // value access // - ////////////////// + private: + ////////////////// + // value access // + ////////////////// - /// get an object (explicit) - template ::value and - std::is_convertible::value - , int>::type = 0> - T get_impl(T*) const - { - if (is_object()) + /// get an object (explicit) + template::value and + std::is_convertible::value, int>::type = 0> + T get_impl(T*) const { - assert(m_value.object != nullptr); - return T(m_value.object->begin(), m_value.object->end()); + if (is_object()) + { + return T(m_value.object->begin(), m_value.object->end()); + } + else + { + throw std::domain_error("type must be object, but is " + type_name()); + } } - else + + /// get an object (explicit) + object_t get_impl(object_t*) const { - throw std::domain_error("type must be object, but is " + type_name()); + if (is_object()) + { + return *(m_value.object); + } + else + { + throw std::domain_error("type must be object, but is " + type_name()); + } } - } - /// get an object (explicit) - object_t get_impl(object_t*) const - { - if (is_object()) + /// get an array (explicit) + template::value and + not std::is_same::value and + not std::is_arithmetic::value and + not std::is_convertible::value and + not has_mapped_type::value, int>::type = 0> + T get_impl(T*) const { - assert(m_value.object != nullptr); - return *(m_value.object); + if (is_array()) + { + T to_vector; + std::transform(m_value.array->begin(), m_value.array->end(), + std::inserter(to_vector, to_vector.end()), [](basic_json i) + { + return i.get(); + }); + return to_vector; + } + else + { + throw std::domain_error("type must be array, but is " + type_name()); + } } - else + + /// get an array (explicit) + template::value and + not std::is_same::value, int>::type = 0> + std::vector get_impl(std::vector*) const { - throw std::domain_error("type must be object, but is " + type_name()); + if (is_array()) + { + std::vector to_vector; + to_vector.reserve(m_value.array->size()); + std::transform(m_value.array->begin(), m_value.array->end(), + std::inserter(to_vector, to_vector.end()), [](basic_json i) + { + return i.get(); + }); + return to_vector; + } + else + { + throw std::domain_error("type must be array, but is " + type_name()); + } } - } - /// get an array (explicit) - template ::value and - not std::is_same::value and - not std::is_arithmetic::value and - not std::is_convertible::value and - not has_mapped_type::value - , int>::type = 0> - T get_impl(T*) const - { - if (is_array()) + /// get an array (explicit) + template::value and + not has_mapped_type::value, int>::type = 0> + T get_impl(T*) const { - T to_vector; - assert(m_value.array != nullptr); - std::transform(m_value.array->begin(), m_value.array->end(), - std::inserter(to_vector, to_vector.end()), [](basic_json i) + if (is_array()) + { + return T(m_value.array->begin(), m_value.array->end()); + } + else { - return i.get(); - }); - return to_vector; + throw std::domain_error("type must be array, but is " + type_name()); + } } - else + + /// get an array (explicit) + array_t get_impl(array_t*) const { - throw std::domain_error("type must be array, but is " + type_name()); + if (is_array()) + { + return *(m_value.array); + } + else + { + throw std::domain_error("type must be array, but is " + type_name()); + } } - } - /// get an array (explicit) - template ::value and - not std::is_same::value - , int>::type = 0> - std::vector get_impl(std::vector*) const - { - if (is_array()) + /// get a string (explicit) + template::value, int>::type = 0> + T get_impl(T*) const { - std::vector to_vector; - assert(m_value.array != nullptr); - to_vector.reserve(m_value.array->size()); - std::transform(m_value.array->begin(), m_value.array->end(), - std::inserter(to_vector, to_vector.end()), [](basic_json i) + if (is_string()) + { + return *m_value.string; + } + else { - return i.get(); - }); - return to_vector; + throw std::domain_error("type must be string, but is " + type_name()); + } } - else + + /// get a number (explicit) + template::value, int>::type = 0> + T get_impl(T*) const { - throw std::domain_error("type must be array, but is " + type_name()); + switch (m_type) + { + case value_t::number_integer: + { + return static_cast(m_value.number_integer); + } + + case value_t::number_unsigned: + { + return static_cast(m_value.number_unsigned); + } + + case value_t::number_float: + { + return static_cast(m_value.number_float); + } + + default: + { + throw std::domain_error("type must be number, but is " + type_name()); + } + } } - } - /// get an array (explicit) - template ::value and - not has_mapped_type::value - , int>::type = 0> - T get_impl(T*) const - { - if (is_array()) + /// get a boolean (explicit) + constexpr boolean_t get_impl(boolean_t*) const { - assert(m_value.array != nullptr); - return T(m_value.array->begin(), m_value.array->end()); + return is_boolean() + ? m_value.boolean + : throw std::domain_error("type must be boolean, but is " + type_name()); } - else + + /// get a pointer to the value (object) + object_t* get_impl_ptr(object_t*) noexcept { - throw std::domain_error("type must be array, but is " + type_name()); + return is_object() ? m_value.object : nullptr; } - } - /// get an array (explicit) - array_t get_impl(array_t*) const - { - if (is_array()) + /// get a pointer to the value (object) + constexpr const object_t* get_impl_ptr(const object_t*) const noexcept { - assert(m_value.array != nullptr); - return *(m_value.array); + return is_object() ? m_value.object : nullptr; } - else + + /// get a pointer to the value (array) + array_t* get_impl_ptr(array_t*) noexcept { - throw std::domain_error("type must be array, but is " + type_name()); + return is_array() ? m_value.array : nullptr; } - } - /// get a string (explicit) - template ::value - , int>::type = 0> - T get_impl(T*) const - { - if (is_string()) + /// get a pointer to the value (array) + constexpr const array_t* get_impl_ptr(const array_t*) const noexcept { - assert(m_value.string != nullptr); - return *m_value.string; + return is_array() ? m_value.array : nullptr; } - else + + /// get a pointer to the value (string) + string_t* get_impl_ptr(string_t*) noexcept { - throw std::domain_error("type must be string, but is " + type_name()); + return is_string() ? m_value.string : nullptr; } - } - /// get a number (explicit) - template::value - , int>::type = 0> - T get_impl(T*) const - { - switch (m_type) + /// get a pointer to the value (string) + constexpr const string_t* get_impl_ptr(const string_t*) const noexcept { - case value_t::number_integer: - { - return static_cast(m_value.number_integer); - } - - case value_t::number_unsigned: - { - return static_cast(m_value.number_unsigned); - } - - case value_t::number_float: - { - return static_cast(m_value.number_float); - } - - default: - { - throw std::domain_error("type must be number, but is " + type_name()); - } + return is_string() ? m_value.string : nullptr; } - } - - /// get a boolean (explicit) - constexpr boolean_t get_impl(boolean_t*) const - { - return is_boolean() - ? m_value.boolean - : throw std::domain_error("type must be boolean, but is " + type_name()); - } - - /// get a pointer to the value (object) - object_t* get_impl_ptr(object_t*) noexcept - { - return is_object() ? m_value.object : nullptr; - } - - /// get a pointer to the value (object) - constexpr const object_t* get_impl_ptr(const object_t*) const noexcept - { - return is_object() ? m_value.object : nullptr; - } - - /// get a pointer to the value (array) - array_t* get_impl_ptr(array_t*) noexcept - { - return is_array() ? m_value.array : nullptr; - } - - /// get a pointer to the value (array) - constexpr const array_t* get_impl_ptr(const array_t*) const noexcept - { - return is_array() ? m_value.array : nullptr; - } - - /// get a pointer to the value (string) - string_t* get_impl_ptr(string_t*) noexcept - { - return is_string() ? m_value.string : nullptr; - } - - /// get a pointer to the value (string) - constexpr const string_t* get_impl_ptr(const string_t*) const noexcept - { - return is_string() ? m_value.string : nullptr; - } - /// get a pointer to the value (boolean) - boolean_t* get_impl_ptr(boolean_t*) noexcept - { - return is_boolean() ? &m_value.boolean : nullptr; - } + /// get a pointer to the value (boolean) + boolean_t* get_impl_ptr(boolean_t*) noexcept + { + return is_boolean() ? &m_value.boolean : nullptr; + } - /// get a pointer to the value (boolean) - constexpr const boolean_t* get_impl_ptr(const boolean_t*) const noexcept - { - return is_boolean() ? &m_value.boolean : nullptr; - } + /// get a pointer to the value (boolean) + constexpr const boolean_t* get_impl_ptr(const boolean_t*) const noexcept + { + return is_boolean() ? &m_value.boolean : nullptr; + } - /// get a pointer to the value (integer number) - number_integer_t* get_impl_ptr(number_integer_t*) noexcept - { - return is_number_integer() ? &m_value.number_integer : nullptr; - } + /// get a pointer to the value (integer number) + number_integer_t* get_impl_ptr(number_integer_t*) noexcept + { + return is_number_integer() ? &m_value.number_integer : nullptr; + } - /// get a pointer to the value (integer number) - constexpr const number_integer_t* get_impl_ptr(const number_integer_t*) const noexcept - { - return is_number_integer() ? &m_value.number_integer : nullptr; - } + /// get a pointer to the value (integer number) + constexpr const number_integer_t* get_impl_ptr(const number_integer_t*) const noexcept + { + return is_number_integer() ? &m_value.number_integer : nullptr; + } - /// get a pointer to the value (unsigned number) - number_unsigned_t* get_impl_ptr(number_unsigned_t*) noexcept - { - return is_number_unsigned() ? &m_value.number_unsigned : nullptr; - } + /// get a pointer to the value (unsigned number) + number_unsigned_t* get_impl_ptr(number_unsigned_t*) noexcept + { + return is_number_unsigned() ? &m_value.number_unsigned : nullptr; + } - /// get a pointer to the value (unsigned number) - constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t*) const noexcept - { - return is_number_unsigned() ? &m_value.number_unsigned : nullptr; - } + /// get a pointer to the value (unsigned number) + constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t*) const noexcept + { + return is_number_unsigned() ? &m_value.number_unsigned : nullptr; + } - /// get a pointer to the value (floating-point number) - number_float_t* get_impl_ptr(number_float_t*) noexcept - { - return is_number_float() ? &m_value.number_float : nullptr; - } + /// get a pointer to the value (floating-point number) + number_float_t* get_impl_ptr(number_float_t*) noexcept + { + return is_number_float() ? &m_value.number_float : nullptr; + } - /// get a pointer to the value (floating-point number) - constexpr const number_float_t* get_impl_ptr(const number_float_t*) const noexcept - { - return is_number_float() ? &m_value.number_float : nullptr; - } + /// get a pointer to the value (floating-point number) + constexpr const number_float_t* get_impl_ptr(const number_float_t*) const noexcept + { + return is_number_float() ? &m_value.number_float : nullptr; + } - /*! + /*! @brief helper function to implement get_ref() This funcion helps to implement get_ref() without code duplication for @@ -2811,30 +2837,33 @@ class basic_json @throw std::domain_error if ReferenceType does not match underlying value type of the current JSON */ - template - static ReferenceType get_ref_impl(ThisType& obj) - { - // delegate the call to get_ptr<>() - using PointerType = typename std::add_pointer::type; - auto ptr = obj.template get_ptr(); - - if (ptr != nullptr) - { - return *ptr; - } - else + template + static ReferenceType get_ref_impl(ThisType& obj) { - throw std::domain_error("incompatible ReferenceType for get_ref, actual type is " + - obj.type_name()); + // helper type + using PointerType = typename std::add_pointer::type; + + // delegate the call to get_ptr<>() + auto ptr = obj.template get_ptr(); + + if (ptr != nullptr) + { + return *ptr; + } + else + { + throw std::domain_error("incompatible ReferenceType for get_ref, actual type is " + + obj.type_name()); + } } - } - public: + public: - /// @name value access - /// @{ + /// @name value access + /// Direct access to the stored value of a JSON value. + /// @{ - /*! + /*! @brief get a value (explicit) Explicit type conversion between the JSON value and a compatible value. @@ -2867,22 +2896,21 @@ class basic_json @since version 1.0.0 */ - template::value - , int>::type = 0> - ValueType get() const - { - return get_impl(static_cast(nullptr)); - } + template::value, int>::type = 0> + ValueType get() const + { + return get_impl(static_cast(nullptr)); + } - /*! + /*! @brief get a pointer value (explicit) Explicit pointer access to the internally stored JSON value. No copies are made. - @warning The pointer becomes invalid if the underlying JSON object changes. + @warning The pointer becomes invalid if the underlying JSON object + changes. @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, @@ -2902,31 +2930,27 @@ class basic_json @since version 1.0.0 */ - template::value - , int>::type = 0> - PointerType get() noexcept - { - // delegate the call to get_ptr - return get_ptr(); - } + template::value, int>::type = 0> + PointerType get() noexcept + { + // delegate the call to get_ptr + return get_ptr(); + } - /*! + /*! @brief get a pointer value (explicit) @copydoc get() */ - template::value - , int>::type = 0> - constexpr const PointerType get() const noexcept - { - // delegate the call to get_ptr - return get_ptr(); - } + template::value, int>::type = 0> + constexpr const PointerType get() const noexcept + { + // delegate the call to get_ptr + return get_ptr(); + } - /*! + /*! @brief get a pointer value (implicit) Implicit pointer access to the internally stored JSON value. No copies are @@ -2937,7 +2961,8 @@ class basic_json @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, - @ref number_unsigned_t, or @ref number_float_t. + @ref number_unsigned_t, or @ref number_float_t. Enforced by a static + assertion. @return pointer to the internally stored JSON value if the requested pointer type @a PointerType fits to the JSON value; `nullptr` otherwise @@ -2951,32 +2976,58 @@ class basic_json @since version 1.0.0 */ - template::value - , int>::type = 0> - PointerType get_ptr() noexcept - { - // delegate the call to get_impl_ptr<>() - return get_impl_ptr(static_cast(nullptr)); - } + template::value, int>::type = 0> + PointerType get_ptr() noexcept + { + // get the type of the PointerType (remove pointer and const) + using pointee_t = typename std::remove_const::type>::type>::type; + // make sure the type matches the allowed types + static_assert( + std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + , "incompatible pointer type"); + + // delegate the call to get_impl_ptr<>() + return get_impl_ptr(static_cast(nullptr)); + } - /*! + /*! @brief get a pointer value (implicit) @copydoc get_ptr() */ - template::value - and std::is_const::type>::value - , int>::type = 0> - constexpr const PointerType get_ptr() const noexcept - { - // delegate the call to get_impl_ptr<>() const - return get_impl_ptr(static_cast(nullptr)); - } + template::value and + std::is_const::type>::value, int>::type = 0> + constexpr const PointerType get_ptr() const noexcept + { + // get the type of the PointerType (remove pointer and const) + using pointee_t = typename std::remove_const::type>::type>::type; + // make sure the type matches the allowed types + static_assert( + std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + , "incompatible pointer type"); + + // delegate the call to get_impl_ptr<>() const + return get_impl_ptr(static_cast(nullptr)); + } - /*! + /*! @brief get a reference value (implicit) Implict reference access to the internally stored JSON value. No copies @@ -2987,7 +3038,7 @@ class basic_json @tparam ReferenceType reference type; must be a reference to @ref array_t, @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or - @ref number_float_t. + @ref number_float_t. Enforced by static assertion. @return reference to the internally stored JSON value if the requested reference type @a ReferenceType fits to the JSON value; throws @@ -3002,32 +3053,28 @@ class basic_json @since version 1.1.0 */ - template::value - , int>::type = 0> - ReferenceType get_ref() - { - // delegate call to get_ref_impl - return get_ref_impl(*this); - } + template::value, int>::type = 0> + ReferenceType get_ref() + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } - /*! + /*! @brief get a reference value (implicit) @copydoc get_ref() */ - template::value - and std::is_const::type>::value - , int>::type = 0> - ReferenceType get_ref() const - { - // delegate call to get_ref_impl - return get_ref_impl(*this); - } + template::value and + std::is_const::type>::value, int>::type = 0> + ReferenceType get_ref() const + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } - /*! + /*! @brief get a value (implicit) Implicit type conversion between the JSON value and a compatible value. @@ -3055,31 +3102,31 @@ class basic_json @since version 1.0.0 */ - template < typename ValueType, typename - std::enable_if < - not std::is_pointer::value - and not std::is_same::value -#ifndef _MSC_VER // Fix for issue #167 operator<< abiguity under VS2015 - and not std::is_same>::value + template < typename ValueType, typename std::enable_if < + not std::is_pointer::value and + not std::is_same::value + #ifndef _MSC_VER // Fix for issue #167 operator<< abiguity under VS2015 + and not std::is_same>::value #endif - , int >::type = 0 > - operator ValueType() const - { - // delegate the call to get<>() const - return get(); - } + , int >::type = 0 > + operator ValueType() const + { + // delegate the call to get<>() const + return get(); + } - /// @} + /// @} - //////////////////// - // element access // - //////////////////// + //////////////////// + // element access // + //////////////////// - /// @name element access - /// @{ + /// @name element access + /// Access to the JSON value. + /// @{ - /*! + /*! @brief access specified array element with bounds checking Returns a reference to the element at specified location @a idx, with @@ -3101,29 +3148,28 @@ class basic_json @since version 1.0.0 */ - reference at(size_type idx) - { - // at only works for arrays - if (is_array()) + reference at(size_type idx) { - try + // at only works for arrays + if (is_array()) { - assert(m_value.array != nullptr); - return m_value.array->at(idx); + try + { + return m_value.array->at(idx); + } + catch (std::out_of_range&) + { + // create better exception explanation + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + } } - catch (std::out_of_range&) + else { - // create better exception explanation - throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + throw std::domain_error("cannot use at() with " + type_name()); } } - else - { - throw std::domain_error("cannot use at() with " + type_name()); - } - } - /*! + /*! @brief access specified array element with bounds checking Returns a const reference to the element at specified location @a idx, @@ -3145,29 +3191,28 @@ class basic_json @since version 1.0.0 */ - const_reference at(size_type idx) const - { - // at only works for arrays - if (is_array()) + const_reference at(size_type idx) const { - try + // at only works for arrays + if (is_array()) { - assert(m_value.array != nullptr); - return m_value.array->at(idx); + try + { + return m_value.array->at(idx); + } + catch (std::out_of_range&) + { + // create better exception explanation + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + } } - catch (std::out_of_range&) + else { - // create better exception explanation - throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + throw std::domain_error("cannot use at() with " + type_name()); } } - else - { - throw std::domain_error("cannot use at() with " + type_name()); - } - } - /*! + /*! @brief access specified object element with bounds checking Returns a reference to the element at with specified key @a key, with @@ -3193,29 +3238,28 @@ class basic_json @since version 1.0.0 */ - reference at(const typename object_t::key_type& key) - { - // at only works for objects - if (is_object()) + reference at(const typename object_t::key_type& key) { - try - { - assert(m_value.object != nullptr); - return m_value.object->at(key); - } - catch (std::out_of_range&) + // at only works for objects + if (is_object()) { - // create better exception explanation - throw std::out_of_range("key '" + key + "' not found"); + try + { + return m_value.object->at(key); + } + catch (std::out_of_range&) + { + // create better exception explanation + throw std::out_of_range("key '" + key + "' not found"); + } + } + else + { + throw std::domain_error("cannot use at() with " + type_name()); } } - else - { - throw std::domain_error("cannot use at() with " + type_name()); - } - } - /*! + /*! @brief access specified object element with bounds checking Returns a const reference to the element at with specified key @a key, @@ -3241,29 +3285,28 @@ class basic_json @since version 1.0.0 */ - const_reference at(const typename object_t::key_type& key) const - { - // at only works for objects - if (is_object()) + const_reference at(const typename object_t::key_type& key) const { - try + // at only works for objects + if (is_object()) { - assert(m_value.object != nullptr); - return m_value.object->at(key); + try + { + return m_value.object->at(key); + } + catch (std::out_of_range&) + { + // create better exception explanation + throw std::out_of_range("key '" + key + "' not found"); + } } - catch (std::out_of_range&) + else { - // create better exception explanation - throw std::out_of_range("key '" + key + "' not found"); + throw std::domain_error("cannot use at() with " + type_name()); } } - else - { - throw std::domain_error("cannot use at() with " + type_name()); - } - } - /*! + /*! @brief access specified array element Returns a reference to the element at specified location @a idx. @@ -3288,34 +3331,36 @@ class basic_json @since version 1.0.0 */ - reference operator[](size_type idx) - { - // implicitly convert null value to an empty array - if (is_null()) - { - m_type = value_t::array; - m_value.array = create(); - } - - // operator[] only works for arrays - if (is_array()) + reference operator[](size_type idx) { - // fill up array with null values until given idx is reached - assert(m_value.array != nullptr); - for (size_t i = m_value.array->size(); i <= idx; ++i) + // implicitly convert null value to an empty array + if (is_null()) { - m_value.array->push_back(basic_json()); + m_type = value_t::array; + m_value.array = create(); + assert_invariant(); } - return m_value.array->operator[](idx); - } - else - { - throw std::domain_error("cannot use operator[] with " + type_name()); + // operator[] only works for arrays + if (is_array()) + { + // fill up array with null values if given idx is outside range + if (idx >= m_value.array->size()) + { + m_value.array->insert(m_value.array->end(), + idx - m_value.array->size() + 1, + basic_json()); + } + + return m_value.array->operator[](idx); + } + else + { + throw std::domain_error("cannot use operator[] with " + type_name()); + } } - } - /*! + /*! @brief access specified array element Returns a const reference to the element at specified location @a idx. @@ -3334,21 +3379,20 @@ class basic_json @since version 1.0.0 */ - const_reference operator[](size_type idx) const - { - // const operator[] only works for arrays - if (is_array()) - { - assert(m_value.array != nullptr); - return m_value.array->operator[](idx); - } - else + const_reference operator[](size_type idx) const { - throw std::domain_error("cannot use operator[] with " + type_name()); + // const operator[] only works for arrays + if (is_array()) + { + return m_value.array->operator[](idx); + } + else + { + throw std::domain_error("cannot use operator[] with " + type_name()); + } } - } - /*! + /*! @brief access specified object element Returns a reference to the element at with specified key @a key. @@ -3375,28 +3419,28 @@ class basic_json @since version 1.0.0 */ - reference operator[](const typename object_t::key_type& key) - { - // implicitly convert null value to an empty object - if (is_null()) + reference operator[](const typename object_t::key_type& key) { - m_type = value_t::object; - m_value.object = create(); - } + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } - // operator[] only works for objects - if (is_object()) - { - assert(m_value.object != nullptr); - return m_value.object->operator[](key); - } - else - { - throw std::domain_error("cannot use operator[] with " + type_name()); + // operator[] only works for objects + if (is_object()) + { + return m_value.object->operator[](key); + } + else + { + throw std::domain_error("cannot use operator[] with " + type_name()); + } } - } - /*! + /*! @brief read-only access specified object element Returns a const reference to the element at with specified key @a key. No @@ -3409,6 +3453,9 @@ class basic_json @return const reference to the element at key @a key + @pre The element with key @a key must exist. **This precondition is + enforced with an assertion.** + @throw std::domain_error if JSON is not an object; example: `"cannot use operator[] with null"` @@ -3423,22 +3470,21 @@ class basic_json @since version 1.0.0 */ - const_reference operator[](const typename object_t::key_type& key) const - { - // const operator[] only works for objects - if (is_object()) - { - assert(m_value.object != nullptr); - assert(m_value.object->find(key) != m_value.object->end()); - return m_value.object->find(key)->second; - } - else + const_reference operator[](const typename object_t::key_type& key) const { - throw std::domain_error("cannot use operator[] with " + type_name()); + // const operator[] only works for objects + if (is_object()) + { + assert(m_value.object->find(key) != m_value.object->end()); + return m_value.object->find(key)->second; + } + else + { + throw std::domain_error("cannot use operator[] with " + type_name()); + } } - } - /*! + /*! @brief access specified object element Returns a reference to the element at with specified key @a key. @@ -3465,13 +3511,13 @@ class basic_json @since version 1.0.0 */ - template - reference operator[](T * (&key)[n]) - { - return operator[](static_cast(key)); - } + template + reference operator[](T * (&key)[n]) + { + return operator[](static_cast(key)); + } - /*! + /*! @brief read-only access specified object element Returns a const reference to the element at with specified key @a key. No @@ -3500,13 +3546,13 @@ class basic_json @since version 1.0.0 */ - template - const_reference operator[](T * (&key)[n]) const - { - return operator[](static_cast(key)); - } + template + const_reference operator[](T * (&key)[n]) const + { + return operator[](static_cast(key)); + } - /*! + /*! @brief access specified object element Returns a reference to the element at with specified key @a key. @@ -3533,29 +3579,29 @@ class basic_json @since version 1.1.0 */ - template - reference operator[](T* key) - { - // implicitly convert null to object - if (is_null()) + template + reference operator[](T* key) { - m_type = value_t::object; - m_value = value_t::object; - } + // implicitly convert null to object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } - // at only works for objects - if (is_object()) - { - assert(m_value.object != nullptr); - return m_value.object->operator[](key); - } - else - { - throw std::domain_error("cannot use operator[] with " + type_name()); + // at only works for objects + if (is_object()) + { + return m_value.object->operator[](key); + } + else + { + throw std::domain_error("cannot use operator[] with " + type_name()); + } } - } - /*! + /*! @brief read-only access specified object element Returns a const reference to the element at with specified key @a key. No @@ -3568,6 +3614,9 @@ class basic_json @return const reference to the element at key @a key + @pre The element with key @a key must exist. **This precondition is + enforced with an assertion.** + @throw std::domain_error if JSON is not an object; example: `"cannot use operator[] with null"` @@ -3582,27 +3631,26 @@ class basic_json @since version 1.1.0 */ - template - const_reference operator[](T* key) const - { - // at only works for objects - if (is_object()) - { - assert(m_value.object != nullptr); - assert(m_value.object->find(key) != m_value.object->end()); - return m_value.object->find(key)->second; - } - else + template + const_reference operator[](T* key) const { - throw std::domain_error("cannot use operator[] with " + type_name()); + // at only works for objects + if (is_object()) + { + assert(m_value.object->find(key) != m_value.object->end()); + return m_value.object->find(key)->second; + } + else + { + throw std::domain_error("cannot use operator[] with " + type_name()); + } } - } - /*! + /*! @brief access specified object element with default value - Returns either a copy of an object's element at the specified key @a key or - a given default value if no element with key @a key exists. + Returns either a copy of an object's element at the specified key @a key + or a given default value if no element with key @a key exists. The function is basically equivalent to executing @code {.cpp} @@ -3646,42 +3694,113 @@ class basic_json @since version 1.0.0 */ - template ::value - , int>::type = 0> - ValueType value(const typename object_t::key_type& key, ValueType default_value) const - { - // at only works for objects - if (is_object()) + template::value, int>::type = 0> + ValueType value(const typename object_t::key_type& key, ValueType default_value) const { - // if key is found, return value and given default value otherwise - const auto it = find(key); - if (it != end()) + // at only works for objects + if (is_object()) { - return *it; + // if key is found, return value and given default value otherwise + const auto it = find(key); + if (it != end()) + { + return *it; + } + else + { + return default_value; + } } else { - return default_value; + throw std::domain_error("cannot use value() with " + type_name()); } } - else + + /*! + @brief overload for a default value of type const char* + @copydoc basic_json::value(const typename object_t::key_type&, ValueType) const + */ + string_t value(const typename object_t::key_type& key, const char* default_value) const { - throw std::domain_error("cannot use value() with " + type_name()); + return value(key, string_t(default_value)); } + + /*! + @brief access specified object element via JSON Pointer with default value + + Returns either a copy of an object's element at the specified key @a key + or a given default value if no element with key @a key exists. + + The function is basically equivalent to executing + @code {.cpp} + try { + return at(ptr); + } catch(std::out_of_range) { + return default_value; } + @endcode + + @note Unlike @ref at(const json_pointer&), this function does not throw + if the given key @a key was not found. - /*! + @param[in] ptr a JSON pointer to the element to access + @param[in] default_value the value to return if @a ptr found no value + + @tparam ValueType type compatible to JSON values, for instance `int` for + JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for + JSON arrays. Note the type of the expected value at @a key and the default + value @a default_value must be compatible. + + @return copy of the element at key @a key or @a default_value if @a key + is not found + + @throw std::domain_error if JSON is not an object; example: `"cannot use + value() with null"` + + @complexity Logarithmic in the size of the container. + + @liveexample{The example below shows how object elements can be queried + with a default value.,basic_json__value_ptr} + + @sa @ref operator[](const json_pointer&) for unchecked access by reference + + @since version 2.0.2 + */ + template::value, int>::type = 0> + ValueType value(const json_pointer& ptr, ValueType default_value) const + { + // at only works for objects + if (is_object()) + { + // if pointer resolves a value, return it or use default value + try + { + return ptr.get_checked(this); + } + catch (std::out_of_range&) + { + return default_value; + } + } + else + { + throw std::domain_error("cannot use value() with " + type_name()); + } + } + + /*! @brief overload for a default value of type const char* - @copydoc basic_json::value() + @copydoc basic_json::value(const json_pointer&, ValueType) const */ - string_t value(const typename object_t::key_type& key, const char* default_value) const - { - return value(key, string_t(default_value)); - } + string_t value(const json_pointer& ptr, const char* default_value) const + { + return value(ptr, string_t(default_value)); + } - /*! + /*! @brief access the first element Returns a reference to the first element in the container. For a JSON @@ -3694,7 +3813,8 @@ class basic_json @complexity Constant. @pre The JSON value must not be `null` (would throw `std::out_of_range`) - or an empty array or object (undefined behavior, guarded by assertions). + or an empty array or object (undefined behavior, **guarded by + assertions**). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value @@ -3705,20 +3825,20 @@ class basic_json @since version 1.0.0 */ - reference front() - { - return *begin(); - } + reference front() + { + return *begin(); + } - /*! + /*! @copydoc basic_json::front() */ - const_reference front() const - { - return *cbegin(); - } + const_reference front() const + { + return *cbegin(); + } - /*! + /*! @brief access the last element Returns a reference to the last element in the container. For a JSON @@ -3736,7 +3856,8 @@ class basic_json @complexity Constant. @pre The JSON value must not be `null` (would throw `std::out_of_range`) - or an empty array or object (undefined behavior, guarded by assertions). + or an empty array or object (undefined behavior, **guarded by + assertions**). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value. @@ -3747,24 +3868,24 @@ class basic_json @since version 1.0.0 */ - reference back() - { - auto tmp = end(); - --tmp; - return *tmp; - } + reference back() + { + auto tmp = end(); + --tmp; + return *tmp; + } - /*! + /*! @copydoc basic_json::back() */ - const_reference back() const - { - auto tmp = cend(); - --tmp; - return *tmp; - } + const_reference back() const + { + auto tmp = cend(); + --tmp; + return *tmp; + } - /*! + /*! @brief remove element given an iterator Removes the element specified by iterator @a pos. The iterator @a pos must @@ -3778,7 +3899,7 @@ class basic_json @return Iterator following the last removed element. If the iterator @a pos refers to the last element, the `end()` iterator is returned. - @tparam InteratorType an @ref iterator or @ref const_iterator + @tparam IteratorType an @ref iterator or @ref const_iterator @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. @@ -3800,7 +3921,7 @@ class basic_json @liveexample{The example shows the result of `erase()` for different JSON types.,erase__IteratorType} - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + @sa @ref erase(IteratorType, IteratorType) -- removes the elements in the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @@ -3809,69 +3930,68 @@ class basic_json @since version 1.0.0 */ - template ::value or - std::is_same::value - , int>::type - = 0> - InteratorType erase(InteratorType pos) - { - // make sure iterator fits the current value - if (this != pos.m_object) + template::value or + std::is_same::value, int>::type + = 0> + IteratorType erase(IteratorType pos) { - throw std::domain_error("iterator does not fit current value"); - } + // make sure iterator fits the current value + if (this != pos.m_object) + { + throw std::domain_error("iterator does not fit current value"); + } - InteratorType result = end(); + IteratorType result = end(); - switch (m_type) - { - case value_t::boolean: - case value_t::number_float: - case value_t::number_integer: - case value_t::number_unsigned: - case value_t::string: + switch (m_type) { - if (not pos.m_it.primitive_iterator.is_begin()) + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: { - throw std::out_of_range("iterator out of range"); + if (not pos.m_it.primitive_iterator.is_begin()) + { + throw std::out_of_range("iterator out of range"); + } + + if (is_string()) + { + AllocatorType alloc; + alloc.destroy(m_value.string); + alloc.deallocate(m_value.string, 1); + m_value.string = nullptr; + } + + m_type = value_t::null; + assert_invariant(); + break; } - if (is_string()) + case value_t::object: { - delete m_value.string; - m_value.string = nullptr; + result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator); + break; } - m_type = value_t::null; - break; - } - - case value_t::object: - { - assert(m_value.object != nullptr); - result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator); - break; - } + case value_t::array: + { + result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator); + break; + } - case value_t::array: - { - assert(m_value.array != nullptr); - result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator); - break; + default: + { + throw std::domain_error("cannot use erase() with " + type_name()); + } } - default: - { - throw std::domain_error("cannot use erase() with " + type_name()); - } + return result; } - return result; - } - - /*! + /*! @brief remove elements given an iterator range Removes the element specified by the range `[first; last)`. The iterator @@ -3886,7 +4006,7 @@ class basic_json @return Iterator following the last removed element. If the iterator @a second refers to the last element, the `end()` iterator is returned. - @tparam InteratorType an @ref iterator or @ref const_iterator + @tparam IteratorType an @ref iterator or @ref const_iterator @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. @@ -3909,7 +4029,7 @@ class basic_json @liveexample{The example shows the result of `erase()` for different JSON types.,erase__IteratorType_IteratorType} - @sa @ref erase(InteratorType) -- removes the element at a given position + @sa @ref erase(IteratorType) -- removes the element at a given position @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @sa @ref erase(const size_type) -- removes the element from an array at @@ -3917,71 +4037,70 @@ class basic_json @since version 1.0.0 */ - template ::value or - std::is_same::value - , int>::type - = 0> - InteratorType erase(InteratorType first, InteratorType last) - { - // make sure iterator fits the current value - if (this != first.m_object or this != last.m_object) + template::value or + std::is_same::value, int>::type + = 0> + IteratorType erase(IteratorType first, IteratorType last) { - throw std::domain_error("iterators do not fit current value"); - } + // make sure iterator fits the current value + if (this != first.m_object or this != last.m_object) + { + throw std::domain_error("iterators do not fit current value"); + } - InteratorType result = end(); + IteratorType result = end(); - switch (m_type) - { - case value_t::boolean: - case value_t::number_float: - case value_t::number_integer: - case value_t::number_unsigned: - case value_t::string: + switch (m_type) { - if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end()) + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: { - throw std::out_of_range("iterators out of range"); + if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end()) + { + throw std::out_of_range("iterators out of range"); + } + + if (is_string()) + { + AllocatorType alloc; + alloc.destroy(m_value.string); + alloc.deallocate(m_value.string, 1); + m_value.string = nullptr; + } + + m_type = value_t::null; + assert_invariant(); + break; } - if (is_string()) + case value_t::object: { - delete m_value.string; - m_value.string = nullptr; + result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator, + last.m_it.object_iterator); + break; } - m_type = value_t::null; - break; - } - - case value_t::object: - { - assert(m_value.object != nullptr); - result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator, - last.m_it.object_iterator); - break; - } + case value_t::array: + { + result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } - case value_t::array: - { - assert(m_value.array != nullptr); - result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator, - last.m_it.array_iterator); - break; + default: + { + throw std::domain_error("cannot use erase() with " + type_name()); + } } - default: - { - throw std::domain_error("cannot use erase() with " + type_name()); - } + return result; } - return result; - } - - /*! + /*! @brief remove element from a JSON object given a key Removes elements from a JSON object with the key value @a key. @@ -4002,29 +4121,28 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__key_type} - @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + @sa @ref erase(IteratorType) -- removes the element at a given position + @sa @ref erase(IteratorType, IteratorType) -- removes the elements in the given range @sa @ref erase(const size_type) -- removes the element from an array at the given index @since version 1.0.0 */ - size_type erase(const typename object_t::key_type& key) - { - // this erase only works for objects - if (is_object()) + size_type erase(const typename object_t::key_type& key) { - assert(m_value.object != nullptr); - return m_value.object->erase(key); - } - else - { - throw std::domain_error("cannot use erase() with " + type_name()); + // this erase only works for objects + if (is_object()) + { + return m_value.object->erase(key); + } + else + { + throw std::domain_error("cannot use erase() with " + type_name()); + } } - } - /*! + /*! @brief remove element from a JSON array given an index Removes element from a JSON array at the index @a idx. @@ -4040,44 +4158,43 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__size_type} - @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + @sa @ref erase(IteratorType) -- removes the element at a given position + @sa @ref erase(IteratorType, IteratorType) -- removes the elements in the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @since version 1.0.0 */ - void erase(const size_type idx) - { - // this erase only works for arrays - if (is_array()) + void erase(const size_type idx) { - if (idx >= size()) + // this erase only works for arrays + if (is_array()) { - throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); - } + if (idx >= size()) + { + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + } - assert(m_value.array != nullptr); - m_value.array->erase(m_value.array->begin() + static_cast(idx)); - } - else - { - throw std::domain_error("cannot use erase() with " + type_name()); + m_value.array->erase(m_value.array->begin() + static_cast(idx)); + } + else + { + throw std::domain_error("cannot use erase() with " + type_name()); + } } - } - /// @} + /// @} - //////////// - // lookup // - //////////// + //////////// + // lookup // + //////////// - /// @name lookup - /// @{ + /// @name lookup + /// @{ - /*! + /*! @brief find an element in a JSON object Finds an element in a JSON object with key equivalent to @a key. If the @@ -4095,37 +4212,35 @@ class basic_json @since version 1.0.0 */ - iterator find(typename object_t::key_type key) - { - auto result = end(); - - if (is_object()) + iterator find(typename object_t::key_type key) { - assert(m_value.object != nullptr); - result.m_it.object_iterator = m_value.object->find(key); - } + auto result = end(); - return result; - } + if (is_object()) + { + result.m_it.object_iterator = m_value.object->find(key); + } + + return result; + } - /*! + /*! @brief find an element in a JSON object @copydoc find(typename object_t::key_type) */ - const_iterator find(typename object_t::key_type key) const - { - auto result = cend(); - - if (is_object()) + const_iterator find(typename object_t::key_type key) const { - assert(m_value.object != nullptr); - result.m_it.object_iterator = m_value.object->find(key); - } + auto result = cend(); - return result; - } + if (is_object()) + { + result.m_it.object_iterator = m_value.object->find(key); + } + + return result; + } - /*! + /*! @brief returns the number of occurrences of a key in a JSON object Returns the number of elements with key @a key. If ObjectType is the @@ -4143,24 +4258,23 @@ class basic_json @since version 1.0.0 */ - size_type count(typename object_t::key_type key) const - { - // return 0 for all nonobject types - assert(not is_object() or m_value.object != nullptr); - return is_object() ? m_value.object->count(key) : 0; - } + size_type count(typename object_t::key_type key) const + { + // return 0 for all nonobject types + return is_object() ? m_value.object->count(key) : 0; + } - /// @} + /// @} - /////////////// - // iterators // - /////////////// + /////////////// + // iterators // + /////////////// - /// @name iterators - /// @{ + /// @name iterators + /// @{ - /*! + /*! @brief returns an iterator to the first element Returns an iterator to the first element. @@ -4184,22 +4298,22 @@ class basic_json @since version 1.0.0 */ - iterator begin() noexcept - { - iterator result(this); - result.set_begin(); - return result; - } + iterator begin() noexcept + { + iterator result(this); + result.set_begin(); + return result; + } - /*! + /*! @copydoc basic_json::cbegin() */ - const_iterator begin() const noexcept - { - return cbegin(); - } + const_iterator begin() const noexcept + { + return cbegin(); + } - /*! + /*! @brief returns a const iterator to the first element Returns a const iterator to the first element. @@ -4224,14 +4338,14 @@ class basic_json @since version 1.0.0 */ - const_iterator cbegin() const noexcept - { - const_iterator result(this); - result.set_begin(); - return result; - } + const_iterator cbegin() const noexcept + { + const_iterator result(this); + result.set_begin(); + return result; + } - /*! + /*! @brief returns an iterator to one past the last element Returns an iterator to one past the last element. @@ -4255,22 +4369,22 @@ class basic_json @since version 1.0.0 */ - iterator end() noexcept - { - iterator result(this); - result.set_end(); - return result; - } + iterator end() noexcept + { + iterator result(this); + result.set_end(); + return result; + } - /*! + /*! @copydoc basic_json::cend() */ - const_iterator end() const noexcept - { - return cend(); - } + const_iterator end() const noexcept + { + return cend(); + } - /*! + /*! @brief returns a const iterator to one past the last element Returns a const iterator to one past the last element. @@ -4295,14 +4409,14 @@ class basic_json @since version 1.0.0 */ - const_iterator cend() const noexcept - { - const_iterator result(this); - result.set_end(); - return result; - } + const_iterator cend() const noexcept + { + const_iterator result(this); + result.set_end(); + return result; + } - /*! + /*! @brief returns an iterator to the reverse-beginning Returns an iterator to the reverse-beginning; that is, the last element. @@ -4325,20 +4439,20 @@ class basic_json @since version 1.0.0 */ - reverse_iterator rbegin() noexcept - { - return reverse_iterator(end()); - } + reverse_iterator rbegin() noexcept + { + return reverse_iterator(end()); + } - /*! + /*! @copydoc basic_json::crbegin() */ - const_reverse_iterator rbegin() const noexcept - { - return crbegin(); - } + const_reverse_iterator rbegin() const noexcept + { + return crbegin(); + } - /*! + /*! @brief returns an iterator to the reverse-end Returns an iterator to the reverse-end; that is, one before the first @@ -4362,20 +4476,20 @@ class basic_json @since version 1.0.0 */ - reverse_iterator rend() noexcept - { - return reverse_iterator(begin()); - } + reverse_iterator rend() noexcept + { + return reverse_iterator(begin()); + } - /*! + /*! @copydoc basic_json::crend() */ - const_reverse_iterator rend() const noexcept - { - return crend(); - } + const_reverse_iterator rend() const noexcept + { + return crend(); + } - /*! + /*! @brief returns a const reverse iterator to the last element Returns a const iterator to the reverse-beginning; that is, the last @@ -4399,12 +4513,12 @@ class basic_json @since version 1.0.0 */ - const_reverse_iterator crbegin() const noexcept - { - return const_reverse_iterator(cend()); - } + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(cend()); + } - /*! + /*! @brief returns a const reverse iterator to one before the first Returns a const reverse iterator to the reverse-end; that is, one before @@ -4428,17 +4542,17 @@ class basic_json @since version 1.0.0 */ - const_reverse_iterator crend() const noexcept - { - return const_reverse_iterator(cbegin()); - } + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(cbegin()); + } - private: - // forward declaration - template class iteration_proxy; + private: + // forward declaration + template class iteration_proxy; - public: - /*! + public: + /*! @brief wrapper to access iterator member functions in range-based for This function allows to access @ref iterator::key() and @ref @@ -4449,30 +4563,30 @@ class basic_json @note The name of this function is not yet final and may change in the future. */ - static iteration_proxy iterator_wrapper(reference cont) - { - return iteration_proxy(cont); - } + static iteration_proxy iterator_wrapper(reference cont) + { + return iteration_proxy(cont); + } - /*! + /*! @copydoc iterator_wrapper(reference) */ - static iteration_proxy iterator_wrapper(const_reference cont) - { - return iteration_proxy(cont); - } + static iteration_proxy iterator_wrapper(const_reference cont) + { + return iteration_proxy(cont); + } - /// @} + /// @} - ////////////// - // capacity // - ////////////// + ////////////// + // capacity // + ////////////// - /// @name capacity - /// @{ + /// @name capacity + /// @{ - /*! + /*! @brief checks whether the container is empty Checks if a JSON value has no elements. @@ -4488,6 +4602,10 @@ class basic_json object | result of function `object_t::empty()` array | result of function `array_t::empty()` + @note This function does not return whether a string stored as JSON value + is empty - it returns whether the JSON container itself is empty which is + false in the case of a string. + @complexity Constant, as long as @ref array_t and @ref object_t satisfy the Container concept; that is, their `empty()` functions have constant complexity. @@ -4505,37 +4623,37 @@ class basic_json @since version 1.0.0 */ - bool empty() const noexcept - { - switch (m_type) + bool empty() const noexcept { - case value_t::null: + switch (m_type) { - // null values are empty - return true; - } + case value_t::null: + { + // null values are empty + return true; + } - case value_t::array: - { - assert(m_value.array != nullptr); - return m_value.array->empty(); - } + case value_t::array: + { + // delegate call to array_t::empty() + return m_value.array->empty(); + } - case value_t::object: - { - assert(m_value.object != nullptr); - return m_value.object->empty(); - } + case value_t::object: + { + // delegate call to object_t::empty() + return m_value.object->empty(); + } - default: - { - // all other types are nonempty - return false; + default: + { + // all other types are nonempty + return false; + } } } - } - /*! + /*! @brief returns the number of elements Returns the number of elements in a JSON value. @@ -4551,6 +4669,10 @@ class basic_json object | result of function object_t::size() array | result of function array_t::size() + @note This function does not return the length of a string stored as JSON + value - it returns the number of elements in the JSON value which is 1 in + the case of a string. + @complexity Constant, as long as @ref array_t and @ref object_t satisfy the Container concept; that is, their size() functions have constant complexity. @@ -4569,37 +4691,37 @@ class basic_json @since version 1.0.0 */ - size_type size() const noexcept - { - switch (m_type) + size_type size() const noexcept { - case value_t::null: + switch (m_type) { - // null values are empty - return 0; - } + case value_t::null: + { + // null values are empty + return 0; + } - case value_t::array: - { - assert(m_value.array != nullptr); - return m_value.array->size(); - } + case value_t::array: + { + // delegate call to array_t::size() + return m_value.array->size(); + } - case value_t::object: - { - assert(m_value.object != nullptr); - return m_value.object->size(); - } + case value_t::object: + { + // delegate call to object_t::size() + return m_value.object->size(); + } - default: - { - // all other types have size 1 - return 1; + default: + { + // all other types have size 1 + return 1; + } } } - } - /*! + /*! @brief returns the maximum possible number of elements Returns the maximum number of elements a JSON value is able to hold due to @@ -4635,41 +4757,41 @@ class basic_json @since version 1.0.0 */ - size_type max_size() const noexcept - { - switch (m_type) + size_type max_size() const noexcept { - case value_t::array: + switch (m_type) { - assert(m_value.array != nullptr); - return m_value.array->max_size(); - } + case value_t::array: + { + // delegate call to array_t::max_size() + return m_value.array->max_size(); + } - case value_t::object: - { - assert(m_value.object != nullptr); - return m_value.object->max_size(); - } + case value_t::object: + { + // delegate call to object_t::max_size() + return m_value.object->max_size(); + } - default: - { - // all other types have max_size() == size() - return size(); + default: + { + // all other types have max_size() == size() + return size(); + } } } - } - /// @} + /// @} - /////////////// - // modifiers // - /////////////// + /////////////// + // modifiers // + /////////////// - /// @name modifiers - /// @{ + /// @name modifiers + /// @{ - /*! + /*! @brief clears the contents Clears the content of a JSON value and resets it to the default value as @@ -4694,63 +4816,60 @@ class basic_json @since version 1.0.0 */ - void clear() noexcept - { - switch (m_type) + void clear() noexcept { - case value_t::number_integer: + switch (m_type) { - m_value.number_integer = 0; - break; - } + case value_t::number_integer: + { + m_value.number_integer = 0; + break; + } - case value_t::number_unsigned: - { - m_value.number_unsigned = 0; - break; - } + case value_t::number_unsigned: + { + m_value.number_unsigned = 0; + break; + } - case value_t::number_float: - { - m_value.number_float = 0.0; - break; - } + case value_t::number_float: + { + m_value.number_float = 0.0; + break; + } - case value_t::boolean: - { - m_value.boolean = false; - break; - } + case value_t::boolean: + { + m_value.boolean = false; + break; + } - case value_t::string: - { - assert(m_value.string != nullptr); - m_value.string->clear(); - break; - } + case value_t::string: + { + m_value.string->clear(); + break; + } - case value_t::array: - { - assert(m_value.array != nullptr); - m_value.array->clear(); - break; - } + case value_t::array: + { + m_value.array->clear(); + break; + } - case value_t::object: - { - assert(m_value.object != nullptr); - m_value.object->clear(); - break; - } + case value_t::object: + { + m_value.object->clear(); + break; + } - default: - { - break; + default: + { + break; + } } } - } - /*! + /*! @brief add an object to an array Appends the given element @a val to the end of the JSON value. If the @@ -4770,73 +4889,73 @@ class basic_json @since version 1.0.0 */ - void push_back(basic_json&& val) - { - // push_back only works for null objects or arrays - if (not(is_null() or is_array())) + void push_back(basic_json&& val) { - throw std::domain_error("cannot use push_back() with " + type_name()); - } + // push_back only works for null objects or arrays + if (not(is_null() or is_array())) + { + throw std::domain_error("cannot use push_back() with " + type_name()); + } - // transform null object into an array - if (is_null()) - { - m_type = value_t::array; - m_value = value_t::array; - } + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } - // add element to array (move semantics) - assert(m_value.array != nullptr); - m_value.array->push_back(std::move(val)); - // invalidate object - val.m_type = value_t::null; - } + // add element to array (move semantics) + m_value.array->push_back(std::move(val)); + // invalidate object + val.m_type = value_t::null; + } - /*! + /*! @brief add an object to an array @copydoc push_back(basic_json&&) */ - reference operator+=(basic_json&& val) - { - push_back(std::move(val)); - return *this; - } + reference operator+=(basic_json&& val) + { + push_back(std::move(val)); + return *this; + } - /*! + /*! @brief add an object to an array @copydoc push_back(basic_json&&) */ - void push_back(const basic_json& val) - { - // push_back only works for null objects or arrays - if (not(is_null() or is_array())) + void push_back(const basic_json& val) { - throw std::domain_error("cannot use push_back() with " + type_name()); - } + // push_back only works for null objects or arrays + if (not(is_null() or is_array())) + { + throw std::domain_error("cannot use push_back() with " + type_name()); + } - // transform null object into an array - if (is_null()) - { - m_type = value_t::array; - m_value = value_t::array; - } + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } - // add element to array - assert(m_value.array != nullptr); - m_value.array->push_back(val); - } + // add element to array + m_value.array->push_back(val); + } - /*! + /*! @brief add an object to an array @copydoc push_back(basic_json&&) */ - reference operator+=(const basic_json& val) - { - push_back(val); - return *this; - } + reference operator+=(const basic_json& val) + { + push_back(val); + return *this; + } - /*! + /*! @brief add an object to an object Inserts the given element @a val to the JSON object. If the function is @@ -4856,37 +4975,37 @@ class basic_json @since version 1.0.0 */ - void push_back(const typename object_t::value_type& val) - { - // push_back only works for null objects or objects - if (not(is_null() or is_object())) + void push_back(const typename object_t::value_type& val) { - throw std::domain_error("cannot use push_back() with " + type_name()); - } + // push_back only works for null objects or objects + if (not(is_null() or is_object())) + { + throw std::domain_error("cannot use push_back() with " + type_name()); + } - // transform null object into an object - if (is_null()) - { - m_type = value_t::object; - m_value = value_t::object; - } + // transform null object into an object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } - // add element to array - assert(m_value.object != nullptr); - m_value.object->insert(val); - } + // add element to array + m_value.object->insert(val); + } - /*! + /*! @brief add an object to an object @copydoc push_back(const typename object_t::value_type&) */ - reference operator+=(const typename object_t::value_type& val) - { - push_back(val); - return *this; - } + reference operator+=(const typename object_t::value_type& val) + { + push_back(val); + return *this; + } - /*! + /*! @brief add an object to an object This function allows to use `push_back` with an initializer list. In case @@ -4911,30 +5030,30 @@ class basic_json @liveexample{The example shows how initializer lists are treated as objects when possible.,push_back__initializer_list} */ - void push_back(std::initializer_list init) - { - if (is_object() and init.size() == 2 and init.begin()->is_string()) + void push_back(std::initializer_list init) { - const string_t key = *init.begin(); - push_back(typename object_t::value_type(key, *(init.begin() + 1))); - } - else - { - push_back(basic_json(init)); + if (is_object() and init.size() == 2 and init.begin()->is_string()) + { + const string_t key = *init.begin(); + push_back(typename object_t::value_type(key, *(init.begin() + 1))); + } + else + { + push_back(basic_json(init)); + } } - } - /*! + /*! @brief add an object to an object @copydoc push_back(std::initializer_list) */ - reference operator+=(std::initializer_list init) - { - push_back(init); - return *this; - } + reference operator+=(std::initializer_list init) + { + push_back(init); + return *this; + } - /*! + /*! @brief inserts element Inserts element @a val before iterator @a pos. @@ -4956,39 +5075,38 @@ class basic_json @since version 1.0.0 */ - iterator insert(const_iterator pos, const basic_json& val) - { - // insert only works for arrays - if (is_array()) + iterator insert(const_iterator pos, const basic_json& val) { - // check if iterator pos fits to this JSON value - if (pos.m_object != this) + // insert only works for arrays + if (is_array()) { - throw std::domain_error("iterator does not fit current value"); - } + // check if iterator pos fits to this JSON value + if (pos.m_object != this) + { + throw std::domain_error("iterator does not fit current value"); + } - // insert to array and return iterator - iterator result(this); - assert(m_value.array != nullptr); - result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, val); - return result; - } - else - { - throw std::domain_error("cannot use insert() with " + type_name()); + // insert to array and return iterator + iterator result(this); + result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, val); + return result; + } + else + { + throw std::domain_error("cannot use insert() with " + type_name()); + } } - } - /*! + /*! @brief inserts element @copydoc insert(const_iterator, const basic_json&) */ - iterator insert(const_iterator pos, basic_json&& val) - { - return insert(pos, val); - } + iterator insert(const_iterator pos, basic_json&& val) + { + return insert(pos, val); + } - /*! + /*! @brief inserts elements Inserts @a cnt copies of @a val before iterator @a pos. @@ -5012,30 +5130,29 @@ class basic_json @since version 1.0.0 */ - iterator insert(const_iterator pos, size_type cnt, const basic_json& val) - { - // insert only works for arrays - if (is_array()) + iterator insert(const_iterator pos, size_type cnt, const basic_json& val) { - // check if iterator pos fits to this JSON value - if (pos.m_object != this) + // insert only works for arrays + if (is_array()) { - throw std::domain_error("iterator does not fit current value"); - } + // check if iterator pos fits to this JSON value + if (pos.m_object != this) + { + throw std::domain_error("iterator does not fit current value"); + } - // insert to array and return iterator - iterator result(this); - assert(m_value.array != nullptr); - result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val); - return result; - } - else - { - throw std::domain_error("cannot use insert() with " + type_name()); + // insert to array and return iterator + iterator result(this); + result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val); + return result; + } + else + { + throw std::domain_error("cannot use insert() with " + type_name()); + } } - } - /*! + /*! @brief inserts elements Inserts elements from range `[first, last)` before iterator @a pos. @@ -5065,41 +5182,41 @@ class basic_json @since version 1.0.0 */ - iterator insert(const_iterator pos, const_iterator first, const_iterator last) - { - // insert only works for arrays - if (not is_array()) + iterator insert(const_iterator pos, const_iterator first, const_iterator last) { - throw std::domain_error("cannot use insert() with " + type_name()); - } + // insert only works for arrays + if (not is_array()) + { + throw std::domain_error("cannot use insert() with " + type_name()); + } - // check if iterator pos fits to this JSON value - if (pos.m_object != this) - { - throw std::domain_error("iterator does not fit current value"); - } + // check if iterator pos fits to this JSON value + if (pos.m_object != this) + { + throw std::domain_error("iterator does not fit current value"); + } - if (first.m_object != last.m_object) - { - throw std::domain_error("iterators do not fit"); - } + // check if range iterators belong to the same JSON object + if (first.m_object != last.m_object) + { + throw std::domain_error("iterators do not fit"); + } - if (first.m_object == this or last.m_object == this) - { - throw std::domain_error("passed iterators may not belong to container"); - } + if (first.m_object == this or last.m_object == this) + { + throw std::domain_error("passed iterators may not belong to container"); + } - // insert to array and return iterator - iterator result(this); - assert(m_value.array != nullptr); - result.m_it.array_iterator = m_value.array->insert( - pos.m_it.array_iterator, - first.m_it.array_iterator, - last.m_it.array_iterator); - return result; - } + // insert to array and return iterator + iterator result(this); + result.m_it.array_iterator = m_value.array->insert( + pos.m_it.array_iterator, + first.m_it.array_iterator, + last.m_it.array_iterator); + return result; + } - /*! + /*! @brief inserts elements Inserts elements from initializer list @a ilist before iterator @a pos. @@ -5123,28 +5240,27 @@ class basic_json @since version 1.0.0 */ - iterator insert(const_iterator pos, std::initializer_list ilist) - { - // insert only works for arrays - if (not is_array()) + iterator insert(const_iterator pos, std::initializer_list ilist) { - throw std::domain_error("cannot use insert() with " + type_name()); - } + // insert only works for arrays + if (not is_array()) + { + throw std::domain_error("cannot use insert() with " + type_name()); + } - // check if iterator pos fits to this JSON value - if (pos.m_object != this) - { - throw std::domain_error("iterator does not fit current value"); - } + // check if iterator pos fits to this JSON value + if (pos.m_object != this) + { + throw std::domain_error("iterator does not fit current value"); + } - // insert to array and return iterator - iterator result(this); - assert(m_value.array != nullptr); - result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, ilist); - return result; - } + // insert to array and return iterator + iterator result(this); + result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, ilist); + return result; + } - /*! + /*! @brief exchanges the values Exchanges the contents of the JSON value with those of @a other. Does not @@ -5161,18 +5277,19 @@ class basic_json @since version 1.0.0 */ - void swap(reference other) noexcept ( + void swap(reference other) noexcept ( std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value - ) - { - std::swap(m_type, other.m_type); - std::swap(m_value, other.m_value); - } + ) + { + std::swap(m_type, other.m_type); + std::swap(m_value, other.m_value); + assert_invariant(); + } - /*! + /*! @brief exchanges the values Exchanges the contents of a JSON array with those of @a other. Does not @@ -5192,21 +5309,20 @@ class basic_json @since version 1.0.0 */ - void swap(array_t& other) - { - // swap only works for arrays - if (is_array()) + void swap(array_t& other) { - assert(m_value.array != nullptr); - std::swap(*(m_value.array), other); - } - else - { - throw std::domain_error("cannot use swap() with " + type_name()); + // swap only works for arrays + if (is_array()) + { + std::swap(*(m_value.array), other); + } + else + { + throw std::domain_error("cannot use swap() with " + type_name()); + } } - } - /*! + /*! @brief exchanges the values Exchanges the contents of a JSON object with those of @a other. Does not @@ -5226,21 +5342,20 @@ class basic_json @since version 1.0.0 */ - void swap(object_t& other) - { - // swap only works for objects - if (is_object()) - { - assert(m_value.object != nullptr); - std::swap(*(m_value.object), other); - } - else + void swap(object_t& other) { - throw std::domain_error("cannot use swap() with " + type_name()); + // swap only works for objects + if (is_object()) + { + std::swap(*(m_value.object), other); + } + else + { + throw std::domain_error("cannot use swap() with " + type_name()); + } } - } - /*! + /*! @brief exchanges the values Exchanges the contents of a JSON string with those of @a other. Does not @@ -5260,32 +5375,31 @@ class basic_json @since version 1.0.0 */ - void swap(string_t& other) - { - // swap only works for strings - if (is_string()) + void swap(string_t& other) { - assert(m_value.string != nullptr); - std::swap(*(m_value.string), other); - } - else - { - throw std::domain_error("cannot use swap() with " + type_name()); + // swap only works for strings + if (is_string()) + { + std::swap(*(m_value.string), other); + } + else + { + throw std::domain_error("cannot use swap() with " + type_name()); + } } - } - /// @} + /// @} - ////////////////////////////////////////// - // lexicographical comparison operators // - ////////////////////////////////////////// + ////////////////////////////////////////// + // lexicographical comparison operators // + ////////////////////////////////////////// - /// @name lexicographical comparison operators - /// @{ + /// @name lexicographical comparison operators + /// @{ - private: - /*! + private: + /*! @brief comparison operator for JSON types Returns an ordering that is similar to Python: @@ -5294,31 +5408,31 @@ class basic_json @since version 1.0.0 */ - friend bool operator<(const value_t lhs, const value_t rhs) noexcept - { - static constexpr std::array order = {{ - 0, // null - 3, // object - 4, // array - 5, // string - 1, // boolean - 2, // integer - 2, // unsigned - 2, // float + friend bool operator<(const value_t lhs, const value_t rhs) noexcept + { + static constexpr std::array order = {{ + 0, // null + 3, // object + 4, // array + 5, // string + 1, // boolean + 2, // integer + 2, // unsigned + 2, // float + } + }; + + // discarded values are not comparable + if (lhs == value_t::discarded or rhs == value_t::discarded) + { + return false; } - }; - // discarded values are not comparable - if (lhs == value_t::discarded or rhs == value_t::discarded) - { - return false; + return order[static_cast(lhs)] < order[static_cast(rhs)]; } - return order[static_cast(lhs)] < order[static_cast(rhs)]; - } - - public: - /*! + public: + /*! @brief comparison: equal Compares two JSON values for equality according to the following rules: @@ -5341,88 +5455,82 @@ class basic_json @since version 1.0.0 */ - friend bool operator==(const_reference lhs, const_reference rhs) noexcept - { - const auto lhs_type = lhs.type(); - const auto rhs_type = rhs.type(); - - if (lhs_type == rhs_type) + friend bool operator==(const_reference lhs, const_reference rhs) noexcept { - switch (lhs_type) + const auto lhs_type = lhs.type(); + const auto rhs_type = rhs.type(); + + if (lhs_type == rhs_type) { - case value_t::array: + switch (lhs_type) { - assert(lhs.m_value.array != nullptr); - assert(rhs.m_value.array != nullptr); - return *lhs.m_value.array == *rhs.m_value.array; - } - case value_t::object: - { - assert(lhs.m_value.object != nullptr); - assert(rhs.m_value.object != nullptr); - return *lhs.m_value.object == *rhs.m_value.object; - } - case value_t::null: - { - return true; - } - case value_t::string: - { - assert(lhs.m_value.string != nullptr); - assert(rhs.m_value.string != nullptr); - return *lhs.m_value.string == *rhs.m_value.string; - } - case value_t::boolean: - { - return lhs.m_value.boolean == rhs.m_value.boolean; - } - case value_t::number_integer: - { - return lhs.m_value.number_integer == rhs.m_value.number_integer; - } - case value_t::number_unsigned: - { - return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned; - } - case value_t::number_float: - { - return lhs.m_value.number_float == rhs.m_value.number_float; - } - default: - { - return false; + case value_t::array: + { + return *lhs.m_value.array == *rhs.m_value.array; + } + case value_t::object: + { + return *lhs.m_value.object == *rhs.m_value.object; + } + case value_t::null: + { + return true; + } + case value_t::string: + { + return *lhs.m_value.string == *rhs.m_value.string; + } + case value_t::boolean: + { + return lhs.m_value.boolean == rhs.m_value.boolean; + } + case value_t::number_integer: + { + return lhs.m_value.number_integer == rhs.m_value.number_integer; + } + case value_t::number_unsigned: + { + return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned; + } + case value_t::number_float: + { + return lhs.m_value.number_float == rhs.m_value.number_float; + } + default: + { + return false; + } } } + else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_integer) == rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float and rhs_type == value_t::number_integer) + { + return lhs.m_value.number_float == static_cast(rhs.m_value.number_integer); + } + else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float and rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_float == static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_integer) + { + return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_integer; + } + else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_integer == static_cast(rhs.m_value.number_unsigned); + } + + return false; } - else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_integer) == rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float and rhs_type == value_t::number_integer) - { - return lhs.m_value.number_float == static_cast(rhs.m_value.number_integer); - } - else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float and rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_float == static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_integer) - { - return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_integer; - } - else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_integer == static_cast(rhs.m_value.number_unsigned); - } - - return false; - } - /*! + /*! @brief comparison: equal The functions compares the given JSON value against a null pointer. As the @@ -5440,21 +5548,21 @@ class basic_json @since version 1.0.0 */ - friend bool operator==(const_reference v, std::nullptr_t) noexcept - { - return v.is_null(); - } + friend bool operator==(const_reference v, std::nullptr_t) noexcept + { + return v.is_null(); + } - /*! + /*! @brief comparison: equal @copydoc operator==(const_reference, std::nullptr_t) */ - friend bool operator==(std::nullptr_t, const_reference v) noexcept - { - return v.is_null(); - } + friend bool operator==(std::nullptr_t, const_reference v) noexcept + { + return v.is_null(); + } - /*! + /*! @brief comparison: not equal Compares two JSON values for inequality by calculating `not (lhs == rhs)`. @@ -5470,12 +5578,12 @@ class basic_json @since version 1.0.0 */ - friend bool operator!=(const_reference lhs, const_reference rhs) noexcept - { - return not (lhs == rhs); - } + friend bool operator!=(const_reference lhs, const_reference rhs) noexcept + { + return not (lhs == rhs); + } - /*! + /*! @brief comparison: not equal The functions compares the given JSON value against a null pointer. As the @@ -5493,21 +5601,21 @@ class basic_json @since version 1.0.0 */ - friend bool operator!=(const_reference v, std::nullptr_t) noexcept - { - return not v.is_null(); - } + friend bool operator!=(const_reference v, std::nullptr_t) noexcept + { + return not v.is_null(); + } - /*! + /*! @brief comparison: not equal @copydoc operator!=(const_reference, std::nullptr_t) */ - friend bool operator!=(std::nullptr_t, const_reference v) noexcept - { - return not v.is_null(); - } + friend bool operator!=(std::nullptr_t, const_reference v) noexcept + { + return not v.is_null(); + } - /*! + /*! @brief comparison: less than Compares whether one JSON value @a lhs is less than another JSON value @a @@ -5531,91 +5639,85 @@ class basic_json @since version 1.0.0 */ - friend bool operator<(const_reference lhs, const_reference rhs) noexcept - { - const auto lhs_type = lhs.type(); - const auto rhs_type = rhs.type(); - - if (lhs_type == rhs_type) + friend bool operator<(const_reference lhs, const_reference rhs) noexcept { - switch (lhs_type) + const auto lhs_type = lhs.type(); + const auto rhs_type = rhs.type(); + + if (lhs_type == rhs_type) { - case value_t::array: - { - assert(lhs.m_value.array != nullptr); - assert(rhs.m_value.array != nullptr); - return *lhs.m_value.array < *rhs.m_value.array; - } - case value_t::object: - { - assert(lhs.m_value.object != nullptr); - assert(rhs.m_value.object != nullptr); - return *lhs.m_value.object < *rhs.m_value.object; - } - case value_t::null: - { - return false; - } - case value_t::string: - { - assert(lhs.m_value.string != nullptr); - assert(rhs.m_value.string != nullptr); - return *lhs.m_value.string < *rhs.m_value.string; - } - case value_t::boolean: - { - return lhs.m_value.boolean < rhs.m_value.boolean; - } - case value_t::number_integer: - { - return lhs.m_value.number_integer < rhs.m_value.number_integer; - } - case value_t::number_unsigned: - { - return lhs.m_value.number_unsigned < rhs.m_value.number_unsigned; - } - case value_t::number_float: + switch (lhs_type) { - return lhs.m_value.number_float < rhs.m_value.number_float; - } - default: - { - return false; + case value_t::array: + { + return *lhs.m_value.array < *rhs.m_value.array; + } + case value_t::object: + { + return *lhs.m_value.object < *rhs.m_value.object; + } + case value_t::null: + { + return false; + } + case value_t::string: + { + return *lhs.m_value.string < *rhs.m_value.string; + } + case value_t::boolean: + { + return lhs.m_value.boolean < rhs.m_value.boolean; + } + case value_t::number_integer: + { + return lhs.m_value.number_integer < rhs.m_value.number_integer; + } + case value_t::number_unsigned: + { + return lhs.m_value.number_unsigned < rhs.m_value.number_unsigned; + } + case value_t::number_float: + { + return lhs.m_value.number_float < rhs.m_value.number_float; + } + default: + { + return false; + } } } - } - else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float and rhs_type == value_t::number_integer) - { - return lhs.m_value.number_float < static_cast(rhs.m_value.number_integer); - } - else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float and rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_float < static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_integer < static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_integer) - { - return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; - } + else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float and rhs_type == value_t::number_integer) + { + return lhs.m_value.number_float < static_cast(rhs.m_value.number_integer); + } + else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float and rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_float < static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_integer < static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_integer) + { + return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; + } - // We only reach this line if we cannot compare values. In that case, - // we compare types. Note we have to call the operator explicitly, - // because MSVC has problems otherwise. - return operator<(lhs_type, rhs_type); - } + // We only reach this line if we cannot compare values. In that case, + // we compare types. Note we have to call the operator explicitly, + // because MSVC has problems otherwise. + return operator<(lhs_type, rhs_type); + } - /*! + /*! @brief comparison: less than or equal Compares whether one JSON value @a lhs is less than or equal to another @@ -5632,12 +5734,12 @@ class basic_json @since version 1.0.0 */ - friend bool operator<=(const_reference lhs, const_reference rhs) noexcept - { - return not (rhs < lhs); - } + friend bool operator<=(const_reference lhs, const_reference rhs) noexcept + { + return not (rhs < lhs); + } - /*! + /*! @brief comparison: greater than Compares whether one JSON value @a lhs is greater than another @@ -5654,12 +5756,12 @@ class basic_json @since version 1.0.0 */ - friend bool operator>(const_reference lhs, const_reference rhs) noexcept - { - return not (lhs <= rhs); - } + friend bool operator>(const_reference lhs, const_reference rhs) noexcept + { + return not (lhs <= rhs); + } - /*! + /*! @brief comparison: greater than or equal Compares whether one JSON value @a lhs is greater than or equal to another @@ -5676,22 +5778,22 @@ class basic_json @since version 1.0.0 */ - friend bool operator>=(const_reference lhs, const_reference rhs) noexcept - { - return not (lhs < rhs); - } + friend bool operator>=(const_reference lhs, const_reference rhs) noexcept + { + return not (lhs < rhs); + } - /// @} + /// @} - /////////////////// - // serialization // - /////////////////// + /////////////////// + // serialization // + /////////////////// - /// @name serialization - /// @{ + /// @name serialization + /// @{ - /*! + /*! @brief serialize to stream Serialize the given JSON value @a j to the output stream @a o. The JSON @@ -5701,6 +5803,10 @@ class basic_json `std::setw(4)` on @a o sets the indentation level to `4` and the serialization result is the same as calling `dump(4)`. + @note During serializaion, the locale and the precision of the output + stream @a o are changed. The original values are restored when the + function returns. + @param[in,out] o stream to serialize to @param[in] j JSON value to serialize @@ -5713,43 +5819,93 @@ class basic_json @since version 1.0.0 */ - friend std::ostream& operator<<(std::ostream& o, const basic_json& j) - { - // read width member and use it as indentation parameter if nonzero - const bool pretty_print = (o.width() > 0); - const auto indentation = (pretty_print ? o.width() : 0); + friend std::ostream& operator<<(std::ostream& o, const basic_json& j) + { + // read width member and use it as indentation parameter if nonzero + const bool pretty_print = (o.width() > 0); + const auto indentation = (pretty_print ? o.width() : 0); - // reset width to 0 for subsequent calls to this stream - o.width(0); + // reset width to 0 for subsequent calls to this stream + o.width(0); - // do the actual serialization - j.dump(o, pretty_print, static_cast(indentation)); - return o; - } + // fix locale problems + const auto old_locale = o.imbue(std::locale(std::locale(), new DecimalSeparator)); + // set precision + + // 6, 15 or 16 digits of precision allows round-trip IEEE 754 + // string->float->string, string->double->string or string->long + // double->string; to be safe, we read this value from + // std::numeric_limits::digits10 + const auto old_precision = o.precision(std::numeric_limits::digits10); + + // do the actual serialization + j.dump(o, pretty_print, static_cast(indentation)); + + // reset locale and precision + o.imbue(old_locale); + o.precision(old_precision); + return o; + } - /*! + /*! @brief serialize to stream @copydoc operator<<(std::ostream&, const basic_json&) */ - friend std::ostream& operator>>(const basic_json& j, std::ostream& o) - { - return o << j; - } + friend std::ostream& operator>>(const basic_json& j, std::ostream& o) + { + return o << j; + } + + /// @} + + + ///////////////////// + // deserialization // + ///////////////////// + + /// @name deserialization + /// @{ + + /*! + @brief deserialize from an array - /// @} + This function reads from an array of 1-byte values. + + @pre Each element of the container has a size of 1 byte. Violating this + precondition yields undefined behavior. **This precondition is enforced + with a static assertion.** + + @param[in] array array to read from + @param[in] cb a parser callback function of type @ref parser_callback_t + which is used to control the deserialization by filtering unwanted values + (optional) + + @return result of the deserialization + + @complexity Linear in the length of the input. The parser is a predictive + LL(1) parser. The complexity can be higher if the parser callback function + @a cb has a super-linear complexity. + @note A UTF-8 byte order mark is silently ignored. - ///////////////////// - // deserialization // - ///////////////////// + @liveexample{The example below demonstrates the `parse()` function reading + from an array.,parse__array__parser_callback_t} - /// @name deserialization - /// @{ + @since version 2.0.3 + */ + template + static basic_json parse(T (&array)[N], + const parser_callback_t cb = nullptr) + { + // delegate the call to the iterator-range parse overload + return parse(std::begin(array), std::end(array), cb); + } - /*! - @brief deserialize from string + /*! + @brief deserialize from string literal - @param[in] s string to read a serialized JSON value from + @tparam CharT character/literal type with size of 1 byte + @param[in] s string literal to read a serialized JSON value from @param[in] cb a parser callback function of type @ref parser_callback_t which is used to control the deserialization by filtering unwanted values (optional) @@ -5761,21 +5917,28 @@ class basic_json @a cb has a super-linear complexity. @note A UTF-8 byte order mark is silently ignored. + @note String containers like `std::string` or @ref string_t can be parsed + with @ref parse(const ContiguousContainer&, const parser_callback_t) @liveexample{The example below demonstrates the `parse()` function with and without callback function.,parse__string__parser_callback_t} - @sa @ref parse(std::istream&, parser_callback_t) for a version that reads - from an input stream + @sa @ref parse(std::istream&, const parser_callback_t) for a version that + reads from an input stream - @since version 1.0.0 + @since version 1.0.0 (originally for @ref string_t) */ - static basic_json parse(const string_t& s, parser_callback_t cb = nullptr) - { - return parser(s, cb).parse(); - } + template::value and + std::is_integral::type>::value and + sizeof(typename std::remove_pointer::type) == 1, int>::type = 0> + static basic_json parse(const CharPT s, + const parser_callback_t cb = nullptr) + { + return parser(reinterpret_cast(s), cb).parse(); + } - /*! + /*! @brief deserialize from stream @param[in,out] i stream to read a serialized JSON value from @@ -5794,25 +5957,151 @@ class basic_json @liveexample{The example below demonstrates the `parse()` function with and without callback function.,parse__istream__parser_callback_t} - @sa @ref parse(const string_t&, parser_callback_t) for a version that - reads from a string + @sa @ref parse(const char*, const parser_callback_t) for a version + that reads from a string @since version 1.0.0 */ - static basic_json parse(std::istream& i, parser_callback_t cb = nullptr) - { - return parser(i, cb).parse(); - } + static basic_json parse(std::istream& i, + const parser_callback_t cb = nullptr) + { + return parser(i, cb).parse(); + } - /*! - @copydoc parse(std::istream&, parser_callback_t) + /*! + @copydoc parse(std::istream&, const parser_callback_t) */ - static basic_json parse(std::istream&& i, parser_callback_t cb = nullptr) - { - return parser(i, cb).parse(); - } + static basic_json parse(std::istream&& i, + const parser_callback_t cb = nullptr) + { + return parser(i, cb).parse(); + } + + /*! + @brief deserialize from an iterator range with contiguous storage + + This function reads from an iterator range of a container with contiguous + storage of 1-byte values. Compatible container types include + `std::vector`, `std::string`, `std::array`, `std::valarray`, and + `std::initializer_list`. Furthermore, C-style arrays can be used with + `std::begin()`/`std::end()`. User-defined containers can be used as long + as they implement random-access iterators and a contiguous storage. + + @pre The iterator range is contiguous. Violating this precondition yields + undefined behavior. **This precondition is enforced with an assertion.** + @pre Each element in the range has a size of 1 byte. Violating this + precondition yields undefined behavior. **This precondition is enforced + with a static assertion.** + + @warning There is no way to enforce all preconditions at compile-time. If + the function is called with noncompliant iterators and with + assertions switched off, the behavior is undefined and will most + likely yield segmentation violation. + + @tparam IteratorType iterator of container with contiguous storage + @param[in] first begin of the range to parse (included) + @param[in] last end of the range to parse (excluded) + @param[in] cb a parser callback function of type @ref parser_callback_t + which is used to control the deserialization by filtering unwanted values + (optional) + + @return result of the deserialization + + @complexity Linear in the length of the input. The parser is a predictive + LL(1) parser. The complexity can be higher if the parser callback function + @a cb has a super-linear complexity. - /*! + @note A UTF-8 byte order mark is silently ignored. + + @liveexample{The example below demonstrates the `parse()` function reading + from an iterator range.,parse__iteratortype__parser_callback_t} + + @since version 2.0.3 + */ + template::iterator_category>::value, int>::type = 0> + static basic_json parse(IteratorType first, IteratorType last, + const parser_callback_t cb = nullptr) + { + // assertion to check that the iterator range is indeed contiguous, + // see http://stackoverflow.com/a/35008842/266378 for more discussion + assert(std::accumulate(first, last, std::make_pair(true, 0), + [&first](std::pair res, decltype(*first) val) + { + res.first &= (val == *(std::next(std::addressof(*first), res.second++))); + return res; + }).first); + + // assertion to check that each element is 1 byte long + static_assert(sizeof(typename std::iterator_traits::value_type) == 1, + "each element in the iterator range must have the size of 1 byte"); + + // if iterator range is empty, create a parser with an empty string + // to generate "unexpected EOF" error message + if (std::distance(first, last) <= 0) + { + return parser("").parse(); + } + + return parser(first, last, cb).parse(); + } + + /*! + @brief deserialize from a container with contiguous storage + + This function reads from a container with contiguous storage of 1-byte + values. Compatible container types include `std::vector`, `std::string`, + `std::array`, and `std::initializer_list`. User-defined containers can be + used as long as they implement random-access iterators and a contiguous + storage. + + @pre The container storage is contiguous. Violating this precondition + yields undefined behavior. **This precondition is enforced with an + assertion.** + @pre Each element of the container has a size of 1 byte. Violating this + precondition yields undefined behavior. **This precondition is enforced + with a static assertion.** + + @warning There is no way to enforce all preconditions at compile-time. If + the function is called with a noncompliant container and with + assertions switched off, the behavior is undefined and will most + likely yield segmentation violation. + + @tparam ContiguousContainer container type with contiguous storage + @param[in] c container to read from + @param[in] cb a parser callback function of type @ref parser_callback_t + which is used to control the deserialization by filtering unwanted values + (optional) + + @return result of the deserialization + + @complexity Linear in the length of the input. The parser is a predictive + LL(1) parser. The complexity can be higher if the parser callback function + @a cb has a super-linear complexity. + + @note A UTF-8 byte order mark is silently ignored. + + @liveexample{The example below demonstrates the `parse()` function reading + from a contiguous container.,parse__contiguouscontainer__parser_callback_t} + + @since version 2.0.3 + */ + template::value and + std::is_base_of< + std::random_access_iterator_tag, + typename std::iterator_traits()))>::iterator_category>::value + , int>::type = 0> + static basic_json parse(const ContiguousContainer& c, + const parser_callback_t cb = nullptr) + { + // delegate the call to the iterator-range parse overload + return parse(std::begin(c), std::end(c), cb); + } + + /*! @brief deserialize from stream Deserializes an input stream to a JSON value. @@ -5830,58 +6119,69 @@ class basic_json @liveexample{The example below shows how a JSON value is constructed by reading a serialization from a stream.,operator_deserialize} - @sa parse(std::istream&, parser_callback_t) for a variant with a parser - callback function to filter values while parsing + @sa parse(std::istream&, const parser_callback_t) for a variant with a + parser callback function to filter values while parsing @since version 1.0.0 */ - friend std::istream& operator<<(basic_json& j, std::istream& i) - { - j = parser(i).parse(); - return i; - } + friend std::istream& operator<<(basic_json& j, std::istream& i) + { + j = parser(i).parse(); + return i; + } - /*! + /*! @brief deserialize from stream @copydoc operator<<(basic_json&, std::istream&) */ - friend std::istream& operator>>(std::istream& i, basic_json& j) - { - j = parser(i).parse(); - return i; - } + friend std::istream& operator>>(std::istream& i, basic_json& j) + { + j = parser(i).parse(); + return i; + } - /// @} + /// @} - private: - /////////////////////////// - // convenience functions // - /////////////////////////// + private: + /////////////////////////// + // convenience functions // + /////////////////////////// - /// return the type as string - string_t type_name() const noexcept - { - switch (m_type) - { - case value_t::null: - return "null"; - case value_t::object: - return "object"; - case value_t::array: - return "array"; - case value_t::string: - return "string"; - case value_t::boolean: - return "boolean"; - case value_t::discarded: - return "discarded"; - default: - return "number"; + /*! + @brief return the type as string + + Returns the type name as string to be used in error messages - usually to + indicate that a function was called on a wrong JSON type. + + @return basically a string representation of a the @a m_type member + + @complexity Constant. + + @since version 1.0.0 + */ + std::string type_name() const + { + switch (m_type) + { + case value_t::null: + return "null"; + case value_t::object: + return "object"; + case value_t::array: + return "array"; + case value_t::string: + return "string"; + case value_t::boolean: + return "boolean"; + case value_t::discarded: + return "discarded"; + default: + return "number"; + } } - } - /*! + /*! @brief calculates the extra space to escape a JSON string @param[in] s the string to escape @@ -5889,43 +6189,42 @@ class basic_json @complexity Linear in the length of string @a s. */ - static std::size_t extra_space(const string_t& s) noexcept - { - std::size_t result = 0; + static std::size_t extra_space(const string_t& s) noexcept + { + return std::accumulate(s.begin(), s.end(), size_t{}, + [](size_t res, typename string_t::value_type c) + { + switch (c) + { + case '"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + { + // from c (1 byte) to \x (2 bytes) + return res + 1; + } + + default: + { + if (c >= 0x00 and c <= 0x1f) + { + // from c (1 byte) to \uxxxx (6 bytes) + return res + 5; + } + else + { + return res; + } + } + } + }); + } - for (const auto& c : s) - { - switch (c) - { - case '"': - case '\\': - case '\b': - case '\f': - case '\n': - case '\r': - case '\t': - { - // from c (1 byte) to \x (2 bytes) - result += 1; - break; - } - - default: - { - if (c >= 0x00 and c <= 0x1f) - { - // from c (1 byte) to \uxxxx (6 bytes) - result += 5; - } - break; - } - } - } - - return result; - } - - /*! + /*! @brief escape a string Escape a string by replacing certain special characters by a sequence of @@ -5938,115 +6237,114 @@ class basic_json @complexity Linear in the length of string @a s. */ - static string_t escape_string(const string_t& s) - { - const auto space = extra_space(s); - if (space == 0) + static string_t escape_string(const string_t& s) { - return s; - } + const auto space = extra_space(s); + if (space == 0) + { + return s; + } - // create a result string of necessary size - string_t result(s.size() + space, '\\'); - std::size_t pos = 0; + // create a result string of necessary size + string_t result(s.size() + space, '\\'); + std::size_t pos = 0; - for (const auto& c : s) - { - switch (c) + for (const auto& c : s) { - // quotation mark (0x22) - case '"': + switch (c) { - result[pos + 1] = '"'; - pos += 2; - break; - } + // quotation mark (0x22) + case '"': + { + result[pos + 1] = '"'; + pos += 2; + break; + } - // reverse solidus (0x5c) - case '\\': - { - // nothing to change - pos += 2; - break; - } + // reverse solidus (0x5c) + case '\\': + { + // nothing to change + pos += 2; + break; + } - // backspace (0x08) - case '\b': - { - result[pos + 1] = 'b'; - pos += 2; - break; - } + // backspace (0x08) + case '\b': + { + result[pos + 1] = 'b'; + pos += 2; + break; + } - // formfeed (0x0c) - case '\f': - { - result[pos + 1] = 'f'; - pos += 2; - break; - } + // formfeed (0x0c) + case '\f': + { + result[pos + 1] = 'f'; + pos += 2; + break; + } - // newline (0x0a) - case '\n': - { - result[pos + 1] = 'n'; - pos += 2; - break; - } + // newline (0x0a) + case '\n': + { + result[pos + 1] = 'n'; + pos += 2; + break; + } - // carriage return (0x0d) - case '\r': - { - result[pos + 1] = 'r'; - pos += 2; - break; - } + // carriage return (0x0d) + case '\r': + { + result[pos + 1] = 'r'; + pos += 2; + break; + } - // horizontal tab (0x09) - case '\t': - { - result[pos + 1] = 't'; - pos += 2; - break; - } + // horizontal tab (0x09) + case '\t': + { + result[pos + 1] = 't'; + pos += 2; + break; + } - default: - { - if (c >= 0x00 and c <= 0x1f) + default: { - // convert a number 0..15 to its hex representation - // (0..f) - const auto hexify = [](const int v) -> char + if (c >= 0x00 and c <= 0x1f) { - return (v < 10) - ? ('0' + static_cast(v)) - : ('a' + static_cast((v - 10) & 0x1f)); - }; + // convert a number 0..15 to its hex representation + // (0..f) + static const char hexify[16] = + { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' + }; + + // print character c as \uxxxx + for (const char m : + { 'u', '0', '0', hexify[c >> 4], hexify[c & 0x0f] + }) + { + result[++pos] = m; + } - // print character c as \uxxxx - for (const char m : - { 'u', '0', '0', hexify(c >> 4), hexify(c & 0x0f) - }) + ++pos; + } + else { - result[++pos] = m; + // all other characters are added as-is + result[pos++] = c; } - - ++pos; - } - else - { - // all other characters are added as-is - result[pos++] = c; + break; } - break; } } - } - return result; - } + return result; + } - /*! + /*! @brief internal implementation of the serialization function This function is called by the public member function dump and organizes @@ -6063,179 +6361,119 @@ class basic_json @param[in] indent_step the indent level @param[in] current_indent the current indent level (only used internally) */ - void dump(std::ostream& o, - const bool pretty_print, - const unsigned int indent_step, - const unsigned int current_indent = 0) const - { - // variable to hold indentation for recursive calls - unsigned int new_indent = current_indent; - - switch (m_type) + void dump(std::ostream& o, + const bool pretty_print, + const unsigned int indent_step, + const unsigned int current_indent = 0) const { - case value_t::object: - { - assert(m_value.object != nullptr); + // variable to hold indentation for recursive calls + unsigned int new_indent = current_indent; - if (m_value.object->empty()) + switch (m_type) + { + case value_t::object: { - o << "{}"; - return; - } + if (m_value.object->empty()) + { + o << "{}"; + return; + } - o << "{"; + o << "{"; - // increase indentation - if (pretty_print) - { - new_indent += indent_step; - o << "\n"; - } + // increase indentation + if (pretty_print) + { + new_indent += indent_step; + o << "\n"; + } - for (auto i = m_value.object->cbegin(); i != m_value.object->cend(); ++i) - { - if (i != m_value.object->cbegin()) + for (auto i = m_value.object->cbegin(); i != m_value.object->cend(); ++i) + { + if (i != m_value.object->cbegin()) + { + o << (pretty_print ? ",\n" : ","); + } + o << string_t(new_indent, ' ') << "\"" + << escape_string(i->first) << "\":" + << (pretty_print ? " " : ""); + i->second.dump(o, pretty_print, indent_step, new_indent); + } + + // decrease indentation + if (pretty_print) { - o << (pretty_print ? ",\n" : ","); + new_indent -= indent_step; + o << "\n"; } - o << string_t(new_indent, ' ') << "\"" - << escape_string(i->first) << "\":" - << (pretty_print ? " " : ""); - i->second.dump(o, pretty_print, indent_step, new_indent); + + o << string_t(new_indent, ' ') + "}"; + return; } - // decrease indentation - if (pretty_print) + case value_t::array: { - new_indent -= indent_step; - o << "\n"; - } + if (m_value.array->empty()) + { + o << "[]"; + return; + } - o << string_t(new_indent, ' ') + "}"; - return; - } + o << "["; - case value_t::array: - { - assert(m_value.array != nullptr); + // increase indentation + if (pretty_print) + { + new_indent += indent_step; + o << "\n"; + } - if (m_value.array->empty()) - { - o << "[]"; + for (auto i = m_value.array->cbegin(); i != m_value.array->cend(); ++i) + { + if (i != m_value.array->cbegin()) + { + o << (pretty_print ? ",\n" : ","); + } + o << string_t(new_indent, ' '); + i->dump(o, pretty_print, indent_step, new_indent); + } + + // decrease indentation + if (pretty_print) + { + new_indent -= indent_step; + o << "\n"; + } + + o << string_t(new_indent, ' ') << "]"; return; } - o << "["; - - // increase indentation - if (pretty_print) + case value_t::string: { - new_indent += indent_step; - o << "\n"; + o << string_t("\"") << escape_string(*m_value.string) << "\""; + return; } - for (auto i = m_value.array->cbegin(); i != m_value.array->cend(); ++i) + case value_t::boolean: { - if (i != m_value.array->cbegin()) - { - o << (pretty_print ? ",\n" : ","); - } - o << string_t(new_indent, ' '); - i->dump(o, pretty_print, indent_step, new_indent); + o << (m_value.boolean ? "true" : "false"); + return; } - // decrease indentation - if (pretty_print) + case value_t::number_integer: { - new_indent -= indent_step; - o << "\n"; + o << m_value.number_integer; + return; } - o << string_t(new_indent, ' ') << "]"; - return; - } - - case value_t::string: - { - assert(m_value.string != nullptr); - o << string_t("\"") << escape_string(*m_value.string) << "\""; - return; - } - - case value_t::boolean: - { - o << (m_value.boolean ? "true" : "false"); - return; - } - - case value_t::number_integer: - { - o << m_value.number_integer; - return; - } - - case value_t::number_unsigned: - { - o << m_value.number_unsigned; - return; - } - - case value_t::number_float: - { - // check if number was parsed from a string - if (m_type.bits.parsed) + case value_t::number_unsigned: { - // check if parsed number had an exponent given - if (m_type.bits.has_exp) - { - // buffer size: precision (2^8-1 = 255) + other ('-.e-xxx' = 7) + null (1) - char buf[263]; - int len; - - // handle capitalization of the exponent - if (m_type.bits.exp_cap) - { - len = snprintf(buf, sizeof(buf), "%.*E", - m_type.bits.precision, m_value.number_float) + 1; - } - else - { - len = snprintf(buf, sizeof(buf), "%.*e", - m_type.bits.precision, m_value.number_float) + 1; - } - - // remove '+' sign from the exponent if necessary - if (not m_type.bits.exp_plus) - { - if (len > static_cast(sizeof(buf))) - { - len = sizeof(buf); - } - for (int i = 0; i < len; i++) - { - if (buf[i] == '+') - { - for (; i + 1 < len; i++) - { - buf[i] = buf[i + 1]; - } - } - } - } - - o << buf; - } - else - { - // no exponent - output as a decimal - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(m_type.bits.precision) - << std::fixed << m_value.number_float; - o << ss.str(); - } + o << m_value.number_unsigned; + return; } - else + + case value_t::number_float: { if (m_value.number_float == 0) { @@ -6244,53 +6482,43 @@ class basic_json } else { - // Otherwise 6, 15 or 16 digits of precision allows - // round-trip IEEE 754 string->float->string, - // string->double->string or string->long - // double->string; to be safe, we read this value from - // std::numeric_limits::digits10 - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(std::numeric_limits::digits10) - << m_value.number_float; - o << ss.str(); + o << m_value.number_float; } + return; } - return; - } - case value_t::discarded: - { - o << ""; - return; - } + case value_t::discarded: + { + o << ""; + return; + } - case value_t::null: - { - o << "null"; - return; + case value_t::null: + { + o << "null"; + return; + } } } - } - private: - ////////////////////// - // member variables // - ////////////////////// + private: + ////////////////////// + // member variables // + ////////////////////// - /// the type of the current element - type_data_t m_type = value_t::null; + /// the type of the current element + value_t m_type = value_t::null; - /// the value of the current element - json_value m_value = {}; + /// the value of the current element + json_value m_value = {}; - private: - /////////////// - // iterators // - /////////////// + private: + /////////////// + // iterators // + /////////////// - /*! + /*! @brief an iterator for primitive JSON types This class models an iterator for primitive JSON types (boolean, number, @@ -6299,178 +6527,184 @@ class basic_json a `difference_type` variable. Value begin_value (`0`) models the begin, end_value (`1`) models past the end. */ - class primitive_iterator_t - { - public: - /// set iterator to a defined beginning - void set_begin() noexcept + class primitive_iterator_t { - m_it = begin_value; - } + public: + /// set iterator to a defined beginning + void set_begin() noexcept + { + m_it = begin_value; + } - /// set iterator to a defined past the end - void set_end() noexcept - { - m_it = end_value; - } + /// set iterator to a defined past the end + void set_end() noexcept + { + m_it = end_value; + } - /// return whether the iterator can be dereferenced - constexpr bool is_begin() const noexcept - { - return (m_it == begin_value); - } + /// return whether the iterator can be dereferenced + constexpr bool is_begin() const noexcept + { + return (m_it == begin_value); + } - /// return whether the iterator is at end - constexpr bool is_end() const noexcept - { - return (m_it == end_value); - } + /// return whether the iterator is at end + constexpr bool is_end() const noexcept + { + return (m_it == end_value); + } - /// return reference to the value to change and compare - operator difference_type& () noexcept - { - return m_it; - } + /// return reference to the value to change and compare + operator difference_type& () noexcept + { + return m_it; + } - /// return value to compare - constexpr operator difference_type () const noexcept - { - return m_it; - } + /// return value to compare + constexpr operator difference_type () const noexcept + { + return m_it; + } - private: - static constexpr difference_type begin_value = 0; - static constexpr difference_type end_value = begin_value + 1; + private: + static constexpr difference_type begin_value = 0; + static constexpr difference_type end_value = begin_value + 1; - /// iterator as signed integer type - difference_type m_it = std::numeric_limits::denorm_min(); - }; + /// iterator as signed integer type + difference_type m_it = std::numeric_limits::denorm_min(); + }; - /*! + /*! @brief an iterator value @note This structure could easily be a union, but MSVC currently does not allow unions members with complex constructors, see https://github.com/nlohmann/json/pull/105. */ - struct internal_iterator - { - /// iterator for JSON objects - typename object_t::iterator object_iterator; - /// iterator for JSON arrays - typename array_t::iterator array_iterator; - /// generic iterator for all other types - primitive_iterator_t primitive_iterator; - - /// create an uninitialized internal_iterator - internal_iterator() noexcept - : object_iterator(), array_iterator(), primitive_iterator() - {} - }; + struct internal_iterator + { + /// iterator for JSON objects + typename object_t::iterator object_iterator; + /// iterator for JSON arrays + typename array_t::iterator array_iterator; + /// generic iterator for all other types + primitive_iterator_t primitive_iterator; - /// proxy class for the iterator_wrapper functions - template - class iteration_proxy - { - private: - /// helper class for iteration - class iteration_proxy_internal - { - private: - /// the iterator - IteratorType anchor; - /// an index for arrays (used to create key names) - size_t array_index = 0; - - public: - explicit iteration_proxy_internal(IteratorType it) noexcept - : anchor(it) + /// create an uninitialized internal_iterator + internal_iterator() noexcept + : object_iterator(), array_iterator(), primitive_iterator() {} + }; - /// dereference operator (needed for range-based for) - iteration_proxy_internal& operator*() + /// proxy class for the iterator_wrapper functions + template + class iteration_proxy + { + private: + /// helper class for iteration + class iteration_proxy_internal { - return *this; - } + private: + /// the iterator + IteratorType anchor; + /// an index for arrays (used to create key names) + size_t array_index = 0; - /// increment operator (needed for range-based for) - iteration_proxy_internal& operator++() - { - ++anchor; - ++array_index; + public: + explicit iteration_proxy_internal(IteratorType it) noexcept + : anchor(it) + {} - return *this; - } + /// dereference operator (needed for range-based for) + iteration_proxy_internal& operator*() + { + return *this; + } - /// inequality operator (needed for range-based for) - bool operator!= (const iteration_proxy_internal& o) const - { - return anchor != o.anchor; - } + /// increment operator (needed for range-based for) + iteration_proxy_internal& operator++() + { + ++anchor; + ++array_index; - /// return key of the iterator - typename basic_json::string_t key() const - { - assert(anchor.m_object != nullptr); + return *this; + } - switch (anchor.m_object->type()) + /// inequality operator (needed for range-based for) + bool operator!= (const iteration_proxy_internal& o) const { - // use integer array index as key - case value_t::array: - { - return std::to_string(array_index); - } + return anchor != o.anchor; + } - // use key from the object - case value_t::object: - { - return anchor.key(); - } + /// return key of the iterator + typename basic_json::string_t key() const + { + assert(anchor.m_object != nullptr); - // use an empty key for all primitive types - default: + switch (anchor.m_object->type()) { - return ""; + // use integer array index as key + case value_t::array: + { + return std::to_string(array_index); + } + + // use key from the object + case value_t::object: + { + return anchor.key(); + } + + // use an empty key for all primitive types + default: + { + return ""; + } } } + + /// return value of the iterator + typename IteratorType::reference value() const + { + return anchor.value(); + } + }; + + /// the container to iterate + typename IteratorType::reference container; + + public: + /// construct iteration proxy from a container + explicit iteration_proxy(typename IteratorType::reference cont) + : container(cont) + {} + + /// return iterator begin (needed for range-based for) + iteration_proxy_internal begin() noexcept + { + return iteration_proxy_internal(container.begin()); } - /// return value of the iterator - typename IteratorType::reference value() const + /// return iterator end (needed for range-based for) + iteration_proxy_internal end() noexcept { - return anchor.value(); + return iteration_proxy_internal(container.end()); } }; - /// the container to iterate - typename IteratorType::reference container; - - public: - /// construct iteration proxy from a container - explicit iteration_proxy(typename IteratorType::reference cont) - : container(cont) - {} - - /// return iterator begin (needed for range-based for) - iteration_proxy_internal begin() noexcept - { - return iteration_proxy_internal(container.begin()); - } - - /// return iterator end (needed for range-based for) - iteration_proxy_internal end() noexcept - { - return iteration_proxy_internal(container.end()); - } - }; - - public: - /*! + public: + /*! @brief a const random access iterator for the @ref basic_json class This class implements a const iterator for the @ref basic_json class. From this class, the @ref iterator class is derived. + @note An iterator is called *initialized* when a pointer to a JSON value + has been set (e.g., by a constructor or a copy assignment). If the + iterator is default-constructed, it is *uninitialized* and most + methods are undefined. **The library uses assertions to detect calls + on uninitialized iterators.** + @requirement The class satisfies the following concept requirements: - [RandomAccessIterator](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator): The iterator that can be moved to point (forward and backward) to any @@ -6478,539 +6712,615 @@ class basic_json @since version 1.0.0 */ - class const_iterator : public std::iterator - { - /// allow basic_json to access private members - friend class basic_json; - - public: - /// the type of the values when the iterator is dereferenced - using value_type = typename basic_json::value_type; - /// a type to represent differences between iterators - using difference_type = typename basic_json::difference_type; - /// defines a pointer to the type iterated over (value_type) - using pointer = typename basic_json::const_pointer; - /// defines a reference to the type iterated over (value_type) - using reference = typename basic_json::const_reference; - /// the category of the iterator - using iterator_category = std::bidirectional_iterator_tag; - - /// default constructor - const_iterator() = default; - - /// constructor for a given JSON instance - explicit const_iterator(pointer object) noexcept - : m_object(object) - { - assert(m_object != nullptr); - - switch (m_object->m_type) + class const_iterator : public std::iterator + { + /// allow basic_json to access private members + friend class basic_json; + + public: + /// the type of the values when the iterator is dereferenced + using value_type = typename basic_json::value_type; + /// a type to represent differences between iterators + using difference_type = typename basic_json::difference_type; + /// defines a pointer to the type iterated over (value_type) + using pointer = typename basic_json::const_pointer; + /// defines a reference to the type iterated over (value_type) + using reference = typename basic_json::const_reference; + /// the category of the iterator + using iterator_category = std::bidirectional_iterator_tag; + + /// default constructor + const_iterator() = default; + + /*! + @brief constructor for a given JSON instance + @param[in] object pointer to a JSON object for this iterator + @pre object != nullptr + @post The iterator is initialized; i.e. `m_object != nullptr`. + */ + explicit const_iterator(pointer object) noexcept + : m_object(object) { - case basic_json::value_t::object: - { - m_it.object_iterator = typename object_t::iterator(); - break; - } + assert(m_object != nullptr); - case basic_json::value_t::array: + switch (m_object->m_type) { - m_it.array_iterator = typename array_t::iterator(); - break; - } + case basic_json::value_t::object: + { + m_it.object_iterator = typename object_t::iterator(); + break; + } - default: - { - m_it.primitive_iterator = primitive_iterator_t(); - break; + case basic_json::value_t::array: + { + m_it.array_iterator = typename array_t::iterator(); + break; + } + + default: + { + m_it.primitive_iterator = primitive_iterator_t(); + break; + } } } - } - - /// copy constructor given a nonconst iterator - explicit const_iterator(const iterator& other) noexcept - : m_object(other.m_object) - { - assert(m_object != nullptr); - switch (m_object->m_type) + /*! + @brief copy constructor given a non-const iterator + @param[in] other iterator to copy from + @note It is not checked whether @a other is initialized. + */ + explicit const_iterator(const iterator& other) noexcept + : m_object(other.m_object) { - case basic_json::value_t::object: + if (m_object != nullptr) { - m_it.object_iterator = other.m_it.object_iterator; - break; - } + switch (m_object->m_type) + { + case basic_json::value_t::object: + { + m_it.object_iterator = other.m_it.object_iterator; + break; + } - case basic_json::value_t::array: - { - m_it.array_iterator = other.m_it.array_iterator; - break; - } + case basic_json::value_t::array: + { + m_it.array_iterator = other.m_it.array_iterator; + break; + } - default: - { - m_it.primitive_iterator = other.m_it.primitive_iterator; - break; + default: + { + m_it.primitive_iterator = other.m_it.primitive_iterator; + break; + } + } } } - } - /// copy constructor - const_iterator(const const_iterator& other) noexcept - : m_object(other.m_object), m_it(other.m_it) - {} + /*! + @brief copy constructor + @param[in] other iterator to copy from + @note It is not checked whether @a other is initialized. + */ + const_iterator(const const_iterator& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} - /// copy assignment - const_iterator& operator=(const_iterator other) noexcept( + /*! + @brief copy assignment + @param[in,out] other iterator to copy from + @note It is not checked whether @a other is initialized. + */ + const_iterator& operator=(const_iterator other) noexcept( std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value - ) - { - std::swap(m_object, other.m_object); - std::swap(m_it, other.m_it); - return *this; - } - - private: - /// set the iterator to the first value - void set_begin() noexcept - { - assert(m_object != nullptr); + ) + { + std::swap(m_object, other.m_object); + std::swap(m_it, other.m_it); + return *this; + } - switch (m_object->m_type) + private: + /*! + @brief set the iterator to the first value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_begin() noexcept { - case basic_json::value_t::object: - { - assert(m_object->m_value.object != nullptr); - m_it.object_iterator = m_object->m_value.object->begin(); - break; - } + assert(m_object != nullptr); - case basic_json::value_t::array: + switch (m_object->m_type) { - assert(m_object->m_value.array != nullptr); - m_it.array_iterator = m_object->m_value.array->begin(); - break; - } + case basic_json::value_t::object: + { + m_it.object_iterator = m_object->m_value.object->begin(); + break; + } - case basic_json::value_t::null: - { - // set to end so begin()==end() is true: null is empty - m_it.primitive_iterator.set_end(); - break; - } + case basic_json::value_t::array: + { + m_it.array_iterator = m_object->m_value.array->begin(); + break; + } - default: - { - m_it.primitive_iterator.set_begin(); - break; + case basic_json::value_t::null: + { + // set to end so begin()==end() is true: null is empty + m_it.primitive_iterator.set_end(); + break; + } + + default: + { + m_it.primitive_iterator.set_begin(); + break; + } } } - } - /// set the iterator past the last value - void set_end() noexcept - { - assert(m_object != nullptr); - - switch (m_object->m_type) + /*! + @brief set the iterator past the last value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_end() noexcept { - case basic_json::value_t::object: - { - assert(m_object->m_value.object != nullptr); - m_it.object_iterator = m_object->m_value.object->end(); - break; - } + assert(m_object != nullptr); - case basic_json::value_t::array: + switch (m_object->m_type) { - assert(m_object->m_value.array != nullptr); - m_it.array_iterator = m_object->m_value.array->end(); - break; - } + case basic_json::value_t::object: + { + m_it.object_iterator = m_object->m_value.object->end(); + break; + } - default: - { - m_it.primitive_iterator.set_end(); - break; + case basic_json::value_t::array: + { + m_it.array_iterator = m_object->m_value.array->end(); + break; + } + + default: + { + m_it.primitive_iterator.set_end(); + break; + } } } - } - - public: - /// return a reference to the value pointed to by the iterator - reference operator*() const - { - assert(m_object != nullptr); - switch (m_object->m_type) + public: + /*! + @brief return a reference to the value pointed to by the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator*() const { - case basic_json::value_t::object: - { - assert(m_object->m_value.object); - assert(m_it.object_iterator != m_object->m_value.object->end()); - return m_it.object_iterator->second; - } + assert(m_object != nullptr); - case basic_json::value_t::array: + switch (m_object->m_type) { - assert(m_object->m_value.array); - assert(m_it.array_iterator != m_object->m_value.array->end()); - return *m_it.array_iterator; - } - - case basic_json::value_t::null: - { - throw std::out_of_range("cannot get value"); - } + case basic_json::value_t::object: + { + assert(m_it.object_iterator != m_object->m_value.object->end()); + return m_it.object_iterator->second; + } - default: - { - if (m_it.primitive_iterator.is_begin()) + case basic_json::value_t::array: { - return *m_object; + assert(m_it.array_iterator != m_object->m_value.array->end()); + return *m_it.array_iterator; } - else + + case basic_json::value_t::null: { throw std::out_of_range("cannot get value"); } + + default: + { + if (m_it.primitive_iterator.is_begin()) + { + return *m_object; + } + else + { + throw std::out_of_range("cannot get value"); + } + } } } - } - /// dereference the iterator - pointer operator->() const - { - assert(m_object != nullptr); - - switch (m_object->m_type) + /*! + @brief dereference the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + pointer operator->() const { - case basic_json::value_t::object: - { - assert(m_object->m_value.object); - assert(m_it.object_iterator != m_object->m_value.object->end()); - return &(m_it.object_iterator->second); - } + assert(m_object != nullptr); - case basic_json::value_t::array: + switch (m_object->m_type) { - assert(m_object->m_value.array); - assert(m_it.array_iterator != m_object->m_value.array->end()); - return &*m_it.array_iterator; - } + case basic_json::value_t::object: + { + assert(m_it.object_iterator != m_object->m_value.object->end()); + return &(m_it.object_iterator->second); + } - default: - { - if (m_it.primitive_iterator.is_begin()) + case basic_json::value_t::array: { - return m_object; + assert(m_it.array_iterator != m_object->m_value.array->end()); + return &*m_it.array_iterator; } - else + + default: { - throw std::out_of_range("cannot get value"); + if (m_it.primitive_iterator.is_begin()) + { + return m_object; + } + else + { + throw std::out_of_range("cannot get value"); + } } } } - } - /// post-increment (it++) - const_iterator operator++(int) - { - auto result = *this; - ++(*this); - return result; - } - - /// pre-increment (++it) - const_iterator& operator++() - { - assert(m_object != nullptr); + /*! + @brief post-increment (it++) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const_iterator operator++(int) + { + auto result = *this; + ++(*this); + return result; + } - switch (m_object->m_type) + /*! + @brief pre-increment (++it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const_iterator& operator++() { - case basic_json::value_t::object: - { - ++m_it.object_iterator; - break; - } + assert(m_object != nullptr); - case basic_json::value_t::array: + switch (m_object->m_type) { - ++m_it.array_iterator; - break; - } + case basic_json::value_t::object: + { + std::advance(m_it.object_iterator, 1); + break; + } - default: - { - ++m_it.primitive_iterator; - break; - } - } + case basic_json::value_t::array: + { + std::advance(m_it.array_iterator, 1); + break; + } - return *this; - } + default: + { + ++m_it.primitive_iterator; + break; + } + } - /// post-decrement (it--) - const_iterator operator--(int) - { - auto result = *this; - --(*this); - return result; - } + return *this; + } - /// pre-decrement (--it) - const_iterator& operator--() - { - assert(m_object != nullptr); + /*! + @brief post-decrement (it--) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const_iterator operator--(int) + { + auto result = *this; + --(*this); + return result; + } - switch (m_object->m_type) + /*! + @brief pre-decrement (--it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const_iterator& operator--() { - case basic_json::value_t::object: + assert(m_object != nullptr); + + switch (m_object->m_type) { - --m_it.object_iterator; - break; + case basic_json::value_t::object: + { + std::advance(m_it.object_iterator, -1); + break; + } + + case basic_json::value_t::array: + { + std::advance(m_it.array_iterator, -1); + break; + } + + default: + { + --m_it.primitive_iterator; + break; + } } - case basic_json::value_t::array: + return *this; + } + + /*! + @brief comparison: equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator==(const const_iterator& other) const + { + // if objects are not the same, the comparison is undefined + if (m_object != other.m_object) { - --m_it.array_iterator; - break; + throw std::domain_error("cannot compare iterators of different containers"); } - default: + assert(m_object != nullptr); + + switch (m_object->m_type) { - --m_it.primitive_iterator; - break; + case basic_json::value_t::object: + { + return (m_it.object_iterator == other.m_it.object_iterator); + } + + case basic_json::value_t::array: + { + return (m_it.array_iterator == other.m_it.array_iterator); + } + + default: + { + return (m_it.primitive_iterator == other.m_it.primitive_iterator); + } } } - return *this; - } - - /// comparison: equal - bool operator==(const const_iterator& other) const - { - // if objects are not the same, the comparison is undefined - if (m_object != other.m_object) + /*! + @brief comparison: not equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator!=(const const_iterator& other) const { - throw std::domain_error("cannot compare iterators of different containers"); + return not operator==(other); } - assert(m_object != nullptr); - - switch (m_object->m_type) + /*! + @brief comparison: smaller + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<(const const_iterator& other) const { - case basic_json::value_t::object: + // if objects are not the same, the comparison is undefined + if (m_object != other.m_object) { - return (m_it.object_iterator == other.m_it.object_iterator); + throw std::domain_error("cannot compare iterators of different containers"); } - case basic_json::value_t::array: - { - return (m_it.array_iterator == other.m_it.array_iterator); - } + assert(m_object != nullptr); - default: + switch (m_object->m_type) { - return (m_it.primitive_iterator == other.m_it.primitive_iterator); - } - } - } + case basic_json::value_t::object: + { + throw std::domain_error("cannot compare order of object iterators"); + } - /// comparison: not equal - bool operator!=(const const_iterator& other) const - { - return not operator==(other); - } + case basic_json::value_t::array: + { + return (m_it.array_iterator < other.m_it.array_iterator); + } - /// comparison: smaller - bool operator<(const const_iterator& other) const - { - // if objects are not the same, the comparison is undefined - if (m_object != other.m_object) - { - throw std::domain_error("cannot compare iterators of different containers"); + default: + { + return (m_it.primitive_iterator < other.m_it.primitive_iterator); + } + } } - assert(m_object != nullptr); - - switch (m_object->m_type) + /*! + @brief comparison: less than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<=(const const_iterator& other) const { - case basic_json::value_t::object: - { - throw std::domain_error("cannot compare order of object iterators"); - } - - case basic_json::value_t::array: - { - return (m_it.array_iterator < other.m_it.array_iterator); - } - - default: - { - return (m_it.primitive_iterator < other.m_it.primitive_iterator); - } + return not other.operator < (*this); } - } - - /// comparison: less than or equal - bool operator<=(const const_iterator& other) const - { - return not other.operator < (*this); - } - /// comparison: greater than - bool operator>(const const_iterator& other) const - { - return not operator<=(other); - } - - /// comparison: greater than or equal - bool operator>=(const const_iterator& other) const - { - return not operator<(other); - } + /*! + @brief comparison: greater than + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>(const const_iterator& other) const + { + return not operator<=(other); + } - /// add to iterator - const_iterator& operator+=(difference_type i) - { - assert(m_object != nullptr); + /*! + @brief comparison: greater than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>=(const const_iterator& other) const + { + return not operator<(other); + } - switch (m_object->m_type) + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const_iterator& operator+=(difference_type i) { - case basic_json::value_t::object: - { - throw std::domain_error("cannot use offsets with object iterators"); - } + assert(m_object != nullptr); - case basic_json::value_t::array: + switch (m_object->m_type) { - m_it.array_iterator += i; - break; - } + case basic_json::value_t::object: + { + throw std::domain_error("cannot use offsets with object iterators"); + } - default: - { - m_it.primitive_iterator += i; - break; - } - } + case basic_json::value_t::array: + { + std::advance(m_it.array_iterator, i); + break; + } - return *this; - } + default: + { + m_it.primitive_iterator += i; + break; + } + } - /// subtract from iterator - const_iterator& operator-=(difference_type i) - { - return operator+=(-i); - } + return *this; + } - /// add to iterator - const_iterator operator+(difference_type i) - { - auto result = *this; - result += i; - return result; - } + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const_iterator& operator-=(difference_type i) + { + return operator+=(-i); + } - /// subtract from iterator - const_iterator operator-(difference_type i) - { - auto result = *this; - result -= i; - return result; - } + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const_iterator operator+(difference_type i) + { + auto result = *this; + result += i; + return result; + } - /// return difference - difference_type operator-(const const_iterator& other) const - { - assert(m_object != nullptr); + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const_iterator operator-(difference_type i) + { + auto result = *this; + result -= i; + return result; + } - switch (m_object->m_type) + /*! + @brief return difference + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + difference_type operator-(const const_iterator& other) const { - case basic_json::value_t::object: - { - throw std::domain_error("cannot use offsets with object iterators"); - } + assert(m_object != nullptr); - case basic_json::value_t::array: + switch (m_object->m_type) { - return m_it.array_iterator - other.m_it.array_iterator; - } + case basic_json::value_t::object: + { + throw std::domain_error("cannot use offsets with object iterators"); + } - default: - { - return m_it.primitive_iterator - other.m_it.primitive_iterator; + case basic_json::value_t::array: + { + return m_it.array_iterator - other.m_it.array_iterator; + } + + default: + { + return m_it.primitive_iterator - other.m_it.primitive_iterator; + } } } - } - - /// access to successor - reference operator[](difference_type n) const - { - assert(m_object != nullptr); - switch (m_object->m_type) + /*! + @brief access to successor + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator[](difference_type n) const { - case basic_json::value_t::object: - { - throw std::domain_error("cannot use operator[] for object iterators"); - } + assert(m_object != nullptr); - case basic_json::value_t::array: + switch (m_object->m_type) { - return *(m_it.array_iterator + n); - } - - case basic_json::value_t::null: - { - throw std::out_of_range("cannot get value"); - } + case basic_json::value_t::object: + { + throw std::domain_error("cannot use operator[] for object iterators"); + } - default: - { - if (m_it.primitive_iterator == -n) + case basic_json::value_t::array: { - return *m_object; + return *std::next(m_it.array_iterator, n); } - else + + case basic_json::value_t::null: { throw std::out_of_range("cannot get value"); } + + default: + { + if (m_it.primitive_iterator == -n) + { + return *m_object; + } + else + { + throw std::out_of_range("cannot get value"); + } + } } } - } - /// return the key of an object iterator - typename object_t::key_type key() const - { - assert(m_object != nullptr); - - if (m_object->is_object()) + /*! + @brief return the key of an object iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + typename object_t::key_type key() const { - return m_it.object_iterator->first; + assert(m_object != nullptr); + + if (m_object->is_object()) + { + return m_it.object_iterator->first; + } + else + { + throw std::domain_error("cannot use key() for non-object iterators"); + } } - else + + /*! + @brief return the value of an iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference value() const { - throw std::domain_error("cannot use key() for non-object iterators"); + return operator*(); } - } - - /// return the value of an iterator - reference value() const - { - return operator*(); - } - private: - /// associated JSON instance - pointer m_object = nullptr; - /// the actual iterator of the associated instance - internal_iterator m_it = internal_iterator(); - }; + private: + /// associated JSON instance + pointer m_object = nullptr; + /// the actual iterator of the associated instance + internal_iterator m_it = internal_iterator(); + }; - /*! + /*! @brief a mutable random access iterator for the @ref basic_json class @requirement The class satisfies the following concept requirements: @@ -7022,130 +7332,130 @@ class basic_json @since version 1.0.0 */ - class iterator : public const_iterator - { - public: - using base_iterator = const_iterator; - using pointer = typename basic_json::pointer; - using reference = typename basic_json::reference; - - /// default constructor - iterator() = default; - - /// constructor for a given JSON instance - explicit iterator(pointer object) noexcept - : base_iterator(object) - {} - - /// copy constructor - iterator(const iterator& other) noexcept - : base_iterator(other) - {} - - /// copy assignment - iterator& operator=(iterator other) noexcept( + class iterator : public const_iterator + { + public: + using base_iterator = const_iterator; + using pointer = typename basic_json::pointer; + using reference = typename basic_json::reference; + + /// default constructor + iterator() = default; + + /// constructor for a given JSON instance + explicit iterator(pointer object) noexcept + : base_iterator(object) + {} + + /// copy constructor + iterator(const iterator& other) noexcept + : base_iterator(other) + {} + + /// copy assignment + iterator& operator=(iterator other) noexcept( std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value - ) - { - base_iterator::operator=(other); - return *this; - } + ) + { + base_iterator::operator=(other); + return *this; + } - /// return a reference to the value pointed to by the iterator - reference operator*() const - { - return const_cast(base_iterator::operator*()); - } + /// return a reference to the value pointed to by the iterator + reference operator*() const + { + return const_cast(base_iterator::operator*()); + } - /// dereference the iterator - pointer operator->() const - { - return const_cast(base_iterator::operator->()); - } + /// dereference the iterator + pointer operator->() const + { + return const_cast(base_iterator::operator->()); + } - /// post-increment (it++) - iterator operator++(int) - { - iterator result = *this; - base_iterator::operator++(); - return result; - } + /// post-increment (it++) + iterator operator++(int) + { + iterator result = *this; + base_iterator::operator++(); + return result; + } - /// pre-increment (++it) - iterator& operator++() - { - base_iterator::operator++(); - return *this; - } + /// pre-increment (++it) + iterator& operator++() + { + base_iterator::operator++(); + return *this; + } - /// post-decrement (it--) - iterator operator--(int) - { - iterator result = *this; - base_iterator::operator--(); - return result; - } + /// post-decrement (it--) + iterator operator--(int) + { + iterator result = *this; + base_iterator::operator--(); + return result; + } - /// pre-decrement (--it) - iterator& operator--() - { - base_iterator::operator--(); - return *this; - } + /// pre-decrement (--it) + iterator& operator--() + { + base_iterator::operator--(); + return *this; + } - /// add to iterator - iterator& operator+=(difference_type i) - { - base_iterator::operator+=(i); - return *this; - } + /// add to iterator + iterator& operator+=(difference_type i) + { + base_iterator::operator+=(i); + return *this; + } - /// subtract from iterator - iterator& operator-=(difference_type i) - { - base_iterator::operator-=(i); - return *this; - } + /// subtract from iterator + iterator& operator-=(difference_type i) + { + base_iterator::operator-=(i); + return *this; + } - /// add to iterator - iterator operator+(difference_type i) - { - auto result = *this; - result += i; - return result; - } + /// add to iterator + iterator operator+(difference_type i) + { + auto result = *this; + result += i; + return result; + } - /// subtract from iterator - iterator operator-(difference_type i) - { - auto result = *this; - result -= i; - return result; - } + /// subtract from iterator + iterator operator-(difference_type i) + { + auto result = *this; + result -= i; + return result; + } - /// return difference - difference_type operator-(const iterator& other) const - { - return base_iterator::operator-(other); - } + /// return difference + difference_type operator-(const iterator& other) const + { + return base_iterator::operator-(other); + } - /// access to successor - reference operator[](difference_type n) const - { - return const_cast(base_iterator::operator[](n)); - } + /// access to successor + reference operator[](difference_type n) const + { + return const_cast(base_iterator::operator[](n)); + } - /// return the value of an iterator - reference value() const - { - return const_cast(base_iterator::value()); - } - }; + /// return the value of an iterator + reference value() const + { + return const_cast(base_iterator::value()); + } + }; - /*! + /*! @brief a template for a reverse iterator class @tparam Base the base iterator type to reverse. Valid types are @ref @@ -7162,289 +7472,298 @@ class basic_json @since version 1.0.0 */ - template - class json_reverse_iterator : public std::reverse_iterator - { - public: - /// shortcut to the reverse iterator adaptor - using base_iterator = std::reverse_iterator; - /// the reference type for the pointed-to element - using reference = typename Base::reference; + template + class json_reverse_iterator : public std::reverse_iterator + { + public: + /// shortcut to the reverse iterator adaptor + using base_iterator = std::reverse_iterator; + /// the reference type for the pointed-to element + using reference = typename Base::reference; - /// create reverse iterator from iterator - json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept - : base_iterator(it) - {} + /// create reverse iterator from iterator + json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept + : base_iterator(it) + {} - /// create reverse iterator from base class - json_reverse_iterator(const base_iterator& it) noexcept - : base_iterator(it) - {} + /// create reverse iterator from base class + json_reverse_iterator(const base_iterator& it) noexcept + : base_iterator(it) + {} - /// post-increment (it++) - json_reverse_iterator operator++(int) - { - return base_iterator::operator++(1); - } + /// post-increment (it++) + json_reverse_iterator operator++(int) + { + return base_iterator::operator++(1); + } - /// pre-increment (++it) - json_reverse_iterator& operator++() - { - base_iterator::operator++(); - return *this; - } + /// pre-increment (++it) + json_reverse_iterator& operator++() + { + base_iterator::operator++(); + return *this; + } - /// post-decrement (it--) - json_reverse_iterator operator--(int) - { - return base_iterator::operator--(1); - } + /// post-decrement (it--) + json_reverse_iterator operator--(int) + { + return base_iterator::operator--(1); + } - /// pre-decrement (--it) - json_reverse_iterator& operator--() - { - base_iterator::operator--(); - return *this; - } + /// pre-decrement (--it) + json_reverse_iterator& operator--() + { + base_iterator::operator--(); + return *this; + } - /// add to iterator - json_reverse_iterator& operator+=(difference_type i) - { - base_iterator::operator+=(i); - return *this; - } + /// add to iterator + json_reverse_iterator& operator+=(difference_type i) + { + base_iterator::operator+=(i); + return *this; + } - /// add to iterator - json_reverse_iterator operator+(difference_type i) const - { - auto result = *this; - result += i; - return result; - } + /// add to iterator + json_reverse_iterator operator+(difference_type i) const + { + auto result = *this; + result += i; + return result; + } - /// subtract from iterator - json_reverse_iterator operator-(difference_type i) const - { - auto result = *this; - result -= i; - return result; - } + /// subtract from iterator + json_reverse_iterator operator-(difference_type i) const + { + auto result = *this; + result -= i; + return result; + } - /// return difference - difference_type operator-(const json_reverse_iterator& other) const - { - return this->base() - other.base(); - } + /// return difference + difference_type operator-(const json_reverse_iterator& other) const + { + return this->base() - other.base(); + } - /// access to successor - reference operator[](difference_type n) const - { - return *(this->operator+(n)); - } + /// access to successor + reference operator[](difference_type n) const + { + return *(this->operator+(n)); + } - /// return the key of an object iterator - typename object_t::key_type key() const - { - auto it = --this->base(); - return it.key(); - } + /// return the key of an object iterator + typename object_t::key_type key() const + { + auto it = --this->base(); + return it.key(); + } - /// return the value of an iterator - reference value() const - { - auto it = --this->base(); - return it.operator * (); - } - }; + /// return the value of an iterator + reference value() const + { + auto it = --this->base(); + return it.operator * (); + } + }; - private: - ////////////////////// - // lexer and parser // - ////////////////////// + private: + ////////////////////// + // lexer and parser // + ////////////////////// - /*! + /*! @brief lexical analysis This class organizes the lexical analysis during JSON deserialization. The core of it is a scanner generated by [re2c](http://re2c.org) that processes a buffer and recognizes tokens according to RFC 7159. */ - class lexer - { - public: - /// token types for the parser - enum class token_type - { - uninitialized, ///< indicating the scanner is uninitialized - literal_true, ///< the "true" literal - literal_false, ///< the "false" literal - literal_null, ///< the "null" literal - value_string, ///< a string -- use get_string() for actual value - value_number, ///< a number -- use get_number() for actual value - begin_array, ///< the character for array begin "[" - begin_object, ///< the character for object begin "{" - end_array, ///< the character for array end "]" - end_object, ///< the character for object end "}" - name_separator, ///< the name separator ":" - value_separator, ///< the value separator "," - parse_error, ///< indicating a parse error - end_of_input ///< indicating the end of the input buffer - }; + class lexer + { + public: + /// token types for the parser + enum class token_type + { + uninitialized, ///< indicating the scanner is uninitialized + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal + value_string, ///< a string -- use get_string() for actual value + value_number, ///< a number -- use get_number() for actual value + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` + parse_error, ///< indicating a parse error + end_of_input ///< indicating the end of the input buffer + }; - /// the char type to use in the lexer - using lexer_char_t = unsigned char; + /// the char type to use in the lexer + using lexer_char_t = unsigned char; - /// constructor with a given buffer - explicit lexer(const string_t& s) noexcept - : m_stream(nullptr), m_buffer(s) - { - m_content = reinterpret_cast(s.c_str()); - assert(m_content != nullptr); - m_start = m_cursor = m_content; - m_limit = m_content + s.size(); - } + /// a lexer from a buffer with given length + lexer(const lexer_char_t* buff, const size_t len) noexcept + : m_content(buff) + { + assert(m_content != nullptr); + m_start = m_cursor = m_content; + m_limit = m_content + len; + } - /// constructor with a given stream - explicit lexer(std::istream* s) noexcept - : m_stream(s), m_buffer() - { - assert(m_stream != nullptr); - getline(*m_stream, m_buffer); - m_content = reinterpret_cast(m_buffer.c_str()); - assert(m_content != nullptr); - m_start = m_cursor = m_content; - m_limit = m_content + m_buffer.size(); - } + /// a lexer from an input stream + explicit lexer(std::istream& s) + : m_stream(&s), m_line_buffer() + { + // fill buffer + fill_line_buffer(); - /// default constructor - lexer() = default; + // skip UTF-8 byte-order mark + if (m_line_buffer.size() >= 3 and m_line_buffer.substr(0, 3) == "\xEF\xBB\xBF") + { + m_line_buffer[0] = ' '; + m_line_buffer[1] = ' '; + m_line_buffer[2] = ' '; + } + } - // switch off unwanted functions - lexer(const lexer&) = delete; - lexer operator=(const lexer&) = delete; + // switch off unwanted functions (due to pointer members) + lexer() = delete; + lexer(const lexer&) = delete; + lexer operator=(const lexer&) = delete; - /*! - @brief create a string from a Unicode code point + /*! + @brief create a string from one or two Unicode code points + + There are two cases: (1) @a codepoint1 is in the Basic Multilingual + Plane (U+0000 through U+FFFF) and @a codepoint2 is 0, or (2) + @a codepoint1 and @a codepoint2 are a UTF-16 surrogate pair to + represent a code point above U+FFFF. @param[in] codepoint1 the code point (can be high surrogate) @param[in] codepoint2 the code point (can be low surrogate or 0) - @return string representation of the code point + @return string representation of the code point; the length of the + result string is between 1 and 4 characters. - @throw std::out_of_range if code point is >0x10ffff; example: `"code + @throw std::out_of_range if code point is > 0x10ffff; example: `"code points above 0x10FFFF are invalid"` @throw std::invalid_argument if the low surrogate is invalid; example: `""missing or wrong low surrogate""` + @complexity Constant. + @see */ - static string_t to_unicode(const std::size_t codepoint1, - const std::size_t codepoint2 = 0) - { - // calculate the codepoint from the given code points - std::size_t codepoint = codepoint1; - - // check if codepoint1 is a high surrogate - if (codepoint1 >= 0xD800 and codepoint1 <= 0xDBFF) + static string_t to_unicode(const std::size_t codepoint1, + const std::size_t codepoint2 = 0) { - // check if codepoint2 is a low surrogate - if (codepoint2 >= 0xDC00 and codepoint2 <= 0xDFFF) + // calculate the code point from the given code points + std::size_t codepoint = codepoint1; + + // check if codepoint1 is a high surrogate + if (codepoint1 >= 0xD800 and codepoint1 <= 0xDBFF) + { + // check if codepoint2 is a low surrogate + if (codepoint2 >= 0xDC00 and codepoint2 <= 0xDFFF) + { + codepoint = + // high surrogate occupies the most significant 22 bits + (codepoint1 << 10) + // low surrogate occupies the least significant 15 bits + + codepoint2 + // there is still the 0xD800, 0xDC00 and 0x10000 noise + // in the result so we have to subtract with: + // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 + - 0x35FDC00; + } + else + { + throw std::invalid_argument("missing or wrong low surrogate"); + } + } + + string_t result; + + if (codepoint < 0x80) + { + // 1-byte characters: 0xxxxxxx (ASCII) + result.append(1, static_cast(codepoint)); + } + else if (codepoint <= 0x7ff) { - codepoint = - // high surrogate occupies the most significant 22 bits - (codepoint1 << 10) - // low surrogate occupies the least significant 15 bits - + codepoint2 - // there is still the 0xD800, 0xDC00 and 0x10000 noise - // in the result so we have to subtract with: - // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 - - 0x35FDC00; + // 2-byte characters: 110xxxxx 10xxxxxx + result.append(1, static_cast(0xC0 | ((codepoint >> 6) & 0x1F))); + result.append(1, static_cast(0x80 | (codepoint & 0x3F))); + } + else if (codepoint <= 0xffff) + { + // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx + result.append(1, static_cast(0xE0 | ((codepoint >> 12) & 0x0F))); + result.append(1, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + result.append(1, static_cast(0x80 | (codepoint & 0x3F))); + } + else if (codepoint <= 0x10ffff) + { + // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + result.append(1, static_cast(0xF0 | ((codepoint >> 18) & 0x07))); + result.append(1, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + result.append(1, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + result.append(1, static_cast(0x80 | (codepoint & 0x3F))); } else { - throw std::invalid_argument("missing or wrong low surrogate"); + throw std::out_of_range("code points above 0x10FFFF are invalid"); } - } - - string_t result; - if (codepoint < 0x80) - { - // 1-byte characters: 0xxxxxxx (ASCII) - result.append(1, static_cast(codepoint)); - } - else if (codepoint <= 0x7ff) - { - // 2-byte characters: 110xxxxx 10xxxxxx - result.append(1, static_cast(0xC0 | ((codepoint >> 6) & 0x1F))); - result.append(1, static_cast(0x80 | (codepoint & 0x3F))); - } - else if (codepoint <= 0xffff) - { - // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx - result.append(1, static_cast(0xE0 | ((codepoint >> 12) & 0x0F))); - result.append(1, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); - result.append(1, static_cast(0x80 | (codepoint & 0x3F))); - } - else if (codepoint <= 0x10ffff) - { - // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - result.append(1, static_cast(0xF0 | ((codepoint >> 18) & 0x07))); - result.append(1, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); - result.append(1, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); - result.append(1, static_cast(0x80 | (codepoint & 0x3F))); - } - else - { - throw std::out_of_range("code points above 0x10FFFF are invalid"); + return result; } - return result; - } - - /// return name of values of type token_type (only used for errors) - static std::string token_type_name(token_type t) - { - switch (t) - { - case token_type::uninitialized: - return ""; - case token_type::literal_true: - return "true literal"; - case token_type::literal_false: - return "false literal"; - case token_type::literal_null: - return "null literal"; - case token_type::value_string: - return "string literal"; - case token_type::value_number: - return "number literal"; - case token_type::begin_array: - return "'['"; - case token_type::begin_object: - return "'{'"; - case token_type::end_array: - return "']'"; - case token_type::end_object: - return "'}'"; - case token_type::name_separator: - return "':'"; - case token_type::value_separator: - return "','"; - case token_type::parse_error: - return ""; - case token_type::end_of_input: - return "end of input"; - default: - { - // catch non-enum values - return "unknown token"; // LCOV_EXCL_LINE + /// return name of values of type token_type (only used for errors) + static std::string token_type_name(const token_type t) + { + switch (t) + { + case token_type::uninitialized: + return ""; + case token_type::literal_true: + return "true literal"; + case token_type::literal_false: + return "false literal"; + case token_type::literal_null: + return "null literal"; + case token_type::value_string: + return "string literal"; + case token_type::value_number: + return "number literal"; + case token_type::begin_array: + return "'['"; + case token_type::begin_object: + return "'{'"; + case token_type::end_array: + return "']'"; + case token_type::end_object: + return "'}'"; + case token_type::name_separator: + return "':'"; + case token_type::value_separator: + return "','"; + case token_type::parse_error: + return ""; + case token_type::end_of_input: + return "end of input"; + default: + { + // catch non-enum values + return "unknown token"; // LCOV_EXCL_LINE + } } } - } - /*! + /*! This function implements a scanner for JSON. It is specified using regular expressions that try to follow RFC 7159 as close as possible. These regular expressions are then translated into a minimized @@ -7453,806 +7772,1029 @@ class basic_json function consists of a large block of code with `goto` jumps. @return the class of the next token read from the buffer + + @complexity Linear in the length of the input.\n + + Proposition: The loop below will always terminate for finite input.\n + + Proof (by contradiction): Assume a finite input. To loop forever, the + loop must never hit code with a `break` statement. The only code + snippets without a `break` statement are the continue statements for + whitespace and byte-order-marks. To loop forever, the input must be an + infinite sequence of whitespace or byte-order-marks. This contradicts + the assumption of finite input, q.e.d. */ - token_type scan() noexcept - { - // pointer for backtracking information - m_marker = nullptr; - - // remember the begin of the token - m_start = m_cursor; - assert(m_start != nullptr); - - - { - lexer_char_t yych; - unsigned int yyaccept = 0; - static const unsigned char yybm[] = - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 32, 0, 0, 32, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 160, 128, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 0, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - if ((m_limit - m_cursor) < 5) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yybm[0 + yych] & 32) - { - goto basic_json_parser_6; - } - if (yych <= '\\') + token_type scan() + { + while (true) { - if (yych <= '-') + // pointer for backtracking information + m_marker = nullptr; + + // remember the begin of the token + m_start = m_cursor; + assert(m_start != nullptr); + + { - if (yych <= '"') + lexer_char_t yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 160, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 0, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + if ((m_limit - m_cursor) < 5) { - if (yych <= 0x00) + fill_line_buffer(5); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yybm[0 + yych] & 32) + { + goto basic_json_parser_6; + } + if (yych <= '[') + { + if (yych <= '-') { - goto basic_json_parser_2; + if (yych <= '"') + { + if (yych <= 0x00) + { + goto basic_json_parser_2; + } + if (yych <= '!') + { + goto basic_json_parser_4; + } + goto basic_json_parser_9; + } + else + { + if (yych <= '+') + { + goto basic_json_parser_4; + } + if (yych <= ',') + { + goto basic_json_parser_10; + } + goto basic_json_parser_12; + } } - if (yych <= '!') + else { - goto basic_json_parser_4; + if (yych <= '9') + { + if (yych <= '/') + { + goto basic_json_parser_4; + } + if (yych <= '0') + { + goto basic_json_parser_13; + } + goto basic_json_parser_15; + } + else + { + if (yych <= ':') + { + goto basic_json_parser_17; + } + if (yych <= 'Z') + { + goto basic_json_parser_4; + } + goto basic_json_parser_19; + } } - goto basic_json_parser_9; } else { - if (yych <= '+') + if (yych <= 'n') { - goto basic_json_parser_4; + if (yych <= 'e') + { + if (yych == ']') + { + goto basic_json_parser_21; + } + goto basic_json_parser_4; + } + else + { + if (yych <= 'f') + { + goto basic_json_parser_23; + } + if (yych <= 'm') + { + goto basic_json_parser_4; + } + goto basic_json_parser_24; + } } - if (yych <= ',') + else { - goto basic_json_parser_10; + if (yych <= 'z') + { + if (yych == 't') + { + goto basic_json_parser_25; + } + goto basic_json_parser_4; + } + else + { + if (yych <= '{') + { + goto basic_json_parser_26; + } + if (yych == '}') + { + goto basic_json_parser_28; + } + goto basic_json_parser_4; + } } - goto basic_json_parser_12; } - } - else - { + basic_json_parser_2: + ++m_cursor; + { + last_token_type = token_type::end_of_input; + break; + } + basic_json_parser_4: + ++m_cursor; + basic_json_parser_5: + { + last_token_type = token_type::parse_error; + break; + } + basic_json_parser_6: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yybm[0 + yych] & 32) + { + goto basic_json_parser_6; + } + { + continue; + } + basic_json_parser_9: + yyaccept = 0; + yych = *(m_marker = ++m_cursor); + if (yych <= 0x1F) + { + goto basic_json_parser_5; + } + if (yych <= 0x7F) + { + goto basic_json_parser_31; + } + if (yych <= 0xC1) + { + goto basic_json_parser_5; + } + if (yych <= 0xF4) + { + goto basic_json_parser_31; + } + goto basic_json_parser_5; + basic_json_parser_10: + ++m_cursor; + { + last_token_type = token_type::value_separator; + break; + } + basic_json_parser_12: + yych = *++m_cursor; + if (yych <= '/') + { + goto basic_json_parser_5; + } + if (yych <= '0') + { + goto basic_json_parser_13; + } if (yych <= '9') { - if (yych <= '/') - { - goto basic_json_parser_4; - } - if (yych <= '0') + goto basic_json_parser_15; + } + goto basic_json_parser_5; + basic_json_parser_13: + yyaccept = 1; + yych = *(m_marker = ++m_cursor); + if (yych <= 'D') + { + if (yych == '.') { - goto basic_json_parser_13; + goto basic_json_parser_43; } - goto basic_json_parser_15; } else { - if (yych <= ':') + if (yych <= 'E') { - goto basic_json_parser_17; + goto basic_json_parser_44; } - if (yych == '[') + if (yych == 'e') { - goto basic_json_parser_19; + goto basic_json_parser_44; } - goto basic_json_parser_4; } - } - } - else - { - if (yych <= 't') - { - if (yych <= 'f') + basic_json_parser_14: { - if (yych <= ']') - { - goto basic_json_parser_21; - } - if (yych <= 'e') + last_token_type = token_type::value_number; + break; + } + basic_json_parser_15: + yyaccept = 1; + m_marker = ++m_cursor; + if ((m_limit - m_cursor) < 3) + { + fill_line_buffer(3); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yybm[0 + yych] & 64) + { + goto basic_json_parser_15; + } + if (yych <= 'D') + { + if (yych == '.') { - goto basic_json_parser_4; + goto basic_json_parser_43; } - goto basic_json_parser_23; + goto basic_json_parser_14; } else { - if (yych == 'n') + if (yych <= 'E') { - goto basic_json_parser_24; + goto basic_json_parser_44; } - if (yych <= 's') + if (yych == 'e') { - goto basic_json_parser_4; + goto basic_json_parser_44; } - goto basic_json_parser_25; + goto basic_json_parser_14; } - } - else - { - if (yych <= '|') + basic_json_parser_17: + ++m_cursor; + { + last_token_type = token_type::name_separator; + break; + } + basic_json_parser_19: + ++m_cursor; + { + last_token_type = token_type::begin_array; + break; + } + basic_json_parser_21: + ++m_cursor; + { + last_token_type = token_type::end_array; + break; + } + basic_json_parser_23: + yyaccept = 0; + yych = *(m_marker = ++m_cursor); + if (yych == 'a') + { + goto basic_json_parser_45; + } + goto basic_json_parser_5; + basic_json_parser_24: + yyaccept = 0; + yych = *(m_marker = ++m_cursor); + if (yych == 'u') { - if (yych == '{') + goto basic_json_parser_46; + } + goto basic_json_parser_5; + basic_json_parser_25: + yyaccept = 0; + yych = *(m_marker = ++m_cursor); + if (yych == 'r') + { + goto basic_json_parser_47; + } + goto basic_json_parser_5; + basic_json_parser_26: + ++m_cursor; + { + last_token_type = token_type::begin_object; + break; + } + basic_json_parser_28: + ++m_cursor; + { + last_token_type = token_type::end_object; + break; + } + basic_json_parser_30: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + basic_json_parser_31: + if (yybm[0 + yych] & 128) + { + goto basic_json_parser_30; + } + if (yych <= 0xE0) + { + if (yych <= '\\') + { + if (yych <= 0x1F) + { + goto basic_json_parser_32; + } + if (yych <= '"') + { + goto basic_json_parser_33; + } + goto basic_json_parser_35; + } + else { - goto basic_json_parser_26; + if (yych <= 0xC1) + { + goto basic_json_parser_32; + } + if (yych <= 0xDF) + { + goto basic_json_parser_36; + } + goto basic_json_parser_37; } - goto basic_json_parser_4; } else { - if (yych <= '}') + if (yych <= 0xEF) { - goto basic_json_parser_28; + if (yych == 0xED) + { + goto basic_json_parser_39; + } + goto basic_json_parser_38; } - if (yych == 0xEF) + else { - goto basic_json_parser_30; - } - goto basic_json_parser_4; - } - } - } -basic_json_parser_2: - ++m_cursor; - { - return token_type::end_of_input; - } -basic_json_parser_4: - ++m_cursor; -basic_json_parser_5: - { - return token_type::parse_error; - } -basic_json_parser_6: - ++m_cursor; - if (m_limit <= m_cursor) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yybm[0 + yych] & 32) - { - goto basic_json_parser_6; - } - { - return scan(); - } -basic_json_parser_9: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych <= 0x0F) - { - goto basic_json_parser_5; - } - goto basic_json_parser_32; -basic_json_parser_10: - ++m_cursor; - { - return token_type::value_separator; - } -basic_json_parser_12: - yych = *++m_cursor; - if (yych <= '/') - { - goto basic_json_parser_5; - } - if (yych <= '0') - { - goto basic_json_parser_13; - } - if (yych <= '9') - { - goto basic_json_parser_15; - } - goto basic_json_parser_5; -basic_json_parser_13: - yyaccept = 1; - yych = *(m_marker = ++m_cursor); - if (yych <= 'D') - { - if (yych == '.') - { - goto basic_json_parser_37; - } - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_38; - } - if (yych == 'e') - { - goto basic_json_parser_38; - } - } -basic_json_parser_14: - { - return token_type::value_number; - } -basic_json_parser_15: - yyaccept = 1; - m_marker = ++m_cursor; - if ((m_limit - m_cursor) < 3) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yybm[0 + yych] & 64) - { - goto basic_json_parser_15; - } - if (yych <= 'D') - { - if (yych == '.') - { - goto basic_json_parser_37; - } - goto basic_json_parser_14; - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_38; - } - if (yych == 'e') - { - goto basic_json_parser_38; - } - goto basic_json_parser_14; - } -basic_json_parser_17: - ++m_cursor; - { - return token_type::name_separator; - } -basic_json_parser_19: - ++m_cursor; - { - return token_type::begin_array; - } -basic_json_parser_21: - ++m_cursor; - { - return token_type::end_array; - } -basic_json_parser_23: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'a') - { - goto basic_json_parser_39; - } - goto basic_json_parser_5; -basic_json_parser_24: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'u') - { - goto basic_json_parser_40; - } - goto basic_json_parser_5; -basic_json_parser_25: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'r') - { - goto basic_json_parser_41; - } - goto basic_json_parser_5; -basic_json_parser_26: - ++m_cursor; - { - return token_type::begin_object; - } -basic_json_parser_28: - ++m_cursor; - { - return token_type::end_object; - } -basic_json_parser_30: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 0xBB) - { - goto basic_json_parser_42; - } - goto basic_json_parser_5; -basic_json_parser_31: - ++m_cursor; - if (m_limit <= m_cursor) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; -basic_json_parser_32: - if (yybm[0 + yych] & 128) - { - goto basic_json_parser_31; - } - if (yych <= 0x0F) - { - goto basic_json_parser_33; - } - if (yych <= '"') - { - goto basic_json_parser_34; - } - goto basic_json_parser_36; -basic_json_parser_33: - m_cursor = m_marker; - if (yyaccept == 0) - { - goto basic_json_parser_5; - } - else - { - goto basic_json_parser_14; - } -basic_json_parser_34: - ++m_cursor; - { - return token_type::value_string; - } -basic_json_parser_36: - ++m_cursor; - if (m_limit <= m_cursor) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yych <= 'e') - { - if (yych <= '/') - { - if (yych == '"') + if (yych <= 0xF0) + { + goto basic_json_parser_40; + } + if (yych <= 0xF3) + { + goto basic_json_parser_41; + } + if (yych <= 0xF4) + { + goto basic_json_parser_42; + } + } + } + basic_json_parser_32: + m_cursor = m_marker; + if (yyaccept == 0) { - goto basic_json_parser_31; + goto basic_json_parser_5; } - if (yych <= '.') + else { - goto basic_json_parser_33; + goto basic_json_parser_14; } - goto basic_json_parser_31; - } - else - { - if (yych <= '\\') + basic_json_parser_33: + ++m_cursor; + { + last_token_type = token_type::value_string; + break; + } + basic_json_parser_35: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= 'e') { - if (yych <= '[') + if (yych <= '/') { - goto basic_json_parser_33; + if (yych == '"') + { + goto basic_json_parser_30; + } + if (yych <= '.') + { + goto basic_json_parser_32; + } + goto basic_json_parser_30; + } + else + { + if (yych <= '\\') + { + if (yych <= '[') + { + goto basic_json_parser_32; + } + goto basic_json_parser_30; + } + else + { + if (yych == 'b') + { + goto basic_json_parser_30; + } + goto basic_json_parser_32; + } } - goto basic_json_parser_31; } else { - if (yych == 'b') + if (yych <= 'q') { - goto basic_json_parser_31; + if (yych <= 'f') + { + goto basic_json_parser_30; + } + if (yych == 'n') + { + goto basic_json_parser_30; + } + goto basic_json_parser_32; + } + else + { + if (yych <= 's') + { + if (yych <= 'r') + { + goto basic_json_parser_30; + } + goto basic_json_parser_32; + } + else + { + if (yych <= 't') + { + goto basic_json_parser_30; + } + if (yych <= 'u') + { + goto basic_json_parser_48; + } + goto basic_json_parser_32; + } } - goto basic_json_parser_33; } - } - } - else - { - if (yych <= 'q') - { - if (yych <= 'f') + basic_json_parser_36: + ++m_cursor; + if (m_limit <= m_cursor) { - goto basic_json_parser_31; + fill_line_buffer(1); // LCOV_EXCL_LINE } - if (yych == 'n') + yych = *m_cursor; + if (yych <= 0x7F) { - goto basic_json_parser_31; + goto basic_json_parser_32; } - goto basic_json_parser_33; - } - else - { - if (yych <= 's') + if (yych <= 0xBF) + { + goto basic_json_parser_30; + } + goto basic_json_parser_32; + basic_json_parser_37: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= 0x9F) + { + goto basic_json_parser_32; + } + if (yych <= 0xBF) + { + goto basic_json_parser_36; + } + goto basic_json_parser_32; + basic_json_parser_38: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= 0x7F) + { + goto basic_json_parser_32; + } + if (yych <= 0xBF) + { + goto basic_json_parser_36; + } + goto basic_json_parser_32; + basic_json_parser_39: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= 0x7F) + { + goto basic_json_parser_32; + } + if (yych <= 0x9F) + { + goto basic_json_parser_36; + } + goto basic_json_parser_32; + basic_json_parser_40: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= 0x8F) + { + goto basic_json_parser_32; + } + if (yych <= 0xBF) + { + goto basic_json_parser_38; + } + goto basic_json_parser_32; + basic_json_parser_41: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= 0x7F) + { + goto basic_json_parser_32; + } + if (yych <= 0xBF) + { + goto basic_json_parser_38; + } + goto basic_json_parser_32; + basic_json_parser_42: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= 0x7F) + { + goto basic_json_parser_32; + } + if (yych <= 0x8F) + { + goto basic_json_parser_38; + } + goto basic_json_parser_32; + basic_json_parser_43: + yych = *++m_cursor; + if (yych <= '/') + { + goto basic_json_parser_32; + } + if (yych <= '9') { - if (yych <= 'r') + goto basic_json_parser_49; + } + goto basic_json_parser_32; + basic_json_parser_44: + yych = *++m_cursor; + if (yych <= ',') + { + if (yych == '+') { - goto basic_json_parser_31; + goto basic_json_parser_51; } - goto basic_json_parser_33; + goto basic_json_parser_32; } else { - if (yych <= 't') + if (yych <= '-') { - goto basic_json_parser_31; + goto basic_json_parser_51; } - if (yych <= 'u') + if (yych <= '/') { - goto basic_json_parser_43; + goto basic_json_parser_32; } - goto basic_json_parser_33; + if (yych <= '9') + { + goto basic_json_parser_52; + } + goto basic_json_parser_32; + } + basic_json_parser_45: + yych = *++m_cursor; + if (yych == 'l') + { + goto basic_json_parser_54; + } + goto basic_json_parser_32; + basic_json_parser_46: + yych = *++m_cursor; + if (yych == 'l') + { + goto basic_json_parser_55; + } + goto basic_json_parser_32; + basic_json_parser_47: + yych = *++m_cursor; + if (yych == 'u') + { + goto basic_json_parser_56; + } + goto basic_json_parser_32; + basic_json_parser_48: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= '@') + { + if (yych <= '/') + { + goto basic_json_parser_32; + } + if (yych <= '9') + { + goto basic_json_parser_57; + } + goto basic_json_parser_32; + } + else + { + if (yych <= 'F') + { + goto basic_json_parser_57; + } + if (yych <= '`') + { + goto basic_json_parser_32; + } + if (yych <= 'f') + { + goto basic_json_parser_57; + } + goto basic_json_parser_32; + } + basic_json_parser_49: + yyaccept = 1; + m_marker = ++m_cursor; + if ((m_limit - m_cursor) < 3) + { + fill_line_buffer(3); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= 'D') + { + if (yych <= '/') + { + goto basic_json_parser_14; + } + if (yych <= '9') + { + goto basic_json_parser_49; + } + goto basic_json_parser_14; + } + else + { + if (yych <= 'E') + { + goto basic_json_parser_44; + } + if (yych == 'e') + { + goto basic_json_parser_44; + } + goto basic_json_parser_14; + } + basic_json_parser_51: + yych = *++m_cursor; + if (yych <= '/') + { + goto basic_json_parser_32; + } + if (yych >= ':') + { + goto basic_json_parser_32; + } + basic_json_parser_52: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= '/') + { + goto basic_json_parser_14; + } + if (yych <= '9') + { + goto basic_json_parser_52; } - } - } -basic_json_parser_37: - yych = *++m_cursor; - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych <= '9') - { - goto basic_json_parser_44; - } - goto basic_json_parser_33; -basic_json_parser_38: - yych = *++m_cursor; - if (yych <= ',') - { - if (yych == '+') - { - goto basic_json_parser_46; - } - goto basic_json_parser_33; - } - else - { - if (yych <= '-') - { - goto basic_json_parser_46; - } - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych <= '9') - { - goto basic_json_parser_47; - } - goto basic_json_parser_33; - } -basic_json_parser_39: - yych = *++m_cursor; - if (yych == 'l') - { - goto basic_json_parser_49; - } - goto basic_json_parser_33; -basic_json_parser_40: - yych = *++m_cursor; - if (yych == 'l') - { - goto basic_json_parser_50; - } - goto basic_json_parser_33; -basic_json_parser_41: - yych = *++m_cursor; - if (yych == 'u') - { - goto basic_json_parser_51; - } - goto basic_json_parser_33; -basic_json_parser_42: - yych = *++m_cursor; - if (yych == 0xBF) - { - goto basic_json_parser_52; - } - goto basic_json_parser_33; -basic_json_parser_43: - ++m_cursor; - if (m_limit <= m_cursor) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yych <= '@') - { - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych <= '9') - { - goto basic_json_parser_54; - } - goto basic_json_parser_33; - } - else - { - if (yych <= 'F') - { - goto basic_json_parser_54; - } - if (yych <= '`') - { - goto basic_json_parser_33; - } - if (yych <= 'f') - { - goto basic_json_parser_54; - } - goto basic_json_parser_33; - } -basic_json_parser_44: - yyaccept = 1; - m_marker = ++m_cursor; - if ((m_limit - m_cursor) < 3) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yych <= 'D') - { - if (yych <= '/') - { goto basic_json_parser_14; + basic_json_parser_54: + yych = *++m_cursor; + if (yych == 's') + { + goto basic_json_parser_58; + } + goto basic_json_parser_32; + basic_json_parser_55: + yych = *++m_cursor; + if (yych == 'l') + { + goto basic_json_parser_59; + } + goto basic_json_parser_32; + basic_json_parser_56: + yych = *++m_cursor; + if (yych == 'e') + { + goto basic_json_parser_61; + } + goto basic_json_parser_32; + basic_json_parser_57: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= '@') + { + if (yych <= '/') + { + goto basic_json_parser_32; + } + if (yych <= '9') + { + goto basic_json_parser_63; + } + goto basic_json_parser_32; + } + else + { + if (yych <= 'F') + { + goto basic_json_parser_63; + } + if (yych <= '`') + { + goto basic_json_parser_32; + } + if (yych <= 'f') + { + goto basic_json_parser_63; + } + goto basic_json_parser_32; + } + basic_json_parser_58: + yych = *++m_cursor; + if (yych == 'e') + { + goto basic_json_parser_64; + } + goto basic_json_parser_32; + basic_json_parser_59: + ++m_cursor; + { + last_token_type = token_type::literal_null; + break; + } + basic_json_parser_61: + ++m_cursor; + { + last_token_type = token_type::literal_true; + break; + } + basic_json_parser_63: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= '@') + { + if (yych <= '/') + { + goto basic_json_parser_32; + } + if (yych <= '9') + { + goto basic_json_parser_66; + } + goto basic_json_parser_32; + } + else + { + if (yych <= 'F') + { + goto basic_json_parser_66; + } + if (yych <= '`') + { + goto basic_json_parser_32; + } + if (yych <= 'f') + { + goto basic_json_parser_66; + } + goto basic_json_parser_32; + } + basic_json_parser_64: + ++m_cursor; + { + last_token_type = token_type::literal_false; + break; + } + basic_json_parser_66: + ++m_cursor; + if (m_limit <= m_cursor) + { + fill_line_buffer(1); // LCOV_EXCL_LINE + } + yych = *m_cursor; + if (yych <= '@') + { + if (yych <= '/') + { + goto basic_json_parser_32; + } + if (yych <= '9') + { + goto basic_json_parser_30; + } + goto basic_json_parser_32; + } + else + { + if (yych <= 'F') + { + goto basic_json_parser_30; + } + if (yych <= '`') + { + goto basic_json_parser_32; + } + if (yych <= 'f') + { + goto basic_json_parser_30; + } + goto basic_json_parser_32; + } } - if (yych <= '9') - { - goto basic_json_parser_44; - } - goto basic_json_parser_14; - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_38; - } - if (yych == 'e') - { - goto basic_json_parser_38; - } - goto basic_json_parser_14; - } -basic_json_parser_46: - yych = *++m_cursor; - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych >= ':') - { - goto basic_json_parser_33; - } -basic_json_parser_47: - ++m_cursor; - if (m_limit <= m_cursor) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yych <= '/') - { - goto basic_json_parser_14; - } - if (yych <= '9') - { - goto basic_json_parser_47; - } - goto basic_json_parser_14; -basic_json_parser_49: - yych = *++m_cursor; - if (yych == 's') - { - goto basic_json_parser_55; - } - goto basic_json_parser_33; -basic_json_parser_50: - yych = *++m_cursor; - if (yych == 'l') - { - goto basic_json_parser_56; - } - goto basic_json_parser_33; -basic_json_parser_51: - yych = *++m_cursor; - if (yych == 'e') - { - goto basic_json_parser_58; - } - goto basic_json_parser_33; -basic_json_parser_52: - ++m_cursor; - { - return scan(); - } -basic_json_parser_54: - ++m_cursor; - if (m_limit <= m_cursor) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yych <= '@') - { - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych <= '9') - { - goto basic_json_parser_60; - } - goto basic_json_parser_33; - } - else - { - if (yych <= 'F') - { - goto basic_json_parser_60; - } - if (yych <= '`') - { - goto basic_json_parser_33; - } - if (yych <= 'f') - { - goto basic_json_parser_60; - } - goto basic_json_parser_33; - } -basic_json_parser_55: - yych = *++m_cursor; - if (yych == 'e') - { - goto basic_json_parser_61; - } - goto basic_json_parser_33; -basic_json_parser_56: - ++m_cursor; - { - return token_type::literal_null; - } -basic_json_parser_58: - ++m_cursor; - { - return token_type::literal_true; - } -basic_json_parser_60: - ++m_cursor; - if (m_limit <= m_cursor) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yych <= '@') - { - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych <= '9') - { - goto basic_json_parser_63; - } - goto basic_json_parser_33; - } - else - { - if (yych <= 'F') - { - goto basic_json_parser_63; - } - if (yych <= '`') - { - goto basic_json_parser_33; - } - if (yych <= 'f') - { - goto basic_json_parser_63; - } - goto basic_json_parser_33; - } -basic_json_parser_61: - ++m_cursor; - { - return token_type::literal_false; - } -basic_json_parser_63: - ++m_cursor; - if (m_limit <= m_cursor) - { - yyfill(); // LCOV_EXCL_LINE; + } - yych = *m_cursor; - if (yych <= '@') + + return last_token_type; + } + + /*! + @brief append data from the stream to the line buffer + + This function is called by the scan() function when the end of the + buffer (`m_limit`) is reached and the `m_cursor` pointer cannot be + incremented without leaving the limits of the line buffer. Note re2c + decides when to call this function. + + If the lexer reads from contiguous storage, there is no trailing null + byte. Therefore, this function must make sure to add these padding + null bytes. + + If the lexer reads from an input stream, this function reads the next + line of the input. + + @pre + p p p p p p u u u u u x . . . . . . + ^ ^ ^ ^ + m_content m_start | m_limit + m_cursor + + @post + u u u u u x x x x x x x . . . . . . + ^ ^ ^ + | m_cursor m_limit + m_start + m_content + */ + void fill_line_buffer(size_t n = 0) + { + // number of processed characters (p) + const auto offset_start = m_start - m_content; + // offset for m_marker wrt. to m_start + const auto offset_marker = (m_marker == nullptr) ? 0 : m_marker - m_start; + // number of unprocessed characters (u) + const auto offset_cursor = m_cursor - m_start; + + // no stream is used or end of file is reached + if (m_stream == nullptr or m_stream->eof()) { - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych <= '9') + // skip this part if we are already using the line buffer + if (m_start != reinterpret_cast(m_line_buffer.data())) { - goto basic_json_parser_31; + // copy unprocessed characters to line buffer + m_line_buffer.clear(); + for (m_cursor = m_start; m_cursor != m_limit; ++m_cursor) + { + m_line_buffer.append(1, static_cast(*m_cursor)); + } } - goto basic_json_parser_33; + + // append n characters to make sure that there is sufficient + // space between m_cursor and m_limit + m_line_buffer.append(1, '\x00'); + m_line_buffer.append(n - 1, '\x01'); } else { - if (yych <= 'F') - { - goto basic_json_parser_31; - } - if (yych <= '`') - { - goto basic_json_parser_33; - } - if (yych <= 'f') - { - goto basic_json_parser_31; - } - goto basic_json_parser_33; + // delete processed characters from line buffer + m_line_buffer.erase(0, static_cast(offset_start)); + // read next line from input stream + std::string line; + std::getline(*m_stream, line, '\n'); + // add line with newline symbol to the line buffer + m_line_buffer += line + "\n"; } - } - } + // set pointers + m_content = reinterpret_cast(m_line_buffer.c_str()); + assert(m_content != nullptr); + m_start = m_content; + m_marker = m_start + offset_marker; + m_cursor = m_start + offset_cursor; + m_limit = m_start + m_line_buffer.size(); + } - /// append data from the stream to the internal buffer - void yyfill() noexcept - { - if (m_stream == nullptr or not * m_stream) + /// return string representation of last read token + string_t get_token_string() const { - return; + assert(m_start != nullptr); + return string_t(reinterpret_cast(m_start), + static_cast(m_cursor - m_start)); } - const auto offset_start = m_start - m_content; - const auto offset_marker = m_marker - m_start; - const auto offset_cursor = m_cursor - m_start; - - m_buffer.erase(0, static_cast(offset_start)); - std::string line; - assert(m_stream != nullptr); - std::getline(*m_stream, line); - m_buffer += "\n" + line; // add line with newline symbol - - m_content = reinterpret_cast(m_buffer.c_str()); - assert(m_content != nullptr); - m_start = m_content; - m_marker = m_start + offset_marker; - m_cursor = m_start + offset_cursor; - m_limit = m_start + m_buffer.size() - 1; - } - - /// return string representation of last read token - string_t get_token() const - { - assert(m_start != nullptr); - return string_t(reinterpret_cast(m_start), - static_cast(m_cursor - m_start)); - } - - /*! + /*! @brief return string value for string tokens The function iterates the characters between the opening and closing @@ -8270,114 +8812,156 @@ basic_json_parser_63: of the construction of the values. 2. Unescaped characters are copied as is. + @pre `m_cursor - m_start >= 2`, meaning the length of the last token + is at least 2 bytes which is trivially true for any string (which + consists of at least two quotes). + + " c1 c2 c3 ... " + ^ ^ + m_start m_cursor + + @complexity Linear in the length of the string.\n + + Lemma: The loop body will always terminate.\n + + Proof (by contradiction): Assume the loop body does not terminate. As + the loop body does not contain another loop, one of the called + functions must never return. The called functions are `std::strtoul` + and to_unicode. Neither function can loop forever, so the loop body + will never loop forever which contradicts the assumption that the loop + body does not terminate, q.e.d.\n + + Lemma: The loop condition for the for loop is eventually false.\n + + Proof (by contradiction): Assume the loop does not terminate. Due to + the above lemma, this can only be due to a tautological loop + condition; that is, the loop condition i < m_cursor - 1 must always be + true. Let x be the change of i for any loop iteration. Then + m_start + 1 + x < m_cursor - 1 must hold to loop indefinitely. This + can be rephrased to m_cursor - m_start - 2 > x. With the + precondition, we x <= 0, meaning that the loop condition holds + indefinitly if i is always decreased. However, observe that the value + of i is strictly increasing with each iteration, as it is incremented + by 1 in the iteration expression and never decremented inside the loop + body. Hence, the loop condition will eventually be false which + contradicts the assumption that the loop condition is a tautology, + q.e.d. + @return string value of current token without opening and closing quotes @throw std::out_of_range if to_unicode fails */ - string_t get_string() const - { - string_t result; - result.reserve(static_cast(m_cursor - m_start - 2)); - - // iterate the result between the quotes - for (const lexer_char_t* i = m_start + 1; i < m_cursor - 1; ++i) - { - // process escaped characters - if (*i == '\\') - { - // read next character - ++i; - - switch (*i) - { - // the default escapes - case 't': - { - result += "\t"; - break; - } - case 'b': - { - result += "\b"; - break; - } - case 'f': - { - result += "\f"; - break; - } - case 'n': - { - result += "\n"; - break; - } - case 'r': - { - result += "\r"; - break; - } - case '\\': - { - result += "\\"; - break; - } - case '/': - { - result += "/"; - break; - } - case '"': - { - result += "\""; - break; - } + string_t get_string() const + { + assert(m_cursor - m_start >= 2); + + string_t result; + result.reserve(static_cast(m_cursor - m_start - 2)); + + // iterate the result between the quotes + for (const lexer_char_t* i = m_start + 1; i < m_cursor - 1; ++i) + { + // process escaped characters + if (*i == '\\') + { + // read next character + ++i; - // unicode - case 'u': + switch (*i) { - // get code xxxx from uxxxx - auto codepoint = std::strtoul(std::string(reinterpret_cast(i + 1), - 4).c_str(), nullptr, 16); + // the default escapes + case 't': + { + result += "\t"; + break; + } + case 'b': + { + result += "\b"; + break; + } + case 'f': + { + result += "\f"; + break; + } + case 'n': + { + result += "\n"; + break; + } + case 'r': + { + result += "\r"; + break; + } + case '\\': + { + result += "\\"; + break; + } + case '/': + { + result += "/"; + break; + } + case '"': + { + result += "\""; + break; + } - // check if codepoint is a high surrogate - if (codepoint >= 0xD800 and codepoint <= 0xDBFF) + // unicode + case 'u': { - // make sure there is a subsequent unicode - if ((i + 6 >= m_limit) or * (i + 5) != '\\' or * (i + 6) != 'u') + // get code xxxx from uxxxx + auto codepoint = std::strtoul(std::string(reinterpret_cast(i + 1), + 4).c_str(), nullptr, 16); + + // check if codepoint is a high surrogate + if (codepoint >= 0xD800 and codepoint <= 0xDBFF) { - throw std::invalid_argument("missing low surrogate"); - } + // make sure there is a subsequent unicode + if ((i + 6 >= m_limit) or * (i + 5) != '\\' or * (i + 6) != 'u') + { + throw std::invalid_argument("missing low surrogate"); + } - // get code yyyy from uxxxx\uyyyy - auto codepoint2 = std::strtoul(std::string(reinterpret_cast - (i + 7), 4).c_str(), nullptr, 16); - result += to_unicode(codepoint, codepoint2); - // skip the next 10 characters (xxxx\uyyyy) - i += 10; - } - else - { - // add unicode character(s) - result += to_unicode(codepoint); - // skip the next four characters (xxxx) - i += 4; + // get code yyyy from uxxxx\uyyyy + auto codepoint2 = std::strtoul(std::string(reinterpret_cast + (i + 7), 4).c_str(), nullptr, 16); + result += to_unicode(codepoint, codepoint2); + // skip the next 10 characters (xxxx\uyyyy) + i += 10; + } + else if (codepoint >= 0xDC00 and codepoint <= 0xDFFF) + { + // we found a lone low surrogate + throw std::invalid_argument("missing high surrogate"); + } + else + { + // add unicode character(s) + result += to_unicode(codepoint); + // skip the next four characters (xxxx) + i += 4; + } + break; } - break; } } + else + { + // all other characters are just copied to the end of the + // string + result.append(1, static_cast(*i)); + } } - else - { - // all other characters are just copied to the end of the - // string - result.append(1, static_cast(*i)); - } - } - return result; - } + return result; + } - /*! + /*! @brief parse floating point number This function (and its overloads) serves to select the most approprate @@ -8391,18 +8975,13 @@ basic_json_parser_63: the number @return the floating point number - - @bug This function uses `std::strtof`, `std::strtod`, or `std::strtold` - which use the current C locale to determine which character is used as - decimal point character. This may yield to parse errors if the locale - does not used `.`. */ - long double str_to_float_t(long double* /* type */, char** endptr) const - { - return std::strtold(reinterpret_cast(m_start), endptr); - } + long double str_to_float_t(long double* /* type */, char** endptr) const + { + return std::strtold(reinterpret_cast(m_start), endptr); + } - /*! + /*! @brief parse floating point number This function (and its overloads) serves to select the most approprate @@ -8417,12 +8996,12 @@ basic_json_parser_63: @return the floating point number */ - double str_to_float_t(double* /* type */, char** endptr) const - { - return std::strtod(reinterpret_cast(m_start), endptr); - } + double str_to_float_t(double* /* type */, char** endptr) const + { + return std::strtod(reinterpret_cast(m_start), endptr); + } - /*! + /*! @brief parse floating point number This function (and its overloads) serves to select the most approprate @@ -8437,12 +9016,12 @@ basic_json_parser_63: @return the floating point number */ - float str_to_float_t(float* /* type */, char** endptr) const - { - return std::strtof(reinterpret_cast(m_start), endptr); - } + float str_to_float_t(float* /* type */, char** endptr) const + { + return std::strtof(reinterpret_cast(m_start), endptr); + } - /*! + /*! @brief return number value for number tokens This function translates the last token into the most appropriate @@ -8456,418 +9035,410 @@ basic_json_parser_63: number_integer_t or @ref number_unsigned_t then it sets the result parameter accordingly. - The 'floating point representation' includes the number of significant - figures after the radix point, whether the number is in exponential or - decimal form, the capitalization of the exponent marker, and if the - optional '+' is present in the exponent. This information is necessary - to perform accurate round trips of floating point numbers. - If the number is a floating point number the number is then parsed using @a std:strtod (or @a std:strtof or @a std::strtold). @param[out] result @ref basic_json object to receive the number, or - NAN if the conversion read past the current token. The latter case - needs to be treated by the caller function. + NAN if the conversion read past the current token. The latter case + needs to be treated by the caller function. */ - void get_number(basic_json& result) const - { - assert(m_start != nullptr); - - const lexer::lexer_char_t* curptr = m_start; - - // remember this number was parsed (for later serialization) - result.m_type.bits.parsed = true; + void get_number(basic_json& result) const + { + assert(m_start != nullptr); - // 'found_radix_point' will be set to 0xFF upon finding a radix - // point and later used to mask in/out the precision depending - // whether a radix is found i.e. 'precision &= found_radix_point' - uint8_t found_radix_point = 0; - uint8_t precision = 0; + const lexer::lexer_char_t* curptr = m_start; - // accumulate the integer conversion result (unsigned for now) - number_unsigned_t value = 0; + // accumulate the integer conversion result (unsigned for now) + number_unsigned_t value = 0; - // maximum absolute value of the relevant integer type - number_unsigned_t max; + // maximum absolute value of the relevant integer type + number_unsigned_t max; - // temporarily store the type to avoid unecessary bitfield access - value_t type; + // temporarily store the type to avoid unecessary bitfield access + value_t type; - // look for sign - if (*curptr == '-') - { - type = value_t::number_integer; - max = static_cast(std::numeric_limits::max()) + 1; - curptr++; - } - else - { - type = value_t::number_unsigned; - max = static_cast(std::numeric_limits::max()); - } + // look for sign + if (*curptr == '-') + { + type = value_t::number_integer; + max = static_cast((std::numeric_limits::max)()) + 1; + curptr++; + } + else + { + type = value_t::number_unsigned; + max = static_cast((std::numeric_limits::max)()); + } - // count the significant figures - for (; curptr < m_cursor; curptr++) - { - // quickly skip tests if a digit - if (*curptr < '0' || *curptr > '9') + // count the significant figures + for (; curptr < m_cursor; curptr++) { - if (*curptr == '.') + // quickly skip tests if a digit + if (*curptr < '0' || *curptr > '9') { - // don't count '.' but change to float + if (*curptr == '.') + { + // don't count '.' but change to float + type = value_t::number_float; + continue; + } + // assume exponent (if not then will fail parse): change to + // float, stop counting and record exponent details type = value_t::number_float; - - // reset precision count - precision = 0; - found_radix_point = 0xFF; - continue; + break; } - // assume exponent (if not then will fail parse): change to - // float, stop counting and record exponent details - type = value_t::number_float; - result.m_type.bits.has_exp = true; - // exponent capitalization - result.m_type.bits.exp_cap = (*curptr == 'E'); + // skip if definitely not an integer + if (type != value_t::number_float) + { + // multiply last value by ten and add the new digit + auto temp = value * 10 + *curptr - '0'; - // exponent '+' sign - result.m_type.bits.exp_plus = (*(++curptr) == '+'); - break; + // test for overflow + if (temp < value || temp > max) + { + // overflow + type = value_t::number_float; + } + else + { + // no overflow - save it + value = temp; + } + } } - // skip if definitely not an integer - if (type != value_t::number_float) + // save the value (if not a float) + if (type == value_t::number_unsigned) + { + result.m_value.number_unsigned = value; + } + else if (type == value_t::number_integer) + { + result.m_value.number_integer = -static_cast(value); + } + else { - // multiply last value by ten and add the new digit - auto temp = value * 10 + *curptr - 0x30; + // parse with strtod + result.m_value.number_float = str_to_float_t(static_cast(nullptr), NULL); - // test for overflow - if (temp < value || temp > max) + // replace infinity and NAN by null + if (not std::isfinite(result.m_value.number_float)) { - // overflow - type = value_t::number_float; - } - else - { - // no overflow - save it - value = temp; + type = value_t::null; + result.m_value = basic_json::json_value(); } } - ++precision; - } - - // If no radix point was found then precision would now be set to - // the number of digits, which is wrong - clear it. - result.m_type.bits.precision = precision & found_radix_point; - // save the value (if not a float) - if (type == value_t::number_unsigned) - { - result.m_value.number_unsigned = value; - } - else if (type == value_t::number_integer) - { - result.m_value.number_integer = -static_cast(value); - } - else - { - // parse with strtod - result.m_value.number_float = str_to_float_t(static_cast(nullptr), NULL); - } - - // save the type - result.m_type = type; - } - - private: - /// optional input stream - std::istream* m_stream = nullptr; - /// the buffer - string_t m_buffer; - /// the buffer pointer - const lexer_char_t* m_content = nullptr; - /// pointer to the beginning of the current symbol - const lexer_char_t* m_start = nullptr; - /// pointer for backtracking information - const lexer_char_t* m_marker = nullptr; - /// pointer to the current symbol - const lexer_char_t* m_cursor = nullptr; - /// pointer to the end of the buffer - const lexer_char_t* m_limit = nullptr; - }; + // save the type + result.m_type = type; + } + + private: + /// optional input stream + std::istream* m_stream = nullptr; + /// line buffer buffer for m_stream + string_t m_line_buffer {}; + /// the buffer pointer + const lexer_char_t* m_content = nullptr; + /// pointer to the beginning of the current symbol + const lexer_char_t* m_start = nullptr; + /// pointer for backtracking information + const lexer_char_t* m_marker = nullptr; + /// pointer to the current symbol + const lexer_char_t* m_cursor = nullptr; + /// pointer to the end of the buffer + const lexer_char_t* m_limit = nullptr; + /// the last token type + token_type last_token_type = token_type::end_of_input; + }; - /*! + /*! @brief syntax analysis This class implements a recursive decent parser. */ - class parser - { - public: - /// constructor for strings - parser(const string_t& s, parser_callback_t cb = nullptr) noexcept - : callback(cb), m_lexer(s) + class parser { - // read first token - get_token(); - } + public: + /// a parser reading from a string literal + parser(const char* buff, const parser_callback_t cb = nullptr) + : callback(cb), + m_lexer(reinterpret_cast(buff), std::strlen(buff)) + {} - /// a parser reading from an input stream - parser(std::istream& _is, parser_callback_t cb = nullptr) noexcept - : callback(cb), m_lexer(&_is) - { - // read first token - get_token(); - } + /// a parser reading from an input stream + parser(std::istream& is, const parser_callback_t cb = nullptr) + : callback(cb), m_lexer(is) + {} - /// public parser interface - basic_json parse() - { - basic_json result = parse_internal(true); + /// a parser reading from an iterator range with contiguous storage + template::iterator_category, std::random_access_iterator_tag>::value + , int>::type + = 0> + parser(IteratorType first, IteratorType last, const parser_callback_t cb = nullptr) + : callback(cb), + m_lexer(reinterpret_cast(&(*first)), + static_cast(std::distance(first, last))) + {} + + /// public parser interface + basic_json parse() + { + // read first token + get_token(); - expect(lexer::token_type::end_of_input); + basic_json result = parse_internal(true); + result.assert_invariant(); - // return parser result and replace it with null in case the - // top-level value was discarded by the callback function - return result.is_discarded() ? basic_json() : result; - } + expect(lexer::token_type::end_of_input); - private: - /// the actual parser - basic_json parse_internal(bool keep) - { - auto result = basic_json(value_t::discarded); + // return parser result and replace it with null in case the + // top-level value was discarded by the callback function + return result.is_discarded() ? basic_json() : std::move(result); + } - switch (last_token) + private: + /// the actual parser + basic_json parse_internal(bool keep) { - case lexer::token_type::begin_object: + auto result = basic_json(value_t::discarded); + + switch (last_token) { - if (keep and (not callback or (keep = callback(depth++, parse_event_t::object_start, result)))) + case lexer::token_type::begin_object: { - // explicitly set result to object to cope with {} - result.m_type = value_t::object; - result.m_value = json_value(value_t::object); - } + if (keep and (not callback + or ((keep = callback(depth++, parse_event_t::object_start, result)) != 0))) + { + // explicitly set result to object to cope with {} + result.m_type = value_t::object; + result.m_value = value_t::object; + } - // read next token - get_token(); + // read next token + get_token(); - // closing } -> we are done - if (last_token == lexer::token_type::end_object) - { + // closing } -> we are done + if (last_token == lexer::token_type::end_object) + { + get_token(); + if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) + { + result = basic_json(value_t::discarded); + } + return result; + } + + // no comma is expected here + unexpect(lexer::token_type::value_separator); + + // otherwise: parse key-value pairs + do + { + // ugly, but could be fixed with loop reorganization + if (last_token == lexer::token_type::value_separator) + { + get_token(); + } + + // store key + expect(lexer::token_type::value_string); + const auto key = m_lexer.get_string(); + + bool keep_tag = false; + if (keep) + { + if (callback) + { + basic_json k(key); + keep_tag = callback(depth, parse_event_t::key, k); + } + else + { + keep_tag = true; + } + } + + // parse separator (:) + get_token(); + expect(lexer::token_type::name_separator); + + // parse and add value + get_token(); + auto value = parse_internal(keep); + if (keep and keep_tag and not value.is_discarded()) + { + result[key] = std::move(value); + } + } + while (last_token == lexer::token_type::value_separator); + + // closing } + expect(lexer::token_type::end_object); get_token(); if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) { result = basic_json(value_t::discarded); } + return result; } - // no comma is expected here - unexpect(lexer::token_type::value_separator); - - // otherwise: parse key-value pairs - do + case lexer::token_type::begin_array: { - // ugly, but could be fixed with loop reorganization - if (last_token == lexer::token_type::value_separator) + if (keep and (not callback + or ((keep = callback(depth++, parse_event_t::array_start, result)) != 0))) + { + // explicitly set result to object to cope with [] + result.m_type = value_t::array; + result.m_value = value_t::array; + } + + // read next token + get_token(); + + // closing ] -> we are done + if (last_token == lexer::token_type::end_array) { get_token(); + if (callback and not callback(--depth, parse_event_t::array_end, result)) + { + result = basic_json(value_t::discarded); + } + return result; } - // store key - expect(lexer::token_type::value_string); - const auto key = m_lexer.get_string(); + // no comma is expected here + unexpect(lexer::token_type::value_separator); - bool keep_tag = false; - if (keep) + // otherwise: parse values + do { - if (callback) + // ugly, but could be fixed with loop reorganization + if (last_token == lexer::token_type::value_separator) { - basic_json k(key); - keep_tag = callback(depth, parse_event_t::key, k); + get_token(); } - else + + // parse value + auto value = parse_internal(keep); + if (keep and not value.is_discarded()) { - keep_tag = true; + result.push_back(std::move(value)); } } + while (last_token == lexer::token_type::value_separator); - // parse separator (:) - get_token(); - expect(lexer::token_type::name_separator); - - // parse and add value + // closing ] + expect(lexer::token_type::end_array); get_token(); - auto value = parse_internal(keep); - if (keep and keep_tag and not value.is_discarded()) + if (keep and callback and not callback(--depth, parse_event_t::array_end, result)) { - result[key] = std::move(value); + result = basic_json(value_t::discarded); } + + return result; } - while (last_token == lexer::token_type::value_separator); - // closing } - expect(lexer::token_type::end_object); - get_token(); - if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) + case lexer::token_type::literal_null: { - result = basic_json(value_t::discarded); + get_token(); + result.m_type = value_t::null; + break; } - return result; - } - - case lexer::token_type::begin_array: - { - if (keep and (not callback or (keep = callback(depth++, parse_event_t::array_start, result)))) + case lexer::token_type::value_string: { - // explicitly set result to object to cope with [] - result.m_type = value_t::array; - result.m_value = json_value(value_t::array); + const auto s = m_lexer.get_string(); + get_token(); + result = basic_json(s); + break; } - // read next token - get_token(); - - // closing ] -> we are done - if (last_token == lexer::token_type::end_array) + case lexer::token_type::literal_true: { get_token(); - if (callback and not callback(--depth, parse_event_t::array_end, result)) - { - result = basic_json(value_t::discarded); - } - return result; + result.m_type = value_t::boolean; + result.m_value = true; + break; } - // no comma is expected here - unexpect(lexer::token_type::value_separator); - - // otherwise: parse values - do + case lexer::token_type::literal_false: { - // ugly, but could be fixed with loop reorganization - if (last_token == lexer::token_type::value_separator) - { - get_token(); - } - - // parse value - auto value = parse_internal(keep); - if (keep and not value.is_discarded()) - { - result.push_back(std::move(value)); - } + get_token(); + result.m_type = value_t::boolean; + result.m_value = false; + break; } - while (last_token == lexer::token_type::value_separator); - // closing ] - expect(lexer::token_type::end_array); - get_token(); - if (keep and callback and not callback(--depth, parse_event_t::array_end, result)) + case lexer::token_type::value_number: { - result = basic_json(value_t::discarded); + m_lexer.get_number(result); + get_token(); + break; } - return result; - } - - case lexer::token_type::literal_null: - { - get_token(); - result.m_type = value_t::null; - break; - } - - case lexer::token_type::value_string: - { - const auto s = m_lexer.get_string(); - get_token(); - result = basic_json(s); - break; - } - - case lexer::token_type::literal_true: - { - get_token(); - result.m_type = value_t::boolean; - result.m_value = true; - break; - } - - case lexer::token_type::literal_false: - { - get_token(); - result.m_type = value_t::boolean; - result.m_value = false; - break; - } - - case lexer::token_type::value_number: - { - m_lexer.get_number(result); - get_token(); - break; + default: + { + // the last token was unexpected + unexpect(last_token); + } } - default: + if (keep and callback and not callback(depth, parse_event_t::value, result)) { - // the last token was unexpected - unexpect(last_token); + result = basic_json(value_t::discarded); } + return result; } - if (keep and callback and not callback(depth, parse_event_t::value, result)) + /// get next token from lexer + typename lexer::token_type get_token() { - result = basic_json(value_t::discarded); + last_token = m_lexer.scan(); + return last_token; } - return result; - } - - /// get next token from lexer - typename lexer::token_type get_token() noexcept - { - last_token = m_lexer.scan(); - return last_token; - } - void expect(typename lexer::token_type t) const - { - if (t != last_token) + void expect(typename lexer::token_type t) const { - std::string error_msg = "parse error - unexpected "; - error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token() + "'") : - lexer::token_type_name(last_token)); - error_msg += "; expected " + lexer::token_type_name(t); - throw std::invalid_argument(error_msg); + if (t != last_token) + { + std::string error_msg = "parse error - unexpected "; + error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() + + "'") : + lexer::token_type_name(last_token)); + error_msg += "; expected " + lexer::token_type_name(t); + throw std::invalid_argument(error_msg); + } } - } - void unexpect(typename lexer::token_type t) const - { - if (t == last_token) + void unexpect(typename lexer::token_type t) const { - std::string error_msg = "parse error - unexpected "; - error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token() + "'") : - lexer::token_type_name(last_token)); - throw std::invalid_argument(error_msg); + if (t == last_token) + { + std::string error_msg = "parse error - unexpected "; + error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() + + "'") : + lexer::token_type_name(last_token)); + throw std::invalid_argument(error_msg); + } } - } - private: - /// current level of recursion - int depth = 0; - /// callback function - parser_callback_t callback; - /// the type of the last read token - typename lexer::token_type last_token = lexer::token_type::uninitialized; - /// the lexer - lexer m_lexer; - }; + private: + /// current level of recursion + int depth = 0; + /// callback function + const parser_callback_t callback = nullptr; + /// the type of the last read token + typename lexer::token_type last_token = lexer::token_type::uninitialized; + /// the lexer + lexer m_lexer; + }; - public: - /*! + public: + /*! @brief JSON Pointer A JSON pointer defines a string syntax for identifying a specific value @@ -8878,13 +9449,13 @@ basic_json_parser_63: @since version 2.0.0 */ - class json_pointer - { - /// allow basic_json to access private members - friend class basic_json; + class json_pointer + { + /// allow basic_json to access private members + friend class basic_json; - public: - /*! + public: + /*! @brief create JSON pointer Create a JSON pointer according to the syntax described in @@ -8906,11 +9477,11 @@ basic_json_parser_63: @since version 2.0.0 */ - explicit json_pointer(const std::string& s = "") - : reference_tokens(split(s)) - {} + explicit json_pointer(const std::string& s = "") + : reference_tokens(split(s)) + {} - /*! + /*! @brief return a string representation of the JSON pointer @invariant For each JSON pointer `ptr`, it holds: @@ -8923,120 +9494,126 @@ basic_json_parser_63: @liveexample{The example shows the result of `to_string`., json_pointer__to_string} - @since version 2.0.0 - */ - std::string to_string() const noexcept - { - std::string result; - - for (const auto& reference_token : reference_tokens) - { - result += "/" + escape(reference_token); - } - - return result; - } - - /// @copydoc to_string() - operator std::string() const - { - return to_string(); - } + @since version 2.0.0 + */ + std::string to_string() const noexcept + { + return std::accumulate(reference_tokens.begin(), + reference_tokens.end(), std::string{}, + [](const std::string & a, const std::string & b) + { + return a + "/" + escape(b); + }); + } - private: - /// remove and return last reference pointer - std::string pop_back() - { - if (is_root()) + /// @copydoc to_string() + operator std::string() const { - throw std::domain_error("JSON pointer has no parent"); + return to_string(); } - auto last = reference_tokens.back(); - reference_tokens.pop_back(); - return last; - } + private: + /// remove and return last reference pointer + std::string pop_back() + { + if (is_root()) + { + throw std::domain_error("JSON pointer has no parent"); + } - /// return whether pointer points to the root document - bool is_root() const - { - return reference_tokens.empty(); - } + auto last = reference_tokens.back(); + reference_tokens.pop_back(); + return last; + } - json_pointer top() const - { - if (is_root()) + /// return whether pointer points to the root document + bool is_root() const { - throw std::domain_error("JSON pointer has no parent"); + return reference_tokens.empty(); } - json_pointer result = *this; - result.reference_tokens = {reference_tokens[0]}; - return result; - } + json_pointer top() const + { + if (is_root()) + { + throw std::domain_error("JSON pointer has no parent"); + } - /*! + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + + /*! @brief create and return a reference to the pointed to value - */ - reference get_and_create(reference j) const - { - pointer result = &j; - // in case no reference tokens exist, return a reference to the - // JSON value j which will be overwritten by a primitive value - for (const auto& reference_token : reference_tokens) + @complexity Linear in the number of reference tokens. + */ + reference get_and_create(reference j) const { - switch (result->m_type) + pointer result = &j; + + // in case no reference tokens exist, return a reference to the + // JSON value j which will be overwritten by a primitive value + for (const auto& reference_token : reference_tokens) { - case value_t::null: + switch (result->m_type) { - if (reference_token == "0") + case value_t::null: { - // start a new array if reference token is 0 - result = &result->operator[](0); + if (reference_token == "0") + { + // start a new array if reference token is 0 + result = &result->operator[](0); + } + else + { + // start a new object otherwise + result = &result->operator[](reference_token); + } + break; } - else + + case value_t::object: { - // start a new object otherwise + // create an entry in the object result = &result->operator[](reference_token); + break; } - break; - } - - case value_t::object: - { - // create an entry in the object - result = &result->operator[](reference_token); - break; - } - case value_t::array: - { - // create an entry in the array - result = &result->operator[](static_cast(std::stoi(reference_token))); - break; - } + case value_t::array: + { + // create an entry in the array + result = &result->operator[](static_cast(std::stoi(reference_token))); + break; + } - /* + /* The following code is only reached if there exists a reference token _and_ the current value is primitive. In this case, we have an error situation, because primitive values may only occur as single value; that is, with an empty list of reference tokens. */ - default: - { - throw std::domain_error("invalid value to unflatten"); + default: + { + throw std::domain_error("invalid value to unflatten"); + } } } - } - return *result; - } + return *result; + } - /*! + /*! @brief return a reference to the pointed to value + @note This version does not throw if a value is not present, but tries + to create nested values instead. For instance, calling this function + with pointer `"/this/that"` on a null value is equivalent to calling + `operator[]("this").operator[]("that")` on that value, effectively + changing the null value to an object. + @param[in] ptr a JSON value @return reference to the JSON value pointed to by the JSON pointer @@ -9047,95 +9624,118 @@ basic_json_parser_63: @throw std::domain_error if an array index begins with '0' @throw std::invalid_argument if an array index was not a number */ - reference get_unchecked(pointer ptr) const - { - for (const auto& reference_token : reference_tokens) + reference get_unchecked(pointer ptr) const { - switch (ptr->m_type) + for (const auto& reference_token : reference_tokens) { - case value_t::object: + // convert null values to arrays or objects before continuing + if (ptr->m_type == value_t::null) { - // use unchecked object access - ptr = &ptr->operator[](reference_token); - break; + // check if reference token is a number + const bool nums = std::all_of(reference_token.begin(), + reference_token.end(), + [](const char x) + { + return std::isdigit(x); + }); + + // change value to array for numbers or "-" or to object + // otherwise + if (nums or reference_token == "-") + { + *ptr = value_t::array; + } + else + { + *ptr = value_t::object; + } } - case value_t::array: + switch (ptr->m_type) { - // error condition (cf. RFC 6901, Sect. 4) - if (reference_token.size() > 1 and reference_token[0] == '0') + case value_t::object: { - throw std::domain_error("array index must not begin with '0'"); + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; } - if (reference_token == "-") + case value_t::array: { - // explicityly treat "-" as index beyond the end - ptr = &ptr->operator[](ptr->m_value.array->size()); + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + + if (reference_token == "-") + { + // explicityly treat "-" as index beyond the end + ptr = &ptr->operator[](ptr->m_value.array->size()); + } + else + { + // convert array index to number; unchecked access + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + } + break; } - else + + default: { - // convert array index to number; unchecked access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); } - break; - } - - default: - { - throw std::out_of_range("unresolved reference token '" + reference_token + "'"); } } - } - return *ptr; - } + return *ptr; + } - reference get_checked(pointer ptr) const - { - for (const auto& reference_token : reference_tokens) + reference get_checked(pointer ptr) const { - switch (ptr->m_type) + for (const auto& reference_token : reference_tokens) { - case value_t::object: - { - // note: at performs range check - ptr = &ptr->at(reference_token); - break; - } - - case value_t::array: + switch (ptr->m_type) { - if (reference_token == "-") + case value_t::object: { - // "-" always fails the range check - throw std::out_of_range("array index '-' (" + - std::to_string(ptr->m_value.array->size()) + - ") is out of range"); + // note: at performs range check + ptr = &ptr->at(reference_token); + break; } - // error condition (cf. RFC 6901, Sect. 4) - if (reference_token.size() > 1 and reference_token[0] == '0') + case value_t::array: { - throw std::domain_error("array index must not begin with '0'"); - } + if (reference_token == "-") + { + // "-" always fails the range check + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } - // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); - break; - } + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } - default: - { - throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + // note: at performs range check + ptr = &ptr->at(static_cast(std::stoi(reference_token))); + break; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } } } - } - return *ptr; - } + return *ptr; + } - /*! + /*! @brief return a const reference to the pointed to value @param[in] ptr a JSON value @@ -9143,162 +9743,162 @@ basic_json_parser_63: @return const reference to the JSON value pointed to by the JSON pointer */ - const_reference get_unchecked(const_pointer ptr) const - { - for (const auto& reference_token : reference_tokens) + const_reference get_unchecked(const_pointer ptr) const { - switch (ptr->m_type) + for (const auto& reference_token : reference_tokens) { - case value_t::object: - { - // use unchecked object access - ptr = &ptr->operator[](reference_token); - break; - } - - case value_t::array: + switch (ptr->m_type) { - if (reference_token == "-") + case value_t::object: { - // "-" cannot be used for const access - throw std::out_of_range("array index '-' (" + - std::to_string(ptr->m_value.array->size()) + - ") is out of range"); + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; } - // error condition (cf. RFC 6901, Sect. 4) - if (reference_token.size() > 1 and reference_token[0] == '0') + case value_t::array: { - throw std::domain_error("array index must not begin with '0'"); - } + if (reference_token == "-") + { + // "-" cannot be used for const access + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } - // use unchecked array access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); - break; - } + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } - default: - { - throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + // use unchecked array access + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + break; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } } } - } - return *ptr; - } + return *ptr; + } - const_reference get_checked(const_pointer ptr) const - { - for (const auto& reference_token : reference_tokens) + const_reference get_checked(const_pointer ptr) const { - switch (ptr->m_type) + for (const auto& reference_token : reference_tokens) { - case value_t::object: - { - // note: at performs range check - ptr = &ptr->at(reference_token); - break; - } - - case value_t::array: + switch (ptr->m_type) { - if (reference_token == "-") + case value_t::object: { - // "-" always fails the range check - throw std::out_of_range("array index '-' (" + - std::to_string(ptr->m_value.array->size()) + - ") is out of range"); + // note: at performs range check + ptr = &ptr->at(reference_token); + break; } - // error condition (cf. RFC 6901, Sect. 4) - if (reference_token.size() > 1 and reference_token[0] == '0') + case value_t::array: { - throw std::domain_error("array index must not begin with '0'"); - } + if (reference_token == "-") + { + // "-" always fails the range check + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } - // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); - break; - } + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } - default: - { - throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + // note: at performs range check + ptr = &ptr->at(static_cast(std::stoi(reference_token))); + break; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } } } - } - - return *ptr; - } - - /// split the string input to reference tokens - static std::vector split(std::string reference_string) - { - std::vector result; - // special case: empty reference string -> no reference tokens - if (reference_string.empty()) - { - return result; - } - - // check if nonempty reference string begins with slash - if (reference_string[0] != '/') - { - throw std::domain_error("JSON pointer must be empty or begin with '/'"); + return *ptr; } - // extract the reference tokens: - // - slash: position of the last read slash (or end of string) - // - start: position after the previous slash - for ( - // search for the first slash after the first character - size_t slash = reference_string.find_first_of("/", 1), - // set the beginning of the first reference token - start = 1; - // we can stop if start == string::npos+1 = 0 - start != 0; - // set the beginning of the next reference token - // (will eventually be 0 if slash == std::string::npos) - start = slash + 1, - // find next slash - slash = reference_string.find_first_of("/", start)) + /// split the string input to reference tokens + static std::vector split(const std::string& reference_string) { - // use the text between the beginning of the reference token - // (start) and the last slash (slash). - auto reference_token = reference_string.substr(start, slash - start); + std::vector result; - // check reference tokens are properly escaped - for (size_t pos = reference_token.find_first_of("~"); - pos != std::string::npos; - pos = reference_token.find_first_of("~", pos + 1)) + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) { - assert(reference_token[pos] == '~'); + return result; + } + + // check if nonempty reference string begins with slash + if (reference_string[0] != '/') + { + throw std::domain_error("JSON pointer must be empty or begin with '/'"); + } + + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + size_t slash = reference_string.find_first_of("/", 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == string::npos+1 = 0 + start != 0; + // set the beginning of the next reference token + // (will eventually be 0 if slash == std::string::npos) + start = slash + 1, + // find next slash + slash = reference_string.find_first_of("/", start)) + { + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); + + // check reference tokens are properly escaped + for (size_t pos = reference_token.find_first_of("~"); + pos != std::string::npos; + pos = reference_token.find_first_of("~", pos + 1)) + { + assert(reference_token[pos] == '~'); - // ~ must be followed by 0 or 1 - if (pos == reference_token.size() - 1 or + // ~ must be followed by 0 or 1 + if (pos == reference_token.size() - 1 or (reference_token[pos + 1] != '0' and reference_token[pos + 1] != '1')) - { - throw std::domain_error("escape error: '~' must be followed with '0' or '1'"); + { + throw std::domain_error("escape error: '~' must be followed with '0' or '1'"); + } } + + // finally, store the reference token + unescape(reference_token); + result.push_back(reference_token); } - // finally, store the reference token - unescape(reference_token); - result.push_back(reference_token); + return result; } - return result; - } - - private: - /*! + private: + /*! @brief replace all occurrences of a substring by another string @param[in,out] s the string to manipulate @param[in] f the substring to replace with @a t - @param[out] t the string to replace @a f + @param[in] t the string to replace @a f @return The string @a s where all occurrences of @a f are replaced with @a t. @@ -9307,144 +9907,144 @@ basic_json_parser_63: @since version 2.0.0 */ - static void replace_substring(std::string& s, - const std::string& f, - const std::string& t) - { - assert(not f.empty()); + static void replace_substring(std::string& s, + const std::string& f, + const std::string& t) + { + assert(not f.empty()); - for ( - size_t pos = s.find(f); // find first occurrence of f - pos != std::string::npos; // make sure f was found - s.replace(pos, f.size(), t), // replace with t - pos = s.find(f, pos + t.size()) // find next occurrence of f - ); - } + for ( + size_t pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t + pos = s.find(f, pos + t.size()) // find next occurrence of f + ); + } - /// escape tilde and slash - static std::string escape(std::string s) - { - // escape "~"" to "~0" and "/" to "~1" - replace_substring(s, "~", "~0"); - replace_substring(s, "/", "~1"); - return s; - } + /// escape tilde and slash + static std::string escape(std::string s) + { + // escape "~"" to "~0" and "/" to "~1" + replace_substring(s, "~", "~0"); + replace_substring(s, "/", "~1"); + return s; + } - /// unescape tilde and slash - static void unescape(std::string& s) - { - // first transform any occurrence of the sequence '~1' to '/' - replace_substring(s, "~1", "/"); - // then transform any occurrence of the sequence '~0' to '~' - replace_substring(s, "~0", "~"); - } + /// unescape tilde and slash + static void unescape(std::string& s) + { + // first transform any occurrence of the sequence '~1' to '/' + replace_substring(s, "~1", "/"); + // then transform any occurrence of the sequence '~0' to '~' + replace_substring(s, "~0", "~"); + } - /*! + /*! @param[in] reference_string the reference string to the current value @param[in] value the value to consider @param[in,out] result the result object to insert values to @note Empty objects or arrays are flattened to `null`. */ - static void flatten(const std::string& reference_string, - const basic_json& value, - basic_json& result) - { - switch (value.m_type) + static void flatten(const std::string& reference_string, + const basic_json& value, + basic_json& result) { - case value_t::array: + switch (value.m_type) { - if (value.m_value.array->empty()) - { - // flatten empty array as null - result[reference_string] = nullptr; - } - else + case value_t::array: { - // iterate array and use index as reference string - for (size_t i = 0; i < value.m_value.array->size(); ++i) + if (value.m_value.array->empty()) + { + // flatten empty array as null + result[reference_string] = nullptr; + } + else { - flatten(reference_string + "/" + std::to_string(i), - value.m_value.array->operator[](i), result); + // iterate array and use index as reference string + for (size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } } + break; } - break; - } - case value_t::object: - { - if (value.m_value.object->empty()) - { - // flatten empty object as null - result[reference_string] = nullptr; - } - else + case value_t::object: { - // iterate object and use keys as reference string - for (const auto& element : *value.m_value.object) + if (value.m_value.object->empty()) + { + // flatten empty object as null + result[reference_string] = nullptr; + } + else { - flatten(reference_string + "/" + escape(element.first), - element.second, result); + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + flatten(reference_string + "/" + escape(element.first), + element.second, result); + } } + break; } - break; - } - default: - { - // add primitive value with its reference string - result[reference_string] = value; - break; + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } } } - } - /*! + /*! @param[in] value flattened JSON @return unflattened JSON */ - static basic_json unflatten(const basic_json& value) - { - if (not value.is_object()) + static basic_json unflatten(const basic_json& value) { - throw std::domain_error("only objects can be unflattened"); - } + if (not value.is_object()) + { + throw std::domain_error("only objects can be unflattened"); + } - basic_json result; + basic_json result; - // iterate the JSON object values - for (const auto& element : *value.m_value.object) - { - if (not element.second.is_primitive()) + // iterate the JSON object values + for (const auto& element : *value.m_value.object) { - throw std::domain_error("values in object must be primitive"); + if (not element.second.is_primitive()) + { + throw std::domain_error("values in object must be primitive"); + } + + // assign value to reference pointed to by JSON pointer; Note + // that if the JSON pointer is "" (i.e., points to the whole + // value), function get_and_create returns a reference to + // result itself. An assignment will then create a primitive + // value. + json_pointer(element.first).get_and_create(result) = element.second; } - // assign value to reference pointed to by JSON pointer; Note - // that if the JSON pointer is "" (i.e., points to the whole - // value), function get_and_create returns a reference to - // result itself. An assignment will then create a primitive - // value. - json_pointer(element.first).get_and_create(result) = element.second; + return result; } - return result; - } - - private: - /// the reference tokens - std::vector reference_tokens {}; - }; + private: + /// the reference tokens + std::vector reference_tokens {}; + }; - ////////////////////////// - // JSON Pointer support // - ////////////////////////// + ////////////////////////// + // JSON Pointer support // + ////////////////////////// - /// @name JSON Pointer functions - /// @{ + /// @name JSON Pointer functions + /// @{ - /*! + /*! @brief access specified element via JSON Pointer Uses a JSON pointer to retrieve a reference to the respective JSON value. @@ -9477,12 +10077,12 @@ basic_json_parser_63: @since version 2.0.0 */ - reference operator[](const json_pointer& ptr) - { - return ptr.get_unchecked(this); - } + reference operator[](const json_pointer& ptr) + { + return ptr.get_unchecked(this); + } - /*! + /*! @brief access specified element via JSON Pointer Uses a JSON pointer to retrieve a reference to the respective JSON value. @@ -9504,12 +10104,12 @@ basic_json_parser_63: @since version 2.0.0 */ - const_reference operator[](const json_pointer& ptr) const - { - return ptr.get_unchecked(this); - } + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get_unchecked(this); + } - /*! + /*! @brief access specified element via JSON Pointer Returns a reference to the element at with specified JSON pointer @a ptr, @@ -9529,12 +10129,12 @@ basic_json_parser_63: @since version 2.0.0 */ - reference at(const json_pointer& ptr) - { - return ptr.get_checked(this); - } + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } - /*! + /*! @brief access specified element via JSON Pointer Returns a const reference to the element at with specified JSON pointer @a @@ -9554,12 +10154,12 @@ basic_json_parser_63: @since version 2.0.0 */ - const_reference at(const json_pointer& ptr) const - { - return ptr.get_checked(this); - } + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); + } - /*! + /*! @brief return flattened JSON value The function creates a JSON object whose keys are JSON pointers (see [RFC @@ -9581,14 +10181,14 @@ basic_json_parser_63: @since version 2.0.0 */ - basic_json flatten() const - { - basic_json result(value_t::object); - json_pointer::flatten("", *this, result); - return result; - } + basic_json flatten() const + { + basic_json result(value_t::object); + json_pointer::flatten("", *this, result); + return result; + } - /*! + /*! @brief unflatten a previously flattened JSON value The function restores the arbitrary nesting of a JSON value that has been @@ -9615,21 +10215,21 @@ basic_json_parser_63: @since version 2.0.0 */ - basic_json unflatten() const - { - return json_pointer::unflatten(*this); - } + basic_json unflatten() const + { + return json_pointer::unflatten(*this); + } - /// @} + /// @} - ////////////////////////// - // JSON Patch functions // - ////////////////////////// + ////////////////////////// + // JSON Patch functions // + ////////////////////////// - /// @name JSON Patch functions - /// @{ + /// @name JSON Patch functions + /// @{ - /*! + /*! @brief applies a JSON patch [JSON Patch](http://jsonpatch.com) defines a JSON document structure for @@ -9665,268 +10265,268 @@ basic_json_parser_63: @since version 2.0.0 */ - basic_json patch(const basic_json& json_patch) const - { - // make a working copy to apply the patch to - basic_json result = *this; - - // the valid JSON Patch operations - enum class patch_operations {add, remove, replace, move, copy, test, invalid}; - - const auto get_op = [](const std::string op) + basic_json patch(const basic_json& json_patch) const { - if (op == "add") - { - return patch_operations::add; - } - if (op == "remove") - { - return patch_operations::remove; - } - if (op == "replace") - { - return patch_operations::replace; - } - if (op == "move") - { - return patch_operations::move; - } - if (op == "copy") - { - return patch_operations::copy; - } - if (op == "test") - { - return patch_operations::test; - } + // make a working copy to apply the patch to + basic_json result = *this; - return patch_operations::invalid; - }; + // the valid JSON Patch operations + enum class patch_operations {add, remove, replace, move, copy, test, invalid}; - // wrapper for "add" operation; add value at ptr - const auto operation_add = [&result](json_pointer & ptr, basic_json val) - { - // adding to the root of the target document means replacing it - if (ptr.is_root()) - { - result = val; - } - else + const auto get_op = [](const std::string op) { - // make sure the top element of the pointer exists - json_pointer top_pointer = ptr.top(); - if (top_pointer != ptr) + if (op == "add") + { + return patch_operations::add; + } + if (op == "remove") { - basic_json& x = result.at(top_pointer); + return patch_operations::remove; + } + if (op == "replace") + { + return patch_operations::replace; + } + if (op == "move") + { + return patch_operations::move; + } + if (op == "copy") + { + return patch_operations::copy; + } + if (op == "test") + { + return patch_operations::test; } - // get reference to parent of JSON pointer ptr - const auto last_path = ptr.pop_back(); - basic_json& parent = result[ptr]; + return patch_operations::invalid; + }; - switch (parent.m_type) + // wrapper for "add" operation; add value at ptr + const auto operation_add = [&result](json_pointer & ptr, basic_json val) + { + // adding to the root of the target document means replacing it + if (ptr.is_root()) { - case value_t::null: - case value_t::object: + result = val; + } + else + { + // make sure the top element of the pointer exists + json_pointer top_pointer = ptr.top(); + if (top_pointer != ptr) { - // use operator[] to add value - parent[last_path] = val; - break; + result.at(top_pointer); } - case value_t::array: + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.pop_back(); + basic_json& parent = result[ptr]; + + switch (parent.m_type) { - if (last_path == "-") + case value_t::null: + case value_t::object: { - // special case: append to back - parent.push_back(val); + // use operator[] to add value + parent[last_path] = val; + break; } - else + + case value_t::array: { - const auto idx = std::stoi(last_path); - if (static_cast(idx) > parent.size()) + if (last_path == "-") { - // avoid undefined behavior - throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + // special case: append to back + parent.push_back(val); } else { - // default case: insert add offset - parent.insert(parent.begin() + static_cast(idx), val); + const auto idx = std::stoi(last_path); + if (static_cast(idx) > parent.size()) + { + // avoid undefined behavior + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + } + else + { + // default case: insert add offset + parent.insert(parent.begin() + static_cast(idx), val); + } } + break; } - break; - } - default: - { - // if there exists a parent it cannot be primitive - assert(false); // LCOV_EXCL_LINE + default: + { + // if there exists a parent it cannot be primitive + assert(false); // LCOV_EXCL_LINE + } } } - } - }; - - // wrapper for "remove" operation; remove value at ptr - const auto operation_remove = [&result](json_pointer & ptr) - { - // get reference to parent of JSON pointer ptr - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - - // remove child - if (parent.is_object()) - { - // perform range check - auto it = parent.find(last_path); - if (it != parent.end()) - { - parent.erase(it); - } - else - { - throw std::out_of_range("key '" + last_path + "' not found"); - } - } - else if (parent.is_array()) - { - // note erase performs range check - parent.erase(static_cast(std::stoi(last_path))); - } - }; - - // type check - if (not json_patch.is_array()) - { - // a JSON patch must be an array of objects - throw std::invalid_argument("JSON patch must be an array of objects"); - } + }; - // iterate and apply th eoperations - for (const auto& val : json_patch) - { - // wrapper to get a value for an operation - const auto get_value = [&val](const std::string & op, - const std::string & member, - bool string_type) -> basic_json& + // wrapper for "remove" operation; remove value at ptr + const auto operation_remove = [&result](json_pointer & ptr) { - // find value - auto it = val.m_value.object->find(member); - - // context-sensitive error message - const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); - // check if desired value is present - if (it == val.m_value.object->end()) + // remove child + if (parent.is_object()) { - throw std::invalid_argument(error_msg + " must have member '" + member + "'"); + // perform range check + auto it = parent.find(last_path); + if (it != parent.end()) + { + parent.erase(it); + } + else + { + throw std::out_of_range("key '" + last_path + "' not found"); + } } - - // check if result is of type string - if (string_type and not it->second.is_string()) + else if (parent.is_array()) { - throw std::invalid_argument(error_msg + " must have string member '" + member + "'"); + // note erase performs range check + parent.erase(static_cast(std::stoi(last_path))); } - - // no error: return value - return it->second; }; // type check - if (not val.is_object()) + if (not json_patch.is_array()) { + // a JSON patch must be an array of objects throw std::invalid_argument("JSON patch must be an array of objects"); } - // collect mandatory members - const std::string op = get_value("op", "op", true); - const std::string path = get_value(op, "path", true); - json_pointer ptr(path); - - switch (get_op(op)) + // iterate and apply th eoperations + for (const auto& val : json_patch) { - case patch_operations::add: + // wrapper to get a value for an operation + const auto get_value = [&val](const std::string & op, + const std::string & member, + bool string_type) -> basic_json& { - operation_add(ptr, get_value("add", "value", false)); - break; - } + // find value + auto it = val.m_value.object->find(member); - case patch_operations::remove: - { - operation_remove(ptr); - break; - } + // context-sensitive error message + const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; - case patch_operations::replace: - { - // the "path" location must exist - use at() - result.at(ptr) = get_value("replace", "value", false); - break; - } + // check if desired value is present + if (it == val.m_value.object->end()) + { + throw std::invalid_argument(error_msg + " must have member '" + member + "'"); + } - case patch_operations::move: - { - const std::string from_path = get_value("move", "from", true); - json_pointer from_ptr(from_path); + // check if result is of type string + if (string_type and not it->second.is_string()) + { + throw std::invalid_argument(error_msg + " must have string member '" + member + "'"); + } - // the "from" location must exist - use at() - basic_json v = result.at(from_ptr); + // no error: return value + return it->second; + }; - // The move operation is functionally identical to a - // "remove" operation on the "from" location, followed - // immediately by an "add" operation at the target - // location with the value that was just removed. - operation_remove(from_ptr); - operation_add(ptr, v); - break; + // type check + if (not val.is_object()) + { + throw std::invalid_argument("JSON patch must be an array of objects"); } - case patch_operations::copy: + // collect mandatory members + const std::string op = get_value("op", "op", true); + const std::string path = get_value(op, "path", true); + json_pointer ptr(path); + + switch (get_op(op)) { - const std::string from_path = get_value("copy", "from", true);; - const json_pointer from_ptr(from_path); + case patch_operations::add: + { + operation_add(ptr, get_value("add", "value", false)); + break; + } - // the "from" location must exist - use at() - result[ptr] = result.at(from_ptr); - break; - } + case patch_operations::remove: + { + operation_remove(ptr); + break; + } - case patch_operations::test: - { - bool success = false; - try + case patch_operations::replace: { - // check if "value" matches the one at "path" // the "path" location must exist - use at() - success = (result.at(ptr) == get_value("test", "value", false)); + result.at(ptr) = get_value("replace", "value", false); + break; } - catch (std::out_of_range&) + + case patch_operations::move: { - // ignore out of range errors: success remains false + const std::string from_path = get_value("move", "from", true); + json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The move operation is functionally identical to a + // "remove" operation on the "from" location, followed + // immediately by an "add" operation at the target + // location with the value that was just removed. + operation_remove(from_ptr); + operation_add(ptr, v); + break; } - // throw an exception if test fails - if (not success) + case patch_operations::copy: { - throw std::domain_error("unsuccessful: " + val.dump()); + const std::string from_path = get_value("copy", "from", true);; + const json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + result[ptr] = result.at(from_ptr); + break; } - break; - } + case patch_operations::test: + { + bool success = false; + try + { + // check if "value" matches the one at "path" + // the "path" location must exist - use at() + success = (result.at(ptr) == get_value("test", "value", false)); + } + catch (std::out_of_range&) + { + // ignore out of range errors: success remains false + } - case patch_operations::invalid: - { - // op must be "add", "remove", "replace", "move", "copy", or - // "test" - throw std::invalid_argument("operation value '" + op + "' is invalid"); + // throw an exception if test fails + if (not success) + { + throw std::domain_error("unsuccessful: " + val.dump()); + } + + break; + } + + case patch_operations::invalid: + { + // op must be "add", "remove", "replace", "move", "copy", or + // "test" + throw std::invalid_argument("operation value '" + op + "' is invalid"); + } } } - } - return result; - } + return result; + } - /*! + /*! @brief creates a diff as a JSON patch Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can @@ -9958,137 +10558,140 @@ basic_json_parser_63: @since version 2.0.0 */ - static basic_json diff(const basic_json& source, - const basic_json& target, - std::string path = "") - { - // the patch - basic_json result(value_t::array); - - // if the values are the same, return empty patch - if (source == target) + static basic_json diff(const basic_json& source, + const basic_json& target, + const std::string& path = "") { - return result; - } + // the patch + basic_json result(value_t::array); - if (source.type() != target.type()) - { - // different types: replace value - result.push_back( + // if the values are the same, return empty patch + if (source == target) { - {"op", "replace"}, - {"path", path}, - {"value", target} - }); - } - else - { - switch (source.type()) + return result; + } + + if (source.type() != target.type()) { - case value_t::array: + // different types: replace value + result.push_back( + { + {"op", "replace"}, + {"path", path}, + {"value", target} + }); + } + else + { + switch (source.type()) { - // first pass: traverse common elements - size_t i = 0; - while (i < source.size() and i < target.size()) + case value_t::array: { - // recursive call to compare array values at index i - auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); - result.insert(result.end(), temp_diff.begin(), temp_diff.end()); - ++i; - } + // first pass: traverse common elements + size_t i = 0; + while (i < source.size() and i < target.size()) + { + // recursive call to compare array values at index i + auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + ++i; + } - // i now reached the end of at least one array - // in a second pass, traverse the remaining elements + // i now reached the end of at least one array + // in a second pass, traverse the remaining elements - // remove my remaining elements - while (i < source.size()) - { - result.push_back(object( + // remove my remaining elements + const auto end_index = static_cast(result.size()); + while (i < source.size()) { - {"op", "remove"}, - {"path", path + "/" + std::to_string(i)} - })); - ++i; - } + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, object( + { + {"op", "remove"}, + {"path", path + "/" + std::to_string(i)} + })); + ++i; + } - // add other remaining elements - while (i < target.size()) - { - result.push_back( + // add other remaining elements + while (i < target.size()) { - {"op", "add"}, - {"path", path + "/" + std::to_string(i)}, - {"value", target[i]} - }); - ++i; - } + result.push_back( + { + {"op", "add"}, + {"path", path + "/" + std::to_string(i)}, + {"value", target[i]} + }); + ++i; + } - break; - } + break; + } - case value_t::object: - { - // first pass: traverse this object's elements - for (auto it = source.begin(); it != source.end(); ++it) + case value_t::object: { - // escape the key name to be used in a JSON patch - const auto key = json_pointer::escape(it.key()); - - if (target.find(it.key()) != target.end()) + // first pass: traverse this object's elements + for (auto it = source.begin(); it != source.end(); ++it) { - // recursive call to compare object values at key it - auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key); - result.insert(result.end(), temp_diff.begin(), temp_diff.end()); - } - else - { - // found a key that is not in o -> remove it - result.push_back(object( + // escape the key name to be used in a JSON patch + const auto key = json_pointer::escape(it.key()); + + if (target.find(it.key()) != target.end()) + { + // recursive call to compare object values at key it + auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + } + else { - {"op", "remove"}, - {"path", path + "/" + key} - })); + // found a key that is not in o -> remove it + result.push_back(object( + { + {"op", "remove"}, + {"path", path + "/" + key} + })); + } } - } - // second pass: traverse other object's elements - for (auto it = target.begin(); it != target.end(); ++it) - { - if (source.find(it.key()) == source.end()) + // second pass: traverse other object's elements + for (auto it = target.begin(); it != target.end(); ++it) { - // found a key that is not in this -> add it - const auto key = json_pointer::escape(it.key()); - result.push_back( + if (source.find(it.key()) == source.end()) { - {"op", "add"}, - {"path", path + "/" + key}, - {"value", it.value()} - }); + // found a key that is not in this -> add it + const auto key = json_pointer::escape(it.key()); + result.push_back( + { + {"op", "add"}, + {"path", path + "/" + key}, + {"value", it.value()} + }); + } } - } - break; - } + break; + } - default: - { - // both primitive type: replace value - result.push_back( + default: { - {"op", "replace"}, - {"path", path}, - {"value", target} - }); - break; + // both primitive type: replace value + result.push_back( + { + {"op", "replace"}, + {"path", path}, + {"value", target} + }); + break; + } } } - } - return result; - } + return result; + } - /// @} -}; + /// @} + }; ///////////// @@ -10103,7 +10706,7 @@ uses the standard template types. @since version 1.0.0 */ -using json = basic_json<>; + using json = basic_json<>; } @@ -10119,64 +10722,73 @@ namespace std @since version 1.0.0 */ -template <> -inline void swap(nlohmann::json& j1, - nlohmann::json& j2) noexcept( - is_nothrow_move_constructible::value and - is_nothrow_move_assignable::value - ) -{ - j1.swap(j2); -} + template<> + inline void swap(nlohmann::json& j1, + nlohmann::json& j2) noexcept( + is_nothrow_move_constructible::value and + is_nothrow_move_assignable::value + ) + { + j1.swap(j2); + } /// hash value for JSON objects -template <> -struct hash -{ - /*! + template<> + struct hash + { + /*! @brief return a hash value for a JSON object @since version 1.0.0 */ - std::size_t operator()(const nlohmann::json& j) const - { - // a naive hashing via the string representation - const auto& h = hash(); - return h(j.dump()); - } -}; + std::size_t operator()(const nlohmann::json& j) const + { + // a naive hashing via the string representation + const auto& h = hash(); + return h(j.dump()); + } + }; } /*! @brief user-defined string literal for JSON values This operator implements a user-defined string literal for JSON objects. It -can be used by adding \p "_json" to a string literal and returns a JSON object +can be used by adding `"_json"` to a string literal and returns a JSON object if no parse error occurred. @param[in] s a string representation of a JSON object +@param[in] n the length of string @a s @return a JSON object @since version 1.0.0 */ -inline nlohmann::json operator "" _json(const char* s, std::size_t) +inline nlohmann::json operator "" _json(const char* s, std::size_t n) { - return nlohmann::json::parse(reinterpret_cast(s)); + return nlohmann::json::parse(s, s + n); } /*! @brief user-defined string literal for JSON pointer +This operator implements a user-defined string literal for JSON Pointers. It +can be used by adding `"_json_pointer"` to a string literal and returns a JSON pointer +object if no parse error occurred. + +@param[in] s a string representation of a JSON Pointer +@param[in] n the length of string @a s +@return a JSON pointer object + @since version 2.0.0 */ -inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t) +inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) { - return nlohmann::json::json_pointer(s); + return nlohmann::json::json_pointer(std::string(s, n)); } // restore GCC/clang diagnostic settings #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #pragma GCC diagnostic pop +#pragma GCC diagnostic pop #endif #endif diff --git a/resources/3rdparty/modernjson/src/json.hpp.re2c b/resources/3rdparty/modernjson/src/json.hpp.re2c index ba4fc007b..892c48a4c 100755 --- a/resources/3rdparty/modernjson/src/json.hpp.re2c +++ b/resources/3rdparty/modernjson/src/json.hpp.re2c @@ -1,7 +1,7 @@ /* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ -| | |__ | | | | | | version 2.0.0 +| | |__ | | | | | | version 2.0.5 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . @@ -32,20 +32,22 @@ SOFTWARE. #include #include #include -#include #include #include #include -#include +#include #include +#include #include #include #include #include #include #include +#include #include #include +#include #include #include #include @@ -53,12 +55,34 @@ SOFTWARE. #include #include +// exclude unsupported compilers +#if defined(__clang__) + #define CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) + #if CLANG_VERSION < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif +#elif defined(__GNUC__) + #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) + #if GCC_VERSION < 40900 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif +#endif + // disable float-equal warnings on GCC/clang #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wfloat-equal" #endif +// allow for portable deprecation warnings +#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) + #define JSON_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) + #define JSON_DEPRECATED __declspec(deprecated) +#else + #define JSON_DEPRECATED +#endif + /*! @brief namespace for Niels Lohmann @see https://github.com/nlohmann @@ -76,7 +100,13 @@ namespace { /*! @brief Helper to determine whether there's a key_type for T. + +Thus helper is used to tell associative containers apart from other containers +such as sequence containers. For instance, `std::map` passes the test as it +contains a `mapped_type`, whereas `std::vector` fails the test. + @sa http://stackoverflow.com/a/7728728/266378 +@since version 1.0.0 */ template struct has_mapped_type @@ -90,11 +120,18 @@ struct has_mapped_type /*! @brief helper class to create locales with decimal point + +This struct is used a default locale during the JSON serialization. JSON +requires the decimal point to be `.`, so this function overloads the +`do_decimal_point()` function to return `.`. This function is called by +float-to-string conversions to retrieve the decimal separator between integer +and fractional parts. + @sa https://github.com/nlohmann/json/issues/51#issuecomment-86869315 +@since version 2.0.0 */ -class DecimalSeparator : public std::numpunct +struct DecimalSeparator : std::numpunct { - protected: char do_decimal_point() const { return '.'; @@ -163,6 +200,13 @@ default) JSON values can be used like STL containers and provide reverse iterator access. +@invariant The member variables @a m_value and @a m_type have the following +relationship: +- If `m_type == value_t::object`, then `m_value.object != nullptr`. +- If `m_type == value_t::array`, then `m_value.array != nullptr`. +- If `m_type == value_t::string`, then `m_value.string != nullptr`. +The invariants are checked by member function assert_invariant(). + @internal @note ObjectType trick from http://stackoverflow.com/a/9860911 @endinternal @@ -188,13 +232,8 @@ class basic_json { private: /// workaround type for MSVC - using basic_json_t = basic_json; public: @@ -207,6 +246,8 @@ class basic_json ///////////////////// /// @name container types + /// The canonic container types to use @ref basic_json like any other STL + /// container. /// @{ /// the type of elements in a basic_json container @@ -256,6 +297,8 @@ class basic_json /////////////////////////// /// @name JSON value data types + /// The data types to store a JSON value. These types are derived from + /// the template arguments passed to class @ref basic_json. /// @{ /*! @@ -358,7 +401,7 @@ class basic_json @tparam ArrayType container type to store arrays (e.g., `std::vector` or `std::list`) - @tparam AllocatorType allocator to use for arrays (e.g., `std::allocator`) + @tparam AllocatorType allocator to use for arrays (e.g., `std::allocator`) #### Default type @@ -595,15 +638,14 @@ class basic_json > that implementations will agree exactly on their numeric values. As this range is a subrange (when considered in conjunction with the - number_integer_t type) of the exactly supported range [0, UINT64_MAX], this - class's integer type is interoperable. + number_integer_t type) of the exactly supported range [0, UINT64_MAX], + this class's integer type is interoperable. #### Storage Integer number values are stored directly inside a @ref basic_json type. @sa @ref number_float_t -- type for number values (floating-point) - @sa @ref number_integer_t -- type for number values (integer) @since version 2.0.0 @@ -691,7 +733,19 @@ class basic_json This enumeration collects the different JSON types. It is internally used to distinguish the stored values, and the functions @ref is_null(), @ref is_object(), @ref is_array(), @ref is_string(), @ref is_boolean(), @ref - is_number(), and @ref is_discarded() rely on it. + is_number() (with @ref is_number_integer(), @ref is_number_unsigned(), and + @ref is_number_float()), @ref is_discarded(), @ref is_primitive(), and + @ref is_structured() rely on it. + + @note There are three enumeration entries (number_integer, + number_unsigned, and number_float), because the library distinguishes + these three types for numbers: @ref number_unsigned_t is used for unsigned + integers, @ref number_integer_t is used for signed integers, and @ref + number_float_t is used for floating-point numbers or to approximate + integers which do not fit in the limits of their respective type. + + @sa @ref basic_json(const value_t value_type) -- create a JSON value with + the default value for a given type @since version 1.0.0 */ @@ -702,7 +756,7 @@ class basic_json array, ///< array (ordered collection of values) string, ///< string value boolean, ///< boolean value - number_integer, ///< number value (integer) + number_integer, ///< number value (signed integer) number_unsigned, ///< number value (unsigned integer) number_float, ///< number value (floating-point) discarded ///< discarded by the the parser callback function @@ -711,73 +765,6 @@ class basic_json private: - /*! - @brief a type to hold JSON type information - - This bitfield type holds information about JSON types. It is internally - used to hold the basic JSON type enumeration, as well as additional - information in the case of values that have been parsed from a string - including whether of not it was created directly or parsed, and in the - case of floating point numbers the number of significant figures in the - original representaiton and if it was in exponential form, if a '+' was - included in the exponent and the capitilization of the exponent marker. - The sole purpose of this information is to permit accurate round trips. - - @since version 2.0.0 - */ - union type_data_t - { - struct - { - /// the type of the value (@ref value_t) - uint16_t type : 4; - /// whether the number was parsed from a string - uint16_t parsed : 1; - /// whether parsed number contained an exponent ('e'/'E') - uint16_t has_exp : 1; - /// whether parsed number contained a plus in the exponent - uint16_t exp_plus : 1; - /// whether parsed number's exponent was capitalized ('E') - uint16_t exp_cap : 1; - /// the number of figures for a parsed number - uint16_t precision : 8; - } bits; - uint16_t data; - - /// return the type as value_t - operator value_t() const - { - return static_cast(bits.type); - } - - /// test type for equality (ignore other fields) - bool operator==(const value_t& rhs) const - { - return static_cast(bits.type) == rhs; - } - - /// assignment - type_data_t& operator=(value_t rhs) - { - bits.type = static_cast(rhs) & 15; // avoid overflow - return *this; - } - - /// construct from value_t - type_data_t(value_t t) noexcept - { - *reinterpret_cast(this) = 0; - bits.type = static_cast(t) & 15; // avoid overflow - } - - /// default constructor - type_data_t() noexcept - { - data = 0; - bits.type = reinterpret_cast(value_t::null); - } - }; - /// helper for exception-safe object creation template static T* create(Args&& ... args) @@ -789,6 +776,7 @@ class basic_json }; std::unique_ptr object(alloc.allocate(1), deleter); alloc.construct(object.get(), std::forward(args)...); + assert(object.get() != nullptr); return object.release(); } @@ -799,7 +787,24 @@ class basic_json /*! @brief a JSON value - The actual storage for a JSON value of the @ref basic_json class. + The actual storage for a JSON value of the @ref basic_json class. This + union combines the different storage types for the JSON value types + defined in @ref value_t. + + JSON type | value_t type | used type + --------- | --------------- | ------------------------ + object | object | pointer to @ref object_t + array | array | pointer to @ref array_t + string | string | pointer to @ref string_t + boolean | boolean | @ref boolean_t + number | number_integer | @ref number_integer_t + number | number_unsigned | @ref number_unsigned_t + number | number_float | @ref number_float_t + null | null | *no value is stored* + + @note Variable-length types (objects, arrays, and strings) are stored as + pointers. The size of the union should not exceed 64 bits if the default + value types are used. @since version 1.0.0 */ @@ -903,6 +908,21 @@ class basic_json } }; + /*! + @brief checks the class invariants + + This function asserts the class invariants. It needs to be called at the + end of every constructor to make sure that created objects respect the + invariant. Furthermore, it has to be called each time the type of a JSON + value is changed, because the invariant expresses a relationship between + @a m_type and @a m_value. + */ + void assert_invariant() const + { + assert(m_type != value_t::object or m_value.object != nullptr); + assert(m_type != value_t::array or m_value.array != nullptr); + assert(m_type != value_t::string or m_value.string != nullptr); + } public: ////////////////////////// @@ -915,6 +935,8 @@ class basic_json This enumeration lists the parser events that can trigger calling a callback function of type @ref parser_callback_t during parsing. + @image html callback_events.png "Example when certain parse events are triggered" + @since version 1.0.0 */ enum class parse_event_t : uint8_t @@ -937,12 +959,13 @@ class basic_json @brief per-element parser callback type With a parser callback function, the result of parsing a JSON text can be - influenced. When passed to @ref parse(std::istream&, parser_callback_t) or - @ref parse(const string_t&, parser_callback_t), it is called on certain - events (passed as @ref parse_event_t via parameter @a event) with a set - recursion depth @a depth and context JSON value @a parsed. The return - value of the callback function is a boolean indicating whether the element - that emitted the callback shall be kept or not. + influenced. When passed to @ref parse(std::istream&, const + parser_callback_t) or @ref parse(const char*, const parser_callback_t), + it is called on certain events (passed as @ref parse_event_t via parameter + @a event) with a set recursion depth @a depth and context JSON value + @a parsed. The return value of the callback function is a boolean + indicating whether the element that emitted the callback shall be kept or + not. We distinguish six scenarios (determined by the event type) in which the callback function can be called. The following table describes the values @@ -957,6 +980,8 @@ class basic_json parse_event_t::array_end | the parser read `]` and finished processing a JSON array | depth of the parent of the JSON array | the parsed JSON array parse_event_t::value | the parser finished reading a JSON value | depth of the value | the parsed JSON value + @image html callback_events.png "Example when certain parse events are triggered" + Discarding a value (i.e., returning `false`) has different effects depending on the context in which function was called: @@ -978,11 +1003,13 @@ class basic_json skipped completely or replaced by an empty discarded object. @sa @ref parse(std::istream&, parser_callback_t) or - @ref parse(const string_t&, parser_callback_t) for examples + @ref parse(const char*, parser_callback_t) for examples @since version 1.0.0 */ - using parser_callback_t = std::function; + using parser_callback_t = std::function; ////////////////// @@ -990,6 +1017,8 @@ class basic_json ////////////////// /// @name constructors and destructors + /// Constructors of class @ref basic_json, copy/move constructor, copy + /// assignment, static functions creating objects, and the destructor. /// @{ /*! @@ -1033,40 +1062,15 @@ class basic_json */ basic_json(const value_t value_type) : m_type(value_type), m_value(value_type) - {} - - /*! - @brief create a null object (implicitly) - - Create a `null` JSON value. This is the implicit version of the `null` - value constructor as it takes no parameters. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this constructor never throws - exceptions. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is constant. - - As postcondition, it holds: `basic_json().empty() == true`. - - @liveexample{The following code shows the constructor for a `null` JSON - value.,basic_json} - - @sa @ref basic_json(std::nullptr_t) -- create a `null` value - - @since version 1.0.0 - */ - basic_json() = default; + { + assert_invariant(); + } /*! - @brief create a null object (explicitly) + @brief create a null object - Create a `null` JSON value. This is the explicitly version of the `null` - value constructor as it takes a null pointer as parameter. It allows to - create `null` values by explicitly assigning a `nullptr` to a JSON value. + Create a `null` JSON value. It either takes a null pointer as parameter + (explicitly creating `null`) or no parameter (implicitly creating `null`). The passed null pointer itself is not read -- it is only used to choose the right constructor. @@ -1075,17 +1079,16 @@ class basic_json @exceptionsafety No-throw guarantee: this constructor never throws exceptions. - @liveexample{The following code shows the constructor with null pointer - parameter.,basic_json__nullptr_t} - - @sa @ref basic_json() -- default constructor (implicitly creating a `null` - value) + @liveexample{The following code shows the constructor with and without a + null pointer parameter.,basic_json__nullptr_t} @since version 1.0.0 */ - basic_json(std::nullptr_t) noexcept + basic_json(std::nullptr_t = nullptr) noexcept : basic_json(value_t::null) - {} + { + assert_invariant(); + } /*! @brief create an object (explicit) @@ -1108,7 +1111,9 @@ class basic_json */ basic_json(const object_t& val) : m_type(value_t::object), m_value(val) - {} + { + assert_invariant(); + } /*! @brief create an object (implicit) @@ -1136,17 +1141,16 @@ class basic_json @since version 1.0.0 */ - template ::value and - std::is_constructible::value, int>::type - = 0> + template::value and + std::is_constructible::value, int>::type = 0> basic_json(const CompatibleObjectType& val) : m_type(value_t::object) { using std::begin; using std::end; m_value.object = create(begin(val), end(val)); + assert_invariant(); } /*! @@ -1170,7 +1174,9 @@ class basic_json */ basic_json(const array_t& val) : m_type(value_t::array), m_value(val) - {} + { + assert_invariant(); + } /*! @brief create an array (implicit) @@ -1198,22 +1204,21 @@ class basic_json @since version 1.0.0 */ - template ::value and - not std::is_same::value and - not std::is_same::value and - not std::is_same::value and - not std::is_same::value and - not std::is_same::value and - std::is_constructible::value, int>::type - = 0> + template::value and + not std::is_same::value and + not std::is_same::value and + not std::is_same::value and + not std::is_same::value and + not std::is_same::value and + std::is_constructible::value, int>::type = 0> basic_json(const CompatibleArrayType& val) : m_type(value_t::array) { using std::begin; using std::end; m_value.array = create(begin(val), end(val)); + assert_invariant(); } /*! @@ -1239,7 +1244,9 @@ class basic_json */ basic_json(const string_t& val) : m_type(value_t::string), m_value(val) - {} + { + assert_invariant(); + } /*! @brief create a string (explicit) @@ -1263,7 +1270,9 @@ class basic_json */ basic_json(const typename string_t::value_type* val) : basic_json(string_t(val)) - {} + { + assert_invariant(); + } /*! @brief create a string (implicit) @@ -1288,13 +1297,13 @@ class basic_json @since version 1.0.0 */ - template ::value, int>::type - = 0> + template::value, int>::type = 0> basic_json(const CompatibleStringType& val) : basic_json(string_t(val)) - {} + { + assert_invariant(); + } /*! @brief create a boolean (explicit) @@ -1312,7 +1321,9 @@ class basic_json */ basic_json(boolean_t val) noexcept : m_type(value_t::boolean), m_value(val) - {} + { + assert_invariant(); + } /*! @brief create an integer number (explicit) @@ -1337,15 +1348,14 @@ class basic_json @since version 1.0.0 */ - template::value) - and std::is_same::value - , int>::type - = 0> + template::value) and + std::is_same::value, int>::type = 0> basic_json(const number_integer_t val) noexcept : m_type(value_t::number_integer), m_value(val) - {} + { + assert_invariant(); + } /*! @brief create an integer number from an enum type (explicit) @@ -1375,7 +1385,9 @@ class basic_json basic_json(const int val) noexcept : m_type(value_t::number_integer), m_value(static_cast(val)) - {} + { + assert_invariant(); + } /*! @brief create an integer number (implicit) @@ -1402,25 +1414,25 @@ class basic_json @since version 1.0.0 */ - template::value and std::numeric_limits::is_integer and std::numeric_limits::is_signed, - CompatibleNumberIntegerType>::type - = 0> + CompatibleNumberIntegerType>::type = 0> basic_json(const CompatibleNumberIntegerType val) noexcept : m_type(value_t::number_integer), m_value(static_cast(val)) - {} + { + assert_invariant(); + } /*! @brief create an unsigned integer number (explicit) Create an unsigned integer number JSON value with a given content. - @tparam T helper type to compare number_unsigned_t and unsigned int - (not visible in) the interface. + @tparam T helper type to compare number_unsigned_t and unsigned int (not + visible in) the interface. @param[in] val an integer to create a JSON number from @@ -1431,15 +1443,14 @@ class basic_json @since version 2.0.0 */ - template::value) - and std::is_same::value - , int>::type - = 0> + template::value) and + std::is_same::value, int>::type = 0> basic_json(const number_unsigned_t val) noexcept : m_type(value_t::number_unsigned), m_value(val) - {} + { + assert_invariant(); + } /*! @brief create an unsigned number (implicit) @@ -1461,17 +1472,17 @@ class basic_json @since version 2.0.0 */ - template < typename CompatibleNumberUnsignedType, typename - std::enable_if < - std::is_constructible::value and - std::numeric_limits::is_integer and - !std::numeric_limits::is_signed, - CompatibleNumberUnsignedType >::type - = 0 > + template::value and + std::numeric_limits::is_integer and + not std::numeric_limits::is_signed, + CompatibleNumberUnsignedType>::type = 0> basic_json(const CompatibleNumberUnsignedType val) noexcept : m_type(value_t::number_unsigned), m_value(static_cast(val)) - {} + { + assert_invariant(); + } /*! @brief create a floating-point number (explicit) @@ -1484,8 +1495,8 @@ class basic_json disallows NaN values: > Numeric values that cannot be represented in the grammar below (such as > Infinity and NaN) are not permitted. - In case the parameter @a val is not a number, a JSON null value is - created instead. + In case the parameter @a val is not a number, a JSON null value is created + instead. @complexity Constant. @@ -1506,6 +1517,8 @@ class basic_json m_type = value_t::null; m_value = json_value(); } + + assert_invariant(); } /*! @@ -1539,14 +1552,14 @@ class basic_json @since version 1.0.0 */ - template::value and - std::is_floating_point::value>::type - > + std::is_floating_point::value>::type> basic_json(const CompatibleNumberFloatType val) noexcept : basic_json(number_float_t(val)) - {} + { + assert_invariant(); + } /*! @brief create a container (array or object) from an initializer list @@ -1558,21 +1571,21 @@ class basic_json 1. If the list is empty, an empty JSON object value `{}` is created. 2. If the list consists of pairs whose first element is a string, a JSON - object value is created where the first elements of the pairs are treated - as keys and the second elements are as values. + object value is created where the first elements of the pairs are + treated as keys and the second elements are as values. 3. In all other cases, an array is created. The rules aim to create the best fit between a C++ initializer list and JSON values. The rationale is as follows: 1. The empty initializer list is written as `{}` which is exactly an empty - JSON object. + JSON object. 2. C++ has now way of describing mapped types other than to list a list of - pairs. As JSON requires that keys must be of type string, rule 2 is the - weakest constraint one can pose on initializer lists to interpret them as - an object. + pairs. As JSON requires that keys must be of type string, rule 2 is the + weakest constraint one can pose on initializer lists to interpret them + as an object. 3. In all other cases, the initializer list could not be interpreted as - JSON object type, so interpreting it as JSON array type is safe. + JSON object type, so interpreting it as JSON array type is safe. With the rules described above, the following JSON values cannot be expressed by an initializer list: @@ -1621,22 +1634,13 @@ class basic_json bool type_deduction = true, value_t manual_type = value_t::array) { - // the initializer list could describe an object - bool is_an_object = true; - // check if each element is an array with two elements whose first // element is a string - for (const auto& element : init) + bool is_an_object = std::all_of(init.begin(), init.end(), + [](const basic_json & element) { - if (not element.is_array() or element.size() != 2 - or not element[0].is_string()) - { - // we found an element that makes it impossible to use the - // initializer list as object - is_an_object = false; - break; - } - } + return element.is_array() and element.size() == 2 and element[0].is_string(); + }); // adjust type if type deduction is not wanted if (not type_deduction) @@ -1660,12 +1664,10 @@ class basic_json m_type = value_t::object; m_value = value_t::object; - assert(m_value.object != nullptr); - - for (auto& element : init) + std::for_each(init.begin(), init.end(), [this](const basic_json & element) { m_value.object->emplace(*(element[0].m_value.string), element[1]); - } + }); } else { @@ -1673,6 +1675,8 @@ class basic_json m_type = value_t::array; m_value.array = create(init); } + + assert_invariant(); } /*! @@ -1777,6 +1781,7 @@ class basic_json : m_type(value_t::array) { m_value.array = create(cnt, val); + assert_invariant(); } /*! @@ -1797,6 +1802,9 @@ class basic_json @param[in] first begin of the range to copy from (included) @param[in] last end of the range to copy from (excluded) + @pre Iterators @a first and @a last must be initialized. **This + precondition is enforced with an assertion.** + @throw std::domain_error if iterators are not compatible; that is, do not belong to the same JSON value; example: `"iterators are not compatible"` @throw std::out_of_range if iterators are for a primitive type (number, @@ -1813,20 +1821,23 @@ class basic_json @since version 1.0.0 */ - template ::value or - std::is_same::value - , int>::type - = 0> - basic_json(InputIT first, InputIT last) : m_type(first.m_object->m_type) + template::value or + std::is_same::value, int>::type = 0> + basic_json(InputIT first, InputIT last) { + assert(first.m_object != nullptr); + assert(last.m_object != nullptr); + // make sure iterator fits the current value if (first.m_object != last.m_object) { throw std::domain_error("iterators are not compatible"); } + // copy type from first iterator + m_type = first.m_object->m_type; + // check if iterator range is complete for primitive values switch (m_type) { @@ -1853,35 +1864,30 @@ class basic_json { case value_t::number_integer: { - assert(first.m_object != nullptr); m_value.number_integer = first.m_object->m_value.number_integer; break; } case value_t::number_unsigned: { - assert(first.m_object != nullptr); m_value.number_unsigned = first.m_object->m_value.number_unsigned; break; } case value_t::number_float: { - assert(first.m_object != nullptr); m_value.number_float = first.m_object->m_value.number_float; break; } case value_t::boolean: { - assert(first.m_object != nullptr); m_value.boolean = first.m_object->m_value.boolean; break; } case value_t::string: { - assert(first.m_object != nullptr); m_value = *first.m_object->m_value.string; break; } @@ -1900,10 +1906,11 @@ class basic_json default: { - assert(first.m_object != nullptr); throw std::domain_error("cannot use construct with iterators from " + first.m_object->type_name()); } } + + assert_invariant(); } /*! @@ -1920,15 +1927,25 @@ class basic_json @note A UTF-8 byte order mark is silently ignored. + @deprecated This constructor is deprecated and will be removed in version + 3.0.0 to unify the interface of the library. Deserialization will be + done by stream operators or by calling one of the `parse` functions, + e.g. @ref parse(std::istream&, const parser_callback_t). That is, calls + like `json j(i);` for an input stream @a i need to be replaced by + `json j = json::parse(i);`. See the example below. + @liveexample{The example below demonstrates constructing a JSON value from a `std::stringstream` with and without callback function.,basic_json__istream} - @since version 2.0.0 + @since version 2.0.0, deprecated in version 2.0.3, to be removed in + version 3.0.0 */ - explicit basic_json(std::istream& i, parser_callback_t cb = nullptr) + JSON_DEPRECATED + explicit basic_json(std::istream& i, const parser_callback_t cb = nullptr) { *this = parser(i, cb).parse(); + assert_invariant(); } /////////////////////////////////////// @@ -1960,25 +1977,25 @@ class basic_json basic_json(const basic_json& other) : m_type(other.m_type) { + // check of passed value is valid + other.assert_invariant(); + switch (m_type) { case value_t::object: { - assert(other.m_value.object != nullptr); m_value = *other.m_value.object; break; } case value_t::array: { - assert(other.m_value.array != nullptr); m_value = *other.m_value.array; break; } case value_t::string: { - assert(other.m_value.string != nullptr); m_value = *other.m_value.string; break; } @@ -2012,6 +2029,8 @@ class basic_json break; } } + + assert_invariant(); } /*! @@ -2036,9 +2055,14 @@ class basic_json : m_type(std::move(other.m_type)), m_value(std::move(other.m_value)) { + // check that passed value is valid + other.assert_invariant(); + // invalidate payload other.m_type = value_t::null; other.m_value = {}; + + assert_invariant(); } /*! @@ -2071,9 +2095,14 @@ class basic_json std::is_nothrow_move_assignable::value ) { + // check that passed value is valid + other.assert_invariant(); + using std::swap; swap(m_type, other.m_type); swap(m_value, other.m_value); + + assert_invariant(); return *this; } @@ -2094,6 +2123,8 @@ class basic_json */ ~basic_json() { + assert_invariant(); + switch (m_type) { case value_t::object: @@ -2136,19 +2167,20 @@ class basic_json /////////////////////// /// @name object inspection + /// Functions to inspect the type of a JSON value. /// @{ /*! @brief serialization Serialization function for JSON values. The function tries to mimic - Python's @p json.dumps() function, and currently supports its @p indent + Python's `json.dumps()` function, and currently supports its @a indent parameter. - @param[in] indent if indent is nonnegative, then array elements and object + @param[in] indent If indent is nonnegative, then array elements and object members will be pretty-printed with that indent level. An indent level of - 0 will only insert newlines. -1 (the default) selects the most compact - representation + `0` will only insert newlines. `-1` (the default) selects the most compact + representation. @return string containing the serialization of the JSON value @@ -2164,6 +2196,15 @@ class basic_json string_t dump(const int indent = -1) const { std::stringstream ss; + // fix locale problems + const static std::locale loc(std::locale(), new DecimalSeparator); + ss.imbue(loc); + + // 6, 15 or 16 digits of precision allows round-trip IEEE 754 + // string->float->string, string->double->string or string->long + // double->string; to be safe, we read this value from + // std::numeric_limits::digits10 + ss.precision(std::numeric_limits::digits10); if (indent >= 0) { @@ -2540,16 +2581,13 @@ class basic_json ////////////////// /// get an object (explicit) - template ::value and - std::is_convertible::value - , int>::type = 0> + template::value and + std::is_convertible::value, int>::type = 0> T get_impl(T*) const { if (is_object()) { - assert(m_value.object != nullptr); return T(m_value.object->begin(), m_value.object->end()); } else @@ -2563,7 +2601,6 @@ class basic_json { if (is_object()) { - assert(m_value.object != nullptr); return *(m_value.object); } else @@ -2573,20 +2610,17 @@ class basic_json } /// get an array (explicit) - template ::value and - not std::is_same::value and - not std::is_arithmetic::value and - not std::is_convertible::value and - not has_mapped_type::value - , int>::type = 0> + template::value and + not std::is_same::value and + not std::is_arithmetic::value and + not std::is_convertible::value and + not has_mapped_type::value, int>::type = 0> T get_impl(T*) const { if (is_array()) { T to_vector; - assert(m_value.array != nullptr); std::transform(m_value.array->begin(), m_value.array->end(), std::inserter(to_vector, to_vector.end()), [](basic_json i) { @@ -2601,17 +2635,14 @@ class basic_json } /// get an array (explicit) - template ::value and - not std::is_same::value - , int>::type = 0> + template::value and + not std::is_same::value, int>::type = 0> std::vector get_impl(std::vector*) const { if (is_array()) { std::vector to_vector; - assert(m_value.array != nullptr); to_vector.reserve(m_value.array->size()); std::transform(m_value.array->begin(), m_value.array->end(), std::inserter(to_vector, to_vector.end()), [](basic_json i) @@ -2627,16 +2658,13 @@ class basic_json } /// get an array (explicit) - template ::value and - not has_mapped_type::value - , int>::type = 0> + template::value and + not has_mapped_type::value, int>::type = 0> T get_impl(T*) const { if (is_array()) { - assert(m_value.array != nullptr); return T(m_value.array->begin(), m_value.array->end()); } else @@ -2650,7 +2678,6 @@ class basic_json { if (is_array()) { - assert(m_value.array != nullptr); return *(m_value.array); } else @@ -2660,15 +2687,12 @@ class basic_json } /// get a string (explicit) - template ::value - , int>::type = 0> + template::value, int>::type = 0> T get_impl(T*) const { if (is_string()) { - assert(m_value.string != nullptr); return *m_value.string; } else @@ -2678,10 +2702,8 @@ class basic_json } /// get a number (explicit) - template::value - , int>::type = 0> + template::value, int>::type = 0> T get_impl(T*) const { switch (m_type) @@ -2814,8 +2836,10 @@ class basic_json template static ReferenceType get_ref_impl(ThisType& obj) { - // delegate the call to get_ptr<>() + // helper type using PointerType = typename std::add_pointer::type; + + // delegate the call to get_ptr<>() auto ptr = obj.template get_ptr(); if (ptr != nullptr) @@ -2832,6 +2856,7 @@ class basic_json public: /// @name value access + /// Direct access to the stored value of a JSON value. /// @{ /*! @@ -2867,10 +2892,8 @@ class basic_json @since version 1.0.0 */ - template::value - , int>::type = 0> + template::value, int>::type = 0> ValueType get() const { return get_impl(static_cast(nullptr)); @@ -2882,7 +2905,8 @@ class basic_json Explicit pointer access to the internally stored JSON value. No copies are made. - @warning The pointer becomes invalid if the underlying JSON object changes. + @warning The pointer becomes invalid if the underlying JSON object + changes. @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, @@ -2902,10 +2926,8 @@ class basic_json @since version 1.0.0 */ - template::value - , int>::type = 0> + template::value, int>::type = 0> PointerType get() noexcept { // delegate the call to get_ptr @@ -2916,10 +2938,8 @@ class basic_json @brief get a pointer value (explicit) @copydoc get() */ - template::value - , int>::type = 0> + template::value, int>::type = 0> constexpr const PointerType get() const noexcept { // delegate the call to get_ptr @@ -2937,7 +2957,8 @@ class basic_json @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, - @ref number_unsigned_t, or @ref number_float_t. + @ref number_unsigned_t, or @ref number_float_t. Enforced by a static + assertion. @return pointer to the internally stored JSON value if the requested pointer type @a PointerType fits to the JSON value; `nullptr` otherwise @@ -2951,12 +2972,25 @@ class basic_json @since version 1.0.0 */ - template::value - , int>::type = 0> + template::value, int>::type = 0> PointerType get_ptr() noexcept { + // get the type of the PointerType (remove pointer and const) + using pointee_t = typename std::remove_const::type>::type>::type; + // make sure the type matches the allowed types + static_assert( + std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + , "incompatible pointer type"); + // delegate the call to get_impl_ptr<>() return get_impl_ptr(static_cast(nullptr)); } @@ -2965,13 +2999,26 @@ class basic_json @brief get a pointer value (implicit) @copydoc get_ptr() */ - template::value - and std::is_const::type>::value - , int>::type = 0> + template::value and + std::is_const::type>::value, int>::type = 0> constexpr const PointerType get_ptr() const noexcept { + // get the type of the PointerType (remove pointer and const) + using pointee_t = typename std::remove_const::type>::type>::type; + // make sure the type matches the allowed types + static_assert( + std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + or std::is_same::value + , "incompatible pointer type"); + // delegate the call to get_impl_ptr<>() const return get_impl_ptr(static_cast(nullptr)); } @@ -2987,7 +3034,7 @@ class basic_json @tparam ReferenceType reference type; must be a reference to @ref array_t, @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or - @ref number_float_t. + @ref number_float_t. Enforced by static assertion. @return reference to the internally stored JSON value if the requested reference type @a ReferenceType fits to the JSON value; throws @@ -3002,10 +3049,8 @@ class basic_json @since version 1.1.0 */ - template::value - , int>::type = 0> + template::value, int>::type = 0> ReferenceType get_ref() { // delegate call to get_ref_impl @@ -3016,11 +3061,9 @@ class basic_json @brief get a reference value (implicit) @copydoc get_ref() */ - template::value - and std::is_const::type>::value - , int>::type = 0> + template::value and + std::is_const::type>::value, int>::type = 0> ReferenceType get_ref() const { // delegate call to get_ref_impl @@ -3055,10 +3098,9 @@ class basic_json @since version 1.0.0 */ - template < typename ValueType, typename - std::enable_if < - not std::is_pointer::value - and not std::is_same::value + template < typename ValueType, typename std::enable_if < + not std::is_pointer::value and + not std::is_same::value #ifndef _MSC_VER // Fix for issue #167 operator<< abiguity under VS2015 and not std::is_same>::value #endif @@ -3077,6 +3119,7 @@ class basic_json //////////////////// /// @name element access + /// Access to the JSON value. /// @{ /*! @@ -3108,7 +3151,6 @@ class basic_json { try { - assert(m_value.array != nullptr); return m_value.array->at(idx); } catch (std::out_of_range&) @@ -3152,7 +3194,6 @@ class basic_json { try { - assert(m_value.array != nullptr); return m_value.array->at(idx); } catch (std::out_of_range&) @@ -3200,7 +3241,6 @@ class basic_json { try { - assert(m_value.object != nullptr); return m_value.object->at(key); } catch (std::out_of_range&) @@ -3248,7 +3288,6 @@ class basic_json { try { - assert(m_value.object != nullptr); return m_value.object->at(key); } catch (std::out_of_range&) @@ -3295,16 +3334,18 @@ class basic_json { m_type = value_t::array; m_value.array = create(); + assert_invariant(); } // operator[] only works for arrays if (is_array()) { - // fill up array with null values until given idx is reached - assert(m_value.array != nullptr); - for (size_t i = m_value.array->size(); i <= idx; ++i) + // fill up array with null values if given idx is outside range + if (idx >= m_value.array->size()) { - m_value.array->push_back(basic_json()); + m_value.array->insert(m_value.array->end(), + idx - m_value.array->size() + 1, + basic_json()); } return m_value.array->operator[](idx); @@ -3339,7 +3380,6 @@ class basic_json // const operator[] only works for arrays if (is_array()) { - assert(m_value.array != nullptr); return m_value.array->operator[](idx); } else @@ -3382,12 +3422,12 @@ class basic_json { m_type = value_t::object; m_value.object = create(); + assert_invariant(); } // operator[] only works for objects if (is_object()) { - assert(m_value.object != nullptr); return m_value.object->operator[](key); } else @@ -3409,6 +3449,9 @@ class basic_json @return const reference to the element at key @a key + @pre The element with key @a key must exist. **This precondition is + enforced with an assertion.** + @throw std::domain_error if JSON is not an object; example: `"cannot use operator[] with null"` @@ -3428,7 +3471,6 @@ class basic_json // const operator[] only works for objects if (is_object()) { - assert(m_value.object != nullptr); assert(m_value.object->find(key) != m_value.object->end()); return m_value.object->find(key)->second; } @@ -3541,12 +3583,12 @@ class basic_json { m_type = value_t::object; m_value = value_t::object; + assert_invariant(); } // at only works for objects if (is_object()) { - assert(m_value.object != nullptr); return m_value.object->operator[](key); } else @@ -3568,6 +3610,9 @@ class basic_json @return const reference to the element at key @a key + @pre The element with key @a key must exist. **This precondition is + enforced with an assertion.** + @throw std::domain_error if JSON is not an object; example: `"cannot use operator[] with null"` @@ -3588,7 +3633,6 @@ class basic_json // at only works for objects if (is_object()) { - assert(m_value.object != nullptr); assert(m_value.object->find(key) != m_value.object->end()); return m_value.object->find(key)->second; } @@ -3601,8 +3645,8 @@ class basic_json /*! @brief access specified object element with default value - Returns either a copy of an object's element at the specified key @a key or - a given default value if no element with key @a key exists. + Returns either a copy of an object's element at the specified key @a key + or a given default value if no element with key @a key exists. The function is basically equivalent to executing @code {.cpp} @@ -3646,10 +3690,8 @@ class basic_json @since version 1.0.0 */ - template ::value - , int>::type = 0> + template::value, int>::type = 0> ValueType value(const typename object_t::key_type& key, ValueType default_value) const { // at only works for objects @@ -3674,13 +3716,86 @@ class basic_json /*! @brief overload for a default value of type const char* - @copydoc basic_json::value() + @copydoc basic_json::value(const typename object_t::key_type&, ValueType) const */ string_t value(const typename object_t::key_type& key, const char* default_value) const { return value(key, string_t(default_value)); } + /*! + @brief access specified object element via JSON Pointer with default value + + Returns either a copy of an object's element at the specified key @a key + or a given default value if no element with key @a key exists. + + The function is basically equivalent to executing + @code {.cpp} + try { + return at(ptr); + } catch(std::out_of_range) { + return default_value; + } + @endcode + + @note Unlike @ref at(const json_pointer&), this function does not throw + if the given key @a key was not found. + + @param[in] ptr a JSON pointer to the element to access + @param[in] default_value the value to return if @a ptr found no value + + @tparam ValueType type compatible to JSON values, for instance `int` for + JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for + JSON arrays. Note the type of the expected value at @a key and the default + value @a default_value must be compatible. + + @return copy of the element at key @a key or @a default_value if @a key + is not found + + @throw std::domain_error if JSON is not an object; example: `"cannot use + value() with null"` + + @complexity Logarithmic in the size of the container. + + @liveexample{The example below shows how object elements can be queried + with a default value.,basic_json__value_ptr} + + @sa @ref operator[](const json_pointer&) for unchecked access by reference + + @since version 2.0.2 + */ + template::value, int>::type = 0> + ValueType value(const json_pointer& ptr, ValueType default_value) const + { + // at only works for objects + if (is_object()) + { + // if pointer resolves a value, return it or use default value + try + { + return ptr.get_checked(this); + } + catch (std::out_of_range&) + { + return default_value; + } + } + else + { + throw std::domain_error("cannot use value() with " + type_name()); + } + } + + /*! + @brief overload for a default value of type const char* + @copydoc basic_json::value(const json_pointer&, ValueType) const + */ + string_t value(const json_pointer& ptr, const char* default_value) const + { + return value(ptr, string_t(default_value)); + } + /*! @brief access the first element @@ -3694,7 +3809,8 @@ class basic_json @complexity Constant. @pre The JSON value must not be `null` (would throw `std::out_of_range`) - or an empty array or object (undefined behavior, guarded by assertions). + or an empty array or object (undefined behavior, **guarded by + assertions**). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value @@ -3736,7 +3852,8 @@ class basic_json @complexity Constant. @pre The JSON value must not be `null` (would throw `std::out_of_range`) - or an empty array or object (undefined behavior, guarded by assertions). + or an empty array or object (undefined behavior, **guarded by + assertions**). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value. @@ -3778,7 +3895,7 @@ class basic_json @return Iterator following the last removed element. If the iterator @a pos refers to the last element, the `end()` iterator is returned. - @tparam InteratorType an @ref iterator or @ref const_iterator + @tparam IteratorType an @ref iterator or @ref const_iterator @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. @@ -3800,7 +3917,7 @@ class basic_json @liveexample{The example shows the result of `erase()` for different JSON types.,erase__IteratorType} - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + @sa @ref erase(IteratorType, IteratorType) -- removes the elements in the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @@ -3809,13 +3926,11 @@ class basic_json @since version 1.0.0 */ - template ::value or - std::is_same::value - , int>::type - = 0> - InteratorType erase(InteratorType pos) + template::value or + std::is_same::value, int>::type + = 0> + IteratorType erase(IteratorType pos) { // make sure iterator fits the current value if (this != pos.m_object) @@ -3823,7 +3938,7 @@ class basic_json throw std::domain_error("iterator does not fit current value"); } - InteratorType result = end(); + IteratorType result = end(); switch (m_type) { @@ -3840,24 +3955,25 @@ class basic_json if (is_string()) { - delete m_value.string; + AllocatorType alloc; + alloc.destroy(m_value.string); + alloc.deallocate(m_value.string, 1); m_value.string = nullptr; } m_type = value_t::null; + assert_invariant(); break; } case value_t::object: { - assert(m_value.object != nullptr); result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator); break; } case value_t::array: { - assert(m_value.array != nullptr); result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator); break; } @@ -3886,7 +4002,7 @@ class basic_json @return Iterator following the last removed element. If the iterator @a second refers to the last element, the `end()` iterator is returned. - @tparam InteratorType an @ref iterator or @ref const_iterator + @tparam IteratorType an @ref iterator or @ref const_iterator @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. @@ -3909,7 +4025,7 @@ class basic_json @liveexample{The example shows the result of `erase()` for different JSON types.,erase__IteratorType_IteratorType} - @sa @ref erase(InteratorType) -- removes the element at a given position + @sa @ref erase(IteratorType) -- removes the element at a given position @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @sa @ref erase(const size_type) -- removes the element from an array at @@ -3917,13 +4033,11 @@ class basic_json @since version 1.0.0 */ - template ::value or - std::is_same::value - , int>::type - = 0> - InteratorType erase(InteratorType first, InteratorType last) + template::value or + std::is_same::value, int>::type + = 0> + IteratorType erase(IteratorType first, IteratorType last) { // make sure iterator fits the current value if (this != first.m_object or this != last.m_object) @@ -3931,7 +4045,7 @@ class basic_json throw std::domain_error("iterators do not fit current value"); } - InteratorType result = end(); + IteratorType result = end(); switch (m_type) { @@ -3948,17 +4062,19 @@ class basic_json if (is_string()) { - delete m_value.string; + AllocatorType alloc; + alloc.destroy(m_value.string); + alloc.deallocate(m_value.string, 1); m_value.string = nullptr; } m_type = value_t::null; + assert_invariant(); break; } case value_t::object: { - assert(m_value.object != nullptr); result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator, last.m_it.object_iterator); break; @@ -3966,7 +4082,6 @@ class basic_json case value_t::array: { - assert(m_value.array != nullptr); result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator, last.m_it.array_iterator); break; @@ -4002,8 +4117,8 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__key_type} - @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + @sa @ref erase(IteratorType) -- removes the element at a given position + @sa @ref erase(IteratorType, IteratorType) -- removes the elements in the given range @sa @ref erase(const size_type) -- removes the element from an array at the given index @@ -4015,7 +4130,6 @@ class basic_json // this erase only works for objects if (is_object()) { - assert(m_value.object != nullptr); return m_value.object->erase(key); } else @@ -4040,8 +4154,8 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__size_type} - @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + @sa @ref erase(IteratorType) -- removes the element at a given position + @sa @ref erase(IteratorType, IteratorType) -- removes the elements in the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @@ -4058,7 +4172,6 @@ class basic_json throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); } - assert(m_value.array != nullptr); m_value.array->erase(m_value.array->begin() + static_cast(idx)); } else @@ -4101,7 +4214,6 @@ class basic_json if (is_object()) { - assert(m_value.object != nullptr); result.m_it.object_iterator = m_value.object->find(key); } @@ -4118,7 +4230,6 @@ class basic_json if (is_object()) { - assert(m_value.object != nullptr); result.m_it.object_iterator = m_value.object->find(key); } @@ -4146,7 +4257,6 @@ class basic_json size_type count(typename object_t::key_type key) const { // return 0 for all nonobject types - assert(not is_object() or m_value.object != nullptr); return is_object() ? m_value.object->count(key) : 0; } @@ -4488,6 +4598,10 @@ class basic_json object | result of function `object_t::empty()` array | result of function `array_t::empty()` + @note This function does not return whether a string stored as JSON value + is empty - it returns whether the JSON container itself is empty which is + false in the case of a string. + @complexity Constant, as long as @ref array_t and @ref object_t satisfy the Container concept; that is, their `empty()` functions have constant complexity. @@ -4517,13 +4631,13 @@ class basic_json case value_t::array: { - assert(m_value.array != nullptr); + // delegate call to array_t::empty() return m_value.array->empty(); } case value_t::object: { - assert(m_value.object != nullptr); + // delegate call to object_t::empty() return m_value.object->empty(); } @@ -4551,6 +4665,10 @@ class basic_json object | result of function object_t::size() array | result of function array_t::size() + @note This function does not return the length of a string stored as JSON + value - it returns the number of elements in the JSON value which is 1 in + the case of a string. + @complexity Constant, as long as @ref array_t and @ref object_t satisfy the Container concept; that is, their size() functions have constant complexity. @@ -4581,13 +4699,13 @@ class basic_json case value_t::array: { - assert(m_value.array != nullptr); + // delegate call to array_t::size() return m_value.array->size(); } case value_t::object: { - assert(m_value.object != nullptr); + // delegate call to object_t::size() return m_value.object->size(); } @@ -4641,13 +4759,13 @@ class basic_json { case value_t::array: { - assert(m_value.array != nullptr); + // delegate call to array_t::max_size() return m_value.array->max_size(); } case value_t::object: { - assert(m_value.object != nullptr); + // delegate call to object_t::max_size() return m_value.object->max_size(); } @@ -4724,21 +4842,18 @@ class basic_json case value_t::string: { - assert(m_value.string != nullptr); m_value.string->clear(); break; } case value_t::array: { - assert(m_value.array != nullptr); m_value.array->clear(); break; } case value_t::object: { - assert(m_value.object != nullptr); m_value.object->clear(); break; } @@ -4783,10 +4898,10 @@ class basic_json { m_type = value_t::array; m_value = value_t::array; + assert_invariant(); } // add element to array (move semantics) - assert(m_value.array != nullptr); m_value.array->push_back(std::move(val)); // invalidate object val.m_type = value_t::null; @@ -4819,10 +4934,10 @@ class basic_json { m_type = value_t::array; m_value = value_t::array; + assert_invariant(); } // add element to array - assert(m_value.array != nullptr); m_value.array->push_back(val); } @@ -4869,10 +4984,10 @@ class basic_json { m_type = value_t::object; m_value = value_t::object; + assert_invariant(); } // add element to array - assert(m_value.object != nullptr); m_value.object->insert(val); } @@ -4969,7 +5084,6 @@ class basic_json // insert to array and return iterator iterator result(this); - assert(m_value.array != nullptr); result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, val); return result; } @@ -5025,7 +5139,6 @@ class basic_json // insert to array and return iterator iterator result(this); - assert(m_value.array != nullptr); result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val); return result; } @@ -5079,6 +5192,7 @@ class basic_json throw std::domain_error("iterator does not fit current value"); } + // check if range iterators belong to the same JSON object if (first.m_object != last.m_object) { throw std::domain_error("iterators do not fit"); @@ -5091,7 +5205,6 @@ class basic_json // insert to array and return iterator iterator result(this); - assert(m_value.array != nullptr); result.m_it.array_iterator = m_value.array->insert( pos.m_it.array_iterator, first.m_it.array_iterator, @@ -5139,7 +5252,6 @@ class basic_json // insert to array and return iterator iterator result(this); - assert(m_value.array != nullptr); result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, ilist); return result; } @@ -5170,6 +5282,7 @@ class basic_json { std::swap(m_type, other.m_type); std::swap(m_value, other.m_value); + assert_invariant(); } /*! @@ -5197,7 +5310,6 @@ class basic_json // swap only works for arrays if (is_array()) { - assert(m_value.array != nullptr); std::swap(*(m_value.array), other); } else @@ -5231,7 +5343,6 @@ class basic_json // swap only works for objects if (is_object()) { - assert(m_value.object != nullptr); std::swap(*(m_value.object), other); } else @@ -5265,7 +5376,6 @@ class basic_json // swap only works for strings if (is_string()) { - assert(m_value.string != nullptr); std::swap(*(m_value.string), other); } else @@ -5352,14 +5462,10 @@ class basic_json { case value_t::array: { - assert(lhs.m_value.array != nullptr); - assert(rhs.m_value.array != nullptr); return *lhs.m_value.array == *rhs.m_value.array; } case value_t::object: { - assert(lhs.m_value.object != nullptr); - assert(rhs.m_value.object != nullptr); return *lhs.m_value.object == *rhs.m_value.object; } case value_t::null: @@ -5368,8 +5474,6 @@ class basic_json } case value_t::string: { - assert(lhs.m_value.string != nullptr); - assert(rhs.m_value.string != nullptr); return *lhs.m_value.string == *rhs.m_value.string; } case value_t::boolean: @@ -5542,14 +5646,10 @@ class basic_json { case value_t::array: { - assert(lhs.m_value.array != nullptr); - assert(rhs.m_value.array != nullptr); return *lhs.m_value.array < *rhs.m_value.array; } case value_t::object: { - assert(lhs.m_value.object != nullptr); - assert(rhs.m_value.object != nullptr); return *lhs.m_value.object < *rhs.m_value.object; } case value_t::null: @@ -5558,8 +5658,6 @@ class basic_json } case value_t::string: { - assert(lhs.m_value.string != nullptr); - assert(rhs.m_value.string != nullptr); return *lhs.m_value.string < *rhs.m_value.string; } case value_t::boolean: @@ -5701,6 +5799,10 @@ class basic_json `std::setw(4)` on @a o sets the indentation level to `4` and the serialization result is the same as calling `dump(4)`. + @note During serializaion, the locale and the precision of the output + stream @a o are changed. The original values are restored when the + function returns. + @param[in,out] o stream to serialize to @param[in] j JSON value to serialize @@ -5722,8 +5824,22 @@ class basic_json // reset width to 0 for subsequent calls to this stream o.width(0); + // fix locale problems + const auto old_locale = o.imbue(std::locale(std::locale(), new DecimalSeparator)); + // set precision + + // 6, 15 or 16 digits of precision allows round-trip IEEE 754 + // string->float->string, string->double->string or string->long + // double->string; to be safe, we read this value from + // std::numeric_limits::digits10 + const auto old_precision = o.precision(std::numeric_limits::digits10); + // do the actual serialization j.dump(o, pretty_print, static_cast(indentation)); + + // reset locale and precision + o.imbue(old_locale); + o.precision(old_precision); return o; } @@ -5747,9 +5863,45 @@ class basic_json /// @{ /*! - @brief deserialize from string + @brief deserialize from an array + + This function reads from an array of 1-byte values. + + @pre Each element of the container has a size of 1 byte. Violating this + precondition yields undefined behavior. **This precondition is enforced + with a static assertion.** + + @param[in] array array to read from + @param[in] cb a parser callback function of type @ref parser_callback_t + which is used to control the deserialization by filtering unwanted values + (optional) - @param[in] s string to read a serialized JSON value from + @return result of the deserialization + + @complexity Linear in the length of the input. The parser is a predictive + LL(1) parser. The complexity can be higher if the parser callback function + @a cb has a super-linear complexity. + + @note A UTF-8 byte order mark is silently ignored. + + @liveexample{The example below demonstrates the `parse()` function reading + from an array.,parse__array__parser_callback_t} + + @since version 2.0.3 + */ + template + static basic_json parse(T (&array)[N], + const parser_callback_t cb = nullptr) + { + // delegate the call to the iterator-range parse overload + return parse(std::begin(array), std::end(array), cb); + } + + /*! + @brief deserialize from string literal + + @tparam CharT character/literal type with size of 1 byte + @param[in] s string literal to read a serialized JSON value from @param[in] cb a parser callback function of type @ref parser_callback_t which is used to control the deserialization by filtering unwanted values (optional) @@ -5761,18 +5913,25 @@ class basic_json @a cb has a super-linear complexity. @note A UTF-8 byte order mark is silently ignored. + @note String containers like `std::string` or @ref string_t can be parsed + with @ref parse(const ContiguousContainer&, const parser_callback_t) @liveexample{The example below demonstrates the `parse()` function with and without callback function.,parse__string__parser_callback_t} - @sa @ref parse(std::istream&, parser_callback_t) for a version that reads - from an input stream + @sa @ref parse(std::istream&, const parser_callback_t) for a version that + reads from an input stream - @since version 1.0.0 + @since version 1.0.0 (originally for @ref string_t) */ - static basic_json parse(const string_t& s, parser_callback_t cb = nullptr) + template::value and + std::is_integral::type>::value and + sizeof(typename std::remove_pointer::type) == 1, int>::type = 0> + static basic_json parse(const CharPT s, + const parser_callback_t cb = nullptr) { - return parser(s, cb).parse(); + return parser(reinterpret_cast(s), cb).parse(); } /*! @@ -5794,24 +5953,150 @@ class basic_json @liveexample{The example below demonstrates the `parse()` function with and without callback function.,parse__istream__parser_callback_t} - @sa @ref parse(const string_t&, parser_callback_t) for a version that - reads from a string + @sa @ref parse(const char*, const parser_callback_t) for a version + that reads from a string @since version 1.0.0 */ - static basic_json parse(std::istream& i, parser_callback_t cb = nullptr) + static basic_json parse(std::istream& i, + const parser_callback_t cb = nullptr) { return parser(i, cb).parse(); } /*! - @copydoc parse(std::istream&, parser_callback_t) + @copydoc parse(std::istream&, const parser_callback_t) */ - static basic_json parse(std::istream&& i, parser_callback_t cb = nullptr) + static basic_json parse(std::istream&& i, + const parser_callback_t cb = nullptr) { return parser(i, cb).parse(); } + /*! + @brief deserialize from an iterator range with contiguous storage + + This function reads from an iterator range of a container with contiguous + storage of 1-byte values. Compatible container types include + `std::vector`, `std::string`, `std::array`, `std::valarray`, and + `std::initializer_list`. Furthermore, C-style arrays can be used with + `std::begin()`/`std::end()`. User-defined containers can be used as long + as they implement random-access iterators and a contiguous storage. + + @pre The iterator range is contiguous. Violating this precondition yields + undefined behavior. **This precondition is enforced with an assertion.** + @pre Each element in the range has a size of 1 byte. Violating this + precondition yields undefined behavior. **This precondition is enforced + with a static assertion.** + + @warning There is no way to enforce all preconditions at compile-time. If + the function is called with noncompliant iterators and with + assertions switched off, the behavior is undefined and will most + likely yield segmentation violation. + + @tparam IteratorType iterator of container with contiguous storage + @param[in] first begin of the range to parse (included) + @param[in] last end of the range to parse (excluded) + @param[in] cb a parser callback function of type @ref parser_callback_t + which is used to control the deserialization by filtering unwanted values + (optional) + + @return result of the deserialization + + @complexity Linear in the length of the input. The parser is a predictive + LL(1) parser. The complexity can be higher if the parser callback function + @a cb has a super-linear complexity. + + @note A UTF-8 byte order mark is silently ignored. + + @liveexample{The example below demonstrates the `parse()` function reading + from an iterator range.,parse__iteratortype__parser_callback_t} + + @since version 2.0.3 + */ + template::iterator_category>::value, int>::type = 0> + static basic_json parse(IteratorType first, IteratorType last, + const parser_callback_t cb = nullptr) + { + // assertion to check that the iterator range is indeed contiguous, + // see http://stackoverflow.com/a/35008842/266378 for more discussion + assert(std::accumulate(first, last, std::make_pair(true, 0), + [&first](std::pair res, decltype(*first) val) + { + res.first &= (val == *(std::next(std::addressof(*first), res.second++))); + return res; + }).first); + + // assertion to check that each element is 1 byte long + static_assert(sizeof(typename std::iterator_traits::value_type) == 1, + "each element in the iterator range must have the size of 1 byte"); + + // if iterator range is empty, create a parser with an empty string + // to generate "unexpected EOF" error message + if (std::distance(first, last) <= 0) + { + return parser("").parse(); + } + + return parser(first, last, cb).parse(); + } + + /*! + @brief deserialize from a container with contiguous storage + + This function reads from a container with contiguous storage of 1-byte + values. Compatible container types include `std::vector`, `std::string`, + `std::array`, and `std::initializer_list`. User-defined containers can be + used as long as they implement random-access iterators and a contiguous + storage. + + @pre The container storage is contiguous. Violating this precondition + yields undefined behavior. **This precondition is enforced with an + assertion.** + @pre Each element of the container has a size of 1 byte. Violating this + precondition yields undefined behavior. **This precondition is enforced + with a static assertion.** + + @warning There is no way to enforce all preconditions at compile-time. If + the function is called with a noncompliant container and with + assertions switched off, the behavior is undefined and will most + likely yield segmentation violation. + + @tparam ContiguousContainer container type with contiguous storage + @param[in] c container to read from + @param[in] cb a parser callback function of type @ref parser_callback_t + which is used to control the deserialization by filtering unwanted values + (optional) + + @return result of the deserialization + + @complexity Linear in the length of the input. The parser is a predictive + LL(1) parser. The complexity can be higher if the parser callback function + @a cb has a super-linear complexity. + + @note A UTF-8 byte order mark is silently ignored. + + @liveexample{The example below demonstrates the `parse()` function reading + from a contiguous container.,parse__contiguouscontainer__parser_callback_t} + + @since version 2.0.3 + */ + template::value and + std::is_base_of< + std::random_access_iterator_tag, + typename std::iterator_traits()))>::iterator_category>::value + , int>::type = 0> + static basic_json parse(const ContiguousContainer& c, + const parser_callback_t cb = nullptr) + { + // delegate the call to the iterator-range parse overload + return parse(std::begin(c), std::end(c), cb); + } + /*! @brief deserialize from stream @@ -5830,8 +6115,8 @@ class basic_json @liveexample{The example below shows how a JSON value is constructed by reading a serialization from a stream.,operator_deserialize} - @sa parse(std::istream&, parser_callback_t) for a variant with a parser - callback function to filter values while parsing + @sa parse(std::istream&, const parser_callback_t) for a variant with a + parser callback function to filter values while parsing @since version 1.0.0 */ @@ -5859,8 +6144,19 @@ class basic_json // convenience functions // /////////////////////////// - /// return the type as string - string_t type_name() const noexcept + /*! + @brief return the type as string + + Returns the type name as string to be used in error messages - usually to + indicate that a function was called on a wrong JSON type. + + @return basically a string representation of a the @a m_type member + + @complexity Constant. + + @since version 1.0.0 + */ + std::string type_name() const { switch (m_type) { @@ -5891,9 +6187,8 @@ class basic_json */ static std::size_t extra_space(const string_t& s) noexcept { - std::size_t result = 0; - - for (const auto& c : s) + return std::accumulate(s.begin(), s.end(), size_t{}, + [](size_t res, typename string_t::value_type c) { switch (c) { @@ -5906,8 +6201,7 @@ class basic_json case '\t': { // from c (1 byte) to \x (2 bytes) - result += 1; - break; + return res + 1; } default: @@ -5915,14 +6209,15 @@ class basic_json if (c >= 0x00 and c <= 0x1f) { // from c (1 byte) to \uxxxx (6 bytes) - result += 5; + return res + 5; + } + else + { + return res; } - break; } } - } - - return result; + }); } /*! @@ -6016,16 +6311,15 @@ class basic_json { // convert a number 0..15 to its hex representation // (0..f) - const auto hexify = [](const int v) -> char + static const char hexify[16] = { - return (v < 10) - ? ('0' + static_cast(v)) - : ('a' + static_cast((v - 10) & 0x1f)); + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; // print character c as \uxxxx for (const char m : - { 'u', '0', '0', hexify(c >> 4), hexify(c & 0x0f) + { 'u', '0', '0', hexify[c >> 4], hexify[c & 0x0f] }) { result[++pos] = m; @@ -6075,8 +6369,6 @@ class basic_json { case value_t::object: { - assert(m_value.object != nullptr); - if (m_value.object->empty()) { o << "{}"; @@ -6117,8 +6409,6 @@ class basic_json case value_t::array: { - assert(m_value.array != nullptr); - if (m_value.array->empty()) { o << "[]"; @@ -6157,7 +6447,6 @@ class basic_json case value_t::string: { - assert(m_value.string != nullptr); o << string_t("\"") << escape_string(*m_value.string) << "\""; return; } @@ -6182,79 +6471,14 @@ class basic_json case value_t::number_float: { - // check if number was parsed from a string - if (m_type.bits.parsed) + if (m_value.number_float == 0) { - // check if parsed number had an exponent given - if (m_type.bits.has_exp) - { - // buffer size: precision (2^8-1 = 255) + other ('-.e-xxx' = 7) + null (1) - char buf[263]; - int len; - - // handle capitalization of the exponent - if (m_type.bits.exp_cap) - { - len = snprintf(buf, sizeof(buf), "%.*E", - m_type.bits.precision, m_value.number_float) + 1; - } - else - { - len = snprintf(buf, sizeof(buf), "%.*e", - m_type.bits.precision, m_value.number_float) + 1; - } - - // remove '+' sign from the exponent if necessary - if (not m_type.bits.exp_plus) - { - if (len > static_cast(sizeof(buf))) - { - len = sizeof(buf); - } - for (int i = 0; i < len; i++) - { - if (buf[i] == '+') - { - for (; i + 1 < len; i++) - { - buf[i] = buf[i + 1]; - } - } - } - } - - o << buf; - } - else - { - // no exponent - output as a decimal - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(m_type.bits.precision) - << std::fixed << m_value.number_float; - o << ss.str(); - } + // special case for zero to get "0.0"/"-0.0" + o << (std::signbit(m_value.number_float) ? "-0.0" : "0.0"); } else { - if (m_value.number_float == 0) - { - // special case for zero to get "0.0"/"-0.0" - o << (std::signbit(m_value.number_float) ? "-0.0" : "0.0"); - } - else - { - // Otherwise 6, 15 or 16 digits of precision allows - // round-trip IEEE 754 string->float->string, - // string->double->string or string->long - // double->string; to be safe, we read this value from - // std::numeric_limits::digits10 - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(std::numeric_limits::digits10) - << m_value.number_float; - o << ss.str(); - } + o << m_value.number_float; } return; } @@ -6279,7 +6503,7 @@ class basic_json ////////////////////// /// the type of the current element - type_data_t m_type = value_t::null; + value_t m_type = value_t::null; /// the value of the current element json_value m_value = {}; @@ -6471,6 +6695,12 @@ class basic_json This class implements a const iterator for the @ref basic_json class. From this class, the @ref iterator class is derived. + @note An iterator is called *initialized* when a pointer to a JSON value + has been set (e.g., by a constructor or a copy assignment). If the + iterator is default-constructed, it is *uninitialized* and most + methods are undefined. **The library uses assertions to detect calls + on uninitialized iterators.** + @requirement The class satisfies the following concept requirements: - [RandomAccessIterator](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator): The iterator that can be moved to point (forward and backward) to any @@ -6498,7 +6728,12 @@ class basic_json /// default constructor const_iterator() = default; - /// constructor for a given JSON instance + /*! + @brief constructor for a given JSON instance + @param[in] object pointer to a JSON object for this iterator + @pre object != nullptr + @post The iterator is initialized; i.e. `m_object != nullptr`. + */ explicit const_iterator(pointer object) noexcept : m_object(object) { @@ -6526,40 +6761,53 @@ class basic_json } } - /// copy constructor given a nonconst iterator + /*! + @brief copy constructor given a non-const iterator + @param[in] other iterator to copy from + @note It is not checked whether @a other is initialized. + */ explicit const_iterator(const iterator& other) noexcept : m_object(other.m_object) { - assert(m_object != nullptr); - - switch (m_object->m_type) + if (m_object != nullptr) { - case basic_json::value_t::object: + switch (m_object->m_type) { - m_it.object_iterator = other.m_it.object_iterator; - break; - } + case basic_json::value_t::object: + { + m_it.object_iterator = other.m_it.object_iterator; + break; + } - case basic_json::value_t::array: - { - m_it.array_iterator = other.m_it.array_iterator; - break; - } + case basic_json::value_t::array: + { + m_it.array_iterator = other.m_it.array_iterator; + break; + } - default: - { - m_it.primitive_iterator = other.m_it.primitive_iterator; - break; + default: + { + m_it.primitive_iterator = other.m_it.primitive_iterator; + break; + } } } } - /// copy constructor + /*! + @brief copy constructor + @param[in] other iterator to copy from + @note It is not checked whether @a other is initialized. + */ const_iterator(const const_iterator& other) noexcept : m_object(other.m_object), m_it(other.m_it) {} - /// copy assignment + /*! + @brief copy assignment + @param[in,out] other iterator to copy from + @note It is not checked whether @a other is initialized. + */ const_iterator& operator=(const_iterator other) noexcept( std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and @@ -6573,7 +6821,10 @@ class basic_json } private: - /// set the iterator to the first value + /*! + @brief set the iterator to the first value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ void set_begin() noexcept { assert(m_object != nullptr); @@ -6582,14 +6833,12 @@ class basic_json { case basic_json::value_t::object: { - assert(m_object->m_value.object != nullptr); m_it.object_iterator = m_object->m_value.object->begin(); break; } case basic_json::value_t::array: { - assert(m_object->m_value.array != nullptr); m_it.array_iterator = m_object->m_value.array->begin(); break; } @@ -6609,7 +6858,10 @@ class basic_json } } - /// set the iterator past the last value + /*! + @brief set the iterator past the last value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ void set_end() noexcept { assert(m_object != nullptr); @@ -6618,14 +6870,12 @@ class basic_json { case basic_json::value_t::object: { - assert(m_object->m_value.object != nullptr); m_it.object_iterator = m_object->m_value.object->end(); break; } case basic_json::value_t::array: { - assert(m_object->m_value.array != nullptr); m_it.array_iterator = m_object->m_value.array->end(); break; } @@ -6639,7 +6889,10 @@ class basic_json } public: - /// return a reference to the value pointed to by the iterator + /*! + @brief return a reference to the value pointed to by the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ reference operator*() const { assert(m_object != nullptr); @@ -6648,14 +6901,12 @@ class basic_json { case basic_json::value_t::object: { - assert(m_object->m_value.object); assert(m_it.object_iterator != m_object->m_value.object->end()); return m_it.object_iterator->second; } case basic_json::value_t::array: { - assert(m_object->m_value.array); assert(m_it.array_iterator != m_object->m_value.array->end()); return *m_it.array_iterator; } @@ -6679,7 +6930,10 @@ class basic_json } } - /// dereference the iterator + /*! + @brief dereference the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ pointer operator->() const { assert(m_object != nullptr); @@ -6688,14 +6942,12 @@ class basic_json { case basic_json::value_t::object: { - assert(m_object->m_value.object); assert(m_it.object_iterator != m_object->m_value.object->end()); return &(m_it.object_iterator->second); } case basic_json::value_t::array: { - assert(m_object->m_value.array); assert(m_it.array_iterator != m_object->m_value.array->end()); return &*m_it.array_iterator; } @@ -6714,7 +6966,10 @@ class basic_json } } - /// post-increment (it++) + /*! + @brief post-increment (it++) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ const_iterator operator++(int) { auto result = *this; @@ -6722,7 +6977,10 @@ class basic_json return result; } - /// pre-increment (++it) + /*! + @brief pre-increment (++it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ const_iterator& operator++() { assert(m_object != nullptr); @@ -6731,13 +6989,13 @@ class basic_json { case basic_json::value_t::object: { - ++m_it.object_iterator; + std::advance(m_it.object_iterator, 1); break; } case basic_json::value_t::array: { - ++m_it.array_iterator; + std::advance(m_it.array_iterator, 1); break; } @@ -6751,7 +7009,10 @@ class basic_json return *this; } - /// post-decrement (it--) + /*! + @brief post-decrement (it--) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ const_iterator operator--(int) { auto result = *this; @@ -6759,7 +7020,10 @@ class basic_json return result; } - /// pre-decrement (--it) + /*! + @brief pre-decrement (--it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ const_iterator& operator--() { assert(m_object != nullptr); @@ -6768,13 +7032,13 @@ class basic_json { case basic_json::value_t::object: { - --m_it.object_iterator; + std::advance(m_it.object_iterator, -1); break; } case basic_json::value_t::array: { - --m_it.array_iterator; + std::advance(m_it.array_iterator, -1); break; } @@ -6788,7 +7052,10 @@ class basic_json return *this; } - /// comparison: equal + /*! + @brief comparison: equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ bool operator==(const const_iterator& other) const { // if objects are not the same, the comparison is undefined @@ -6818,13 +7085,19 @@ class basic_json } } - /// comparison: not equal + /*! + @brief comparison: not equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ bool operator!=(const const_iterator& other) const { return not operator==(other); } - /// comparison: smaller + /*! + @brief comparison: smaller + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ bool operator<(const const_iterator& other) const { // if objects are not the same, the comparison is undefined @@ -6854,25 +7127,37 @@ class basic_json } } - /// comparison: less than or equal + /*! + @brief comparison: less than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ bool operator<=(const const_iterator& other) const { return not other.operator < (*this); } - /// comparison: greater than + /*! + @brief comparison: greater than + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ bool operator>(const const_iterator& other) const { return not operator<=(other); } - /// comparison: greater than or equal + /*! + @brief comparison: greater than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ bool operator>=(const const_iterator& other) const { return not operator<(other); } - /// add to iterator + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ const_iterator& operator+=(difference_type i) { assert(m_object != nullptr); @@ -6886,7 +7171,7 @@ class basic_json case basic_json::value_t::array: { - m_it.array_iterator += i; + std::advance(m_it.array_iterator, i); break; } @@ -6900,13 +7185,19 @@ class basic_json return *this; } - /// subtract from iterator + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ const_iterator& operator-=(difference_type i) { return operator+=(-i); } - /// add to iterator + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ const_iterator operator+(difference_type i) { auto result = *this; @@ -6914,7 +7205,10 @@ class basic_json return result; } - /// subtract from iterator + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ const_iterator operator-(difference_type i) { auto result = *this; @@ -6922,7 +7216,10 @@ class basic_json return result; } - /// return difference + /*! + @brief return difference + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ difference_type operator-(const const_iterator& other) const { assert(m_object != nullptr); @@ -6946,7 +7243,10 @@ class basic_json } } - /// access to successor + /*! + @brief access to successor + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ reference operator[](difference_type n) const { assert(m_object != nullptr); @@ -6960,7 +7260,7 @@ class basic_json case basic_json::value_t::array: { - return *(m_it.array_iterator + n); + return *std::next(m_it.array_iterator, n); } case basic_json::value_t::null: @@ -6982,7 +7282,10 @@ class basic_json } } - /// return the key of an object iterator + /*! + @brief return the key of an object iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ typename object_t::key_type key() const { assert(m_object != nullptr); @@ -6997,7 +7300,10 @@ class basic_json } } - /// return the value of an iterator + /*! + @brief return the value of an iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ reference value() const { return operator*(); @@ -7277,17 +7583,17 @@ class basic_json enum class token_type { uninitialized, ///< indicating the scanner is uninitialized - literal_true, ///< the "true" literal - literal_false, ///< the "false" literal - literal_null, ///< the "null" literal + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal value_string, ///< a string -- use get_string() for actual value value_number, ///< a number -- use get_number() for actual value - begin_array, ///< the character for array begin "[" - begin_object, ///< the character for object begin "{" - end_array, ///< the character for array end "]" - end_object, ///< the character for object end "}" - name_separator, ///< the name separator ":" - value_separator, ///< the value separator "," + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` parse_error, ///< indicating a parse error end_of_input ///< indicating the end of the input buffer }; @@ -7295,54 +7601,55 @@ class basic_json /// the char type to use in the lexer using lexer_char_t = unsigned char; - /// constructor with a given buffer - explicit lexer(const string_t& s) noexcept - : m_stream(nullptr), m_buffer(s) + /// a lexer from a buffer with given length + lexer(const lexer_char_t* buff, const size_t len) noexcept + : m_content(buff) { - m_content = reinterpret_cast(s.c_str()); assert(m_content != nullptr); m_start = m_cursor = m_content; - m_limit = m_content + s.size(); + m_limit = m_content + len; } - /// constructor with a given stream - explicit lexer(std::istream* s) noexcept - : m_stream(s), m_buffer() + /// a lexer from an input stream + explicit lexer(std::istream& s) + : m_stream(&s), m_line_buffer() { - assert(m_stream != nullptr); - getline(*m_stream, m_buffer); - m_content = reinterpret_cast(m_buffer.c_str()); - assert(m_content != nullptr); - m_start = m_cursor = m_content; - m_limit = m_content + m_buffer.size(); + // fill buffer + fill_line_buffer(); } - /// default constructor - lexer() = default; - - // switch off unwanted functions + // switch off unwanted functions (due to pointer members) + lexer() = delete; lexer(const lexer&) = delete; lexer operator=(const lexer&) = delete; /*! - @brief create a string from a Unicode code point + @brief create a string from one or two Unicode code points + + There are two cases: (1) @a codepoint1 is in the Basic Multilingual + Plane (U+0000 through U+FFFF) and @a codepoint2 is 0, or (2) + @a codepoint1 and @a codepoint2 are a UTF-16 surrogate pair to + represent a code point above U+FFFF. @param[in] codepoint1 the code point (can be high surrogate) @param[in] codepoint2 the code point (can be low surrogate or 0) - @return string representation of the code point + @return string representation of the code point; the length of the + result string is between 1 and 4 characters. - @throw std::out_of_range if code point is >0x10ffff; example: `"code + @throw std::out_of_range if code point is > 0x10ffff; example: `"code points above 0x10FFFF are invalid"` @throw std::invalid_argument if the low surrogate is invalid; example: `""missing or wrong low surrogate""` + @complexity Constant. + @see */ static string_t to_unicode(const std::size_t codepoint1, const std::size_t codepoint2 = 0) { - // calculate the codepoint from the given code points + // calculate the code point from the given code points std::size_t codepoint = codepoint1; // check if codepoint1 is a high surrogate @@ -7404,7 +7711,7 @@ class basic_json } /// return name of values of type token_type (only used for errors) - static std::string token_type_name(token_type t) + static std::string token_type_name(const token_type t) { switch (t) { @@ -7453,109 +7760,171 @@ class basic_json function consists of a large block of code with `goto` jumps. @return the class of the next token read from the buffer + + @complexity Linear in the length of the input.\n + + Proposition: The loop below will always terminate for finite input.\n + + Proof (by contradiction): Assume a finite input. To loop forever, the + loop must never hit code with a `break` statement. The only code + snippets without a `break` statement are the continue statements for + whitespace and byte-order-marks. To loop forever, the input must be an + infinite sequence of whitespace or byte-order-marks. This contradicts + the assumption of finite input, q.e.d. */ - token_type scan() noexcept - { - // pointer for backtracking information - m_marker = nullptr; + token_type scan() + { + while (true) + { + // pointer for backtracking information + m_marker = nullptr; + + // remember the begin of the token + m_start = m_cursor; + assert(m_start != nullptr); + + /*!re2c + re2c:define:YYCTYPE = lexer_char_t; + re2c:define:YYCURSOR = m_cursor; + re2c:define:YYLIMIT = m_limit; + re2c:define:YYMARKER = m_marker; + re2c:define:YYFILL = "fill_line_buffer()"; + re2c:yyfill:parameter = 0; + re2c:indent:string = " "; + re2c:indent:top = 1; + re2c:labelprefix = "basic_json_parser_"; + + // ignore whitespace + ws = [ \t\n\r]+; + ws { continue; } + + // ignore byte-order-mark + bom = "\xEF\xBB\xBF"; + bom { continue; } + + // structural characters + "[" { last_token_type = token_type::begin_array; break; } + "]" { last_token_type = token_type::end_array; break; } + "{" { last_token_type = token_type::begin_object; break; } + "}" { last_token_type = token_type::end_object; break; } + "," { last_token_type = token_type::value_separator; break; } + ":" { last_token_type = token_type::name_separator; break; } + + // literal names + "null" { last_token_type = token_type::literal_null; break; } + "true" { last_token_type = token_type::literal_true; break; } + "false" { last_token_type = token_type::literal_false; break; } + + // number + decimal_point = "."; + digit = [0-9]; + digit_1_9 = [1-9]; + e = "e" | "E"; + minus = "-"; + plus = "+"; + zero = "0"; + exp = e (minus | plus)? digit+; + frac = decimal_point digit+; + int = (zero | digit_1_9 digit*); + number = minus? int frac? exp?; + number { last_token_type = token_type::value_number; break; } - // remember the begin of the token - m_start = m_cursor; - assert(m_start != nullptr); + // string + quotation_mark = "\""; + escape = "\\"; + unescaped = [^"\\\x00-\x1f]; + single_escaped = "\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t"; + unicode_escaped = "u" [0-9a-fA-F]{4}; + escaped = escape (single_escaped | unicode_escaped); + char = unescaped | escaped; + string = quotation_mark char* quotation_mark; + string { last_token_type = token_type::value_string; break; } - /*!re2c - re2c:define:YYCTYPE = lexer_char_t; - re2c:define:YYCURSOR = m_cursor; - re2c:define:YYLIMIT = m_limit; - re2c:define:YYMARKER = m_marker; - re2c:define:YYFILL = "yyfill(); // LCOV_EXCL_LINE"; - re2c:yyfill:parameter = 0; - re2c:indent:string = " "; - re2c:indent:top = 1; - re2c:labelprefix = "basic_json_parser_"; - - // ignore whitespace - ws = [ \t\n\r]+; - ws { return scan(); } - - // ignore byte-order-mark - bom = "\xEF\xBB\xBF"; - bom { return scan(); } - - // structural characters - "[" { return token_type::begin_array; } - "]" { return token_type::end_array; } - "{" { return token_type::begin_object; } - "}" { return token_type::end_object; } - "," { return token_type::value_separator; } - ":" { return token_type::name_separator; } - - // literal names - "null" { return token_type::literal_null; } - "true" { return token_type::literal_true; } - "false" { return token_type::literal_false; } - - // number - decimal_point = [.]; - digit = [0-9]; - digit_1_9 = [1-9]; - e = [eE]; - minus = [-]; - plus = [+]; - zero = [0]; - exp = e (minus|plus)? digit+; - frac = decimal_point digit+; - int = (zero|digit_1_9 digit*); - number = minus? int frac? exp?; - number { return token_type::value_number; } - - // string - quotation_mark = [\"]; - escape = [\\]; - unescaped = [^\"\\\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F]; - single_escaped = [\"\\/bfnrt]; - unicode_escaped = [u][0-9a-fA-F]{4}; - escaped = escape (single_escaped | unicode_escaped); - char = unescaped | escaped; - string = quotation_mark char* quotation_mark; - string { return token_type::value_string; } - - // end of file - '\000' { return token_type::end_of_input; } - - // anything else is an error - . { return token_type::parse_error; } - */ - } - - /// append data from the stream to the internal buffer - void yyfill() noexcept - { - if (m_stream == nullptr or not * m_stream) - { - return; + // end of file + "\000" { last_token_type = token_type::end_of_input; break; } + + // anything else is an error + . { last_token_type = token_type::parse_error; break; } + */ } + return last_token_type; + } + + /*! + @brief append data from the stream to the line buffer + + This function is called by the scan() function when the end of the + buffer (`m_limit`) is reached and the `m_cursor` pointer cannot be + incremented without leaving the limits of the line buffer. Note re2c + decides when to call this function. + + If the lexer reads from contiguous storage, there is no trailing null + byte. Therefore, this function must make sure to add these padding + null bytes. + + If the lexer reads from an input stream, this function reads the next + line of the input. + + @pre + p p p p p p u u u u u x . . . . . . + ^ ^ ^ ^ + m_content m_start | m_limit + m_cursor + + @post + u u u u u x x x x x x x . . . . . . + ^ ^ ^ + | m_cursor m_limit + m_start + m_content + */ + void fill_line_buffer() + { + // number of processed characters (p) const auto offset_start = m_start - m_content; - const auto offset_marker = m_marker - m_start; + // offset for m_marker wrt. to m_start + const auto offset_marker = (m_marker == nullptr) ? 0 : m_marker - m_start; + // number of unprocessed characters (u) const auto offset_cursor = m_cursor - m_start; - m_buffer.erase(0, static_cast(offset_start)); - std::string line; - assert(m_stream != nullptr); - std::getline(*m_stream, line); - m_buffer += "\n" + line; // add line with newline symbol + // no stream is used or end of file is reached + if (m_stream == nullptr or m_stream->eof()) + { + // copy unprocessed characters to line buffer + m_line_buffer.clear(); + for (m_cursor = m_start; m_cursor != m_limit; ++m_cursor) + { + m_line_buffer.append(1, static_cast(*m_cursor)); + } - m_content = reinterpret_cast(m_buffer.c_str()); + // append 5 characters (size of longest keyword "false") to + // make sure that there is sufficient space between m_cursor + // and m_limit + m_line_buffer.append(5, '\0'); + } + else + { + // delete processed characters from line buffer + m_line_buffer.erase(0, static_cast(offset_start)); + // read next line from input stream + std::string line; + std::getline(*m_stream, line); + // add line with newline symbol to the line buffer + m_line_buffer += line + "\n"; + } + + // set pointers + m_content = reinterpret_cast(m_line_buffer.c_str()); assert(m_content != nullptr); m_start = m_content; m_marker = m_start + offset_marker; m_cursor = m_start + offset_cursor; - m_limit = m_start + m_buffer.size() - 1; + m_limit = m_start + m_line_buffer.size(); } /// return string representation of last read token - string_t get_token() const + string_t get_token_string() const { assert(m_start != nullptr); return string_t(reinterpret_cast(m_start), @@ -7580,12 +7949,49 @@ class basic_json of the construction of the values. 2. Unescaped characters are copied as is. + @pre `m_cursor - m_start >= 2`, meaning the length of the last token + is at least 2 bytes which is trivially true for any string (which + consists of at least two quotes). + + " c1 c2 c3 ... " + ^ ^ + m_start m_cursor + + @complexity Linear in the length of the string.\n + + Lemma: The loop body will always terminate.\n + + Proof (by contradiction): Assume the loop body does not terminate. As + the loop body does not contain another loop, one of the called + functions must never return. The called functions are `std::strtoul` + and to_unicode. Neither function can loop forever, so the loop body + will never loop forever which contradicts the assumption that the loop + body does not terminate, q.e.d.\n + + Lemma: The loop condition for the for loop is eventually false.\n + + Proof (by contradiction): Assume the loop does not terminate. Due to + the above lemma, this can only be due to a tautological loop + condition; that is, the loop condition i < m_cursor - 1 must always be + true. Let x be the change of i for any loop iteration. Then + m_start + 1 + x < m_cursor - 1 must hold to loop indefinitely. This + can be rephrased to m_cursor - m_start - 2 > x. With the + precondition, we x <= 0, meaning that the loop condition holds + indefinitly if i is always decreased. However, observe that the value + of i is strictly increasing with each iteration, as it is incremented + by 1 in the iteration expression and never decremented inside the loop + body. Hence, the loop condition will eventually be false which + contradicts the assumption that the loop condition is a tautology, + q.e.d. + @return string value of current token without opening and closing quotes @throw std::out_of_range if to_unicode fails */ string_t get_string() const { + assert(m_cursor - m_start >= 2); + string_t result; result.reserve(static_cast(m_cursor - m_start - 2)); @@ -7701,11 +8107,6 @@ class basic_json the number @return the floating point number - - @bug This function uses `std::strtof`, `std::strtod`, or `std::strtold` - which use the current C locale to determine which character is used as - decimal point character. This may yield to parse errors if the locale - does not used `.`. */ long double str_to_float_t(long double* /* type */, char** endptr) const { @@ -7766,18 +8167,12 @@ class basic_json number_integer_t or @ref number_unsigned_t then it sets the result parameter accordingly. - The 'floating point representation' includes the number of significant - figures after the radix point, whether the number is in exponential or - decimal form, the capitalization of the exponent marker, and if the - optional '+' is present in the exponent. This information is necessary - to perform accurate round trips of floating point numbers. - If the number is a floating point number the number is then parsed using @a std:strtod (or @a std:strtof or @a std::strtold). @param[out] result @ref basic_json object to receive the number, or - NAN if the conversion read past the current token. The latter case - needs to be treated by the caller function. + NAN if the conversion read past the current token. The latter case + needs to be treated by the caller function. */ void get_number(basic_json& result) const { @@ -7785,15 +8180,6 @@ class basic_json const lexer::lexer_char_t* curptr = m_start; - // remember this number was parsed (for later serialization) - result.m_type.bits.parsed = true; - - // 'found_radix_point' will be set to 0xFF upon finding a radix - // point and later used to mask in/out the precision depending - // whether a radix is found i.e. 'precision &= found_radix_point' - uint8_t found_radix_point = 0; - uint8_t precision = 0; - // accumulate the integer conversion result (unsigned for now) number_unsigned_t value = 0; @@ -7807,13 +8193,13 @@ class basic_json if (*curptr == '-') { type = value_t::number_integer; - max = static_cast(std::numeric_limits::max()) + 1; + max = static_cast((std::numeric_limits::max)()) + 1; curptr++; } else { type = value_t::number_unsigned; - max = static_cast(std::numeric_limits::max()); + max = static_cast((std::numeric_limits::max)()); } // count the significant figures @@ -7826,22 +8212,11 @@ class basic_json { // don't count '.' but change to float type = value_t::number_float; - - // reset precision count - precision = 0; - found_radix_point = 0xFF; continue; } // assume exponent (if not then will fail parse): change to // float, stop counting and record exponent details type = value_t::number_float; - result.m_type.bits.has_exp = true; - - // exponent capitalization - result.m_type.bits.exp_cap = (*curptr == 'E'); - - // exponent '+' sign - result.m_type.bits.exp_plus = (*(++curptr) == '+'); break; } @@ -7849,7 +8224,7 @@ class basic_json if (type != value_t::number_float) { // multiply last value by ten and add the new digit - auto temp = value * 10 + *curptr - 0x30; + auto temp = value * 10 + *curptr - '0'; // test for overflow if (temp < value || temp > max) @@ -7863,13 +8238,8 @@ class basic_json value = temp; } } - ++precision; } - // If no radix point was found then precision would now be set to - // the number of digits, which is wrong - clear it. - result.m_type.bits.precision = precision & found_radix_point; - // save the value (if not a float) if (type == value_t::number_unsigned) { @@ -7892,8 +8262,8 @@ class basic_json private: /// optional input stream std::istream* m_stream = nullptr; - /// the buffer - string_t m_buffer; + /// line buffer buffer for m_stream + string_t m_line_buffer {}; /// the buffer pointer const lexer_char_t* m_content = nullptr; /// pointer to the beginning of the current symbol @@ -7904,6 +8274,8 @@ class basic_json const lexer_char_t* m_cursor = nullptr; /// pointer to the end of the buffer const lexer_char_t* m_limit = nullptr; + /// the last token type + token_type last_token_type = token_type::end_of_input; }; /*! @@ -7914,32 +8286,42 @@ class basic_json class parser { public: - /// constructor for strings - parser(const string_t& s, parser_callback_t cb = nullptr) noexcept - : callback(cb), m_lexer(s) - { - // read first token - get_token(); - } + /// a parser reading from a string literal + parser(const char* buff, const parser_callback_t cb = nullptr) + : callback(cb), + m_lexer(reinterpret_cast(buff), strlen(buff)) + {} /// a parser reading from an input stream - parser(std::istream& _is, parser_callback_t cb = nullptr) noexcept - : callback(cb), m_lexer(&_is) - { - // read first token - get_token(); - } + parser(std::istream& is, const parser_callback_t cb = nullptr) + : callback(cb), m_lexer(is) + {} + + /// a parser reading from an iterator range with contiguous storage + template::iterator_category, std::random_access_iterator_tag>::value + , int>::type + = 0> + parser(IteratorType first, IteratorType last, const parser_callback_t cb = nullptr) + : callback(cb), + m_lexer(reinterpret_cast(&(*first)), + static_cast(std::distance(first, last))) + {} /// public parser interface basic_json parse() { + // read first token + get_token(); + basic_json result = parse_internal(true); + result.assert_invariant(); expect(lexer::token_type::end_of_input); // return parser result and replace it with null in case the // top-level value was discarded by the callback function - return result.is_discarded() ? basic_json() : result; + return result.is_discarded() ? basic_json() : std::move(result); } private: @@ -7952,11 +8334,12 @@ class basic_json { case lexer::token_type::begin_object: { - if (keep and (not callback or (keep = callback(depth++, parse_event_t::object_start, result)))) + if (keep and (not callback + or ((keep = callback(depth++, parse_event_t::object_start, result)) != 0))) { // explicitly set result to object to cope with {} result.m_type = value_t::object; - result.m_value = json_value(value_t::object); + result.m_value = value_t::object; } // read next token @@ -8030,11 +8413,12 @@ class basic_json case lexer::token_type::begin_array: { - if (keep and (not callback or (keep = callback(depth++, parse_event_t::array_start, result)))) + if (keep and (not callback + or ((keep = callback(depth++, parse_event_t::array_start, result)) != 0))) { // explicitly set result to object to cope with [] result.m_type = value_t::array; - result.m_value = json_value(value_t::array); + result.m_value = value_t::array; } // read next token @@ -8136,7 +8520,7 @@ class basic_json } /// get next token from lexer - typename lexer::token_type get_token() noexcept + typename lexer::token_type get_token() { last_token = m_lexer.scan(); return last_token; @@ -8147,7 +8531,8 @@ class basic_json if (t != last_token) { std::string error_msg = "parse error - unexpected "; - error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token() + "'") : + error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() + + "'") : lexer::token_type_name(last_token)); error_msg += "; expected " + lexer::token_type_name(t); throw std::invalid_argument(error_msg); @@ -8159,7 +8544,8 @@ class basic_json if (t == last_token) { std::string error_msg = "parse error - unexpected "; - error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token() + "'") : + error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() + + "'") : lexer::token_type_name(last_token)); throw std::invalid_argument(error_msg); } @@ -8169,7 +8555,7 @@ class basic_json /// current level of recursion int depth = 0; /// callback function - parser_callback_t callback; + const parser_callback_t callback = nullptr; /// the type of the last read token typename lexer::token_type last_token = lexer::token_type::uninitialized; /// the lexer @@ -8237,14 +8623,12 @@ class basic_json */ std::string to_string() const noexcept { - std::string result; - - for (const auto& reference_token : reference_tokens) + return std::accumulate(reference_tokens.begin(), + reference_tokens.end(), std::string{}, + [](const std::string & a, const std::string & b) { - result += "/" + escape(reference_token); - } - - return result; + return a + "/" + escape(b); + }); } /// @copydoc to_string() @@ -8287,6 +8671,8 @@ class basic_json /*! @brief create and return a reference to the pointed to value + + @complexity Linear in the number of reference tokens. */ reference get_and_create(reference j) const { @@ -8542,7 +8928,7 @@ class basic_json } /// split the string input to reference tokens - static std::vector split(std::string reference_string) + static std::vector split(const std::string& reference_string) { std::vector result; @@ -8608,7 +8994,7 @@ class basic_json @param[in,out] s the string to manipulate @param[in] f the substring to replace with @a t - @param[out] t the string to replace @a f + @param[in] t the string to replace @a f @return The string @a s where all occurrences of @a f are replaced with @a t. @@ -9027,7 +9413,7 @@ class basic_json json_pointer top_pointer = ptr.top(); if (top_pointer != ptr) { - basic_json& x = result.at(top_pointer); + result.at(top_pointer); } // get reference to parent of JSON pointer ptr @@ -9270,7 +9656,7 @@ class basic_json */ static basic_json diff(const basic_json& source, const basic_json& target, - std::string path = "") + const std::string& path = "") { // the patch basic_json result(value_t::array); @@ -9311,9 +9697,12 @@ class basic_json // in a second pass, traverse the remaining elements // remove my remaining elements + const auto end_index = static_cast(result.size()); while (i < source.size()) { - result.push_back(object( + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, object( { {"op", "remove"}, {"path", path + "/" + std::to_string(i)} @@ -9429,7 +9818,7 @@ namespace std @since version 1.0.0 */ -template <> +template<> inline void swap(nlohmann::json& j1, nlohmann::json& j2) noexcept( is_nothrow_move_constructible::value and @@ -9440,7 +9829,7 @@ inline void swap(nlohmann::json& j1, } /// hash value for JSON objects -template <> +template<> struct hash { /*! @@ -9461,7 +9850,7 @@ struct hash @brief user-defined string literal for JSON values This operator implements a user-defined string literal for JSON objects. It -can be used by adding \p "_json" to a string literal and returns a JSON object +can be used by adding `"_json"` to a string literal and returns a JSON object if no parse error occurred. @param[in] s a string representation of a JSON object @@ -9471,12 +9860,19 @@ if no parse error occurred. */ inline nlohmann::json operator "" _json(const char* s, std::size_t) { - return nlohmann::json::parse(reinterpret_cast(s)); + return nlohmann::json::parse(s); } /*! @brief user-defined string literal for JSON pointer +This operator implements a user-defined string literal for JSON Pointers. It +can be used by adding `"_json"` to a string literal and returns a JSON pointer +object if no parse error occurred. + +@param[in] s a string representation of a JSON Pointer +@return a JSON pointer object + @since version 2.0.0 */ inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t) diff --git a/resources/3rdparty/modernjson/test/CMakeLists.txt b/resources/3rdparty/modernjson/test/CMakeLists.txt deleted file mode 100755 index b63e5a394..000000000 --- a/resources/3rdparty/modernjson/test/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -# The unit test executable. -add_executable(json_unit - "src/catch.hpp" - "src/unit.cpp" -) - -set_target_properties(json_unit PROPERTIES - CXX_STANDARD 11 - CXX_STANDARD_REQUIRED ON - COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" - COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>" -) - -# Install the test binary. -install(TARGETS json_unit RUNTIME DESTINATION test/bin) - -# Copy the test data to the install tree. -install(DIRECTORY data/ DESTINATION test/data) - -target_include_directories(json_unit PRIVATE "src") -target_link_libraries(json_unit ${JSON_TARGET_NAME}) diff --git a/resources/3rdparty/modernjson/test/data/json.org/1.json b/resources/3rdparty/modernjson/test/data/json.org/1.json deleted file mode 100755 index eacfbf5e6..000000000 --- a/resources/3rdparty/modernjson/test/data/json.org/1.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "glossary": { - "title": "example glossary", - "GlossDiv": { - "title": "S", - "GlossList": { - "GlossEntry": { - "ID": "SGML", - "SortAs": "SGML", - "GlossTerm": "Standard Generalized Markup Language", - "Acronym": "SGML", - "Abbrev": "ISO 8879:1986", - "GlossDef": { - "para": "A meta-markup language, used to create markup languages such as DocBook.", - "GlossSeeAlso": ["GML", "XML"] - }, - "GlossSee": "markup" - } - } - } - } -} diff --git a/resources/3rdparty/modernjson/test/data/json.org/2.json b/resources/3rdparty/modernjson/test/data/json.org/2.json deleted file mode 100755 index 5600991a4..000000000 --- a/resources/3rdparty/modernjson/test/data/json.org/2.json +++ /dev/null @@ -1,11 +0,0 @@ -{"menu": { - "id": "file", - "value": "File", - "popup": { - "menuitem": [ - {"value": "New", "onclick": "CreateNewDoc()"}, - {"value": "Open", "onclick": "OpenDoc()"}, - {"value": "Close", "onclick": "CloseDoc()"} - ] - } -}} diff --git a/resources/3rdparty/modernjson/test/data/json.org/3.json b/resources/3rdparty/modernjson/test/data/json.org/3.json deleted file mode 100755 index 5bfdffec8..000000000 --- a/resources/3rdparty/modernjson/test/data/json.org/3.json +++ /dev/null @@ -1,26 +0,0 @@ -{"widget": { - "debug": "on", - "window": { - "title": "Sample Konfabulator Widget", - "name": "main_window", - "width": 500, - "height": 500 - }, - "image": { - "src": "Images/Sun.png", - "name": "sun1", - "hOffset": 250, - "vOffset": 250, - "alignment": "center" - }, - "text": { - "data": "Click Here", - "size": 36, - "style": "bold", - "name": "text1", - "hOffset": 250, - "vOffset": 100, - "alignment": "center", - "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" - } -}} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json.org/4.json b/resources/3rdparty/modernjson/test/data/json.org/4.json deleted file mode 100755 index d540b57f0..000000000 --- a/resources/3rdparty/modernjson/test/data/json.org/4.json +++ /dev/null @@ -1,88 +0,0 @@ -{"web-app": { - "servlet": [ - { - "servlet-name": "cofaxCDS", - "servlet-class": "org.cofax.cds.CDSServlet", - "init-param": { - "configGlossary:installationAt": "Philadelphia, PA", - "configGlossary:adminEmail": "ksm@pobox.com", - "configGlossary:poweredBy": "Cofax", - "configGlossary:poweredByIcon": "/images/cofax.gif", - "configGlossary:staticPath": "/content/static", - "templateProcessorClass": "org.cofax.WysiwygTemplate", - "templateLoaderClass": "org.cofax.FilesTemplateLoader", - "templatePath": "templates", - "templateOverridePath": "", - "defaultListTemplate": "listTemplate.htm", - "defaultFileTemplate": "articleTemplate.htm", - "useJSP": false, - "jspListTemplate": "listTemplate.jsp", - "jspFileTemplate": "articleTemplate.jsp", - "cachePackageTagsTrack": 200, - "cachePackageTagsStore": 200, - "cachePackageTagsRefresh": 60, - "cacheTemplatesTrack": 100, - "cacheTemplatesStore": 50, - "cacheTemplatesRefresh": 15, - "cachePagesTrack": 200, - "cachePagesStore": 100, - "cachePagesRefresh": 10, - "cachePagesDirtyRead": 10, - "searchEngineListTemplate": "forSearchEnginesList.htm", - "searchEngineFileTemplate": "forSearchEngines.htm", - "searchEngineRobotsDb": "WEB-INF/robots.db", - "useDataStore": true, - "dataStoreClass": "org.cofax.SqlDataStore", - "redirectionClass": "org.cofax.SqlRedirection", - "dataStoreName": "cofax", - "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver", - "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", - "dataStoreUser": "sa", - "dataStorePassword": "dataStoreTestQuery", - "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", - "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", - "dataStoreInitConns": 10, - "dataStoreMaxConns": 100, - "dataStoreConnUsageLimit": 100, - "dataStoreLogLevel": "debug", - "maxUrlLength": 500}}, - { - "servlet-name": "cofaxEmail", - "servlet-class": "org.cofax.cds.EmailServlet", - "init-param": { - "mailHost": "mail1", - "mailHostOverride": "mail2"}}, - { - "servlet-name": "cofaxAdmin", - "servlet-class": "org.cofax.cds.AdminServlet"}, - - { - "servlet-name": "fileServlet", - "servlet-class": "org.cofax.cds.FileServlet"}, - { - "servlet-name": "cofaxTools", - "servlet-class": "org.cofax.cms.CofaxToolsServlet", - "init-param": { - "templatePath": "toolstemplates/", - "log": 1, - "logLocation": "/usr/local/tomcat/logs/CofaxTools.log", - "logMaxSize": "", - "dataLog": 1, - "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", - "dataLogMaxSize": "", - "removePageCache": "/content/admin/remove?cache=pages&id=", - "removeTemplateCache": "/content/admin/remove?cache=templates&id=", - "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", - "lookInContext": 1, - "adminGroupID": 4, - "betaServer": true}}], - "servlet-mapping": { - "cofaxCDS": "/", - "cofaxEmail": "/cofaxutil/aemail/*", - "cofaxAdmin": "/admin/*", - "fileServlet": "/static/*", - "cofaxTools": "/tools/*"}, - - "taglib": { - "taglib-uri": "cofax.tld", - "taglib-location": "/WEB-INF/tlds/cofax.tld"}}} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json.org/5.json b/resources/3rdparty/modernjson/test/data/json.org/5.json deleted file mode 100755 index acdf930ea..000000000 --- a/resources/3rdparty/modernjson/test/data/json.org/5.json +++ /dev/null @@ -1,27 +0,0 @@ -{"menu": { - "header": "SVG Viewer", - "items": [ - {"id": "Open"}, - {"id": "OpenNew", "label": "Open New"}, - null, - {"id": "ZoomIn", "label": "Zoom In"}, - {"id": "ZoomOut", "label": "Zoom Out"}, - {"id": "OriginalView", "label": "Original View"}, - null, - {"id": "Quality"}, - {"id": "Pause"}, - {"id": "Mute"}, - null, - {"id": "Find", "label": "Find..."}, - {"id": "FindAgain", "label": "Find Again"}, - {"id": "Copy"}, - {"id": "CopyAgain", "label": "Copy Again"}, - {"id": "CopySVG", "label": "Copy SVG"}, - {"id": "ViewSVG", "label": "View SVG"}, - {"id": "ViewSource", "label": "View Source"}, - {"id": "SaveAs", "label": "Save As"}, - null, - {"id": "Help"}, - {"id": "About", "label": "About Adobe CVG Viewer..."} - ] -}} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_nlohmann_tests/all_unicode.json.REMOVED.git-id b/resources/3rdparty/modernjson/test/data/json_nlohmann_tests/all_unicode.json.REMOVED.git-id deleted file mode 100644 index a26b04e23..000000000 --- a/resources/3rdparty/modernjson/test/data/json_nlohmann_tests/all_unicode.json.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -9b834847378ec1a1651518b7e24719775aa0725e \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_nlohmann_tests/bom.json b/resources/3rdparty/modernjson/test/data/json_nlohmann_tests/bom.json deleted file mode 100755 index 9d02f600b..000000000 --- a/resources/3rdparty/modernjson/test/data/json_nlohmann_tests/bom.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "foo": true -} diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip01.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip01.json deleted file mode 100755 index 500db4a86..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip01.json +++ /dev/null @@ -1 +0,0 @@ -[null] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip02.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip02.json deleted file mode 100755 index de601e305..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip02.json +++ /dev/null @@ -1 +0,0 @@ -[true] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip03.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip03.json deleted file mode 100755 index 67b2f0760..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip03.json +++ /dev/null @@ -1 +0,0 @@ -[false] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip04.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip04.json deleted file mode 100755 index 6e7ea636e..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip04.json +++ /dev/null @@ -1 +0,0 @@ -[0] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip05.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip05.json deleted file mode 100755 index 6dfd29830..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip05.json +++ /dev/null @@ -1 +0,0 @@ -["foo"] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip06.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip06.json deleted file mode 100755 index 0637a088a..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip06.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip07.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip07.json deleted file mode 100755 index 9e26dfeeb..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip07.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip08.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip08.json deleted file mode 100755 index bfa34124c..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip08.json +++ /dev/null @@ -1 +0,0 @@ -[0,1] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip09.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip09.json deleted file mode 100755 index 9f5dd4e3d..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip09.json +++ /dev/null @@ -1 +0,0 @@ -{"foo":"bar"} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip10.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip10.json deleted file mode 100755 index 2355b4df2..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip10.json +++ /dev/null @@ -1 +0,0 @@ -{"a":null,"foo":"bar"} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip11.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip11.json deleted file mode 100755 index 99d21a2a0..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip11.json +++ /dev/null @@ -1 +0,0 @@ -[-1] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip12.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip12.json deleted file mode 100755 index 56c78bef1..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip12.json +++ /dev/null @@ -1 +0,0 @@ -[-2147483648] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip13.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip13.json deleted file mode 100755 index 029580f6f..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip13.json +++ /dev/null @@ -1 +0,0 @@ -[-1234567890123456789] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip14.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip14.json deleted file mode 100755 index d86580009..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip14.json +++ /dev/null @@ -1 +0,0 @@ -[-9223372036854775808] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip15.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip15.json deleted file mode 100755 index bace2a0be..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip15.json +++ /dev/null @@ -1 +0,0 @@ -[1] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip16.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip16.json deleted file mode 100755 index dfe696dbd..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip16.json +++ /dev/null @@ -1 +0,0 @@ -[2147483647] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip17.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip17.json deleted file mode 100755 index 6640b07fb..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip17.json +++ /dev/null @@ -1 +0,0 @@ -[4294967295] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip18.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip18.json deleted file mode 100755 index a3ab143b0..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip18.json +++ /dev/null @@ -1 +0,0 @@ -[1234567890123456789] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip19.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip19.json deleted file mode 100755 index 8ab4a5078..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip19.json +++ /dev/null @@ -1 +0,0 @@ -[9223372036854775807] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip20.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip20.json deleted file mode 100755 index 92df1df1d..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip20.json +++ /dev/null @@ -1 +0,0 @@ -[0.0] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip21.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip21.json deleted file mode 100755 index cfef81540..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip21.json +++ /dev/null @@ -1 +0,0 @@ -[-0.0] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip22.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip22.json deleted file mode 100755 index a7b7eefc5..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip22.json +++ /dev/null @@ -1 +0,0 @@ -[1.2345] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip23.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip23.json deleted file mode 100755 index b553e84b7..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip23.json +++ /dev/null @@ -1 +0,0 @@ -[-1.2345] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip24.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip24.json deleted file mode 100755 index f01efb6d5..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip24.json +++ /dev/null @@ -1 +0,0 @@ -[5e-324] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip25.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip25.json deleted file mode 100755 index cdef14d38..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip25.json +++ /dev/null @@ -1 +0,0 @@ -[2.225073858507201e-308] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip26.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip26.json deleted file mode 100755 index f4121b787..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip26.json +++ /dev/null @@ -1 +0,0 @@ -[2.2250738585072014e-308] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip27.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip27.json deleted file mode 100755 index 17ce5211c..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip27.json +++ /dev/null @@ -1 +0,0 @@ -[1.7976931348623157e308] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip28.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip28.json deleted file mode 100755 index 749ffaf93..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip28.json +++ /dev/null @@ -1 +0,0 @@ -[4.940656458412e-324] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip29.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip29.json deleted file mode 100755 index 4bf65ec4b..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip29.json +++ /dev/null @@ -1 +0,0 @@ -[2.2250738585072e-308] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip30.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip30.json deleted file mode 100755 index fd357651b..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip30.json +++ /dev/null @@ -1 +0,0 @@ -[1.2345E-30] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip31.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip31.json deleted file mode 100755 index 1428d1443..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip31.json +++ /dev/null @@ -1 +0,0 @@ -[1.2345E+30] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip32.json b/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip32.json deleted file mode 100755 index d6f34011f..000000000 --- a/resources/3rdparty/modernjson/test/data/json_roundtrip/roundtrip32.json +++ /dev/null @@ -1 +0,0 @@ -[1.2345e+30] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail1.json b/resources/3rdparty/modernjson/test/data/json_tests/fail1.json deleted file mode 100755 index 6216b865f..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail1.json +++ /dev/null @@ -1 +0,0 @@ -"A JSON payload should be an object or array, not a string." \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail10.json b/resources/3rdparty/modernjson/test/data/json_tests/fail10.json deleted file mode 100755 index 5d8c0047b..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail10.json +++ /dev/null @@ -1 +0,0 @@ -{"Extra value after close": true} "misplaced quoted value" \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail11.json b/resources/3rdparty/modernjson/test/data/json_tests/fail11.json deleted file mode 100755 index 76eb95b45..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail11.json +++ /dev/null @@ -1 +0,0 @@ -{"Illegal expression": 1 + 2} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail12.json b/resources/3rdparty/modernjson/test/data/json_tests/fail12.json deleted file mode 100755 index 77580a452..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail12.json +++ /dev/null @@ -1 +0,0 @@ -{"Illegal invocation": alert()} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail13.json b/resources/3rdparty/modernjson/test/data/json_tests/fail13.json deleted file mode 100755 index 379406b59..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail13.json +++ /dev/null @@ -1 +0,0 @@ -{"Numbers cannot have leading zeroes": 013} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail14.json b/resources/3rdparty/modernjson/test/data/json_tests/fail14.json deleted file mode 100755 index 0ed366b38..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail14.json +++ /dev/null @@ -1 +0,0 @@ -{"Numbers cannot be hex": 0x14} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail15.json b/resources/3rdparty/modernjson/test/data/json_tests/fail15.json deleted file mode 100755 index fc8376b60..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail15.json +++ /dev/null @@ -1 +0,0 @@ -["Illegal backslash escape: \x15"] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail16.json b/resources/3rdparty/modernjson/test/data/json_tests/fail16.json deleted file mode 100755 index 3fe21d4b5..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail16.json +++ /dev/null @@ -1 +0,0 @@ -[\naked] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail17.json b/resources/3rdparty/modernjson/test/data/json_tests/fail17.json deleted file mode 100755 index 62b9214ae..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail17.json +++ /dev/null @@ -1 +0,0 @@ -["Illegal backslash escape: \017"] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail18.json b/resources/3rdparty/modernjson/test/data/json_tests/fail18.json deleted file mode 100755 index edac92716..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail18.json +++ /dev/null @@ -1 +0,0 @@ -[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail19.json b/resources/3rdparty/modernjson/test/data/json_tests/fail19.json deleted file mode 100755 index 3b9c46fa9..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail19.json +++ /dev/null @@ -1 +0,0 @@ -{"Missing colon" null} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail2.json b/resources/3rdparty/modernjson/test/data/json_tests/fail2.json deleted file mode 100755 index 6b7c11e5a..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail2.json +++ /dev/null @@ -1 +0,0 @@ -["Unclosed array" \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail20.json b/resources/3rdparty/modernjson/test/data/json_tests/fail20.json deleted file mode 100755 index 27c1af3e7..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail20.json +++ /dev/null @@ -1 +0,0 @@ -{"Double colon":: null} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail21.json b/resources/3rdparty/modernjson/test/data/json_tests/fail21.json deleted file mode 100755 index 62474573b..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail21.json +++ /dev/null @@ -1 +0,0 @@ -{"Comma instead of colon", null} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail22.json b/resources/3rdparty/modernjson/test/data/json_tests/fail22.json deleted file mode 100755 index a7752581b..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail22.json +++ /dev/null @@ -1 +0,0 @@ -["Colon instead of comma": false] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail23.json b/resources/3rdparty/modernjson/test/data/json_tests/fail23.json deleted file mode 100755 index 494add1ca..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail23.json +++ /dev/null @@ -1 +0,0 @@ -["Bad value", truth] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail24.json b/resources/3rdparty/modernjson/test/data/json_tests/fail24.json deleted file mode 100755 index caff239bf..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail24.json +++ /dev/null @@ -1 +0,0 @@ -['single quote'] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail25.json b/resources/3rdparty/modernjson/test/data/json_tests/fail25.json deleted file mode 100755 index 8b7ad23e0..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail25.json +++ /dev/null @@ -1 +0,0 @@ -[" tab character in string "] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail26.json b/resources/3rdparty/modernjson/test/data/json_tests/fail26.json deleted file mode 100755 index 845d26a6a..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail26.json +++ /dev/null @@ -1 +0,0 @@ -["tab\ character\ in\ string\ "] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail27.json b/resources/3rdparty/modernjson/test/data/json_tests/fail27.json deleted file mode 100755 index 6b01a2ca4..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail27.json +++ /dev/null @@ -1,2 +0,0 @@ -["line -break"] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail28.json b/resources/3rdparty/modernjson/test/data/json_tests/fail28.json deleted file mode 100755 index 621a0101c..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail28.json +++ /dev/null @@ -1,2 +0,0 @@ -["line\ -break"] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail29.json b/resources/3rdparty/modernjson/test/data/json_tests/fail29.json deleted file mode 100755 index 47ec421bb..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail29.json +++ /dev/null @@ -1 +0,0 @@ -[0e] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail3.json b/resources/3rdparty/modernjson/test/data/json_tests/fail3.json deleted file mode 100755 index 168c81eb7..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail3.json +++ /dev/null @@ -1 +0,0 @@ -{unquoted_key: "keys must be quoted"} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail30.json b/resources/3rdparty/modernjson/test/data/json_tests/fail30.json deleted file mode 100755 index 8ab0bc4b8..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail30.json +++ /dev/null @@ -1 +0,0 @@ -[0e+] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail31.json b/resources/3rdparty/modernjson/test/data/json_tests/fail31.json deleted file mode 100755 index 1cce602b5..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail31.json +++ /dev/null @@ -1 +0,0 @@ -[0e+-1] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail32.json b/resources/3rdparty/modernjson/test/data/json_tests/fail32.json deleted file mode 100755 index 45cba7396..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail32.json +++ /dev/null @@ -1 +0,0 @@ -{"Comma instead if closing brace": true, \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail33.json b/resources/3rdparty/modernjson/test/data/json_tests/fail33.json deleted file mode 100755 index ca5eb19dc..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail33.json +++ /dev/null @@ -1 +0,0 @@ -["mismatch"} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail4.json b/resources/3rdparty/modernjson/test/data/json_tests/fail4.json deleted file mode 100755 index 9de168bf3..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail4.json +++ /dev/null @@ -1 +0,0 @@ -["extra comma",] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail5.json b/resources/3rdparty/modernjson/test/data/json_tests/fail5.json deleted file mode 100755 index ddf3ce3d2..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail5.json +++ /dev/null @@ -1 +0,0 @@ -["double extra comma",,] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail6.json b/resources/3rdparty/modernjson/test/data/json_tests/fail6.json deleted file mode 100755 index ed91580e1..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail6.json +++ /dev/null @@ -1 +0,0 @@ -[ , "<-- missing value"] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail7.json b/resources/3rdparty/modernjson/test/data/json_tests/fail7.json deleted file mode 100755 index 8a96af3e4..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail7.json +++ /dev/null @@ -1 +0,0 @@ -["Comma after the close"], \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail8.json b/resources/3rdparty/modernjson/test/data/json_tests/fail8.json deleted file mode 100755 index b28479c6e..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail8.json +++ /dev/null @@ -1 +0,0 @@ -["Extra close"]] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/fail9.json b/resources/3rdparty/modernjson/test/data/json_tests/fail9.json deleted file mode 100755 index 5815574f3..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/fail9.json +++ /dev/null @@ -1 +0,0 @@ -{"Extra comma": true,} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/pass1.json b/resources/3rdparty/modernjson/test/data/json_tests/pass1.json deleted file mode 100755 index 70e268543..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/pass1.json +++ /dev/null @@ -1,58 +0,0 @@ -[ - "JSON Test Pattern pass1", - {"object with 1 member":["array with 1 element"]}, - {}, - [], - -42, - true, - false, - null, - { - "integer": 1234567890, - "real": -9876.543210, - "e": 0.123456789e-12, - "E": 1.234567890E+34, - "": 23456789012E66, - "zero": 0, - "one": 1, - "space": " ", - "quote": "\"", - "backslash": "\\", - "controls": "\b\f\n\r\t", - "slash": "/ & \/", - "alpha": "abcdefghijklmnopqrstuvwyz", - "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", - "digit": "0123456789", - "0123456789": "digit", - "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", - "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", - "true": true, - "false": false, - "null": null, - "array":[ ], - "object":{ }, - "address": "50 St. James Street", - "url": "http://www.JSON.org/", - "comment": "// /* */": " ", - " s p a c e d " :[1,2 , 3 - -, - -4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7], - "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", - "quotes": "" \u0022 %22 0x22 034 "", - "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" -: "A key can be any string" - }, - 0.5 ,98.6 -, -99.44 -, - -1066, -1e1, -0.1e1, -1e-1, -1e00,2e+00,2e-00 -,"rosebud"] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/pass2.json b/resources/3rdparty/modernjson/test/data/json_tests/pass2.json deleted file mode 100755 index d3c63c7ad..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/pass2.json +++ /dev/null @@ -1 +0,0 @@ -[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_tests/pass3.json b/resources/3rdparty/modernjson/test/data/json_tests/pass3.json deleted file mode 100755 index 4528d51f1..000000000 --- a/resources/3rdparty/modernjson/test/data/json_tests/pass3.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "JSON Test Pattern pass3": { - "The outermost value": "must be an object or array.", - "In this test": "It is an object." - } -} diff --git a/resources/3rdparty/modernjson/test/data/json_testsuite/README.md b/resources/3rdparty/modernjson/test/data/json_testsuite/README.md deleted file mode 100755 index e259b6d0b..000000000 --- a/resources/3rdparty/modernjson/test/data/json_testsuite/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# json-test-suite - -## Source - -https://code.google.com/p/json-test-suite/downloads/detail?name=sample.zip&can=2&q= - -## License - -Apache License Version 2.0 -http://www.apache.org/licenses/LICENSE-2.0 \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/data/json_testsuite/sample.json b/resources/3rdparty/modernjson/test/data/json_testsuite/sample.json deleted file mode 100755 index 30930e765..000000000 --- a/resources/3rdparty/modernjson/test/data/json_testsuite/sample.json +++ /dev/null @@ -1,3315 +0,0 @@ -{ - "a": { - "6U閆崬밺뀫颒myj츥휘:$薈mY햚#rz飏+玭V㭢뾿愴YꖚX亥ᮉ푊\u0006垡㐭룝\"厓ᔧḅ^Sqpv媫\"⤽걒\"˽Ἆ?ꇆ䬔未tv{DV鯀Tἆl凸g\\㈭ĭ즿UH㽤": null, - "b茤z\\.N": [[ - "ZL:ᅣዎ*Y|猫劁櫕荾Oj为1糕쪥泏S룂w࡛Ᏺ⸥蚙)", - { - "\"䬰ỐwD捾V`邀⠕VD㺝sH6[칑.:醥葹*뻵倻aD\"": true, - "e浱up蔽Cr෠JK軵xCʨ<뜡癙Y獩ケ齈X/螗唻?<蘡+뷄㩤쳖3偑犾&\\첊xz坍崦ݻ鍴\"嵥B3㰃詤豺嚼aqJ⑆∥韼@\u000b㢊\u0015L臯.샥": false, - "l?Ǩ喳e6㔡$M꼄I,(3᝝縢,䊀疅뉲B㴔傳䂴\u0088㮰钘ꜵ!ᅛ韽>": -5514085325291784739, - "o㮚?\"춛㵉<\/﬊ࠃ䃪䝣wp6ἀ䱄[s*S嬈貒pᛥ㰉'돀": [{ - "(QP윤懊FI<ꃣ『䕷[\"珒嶮?%Ḭ壍಻䇟0荤!藲끹bd浶tl\u2049#쯀@僞": {"i妾8홫": { - ",M맃䞛K5nAㆴVN㒊햬$n꩑&ꎝ椞阫?/ṏ세뉪1x쥼㻤㪙`\"$쟒薟B煌܀쨝ଢ଼2掳7㙟鴙X婢\u0002": "Vዉ菈᧷⦌kﮞఈnz*﷜FM\"荭7ꍀ-VR<\/';䁙E9$䩉\f @s?퍪o3^衴cඎ䧪aK鼟q䆨c{䳠5mᒲՙ蘹ᮩ": { - "F㲷JGo⯍P덵x뒳p䘧☔\"+ꨲ吿JfR㔹)4n紬G练Q፞!C|": true, - "p^㫮솎oc.೚A㤠??r\u000f)⾽⌲們M2.䴘䩳:⫭胃\\፾@Fᭌ\\K": false, - "蟌Tk愙潦伩": { - "a<\/@ᾛ慂侇瘎": -7271305752851720826, - "艓藬/>၄ṯ,XW~㲆w": {"E痧郶)㜓ha朗!N赻瞉駠uC\u20ad辠x퓮⣫P1ࠫLMMX'M刼唳됤": null, - "P쓫晥%k覛ዩIUᇸ滨:噐혲lMR5䋈V梗>%幽u頖\\)쟟": null, - "eg+昉~矠䧞难\b?gQ쭷筝\\eꮠNl{ಢ哭|]Mn銌╥zꖘzⱷ⭤ᮜ^": [ - -1.30142114406914976E17, - -1.7555215491128452E-19, - null, - "渾㨝ߏ牄귛r?돌?w[⚞ӻ~廩輫㼧/", - -4.5737191805302129E18, - null, - "xy࿑M[oc셒竓Ⓔx?뜓y䊦>-D켍(&&?XKkc꩖ﺸᏋ뵞K伕6ী)딀P朁yW揙?훻魢傎EG碸9類៌g踲C⟌aEX舲:z꒸许", - 3808159498143417627, - null, - {"m試\u20df1{G8&뚈h홯J<\/": { - "3ஸ厠zs#1K7:rᥞoꅔꯧ&띇鵼鞫6跜#赿5l'8{7㕳(b/j\"厢aq籀ꏚ\u0015厼稥": [ - -2226135764510113982, - true, - null, - { - "h%'맞S싅Hs&dl슾W0j鿏MםD놯L~S-㇡R쭬%": null, - "⟓咔謡칲\u0000孺ꛭx旑檉㶆?": null, - "恇I転;￸B2Y`z\\獓w,놏濐撐埵䂄)!䶢D=ഭ㴟jyY": { - "$ࡘt厛毣ൢI芁<겿骫⫦6tr惺a": [ - 6.385779736989334E-20, - false, - true, - true, - [ - -6.891946211462334E-19, - null, - { - "]-\\Ꟑ1/薓❧Ὂ\\l牑\u0007A郃)阜ᇒᓌ-塯`W峬G}SDb㬨Q臉⮻빌O鞟톴첂B㺱<ƈmu챑J㴹㷳픷Oㆩs": { - "\"◉B\"pᶉt骔J꩸ᄇᛐi╰栛K쉷㉯鐩!㈐n칍䟅難>盥y铿e୔蒏M貹ヅ8嘋퀯䉶ጥ㏢殊뻳\"絧╿ꉑ䠥?∃蓊{}㣣Gk긔H1哵峱": false, - "6.瀫cN䇮F㧺?\\椯=ڈT䘆4␘8qv": -3.5687501019676885E-19, - "Q?yऴr혴{஀䳘p惭f1ﹸ䅷䕋贲<ྃᄊ繲hq\\b|#QSTs1c-7(䵢\u2069匏絘ꯉ:l毴汞t戀oෟᵶ뮱፣-醇Jx䙬䐁햢0࣫ᡁgrㄛ": "\u0011_xM/蘇Chv;dhA5.嗀绱V爤ﰦi뵲M", - "⏑[\"ugoy^儣횎~U\\섯겜論l2jw஌yD腅̂\u0019": true, - "ⵯɇ䐲᫿࢚!㯢l샅笶戮1꣖0Xe": null, - "劅f넀識b宁焊E찓橵G!ʱ獓뭔雩괛": [{"p⹣켙[q>燣䍃㞽ᩲx:쓤삘7玑퇼0<\/q璂ᑁ[Z\\3䅵䧳\u0011㤧|妱緒C['췓Yꞟ3Z鳱雼P錻BU씧U`ᢶg蓱>.1ӧ譫'L_5V䏵Ц": [ - false, - false, - {"22䂍盥N霂얢躰e9⑩_뵜斌n@B}$괻Yᐱ@䧋V\"☒-諯cV돯ʠ": true, - "Ű螧ᔼ檍鍎땒딜qꄃH뜣<獧ूCY吓⸏>XQ㵡趌o끬k픀빯a(ܵ甏끆୯/6Nᪧ}搚ᆚ짌P牰泱鈷^d꣟#L삀\"㕹襻;k㸊\\f+": true, - "쎣\",|⫝̸阊x庿k잣v庅$鈏괎炔k쬪O_": [ - "잩AzZGz3v愠ꉈⵎ?㊱}S尳௏p\r2>췝IP䘈M)w|\u000eE", - -9222726055990423201, - null, - [ - false, - {"´킮'뮤쯽Wx讐V,6ᩪ1紲aႈ\u205czD": [ - -930994432421097536, - 3157232031581030121, - "l貚PY䃛5@䭄귻m㎮琸f": 1.0318894506812084E-19, - "࢜⩢Ш䧔1肽씮+༎ᣰ闺馺窃䕨8Mƶq腽xc(៯夐J5굄䕁Qj_훨/~価.䢵慯틠퇱豠㼇Qﵘ$DuSp(8Uญ<\/ಟ룴𥳐ݩ$": 8350772684161555590, - "ㆎQ䄾\u001bpᩭ${[諟^^骴᤮b^ㅥI┧T㉇⾞\"绦r䰂f矩'-7䡭桥Dz兔V9谶居㺍ᔊ䩯덲.\u001eL0ὅㅷ釣": [{ - "<쯬J卷^숞u࠯䌗艞R9닪g㐾볎a䂈歖意:%鐔|ﵤ|y}>;2,覂⶚啵tb*仛8乒㓶B࿠㯉戩oX 貘5V嗆렽낁߼4h䧛ꍺM空\\b꿋貼": 8478577078537189402, - "VD*|吝z~h譺aᯒ": { - "YI췢K<\/濳xNne玗rJo쾘3핰鴊\"↱AR:ࢷ\"9?\"臁說)?誚ꊏe)_D翾W?&F6J@뺾ꍰNZ醊Z쾈വH嶿?炫㷱鬰M겈᭨b,⻁鈵P䕡䀠८ⱄ홎鄣": { - "@?k2鶖㋮\"Oರ K㨇廪儲\u0017䍾J?);\b*묀㗠섳햭1MC V": null, - "UIICP!BUA`ᢈ㋸~袩㗪⾒=fB﮴l1ꡛ죘R辂여ҳ7쮡<䩲`熕8頁": 4481809488267626463, - "Y?+8먙ᚔ鋳蜩럶1㥔y璜౩`": [ - null, - 1.2850335807501874E-19, - "~V2", - 2035406654801997866, - { - "<숻1>\"": -8062468865199390827, - "M㿣E]}qwG莎Gn᝶(ꔙ\\D⬲iꇲs寢t駇S뀡ꢜ": false, - "pꝤ㎏9W%>M;-U璏f(^j1?&RB隧 忓b똊E": "#G?C8.躬ꥯ'?냪#< 渟&헿란zpo왓Kj}鷧XﻘMツb䕖;㪻", - "vE풤幉xz뱕쫥Ug㦲aH} ᣟp:鬼YᰟH3镔ᴚ斦\\鏑r*2橱G⼔F/.j": true, - "RK좬뎂a홠f*f㱉ᮍ⦋潙㨋Gu곌SGI3I뿐\\F',)t`荁蘯囯ﮉ裲뇟쥼_ገ驪▵撏ᕤV": 1.52738225997956557E18, - "^k굲䪿꠹B逤%F㱢漥O披M㽯镞竇霒i꼂焅륓\u00059=皫之눃\u2047娤閍銤唫ၕb<\/w踲䔼u솆맚,䝒ᝳ'/it": "B餹饴is権ꖪ怯ꦂẉဎt\"!凢谵⧿0\\<=(uL䷍刨쑪>俆揓Cy襸Q힆䆭涷<\/ᐱ0ɧ䗾䚹\\ኜ?ꄢᇘ`䴢{囇}᠈䴥X4퓪檄]ꥷ/3謒ሴn+g騍X", - "GgG꽬[(嫓몍6\u0004궍宩㙻/>\u0011^辍dT腪hxǑ%ꊇk,8(W⧂結P鬜O": [{ - "M㴾c>\\ᓲ\u0019V{>ꤩ혙넪㭪躂TS-痴໸闓⍵/徯O.M㏥ʷD囎⧔쁳휤T??鉬뇙=#ꢫ숣BX䭼<\/d똬졬g榿)eꨋﯪ좇첻\u001a\u0011\";~쓆BH4坋攊7힪", - "iT:L闞椕윚*滛gI≀Wਟඊ'ꢆ縺뱹鮚Nꩁ᧬蕼21줧\\䋯``⍐\\㏱鳨": 1927052677739832894, - "쮁缦腃g]礿Y㬙 fヺSɪ꾾N㞈": [ - null, - null, - { - "!t,灝Y 1䗉罵?c饃호䉂Cᐭ쒘z(즽sZG㬣sഖE4뢜㓕䏞丮Qp簍6EZឪ겛fx'ꩱQ0罣i{k锩*㤴㯞r迎jTⲤ渔m炅肳": [ - -3.3325685522591933E18, - [{"㓁5]A䢕1룥BC?Ꙍ`r룔Ⳛ䙡u伲+\u0001്o": [ - null, - 4975309147809803991, - null, - null, - {"T팘8Dﯲ稟MM☻㧚䥧/8ﻥ⥯aXLaH\"顾S☟耲ît7fS෉놁뮔/ꕼ䓈쁺4\\霶䠴ᩢ<\/t4?죵>uD5➶༆쉌럮⢀秙䘥\u20972ETR3濡恆vB? ~鸆\u0005": { - "`閖m璝㥉b뜴?Wf;?DV콜\u2020퍉౓擝宏ZMj3mJ먡-傷뱙yח㸷꥿ ໘u=M읝!5吭L4v\\?ǎ7C홫": null, - "|": false, - "~Ztᛋ䚘\\擭㗝傪W陖+㗶qᵿ蘥ᙄp%䫎)}=⠔6ᮢS湟-螾-mXH?cp": 448751162044282216, - "\u209fad놹j檋䇌ᶾ梕㉝bוּ": {"?苴ꩠD䋓帘5騱qﱖPF?☸珗顒yU ᡫcb䫎 S@㥚gꮒ쎘泴멖\\:I鮱TZ듒ᶨQ3+f7캙\"?\f풾\\o杞紟﻽M.⏎靑OP": [ - -2.6990368911551596E18, - [{"䒖@<᰿<\/⽬tTr腞&G%᳊秩蜰擻f㎳?S㵧\r*k뎾-乢겹隷j軛겷0룁鮁": {")DO0腦:춍逿:1㥨่!蛍樋2": [{ - ",ꌣf侴笾m๫ꆽ?1?U?\u0011ꌈꂇ": { - "x捗甠nVq䅦w`CD⦂惺嘴0I#vỵ} \\귂S끴D얾?Ԓj溯\"v餄a": { - "@翙c⢃趚痋i\u0015OQ⍝lq돆Y0pࢥ3쉨䜩^<8g懥0w)]䊑n洺o5쭝QL댊랖L镈Qnt⪟㒅십q헎鳒⮤眉ᔹ梠@O縠u泌ㄘb榚癸XޔFtj;iC": false, - "I&뱋゘|蓔䔕측瓯%6ᗻHW\\N1貇#?僐ᗜgh᭪o'䗈꽹Rc욏/蔳迄༝!0邔䨷푪8疩)[쭶緄㇈୧ፐ": { - "B+:ꉰ`s쾭)빼C羍A䫊pMgjdx䐝Hf9᥸W0!C樃'蘿f䫤סи\u0017Jve? 覝f둀⬣퓉Whk\"஼=չﳐ皆笁BIW虨쫓F廰饞": -642906201042308791, - "sb,XcZ<\/m㉹ ;䑷@c䵀s奤⬷7`ꘖ蕘戚?Feb#輜}p4nH⬮eKL트}": [ - "RK鳗z=袤Pf|[,u욺", - "Ẏᏻ罯뉋⺖锅젯㷻{H䰞쬙-쩓D]~\u0013O㳢gb@揶蔉|kᦂ❗!\u001ebM褐sca쨜襒y⺉룓", - null, - null, - true, - -1.650777344339075E-19, - false, - "☑lꄆs힨꤇]'uTന⌳농].1⋔괁沰\"IWഩ\u0019氜8쟇䔻;3衲恋,窌z펏喁횗?4?C넁问?ᥙ橭{稻Ⴗ_썔", - "n?]讇빽嗁}1孅9#ꭨ靶v\u0014喈)vw祔}룼쮿I", - -2.7033457331882025E18, - { - ";⚃^㱋x:饬ኡj'꧵T☽O㔬RO婎?향ᒭ搩$渣y4i;(Q>꿘e8q": "j~錘}0g;L萺*;ᕭꄮ0l潛烢5H▄쳂ꏒוֹꙶT犘≫x閦웧v", - "~揯\u2018c4職렁E~ᑅቚꈂ?nq뎤.:慹`F햘+%鉎O瀜쟏敛菮⍌浢<\/㮺紿P鳆ࠉ8I-o?#jﮨ7v3Dt赻J9": null, - "ࣝW䌈0ꍎqC逖,횅c၃swj;jJS櫍5槗OaB>D踾Y": {"㒰䵝F%?59.㍈cᕨ흕틎ḏ㋩B=9IېⓌ{:9.yw}呰ㆮ肒᎒tI㾴62\"ዃ抡C﹬B<\/촋jo朣", - [ - -7675533242647793366, - {"ᙧ呃:[㒺쳀쌡쏂H稈㢤\u001dᶗGG-{GHྻຊꡃ哸䵬;$?&d\\⥬こN圴됤挨-'ꕮ$PU%?冕눖i魁q騎Q": [ - false, - [[ - 7929823049157504248, - [[ - true, - "Z菙\u0017'eꕤ᱕l,0\\X\u001c[=雿8蠬L<\/낲긯W99g톉4ퟋb㝺\u0007劁'!麕Q궈oW:@X၎z蘻m絙璩귓죉+3柚怫tS捇蒣䝠-擶D[0=퉿8)q0ٟ", - "唉\nFA椭穒巯\\䥴䅺鿤S#b迅獘 ﶗ꬘\\?q1qN犠pX꜅^䤊⛤㢌[⬛휖岺q唻ⳡ틍\"㙙Eh@oA賑㗠y必Nꊑᗘ", - -2154220236962890773, - -3.2442003245397908E18, - "Wᄿ筠:瘫퀩?o貸q⊻(᎞KWf宛尨h^残3[U(='橄", - -7857990034281549164, - 1.44283696979059942E18, - null, - {"ꫯAw跭喀 ?_9\"Aty背F=9缉ྦྷ@;?^鞀w:uN㘢Rỏ": [ - 7.393662029337442E15, - 3564680942654233068, - [ - false, - -5253931502642112194, - "煉\\辎ೆ罍5⒭1䪁䃑s䎢:[e5}峳ﴱn騎3?腳Hyꏃ膼N潭錖,Yᝋ˜YAၓ㬠bG렣䰣:", - true, - null, - { - "⒛'P&%죮|:⫶춞": -3818336746965687085, - "钖m<\/0ݎMtF2Pk=瓰୮洽겎.": [[ - -8757574841556350607, - -3045234949333270161, - null, - { - "Ꮬr輳>⫇9hU##w@귪A\\C 鋺㘓ꖐ梒뒬묹㹻+郸嬏윤'+g<\/碴,}ꙫ>손;情d齆J䬁ຩ撛챝탹/R澡7剌tꤼ?ặ!`⏲睤\u00002똥଴⟏": null, - "\u20f2ܹe\\tAꥍư\\x当뿖렉禛;G檳ﯪS૰3~㘠#[J<}{奲 5箉⨔{놁<\/釿抋,嚠/曳m&WaOvT赋皺璑텁": [[ - false, - null, - true, - -5.7131445659795661E18, - "萭m䓪D5|3婁ఞ>蠇晼6nﴺPp禽羱DS<睓닫屚삏姿", - true, - [ - -8759747687917306831, - { - ">ⓛ\t,odKr{䘠?b퓸C嶈=DyEᙬ@ᴔ쨺芛髿UT퓻春<\/yꏸ>豚W釺N뜨^?꽴﨟5殺ᗃ翐%>퍂ဿ䄸沂Ea;A_\u0005閹殀W+窊?Ꭼd\u0013P汴G5썓揘": 4.342729067882445E-18, - "Q^즾眆@AN\u0011Kb榰냎Y#䝀ꀒᳺ'q暇睵s\"!3#I⊆畼寤@HxJ9": false, - "⿾D[)袨㇩i]웪䀤ᛰMvR<蟏㣨": {"v퇓L㪱ꖣ豛톤\\곱#kDTN": [{ - "(쾴䡣,寴ph(C\"㳶w\"憳2s馆E!n!&柄<\/0Pꈗſ?㿳Qd鵔": {"娇堰孹L錮h嵅⛤躏顒?CglN束+쨣ﺜ\\MrH": {"獞䎇둃ቲ弭팭^ꄞ踦涟XK錆쳞ឌ`;੶S炥騞ଋ褂B៎{ڒ䭷ᶼ靜pI荗虶K$": [{"◖S~躘蒉꫿輜譝Q㽙闐@ᢗ¥E榁iء5┄^B[絮跉ᰥ遙PWi3wㄾⵀDJ9!w㞣ᄎ{듒ꓓb6\\篴??c⼰鶹⟧\\鮇ꮇ": [[ - 654120831325413520, - -1.9562073916357608E-19, - { - "DC(昐衵ἡ긙갵姭|֛[t": 7.6979110359897907E18, - "J␅))嫼❳9Xfd飉j7猬ᩉ+⤻眗벎E鰉Zᄊ63zၝ69}ZᶐL崭ᦥ⡦靚⋛ꎨ~i㨃咊ꧭo䰠阀3C(": -3.5844809362512589E17, - "p꣑팱쒬ꎑ뛡Ꙩ挴恍胔&7ᔈ묒4Hd硶훐㎖zꢼ豍㿢aሃ=<\/湉鵲EӅ%$F!퍶棌孼{O駍਺geu+": ")\u001b잓kŀX쩫A밁®ڣ癦狢)扔弒p}k縕ꩋ,䃉tࣼi", - "ァF肿輸<솄G-䢹䛸ꊏl`Tqꕗ蒞a氷⸅ᴉ蠰]S/{J왲m5{9.uέ~㕚㣹u>x8U讁B덺襪盎QhVS맅킃i识{벂磄Iහ䙅xZy/抍૭Z鲁-霳V据挦ℒ": null, - "㯛|Nꐸb7ⵐb?拠O\u0014ކ?-(EꞨ4ꕷᄤYᯕOW瞺~螸\"욿ќe㺰\"'㌢ƐW\u0004瞕>0?V鷵엳": true, - "뤥G\\迋䠿[庩'꼡\u001aiᩮV쯁ᳪ䦪Ô;倱ନ뛁誈": null, - "쥹䄆䚟Q榁䎐᢭<\/2㕣p}HW蟔|䃏꿈ꚉ锳2Pb7㙑Tⅹᵅ": { - "Y?֭$>#cVBꩨ:>eL蒁務": { - "86柡0po 䏚&-捑Ћ祌<\/휃-G*㶢הּ쩍s㶟餇c걺yu꽎還5*턧簕Og婥SꝐ": null, - "a+葞h٥ࠆ裈嗫ﵢ5輙퀟ᛜ,QDﹼ⟶Y騠锪E_|x죗j侵;m蜫轘趥?븅w5+mi콛L": { - ";⯭ﱢ!买F⽍柤鶂n䵣V㫚墱2렾ELEl⣆": [ - true, - -3.6479311868339015E-18, - -7270785619461995400, - 3.334081886177621E18, - 2.581457786298155E18, - -6.605252412954115E-20, - -3.9232347037744167E-20, - { - "B6㊕.k1": null, - "ZAꄮJ鮷ᳱo갘硥鈠䠒츼": { - "ᕅ}럡}.@y陪鶁r業'援퀉x䉴ﵴl퍘):씭脴ᥞhiꃰblﲂ䡲엕8߇M㶭0燋標挝-?PCwe⾕J碻Ᾱ䬈䈥뷰憵賣뵓痬+": {"a췩v礗X⋈耓ፊf罅靮!㔽YYᣓw澍33⎔芲F|\"䜏T↮輦挑6ᓘL侘?ᅥ]덆1R௯✎餘6ꏽ<\/௨\\?q喷ꁫj~@ulq": {"嗫欆뾔Xꆹ4H㌋F嵧]ࠎ]㠖1ꞤT<$m뫏O i댳0䲝i": {"?෩?\u20cd슮|ꯆjs{?d7?eNs⢚嫥氂䡮쎱:鑵롟2hJꎒﯭ鱢3춲亄:뼣v䊭諱Yj択cVmR䩃㘬T\"N홝*ै%x^F\\_s9보zz4淗?q": [ - null, - "?", - 2941869570821073737, - "{5{殇0䝾g6밖퍋臩綹R$䖭j紋釰7sXI繳漪행y", - false, - "aH磂?뛡#惇d婅?Fe,쐘+늵䍘\"3r瘆唊勐j⳧࠴ꇓ<\/唕윈x⬌讣䋵%拗ᛆⰿ妴᝔M2㳗必꧂淲?ゥ젯檢<8끒MidX䏒3᳻Q▮佐UT|⤪봦靏⊏", - [[{ - "颉(&뜸귙{y^\"P퟉춝Ჟ䮭D顡9=?}Y誱<$b뱣RvO8cH煉@tk~4ǂ⤧⩝屋SS;J{vV#剤餓ᯅc?#a6D,s": [ - -7.8781018564821536E16, - true, - [ - -2.28770899315832371E18, - false, - -1.0863912140143876E-20, - -6282721572097446995, - 6767121921199223078, - -2545487755405567831, - false, - null, - -9065970397975641765, - [ - -5.928721243413937E-20, - {"6촊\u001a홯kB0w撨燠룉{绎6⳹!턍贑y▾鱧ժ[;7ᨷ∀*땒䪮1x霆Hᩭ☔\"r䝐7毟ᝰr惃3ꉭE+>僒澐": [ - "Ta쎩aƝt쵯ⰪVb", - [ - -5222472249213580702, - null, - -2851641861541559595, - null, - 4808804630502809099, - 5657671602244269874, - "5犲﨣4mᥣ?yf젫꾯|䋬잁$`Iⳉﴷ扳兝,'c", - false, - [ - null, - { - "DyUIN쎾M仼惀⮥裎岶泭lh扠\u001e礼.tEC癯튻@_Qd4c5S熯A<\/\6U윲蹴Q=%푫汹\\\u20614b[௒C⒥Xe⊇囙b,服3ss땊뢍i~逇PA쇸1": -2.63273619193485312E17, - "Mq꺋貘k휕=nK硍뫞輩>㾆~἞ࡹ긐榵l⋙Hw뮢帋M엳뢯v⅃^": 1877913476688465125, - "ᶴ뻗`~筗免⚽টW˃⽝b犳䓺Iz篤p;乨A\u20ef쩏?疊m㝀컩뫡b탔鄃ᾈV(遢珳=뎲ିeF仢䆡谨8t0醄7㭧瘵⻰컆r厡궥d)a阄፷Ed&c﯄伮1p": null, - "⯁w4曢\"(欷輡": "\"M᭫]䣒頳B\\燧ࠃN㡇j姈g⊸⺌忉ꡥF矉স%^", - "㣡Oᄦ昵⫮Y祎S쐐級㭻撥>{I$": -378474210562741663, - "䛒掷留Q%쓗1*1J*끓헩ᦢ﫫哉쩧EↅIcꅡ\\?ⴊl귛顮4": false, - "寔愆샠5]䗄IH贈=d﯊/偶?ॊn%晥D視N򗘈'᫂⚦|X쵩넽z질tskxDQ莮Aoﱻ뛓": true, - "钣xp?&\u001e侉/y䴼~?U篔蘚缣/I畚?Q绊": -3034854258736382234, - "꺲໣眀)⿷J暘pИfAV삕쳭Nꯗ4々'唄ⶑ伻㷯騑倭D*Ok꧁3b␽_<\/챣Xm톰ၕ䆄`*fl㭀暮滠毡?": [ - "D男p`V뙸擨忝븪9c麺`淂⢦Yw⡢+kzܖ\fY1䬡H歁)벾Z♤溊-혰셢?1<-\u0005;搢Tᐁle\\ᛵߓﭩ榩訝-xJ;巡8깊蠝ﻓU$K": { - "Vꕡ諅搓W=斸s︪vﲜ츧$)iꡟ싉e寳?ጭムVથ嵬i楝Fg<\/Z|៪ꩆ-5'@ꃱ80!燱R쇤t糳]罛逇dṌ֣XHiͦ{": true, - "Ya矲C멗Q9膲墅携휻c\\딶G甔<\/.齵휴": -1.1456247877031811E-19, - "z#.OO￝J": -8263224695871959017, - "崍_3夼ᮟ1F븍뽯ᦓ鴭V豈Ь": [{ - "N蒬74": null, - "yuB?厅vK笗!ᔸcXQ旦컶P-녫mᄉ麟_": "1R@ 톘xa_|﩯遘s槞d!d껀筤⬫薐焵먑D{\\6k共倌☀G~AS_D\"딟쬚뮥馲렓쓠攥WTMܭ8nX㩴䕅檹E\u0007ﭨN 2 ℆涐ꥏ꠵3▙玽|됨_\u2048", - "恐A C䧩G": {":M큣5e들\\ꍀ恼ᔄ靸|I﨏$)n": { - "|U䬫㟯SKV6ꛤ㗮\bn봻䲄fXT:㾯쳤'笓0b/ೢC쳖?2浓uO.䰴": "ཐ꼋e?``,ᚇ慐^8ꜙNM䂱\u0001IᖙꝧM'vKdꌊH牮r\\O@䊷ᓵ쀆(fy聻i툺\"?<\/峧ࣞ⓺ᤤ쵒߯ꎺ騬?)刦\u2072l慪y꺜ﲖTj+u", - "뽫hh䈵w>1ⲏ쐭V[ⅎ\\헑벑F_㖝⠗㫇h恽;῝汰ᱼ瀖J옆9RR셏vsZ柺鶶툤r뢱橾/ꉇ囦FGm\"謗ꉦ⨶쒿⥡%]鵩#ᖣ_蹎 u5|祥?O", - null, - 2.0150326776036215E-19, - null, - true, - false, - true, - {"\fa᭶P捤WWc᠟f뚉ᬏ퓗ⳀW睹5:HXH=q7x찙X$)모r뚥ᆟ!Jﳸf": [ - -2995806398034583407, - [ - 6441377066589744683, - "Mﶒ醹i)Gἦ廃s6몞 KJ౹礎VZ螺费힀\u0000冺업{谥'꡾뱻:.ꘘ굄奉攼Di᷑K鶲y繈욊阓v㻘}枭캗e矮1c?휐\"4\u0005厑莔뀾墓낝⽴洗ṹ䇃糞@b1\u0016즽Y轹", - { - "1⽕⌰鉟픏M㤭n⧴ỼD#%鐘⊯쿼稁븣몐紧ᅇ㓕ᛖcw嬀~ഌ㖓(0r⧦Q䑕髍ര铂㓻R儮\"@ꇱm❈௿᦯頌8}㿹犴?xn잆꥽R": 2.07321075750427366E18, - "˳b18㗈䃟柵Z曆VTAu7+㛂cb0﯑Wp執<\/臋뭡뚋刼틮荋벲TLP预庰܈G\\O@VD'鱃#乖끺*鑪ꬳ?Mޞdﭹ{␇圯쇜㼞顄︖Y홡g": [{ - "0a,FZ": true, - "2z̬蝣ꧦ驸\u0006L↛Ḣ4๚뿀'?lcwᄧ㐮!蓚䃦-|7.飑挴.樵*+1ﮊ\u0010ꛌ%貨啺/JdM:똍!FBe?鰴㨗0O财I藻ʔWA᫓G쳛u`<\/I": [{ - "$τ5V鴐a뾆両環iZp頻යn븃v": -4869131188151215571, - "*즢[⦃b礞R◚nΰꕢH=귰燙[yc誘g䆌?ଜ臛": { - "洤湌鲒)⟻\\䥳va}PeAMnN[": "㐳ɪ/(軆lZR,Cp殍ȮN啷\"3B婴?i=r$펽ᤐ쀸", - "阄R4㒿㯔ڀ69ZᲦ2癁핌噗P崜#\\-쭍袛&鐑/$4童V꩑_ZHA澢fZ3": {"x;P{긳:G閉:9?活H": [ - "繺漮6?z犞焃슳\">ỏ[Ⳛ䌜녏䂹>聵⼶煜Y桥[泥뚩MvK$4jtロ", - "E#갶霠좭㦻ୗ먵F+䪀o蝒ba쮎4X㣵 h", - -335836610224228782, - null, - null, - [ - "r1᫩0>danjY짿bs{", - [ - -9.594464059325631E-23, - 1.0456894622831624E-20, - null, - 5.803973284253454E-20, - -8141787905188892123, - true, - -4735305442504973382, - 9.513150514479281E-20, - "7넳$螔忷㶪}䪪l짴\u0007鹁P鰚HF銏ZJﳴ/⍎1ᷓ忉睇ᜋ쓈x뵠m䷐窥Ꮤ^\u0019ᶌ偭#ヂt☆၃pᎍ臶䟱5$䰵&๵分숝]䝈뉍♂坎\u0011<>", - "C蒑貑藁lﰰ}X喇몛;t밿O7/᯹f\u0015kI嘦<ዴ㟮ᗎZ`GWퟩ瑹࡮ᅴB꿊칈??R校s脚", - { - "9珵戬+AU^洘拻ቒy柭床'粙XG鞕᠜繀伪%]hC,$輙?Ut乖Qm떚W8઼}~q⠪rU䤶CQ痗ig@#≲t샌f㈥酧l;y闥ZH斦e⸬]j⸗?ঢ拻퀆滌": null, - "畯}㧢J罚帐VX㨑>1ꢶkT⿄蘥㝑o|<嗸層沈挄GEOM@-䞚䧰$만峬輏䠱V✩5宸-揂D'㗪yP掶7b⠟J㕻SfP?d}v㼂Ꮕ'猘": { - "陓y잀v>╪": null, - "鬿L+7:됑Y=焠U;킻䯌잫!韎ஔ\f": { - "駫WmGጶ": { - "\\~m6狩K": -2586304199791962143, - "ႜࠀ%͑l⿅D.瑢Dk%0紪dḨTI픸%뗜☓s榗኉\"?V籄7w髄♲쟗翛歂E䤓皹t ?)ᄟ鬲鐜6C": { - "_췤a圷1\u000eB-XOy缿請∎$`쳌eZ~杁튻/蜞`塣৙\"⪰\"沒l}蕌\\롃荫氌.望wZ|o!)Hn獝qg}": null, - "kOSܧ䖨钨:಼鉝ꭝO醧S`십`ꓭ쭁ﯢN&Et㺪馻㍢ⅳ㢺崡ຊ蜚锫\\%ahx켨|ż劻ꎄ㢄쐟A躊᰹p譞綨Ir쿯\u0016ﵚOd럂*僨郀N*b㕷63z": { - ":L5r+T㡲": [{ - "VK泓돲ᮙRy㓤➙Ⱗ38oi}LJቨ7Ó㹡৘*q)1豢⛃e᫛뙪壥镇枝7G藯g㨛oI䄽 孂L缊ꋕ'EN`": -2148138481412096818, - "`⛝ᘑ$(खꊲ⤖ᄁꤒ䦦3=)]Y㢌跨NĴ驳줟秠++d孳>8ᎊ떩EꡣSv룃 쯫أ?#E|᭙㎐?zv:5祉^⋑V": [ - -1.4691944435285607E-19, - 3.4128661569395795E17, - "㐃촗^G9佭龶n募8R厞eEw⺡_ㆱ%⼨D뉄퉠2ꩵᛅⳍ搿L팹Lවn=\"慉념ᛮy>!`g!풲晴[/;?[v겁軇}⤳⤁핏∌T㽲R홓遉㓥", - "愰_⮹T䓒妒閤둥?0aB@㈧g焻-#~跬x<\/舁P݄ꐡ=\\׳P\u0015jᳪᢁq;㯏l%᭗;砢觨▝,謁ꍰGy?躤O黩퍋Y㒝a擯\n7覌똟_䔡]fJ晋IAS", - 4367930106786121250, - -4.9421193149720582E17, - null, - { - ";ᄌ똾柉곟ⰺKpፇ䱻ฺ䖝{o~h!eꁿ઻욄ښ\u0002y?xUd\u207c悜ꌭ": [ - 1.6010824122815255E-19, - [ - "宨︩9앉檥pr쇷?WxLb", - "氇9】J玚\u000f옛呲~ 輠1D嬛,*mW3?n휂糊γ虻*ᴫ꾠?q凐趗Ko↦GT铮", - "㶢ថmO㍔k'诔栀Z蛟}GZ钹D", - false, - -6.366995517736813E-20, - -4894479530745302899, - null, - "V%᫡II璅䅛䓎풹ﱢ/pU9se되뛞x梔~C)䨧䩻蜺(g㘚R?/Ự[忓C뾠ࢤc왈邠买?嫥挤풜隊枕", - ",v碍喔㌲쟚蔚톬៓ꭶ", - 3.9625444752577524E-19, - null, - [ - "kO8란뿒䱕馔b臻⍟隨\"㜮鲣Yq5m퐔K#ꢘug㼈ᝦ=P^6탲@䧔%$CqSw铜랊0&m⟭<\/a逎ym\u0013vᯗ": true, - "洫`|XN뤮\u0018詞=紩鴘_sX)㯅鿻Ố싹": 7.168252736947373E-20, - "ꛊ饤ﴏ袁(逊+~⽫얢鈮艬O힉7D筗S곯w操I斞᠈븘蓷x": [[[[ - -7.3136069426336952E18, - -2.13572396712722688E18, - { - "硢3㇩R:o칢行E<=\u0018ၬYuH!\u00044U%卝炼2>\u001eSi$⓷ꒈ'렢gᙫ番ꯒ㛹럥嶀澈v;葷鄕x蓎\\惩+稘UEᖸﳊ㊈壋N嫿⏾挎,袯苷ኢ\\x|3c": 7540762493381776411, - "?!*^ᢏ窯?\u0001ڔꙃw虜돳FgJ?&⨫*uo籤:?}ꃹ=ٴ惨瓜Z媊@ત戹㔏똩Ԛ耦Wt轁\\枒^\\ꩵ}}}ꀣD\\]6M_⌫)H豣:36섘㑜": { - ";홗ᰰU஋㙛`D왔ཿЃS회爁\u001b-㢈`봆?盂㛣듿ᦾ蒽_AD~EEຆ㊋(eNwk=Rɠ峭q\"5Ἠ婾^>'ls\n8QAK)- Q䲌mo펹L_칍樖庫9꩝쪹ᘹ䑖瀍aK ?*趤f뭓廝p=磕", - "哑z懅ᤏ-ꍹux쀭", - [ - true, - 3998739591332339511, - "ጻ㙙?᳸aK<\/囩U`B3袗ﱱ?\"/k鏔䍧2l@쿎VZ쨎/6ꃭ脥|B?31+on颼-ꮧ,O嫚m ࡭`KH葦:粘i]aSU쓙$쐂f+詛頖b", - [{"^<9<箝&絡;%i﫡2攑紴\\켉h쓙-柂䚝ven\u20f7浯-Ꮏ\r^훁䓚헬\u000e?\\ㅡֺJ떷VOt": [{ - "-௄卶k㘆혐஽y⎱㢬sS઄+^瞥h;ᾷj;抭\u0003밫f<\/5Ⱗ裏_朻%*[-撵䷮彈-芈": { - "㩩p3篊G|宮hz䑊o곥j^Co0": [ - 653239109285256503, - {"궲?|\":N1ۿ氃NZ#깩:쇡o8킗ࡊ[\"됸Po핇1(6鰏$膓}⽐*)渽J'DN<썙긘毦끲Ys칖": { - "2Pr?Xjㆠ?搮/?㓦柖馃5뚣Nᦼ|铢r衴㩖\"甝湗ܝ憍": "\"뾯i띇筝牻$珲/4ka $匝휴译zbAᩁꇸ瑅&뵲衯ꎀᆿ7@ꈋ'ᶨH@ᠴl+", - "7뢽뚐v?4^ꊥ_⪛.>pởr渲<\/⢕疻c\"g䇘vU剺dஔ鮥꒚(dv祴X⼹\\a8y5坆": true, - "o뼄B욞羁hr﷔폘뒚⿛U5pꪴfg!6\\\"爑쏍䢱W<ﶕ\\텣珇oI/BK뺡'谑♟[Ut븷亮g(\"t⡎有?ꬊ躺翁艩nl F⤿蠜": 1695826030502619742, - "ۊ깖>ࡹ햹^ⵕ쌾BnN〳2C䌕tʬ]찠?ݾ2饺蹳ぶꌭ訍\"◹ᬁD鯎4e滨T輀ﵣ੃3\u20f3킙D瘮g\\擦+泙ၧ 鬹ﯨַ肋7놷郟lP冝{ߒhড়r5,꓋": null, - "ΉN$y{}2\\N﹯ⱙK'8ɜͣwt,.钟廣䎘ꆚk媄_": null, - "䎥eᾆᝦ읉,Jުn岪㥐s搖謽䚔5t㯏㰳㱊ZhD䃭f絕s鋡篟a`Q鬃┦鸳n_靂(E4迠_觅뷝_宪D(NL疶hL追V熑%]v肫=惂!㇫5⬒\u001f喺4랪옑": { - "2a輍85먙R㮧㚪Sm}E2yꆣꫨrRym㐱膶ᔨ\\t綾A☰.焄뙗9<쫷챻䒵셴᭛䮜.<\/慌꽒9叻Ok䰊Z㥪幸k": [ - null, - true, - {"쌞쐍": { - "▟GL K2i뛱iQ\"̠.옛1X$}涺]靎懠ڦ늷?tf灟ݞゟ{": 1.227740268699265E-19, - "꒶]퓚%ฬK❅": [{ - "(ෛ@Ǯっ䧼䵤[aテൖvEnAdU렖뗈@볓yꈪ,mԴ|꟢캁(而첸죕CX4Y믅": "2⯩㳿ꢚ훀~迯?᪑\\啚;4X\u20c2襏B箹)俣eỻw䇄", - "75༂f詳䅫ꐧ鏿 }3\u20b5'∓䝱虀f菼Iq鈆﨤g퍩)BFa왢d0뮪痮M鋡nw∵謊;ꝧf美箈ḋ*\u001c`퇚퐋䳫$!V#N㹲抗ⱉ珎(V嵟鬒_b㳅\u0019": null, - "e_m@(i㜀3ꦗ䕯䭰Oc+-련0뭦⢹苿蟰ꂏSV䰭勢덥.ྈ爑Vd,ᕥ=퀍)vz뱊ꈊB_6듯\"?{㒲&㵞뵫疝돡믈%Qw限,?\r枮\"? N~癃ruࡗdn&": null, - "㉹&'Pfs䑜공j<\/?|8oc᧨L7\\pXᭁ 9᪘": -2.423073789014103E18, - "䝄瑄䢸穊f盈᥸,B뾧푗횵B1쟢f\u001f凄": "魖⚝2儉j꼂긾껢嗎0ࢇ纬xI4](੓`蕞;픬\fC\"斒\")2櫷I﹥迧", - "ퟯ詔x悝령+T?Bg⥄섅kOeQ큼㻴*{E靼6氿L缋\u001c둌๶-㥂2==-츫I즃㠐Lg踞ꙂEG貨鞠\"\u0014d'.缗gI-lIb䋱ᎂDy缦?": null, - "紝M㦁犿w浴詟棓쵫G:䜁?V2ힽ7N*n&㖊Nd-'ຊ?-樹DIv⊜)g䑜9뉂ㄹ푍阉~ꅐ쵃#R^\u000bB䌎䦾]p.䀳": [{"ϒ爛\"ꄱ︗竒G䃓-ま帳あ.j)qgu扐徣ਁZ鼗A9A鸦甈!k蔁喙:3T%&㠘+,䷞|챽v䚞문H<\/醯r셓㶾\\a볜卺zE䝷_죤ဵ뿰᎟CB": [ - 6233512720017661219, - null, - -1638543730522713294, - false, - -8901187771615024724, - [ - 3891351109509829590, - true, - false, - -1.03836679125188032E18, - { - "j랎:g曞ѕᘼ}链N", - -1.1103819473845426E-19, - true, - [ - true, - null, - -7.9091791735309888E17, - true, - {"}蔰鋈+ꐨ啵0?g*사%`J?*": [{ - "\"2wG?yn,癷BK\\龞䑞x?蠢": -3.7220345009853505E-19, - ";饹়❀)皋`噿焒j(3⿏w>偍5X薙婏聿3aFÆÝ": "2,ꓴg?_섦_>Y쪥션钺;=趘F~?D㨫\bX?㹤+>/믟kᠪ멅쬂Uzỵ]$珧`m雁瑊ඖ鯬cꙉ梢f묛bB", - "♽n$YjKiXX*GO贩鏃豮祴遞K醞眡}ꗨv嵎꼷0୸+M菋eH徸J꣆:⼐悥B켽迚㯃b諂\u000bjꠜ碱逮m8": [ - "푷᣺ﻯd8ﱖ嬇ភH鹎⡱᱅0g:果6$GQ췎{vᷧYy-脕x偹砡館⮸C蓼ꏚ=軄H犠G谖ES詤Z蠂3l봟hᅭ7䦹1GPQG癸숟~[#駥8zQ뛣J소obg,", - null, - 1513751096373485652, - null, - -6.851466660824754E-19, - {"䩂-⴮2ٰK솖풄꾚ႻP앳1H鷛wmR䗂皎칄?醜<\/&ࠧ㬍X濬䵈K`vJ륒Q/IC묛!;$vϑ": { - "@-ꚗxྐྵ@m瘬\u0010U絨ﮌ驐\\켑寛넆T=tQ㭤L연@脸삯e-:⩼u㎳VQ㋱襗ຓ<Ⅶ䌸cML3+\u001e_C)r\\9+Jn\\Pﺔ8蠱檾萅Pq鐳话T䄐I": -1.80683891195530061E18, - "ᷭዻU~ཷsgSJ`᪅'%㖔n5픆桪砳峣3獮枾䌷⊰呀": { - "Ş੉䓰邟自~X耤pl7间懑徛s첦5ਕXexh⬖鎥᐀nNr(J컗|ૃF\"Q겮葲놔엞^겄+㈆话〾희紐G'E?飕1f❼텬悚泬먐U睬훶Qs": false, - "(\u20dag8큽튣>^Y{뤋.袊䂓;_g]S\u202a꽬L;^'#땏bႌ?C緡<䝲䲝断ꏏ6\u001asD7IK5Wxo8\u0006p弊⼂ꯍ扵\u0003`뵂픋%ꄰ⫙됶l囏尛+䗅E쟇\\": [ - true, - { - "\n鱿aK㝡␒㼙2촹f;`쾏qIࡔG}㝷䐍瓰w늮*粅9뒪ㄊCj倡翑閳R渚MiUO~仨䜶RꙀA僈㉋⦋n{㖥0딿벑逦⥻0h薓쯴Ꝼ": [ - 5188716534221998369, - 2579413015347802508, - 9.010794400256652E-21, - -6.5327297761238093E17, - 1.11635352494065523E18, - -6656281618760253655, - { - "": ")?", - "TWKLꑙ裑꺔UE俸塑炌Ũ᜕-o\"徚#": {"M/癟6!oI51ni퐚=댡>xꍨ\u0004 ?": { - "皭": {"⢫䋖>u%w잼<䕏꘍P䋵$魋拝U䮎緧皇Y훂&|羋ꋕ잿cJ䨈跓齳5\u001a삱籷I꿾뤔S8㌷繖_Yឯ䲱B턼O歵F\\l醴o_欬6籏=D": [ - false, - true, - {"Mt|ꏞD|F궣MQ뵕T,띺k+?㍵i": [ - 7828094884540988137, - false, - { - "!༦鯠,&aﳑ>[euJꏽ綷搐B.h": -7648546591767075632, - "-n켧嘰{7挐毄Y,>❏螵煫乌pv醑Q嶚!|⌝責0왾덢ꏅ蛨S\\)竰'舓Q}A釡5#v": 3344849660672723988, - "8閪麁V=鈢1녈幬6棉⪮둌\u207d᚛驉ꛃ'r䆉惏ै|bἧﺢᒙ<=穊强s혧eꮿ慩⌡ \\槳W븧J檀C,ᘉ의0俯퀉M;筷ࣴ瓿{늊埂鄧_4揸Nn阼Jੵ˥(社": true, - "o뼀vw)4A뢵(a䵢)p姃뛸\u000fK#KiQp\u0005ꅍ芅쏅": null, - "砥$ꥸ┇耽u斮Gc{z빔깎밇\\숰\u001e괷各㶇쵿_ᴄ+h穢p촀Ნ䃬z䝁酳ӂ31xꔄ1_砚W렘G#2葊P ": [ - -3709692921720865059, - null, - [ - 6669892810652602379, - -135535375466621127, - "뎴iO}Z? 馢녱稹ᄾ䐩rSt帤넆&7i騏멗畖9誧鄜'w{Ͻ^2窭외b㑎粖i矪ꦨ탪跣)KEㆹ\u0015V8[W?⽉>'kc$䨘ᮛ뉻٬M5", - 1.10439588726055846E18, - false, - -4349729830749729097, - null, - [ - false, - "_蠢㠝^䟪/D녒㡋ỎC䒈판\u0006એq@O펢%;鹐쏌o戥~A[ꡉ濽ỳ&虃᩾荣唙藍茨Ig楡꒻M窓冉?", - true, - 2.17220752996421728E17, - -5079714907315156164, - -9.960375974658589E-20, - "ᾎ戞༒", - true, - false, - [[ - "ⶉᖌX⧕홇)g엃⹪x뚐癟\u0002", - -5185853871623955469, - { - "L㜤9ợㇶK鐰⋓V뽋˖!斫as|9"፬䆪?7胜&n薑~": -2.11545634977136992E17, - "O8뀩D}캖q萂6༣㏗䈓煮吽ਆᎼDᣘ폛;": false, - "YTᡅ^L㗎cbY$pᣞ縿#fh!ꘂb삵玊颟샞ဢ$䁗鼒몁~rkH^:닮먖츸륈⪺쒉砉?㙓扫㆕꣒`R䢱B酂?C뇞<5Iޚ讳騕S瞦z": null, - "\\RB?`mG댵鉡幐物䵎有5*e骄T㌓ᛪ琾駒Ku\u001a[柆jUq8⋈5鿋츿myﻗ?雍ux঴?": 5828963951918205428, - "n0晅:黯 xu씪^퓞cB㎊ᬍ⺘٤փ~B岚3㥕擄vᲂ~F?C䶖@$m~忔S왖㲚?챴⊟W#벌{'㰝I䝠縁s樘\\X뢻9핡I6菍ㄛ8쯶]wॽ0L\"q": null, - "x增줖j⦦t䏢᎙㛿Yf鼘~꫓恄4惊\u209c": "oOhbᤃ᛽z&Bi犑\\3B㩬劇䄑oŁ쨅孥멁ຖacA㖫借㞝vg싰샂㐜#譞⢤@k]鋰嘘䜾L熶塥_<\/⍾屈ﮊ_mY菹t뙺}Ox=w鮮4S1ꐩמּ'巑", - "㗓蟵ꂾe蠅匳(JP䗏෸\u0089耀왲": [{ - "ᤃ㵥韎뤽\r?挥O쯡⇔㞚3伖\u0005P⋪\"D궣QLn(⚘罩䩢Ŏv䤘尗뼤됛O淽鋋闚r崩a{4箙{煷m6〈": { - "l곺1L": { - "T'ਤ?砅|੬Km]䄩\"(࿶<\/6U爢䫈倔郴l2㴱^줣k'L浖L鰄Rp今鎗⒗C얨M훁㡧ΘX粜뫈N꤇輊㌻켑#㮮샶-䍗룲蠝癜㱐V>=\\I尬癤t=": 7648082845323511446, - "鋞EP:<\/_`ၧe混ㇹBd⯢㮂驋\\q碽饩跓྿ᴜ+j箿렏㗑yK毢宸p謹h䦹乕U媣\\炤": [[ - "3", - [ - true, - 3.4058271399411134E-20, - true, - "揀+憱f逮@먻BpW曉\u001a㣐⎊$n劈D枤㡞좾\u001aᛁ苔౩闝1B䷒Ṋ݋➐ꀞꐃ磍$t੤_:蘺⮼(#N", - 697483894874368636, - [ - "vᘯ锴)0訶}䳅⩚0O壱韈ߜ\u0018*U鍾䏖=䧉뽑单휻ID쿇嘗?ꌸῬ07", - -5.4858784319382006E18, - 7.5467775182251151E18, - -8911128589670029195, - -7531052386005780140, - null, - [ - null, - true, - [[{ - "1欯twG<\/Q:0怯押殃탷聫사<ỗꕧ蚨䡁nDꌕ\u001c녬~蓩鲃g儊>ꏡl㻿/⑷*챳6㻜W毤緛ﹺᨪ4\u0013뺚J髬e3쳸䘦伧?恪&{L掾p+꬜M䏊d娘6": { - "2p첼양棜h䜢﮶aQ*c扦v︥뮓kC寵횂S銩&ǝ{O*य़iH`U큅ࡓr䩕5ꄸ?`\\᧫?ᮼ?t〟崾훈k薐ì/iy꤃뵰z1<\/AQ#뿩8jJ1z@u䕥": 1.82135747285215155E18, - "ZdN &=d년ᅆ'쑏ⅉ:烋5&៏ᄂ汎来L㯄固{钧u\\㊏튚e摑&t嗄ꖄUb❌?m䴘熚9EW": [{ - "ଛ{i*a(": -8.0314147546006822E17, - "⫾ꃆY\u000e+W`௸ \"M뒶+\\뷐lKE}(NT킶Yj選篒쁶'jNQ硾(똡\\\"逌ⴍy? IRꜘ὞鄬﨧:M\\f⠋Cꚜ쫊ᚴNV^D䕗ㅖἔIao꿬C⍏8": [ - 287156137829026547, - { - "H丞N逕⯲": {"": { - "7-;枮阕梒9ᑄZ": [[[[ - null, - { - "": [[[[ - -7.365909561486078E-19, - 2948694324944243408, - null, - [ - true, - "荒\"并孷䂡쵼9o䀘F\u0002龬7⮹Wz%厖/*? a*R枈㌦됾g뒠䤈q딄㺿$쮸tᶎ릑弣^鏎<\/Y鷇驜L鿽<\/춋9Mᲆឨ^<\/庲3'l낢", - "c鮦\u001b두\\~?眾ಢu݆綑෪蘛轋◜gȃ<\/ⴃcpkDt誩܅\"Y", - [[ - null, - null, - [ - 3113744396744005402, - true, - "v(y", - { - "AQ幆h쾜O+꺷铀ꛉ練A蚗⼺螔j㌍3꽂楎䥯뎸먩?": null, - "蠗渗iz鱖w]擪E": 1.2927828494783804E-17, - "튷|䀭n*曎b✿~杤U]Gz鄭kW|㴚#㟗ഠ8u擨": [[ - true, - null, - null, - {"⾪壯톽g7?㥜ώQꑐ㦀恃㧽伓\\*᧰閖樧뢇赸N휶䎈pI氇镊maᬠ탷#X?A+kНM ༑᩟؝?5꧎鰜ṚY즫궔 =ঈ;ﳈ?*s|켦蜌wM笙莔": [ - null, - -3808207793125626469, - [ - -469910450345251234, - 7852761921290328872, - -2.7979740127017492E18, - 1.4458504352519893E-20, - true, - "㽙깹?먏䆢:䴎ۻg殠JBTU⇞}ꄹꗣi#I뵣鉍r혯~脀쏃#釯:场:䔁>䰮o'㼽HZ擓௧nd", - [ - 974441101787238751, - null, - -2.1647718292441327E-19, - 1.03602824249831488E18, - [ - null, - 1.0311977941822604E-17, - false, - true, - { - "": -3.7019778830816707E18, - "E峾恆茍6xLIm縂0n2视֯J-ᤜz+ᨣ跐mYD豍繹⹺䊓몓ﴀE(@詮(!Y膽#᎙2䟓섣A䈀㟎,囪QbK插wcG湎ꤧtG엝x⥏俎j'A一ᯥ뛙6ㅑ鬀": 8999803005418087004, - "よ殳\\zD⧅%Y泥簳Uꈩ*wRL{3#3FYHା[d岀䉯T稉駅䞘礄P:闈W怏ElB㤍喬赔bG䠼U଄Nw鰯闀楈ePsDꥷ꭬⊊": [ - 6.77723657904486E-20, - null, - [ - "ཚ_뷎꾑蹝q'㾱ꂓ钚蘞慵렜떆`ⴹ⎼櫯]J?[t9Ⓢ !컶躔I᮸uz>3a㠕i,錃L$氰텰@7녫W㸮?羧W뇧ꃞ,N鋮숪2ɼ콏┍䁲6", - "&y?뢶=킕올Za惻HZk>c\u20b58i?ꦶcfBv잉ET9j䡡", - "im珊Ճb칧校\\뼾쯀", - 9.555715121193197E-20, - true, - { - "<㫚v6腓㨭e1㕔&&V∌ᗈT奄5Lጥ>탤?튣瑦㳆ꉰ!(ᙪ㿬擇_n쌯IMΉ㕨␰櫈ᱷ5풔蟹&L.첽e鰷쯃劼﫭b#ﭶ퓀7뷄Wr㢈๧Tʴશ㶑澕鍍%": -1810142373373748101, - "fg晌o?߲ꗄ;>C>?=鑰監侯Kt굅": true, - "䫡蓺ꑷ]C蒹㦘\"1ః@呫\u0014NL䏾eg呮፳,r$裢k>/\\?ㄤᇰﻛ쉕1஥'Ċ\" \\_?쨔\"ʾr: 9S䘏禺ᪧꄂ㲄", - [[{ - "*硙^+E쌺I1䀖ju?:⦈Ꞓl๴竣迃xKC/饉:\fl\"XTFᄄ蟭,芢<\/骡軺띜hꏘ\u001f銿<棔햳▨(궆*=乥b8\\媦䷀뫝}닶ꇭ(Kej䤑M": [{ - "1Ꮼ?>옿I╅C<ގ?ꊌ冉SV5A㢊㶆z-๎玶绢2F뵨@㉌뀌o嶔f9-庒茪珓뷳4": null, - ";lᰳ": "CbB+肻a䄷苝*/볳+/4fq=㰁h6瘉샴4铢Y骐.⌖@哼猎㦞+'gꋸ㒕ߤ㞑(䶒跲ti⑴a硂#No볔", - "t?/jE幸YHT셵⩎K!Eq糦ꗣv刴w\"l$ο:=6:移": { - "z]鑪醊嫗J-Xm銌翁絨c里됏炙Ep㣋鏣똼嚌䀓GP﹖cmf4鹭T䅿꣭姧␸wy6ꦶ;S&(}ᎧKxᾂQ|t뻳k\"d6\"|Ml췆hwLt꼼4$&8Պ褵婶鯀9": {"嵃닢ᒯ'd᧫䳳#NXe3-붋鸿ଢ떓%dK\u0013䲎ꖍYV.裸R⍉rR3蟛\\:젯:南ĺLʆ넕>|텩鴷矔ꋅⒹ{t孶㓑4_": [ - true, - null, - [ - false, - "l怨콈lᏒ", - { - "0w䲏嬧-:`䉅쉇漧\\܂yㄨb%㽄j7ᦶ涶<": 3.7899452730383747E-19, - "ꯛTẀq纤q嶏V⿣?\"g}ი艹(쥯B T騠I=仵및X": {"KX6颠+&ᅃ^f畒y[": { - "H?뱜^?꤂-⦲1a㋞&ꍃ精Ii᤾챪咽쬘唂쫷<땡劈훫놡o㥂\\ KⴙD秼F氮[{'좴:례晰Iq+I쭥_T綺砸GO煝䟪ᚪ`↹l羉q쐼D꽁ᜅ훦: vUV": true, - "u^yﳍ0㱓#[y뜌앸ꊬL㷩?蕶蘾⻍KӼ": -7931695755102841701, - "䤬轉車>\u001c鴵惋\"$쯃྆⇻n뽀G氠S坪]ಲꨍ捇Qxኻ椕駔\\9ࣼ﫻읜磡煮뺪ᶚ볝l㕆t+sζ": [[[ - true, - false, - [ - null, - 3363739578828074923, - true, - { - "\"鸣詩 볰㑵gL㯦῅춝旫}ED辗ﮈI쀤-ꧤ|㠦Z\"娑ᕸ4爏騍㣐\"]쳝Af]茛⬻싦o蚁k䢯䩐菽3廇喑ޅ": 4.5017999150704666E17, - "TYႇ7ʠ值4챳唤~Zo&ݛ": false, - "`塄J袛㭆끺㳀N㺣`꽐嶥KﯝSVᶔ∲퀠獾N딂X\"ᤏhNﬨvI": {"\u20bb㭘I䖵䰼?sw䂷쇪](泒f\"~;꼪Fԝsᝦ": {"p,'ꉂ軿=A蚶?bƉ㏵䅰諬'LYKL6B깯⋩겦뎙(ᜭ\u0006噣d꾆㗼Z;䄝䚔cd<情@䞂3苼㸲U{)<6&ꩻ钛\u001au〷N숨囖愙j=BXW욕^x芜堏Ῑ爂뛷꒻t✘Q\b": [[ - "籛&ଃ䩹.ꃩ㦔\\C颫#暪&!勹ꇶ놽攺J堬镙~軌C'꾖䣹㮅岃ᙴ鵣", - 4.317829988264744E15, - 6.013585322002147E-20, - false, - true, - null, - null, - -3.084633632357326E-20, - false, - null, - { - "\"짫愔昻 X\"藣j\"\"먁ཅѻ㘤㬯0晲DU꟒㸃d벀윒l䦾c੻*3": null, - "谈Wm陧阦咟ฯ歖擓N喴㋐銭rCCnVࢥ^♼Ⅾ젲씗刊S༝+_t赔\\b䚍뉨ꬫ6펛cL䊘᜼<\/澤pF懽&H": [ - null, - { - "W\"HDUuΌ퀟M'P4࿰H똆ⰱﮯ<\/凐蘲\"C鴫ﭒж}ꭩ쥾t5yd诪ﮡ퍉ⴰ@?氐醳rj4I6Qt": 6.9090159359219891E17, - "絛ﳛ⺂": {"諰P㗮聦`ZQ?ꫦh*റcb⧱}埌茥h{棩렛툽o3钛5鮁l7Q榛6_g)ὄ\u0013kj뤬^爖eO4Ⱈ槞鉨ͺ订%qX0T썗嫷$?\\\"봅늆'%": [ - -2.348150870600346E-19, - [[ - true, - -6619392047819511778, - false, - [[ - -1.2929189982356161E-20, - 1.7417192219309838E-19, - {"?嵲2࿐2\u0001啑㷳c縯": [ - null, - [ - false, - true, - 2578060295690793218, - { - "?\"殃呎#㑑F": true, - "}F炊_殛oU헢兔Ꝉ,赭9703.B数gTz3⏬": { - "5&t3,햓Mݸᵣ㴵;꣫䩍↳#@뫷䠅+W-ࣇzᓃ鿕ಔ梭?T䮑ꥬ旴]u뫵막bB讍:왳둛lEh=숾鱠p咐$짏#?g⹷ᗊv㷵.斈u頻\u0018-G.": "뽙m-ouࣤ஫牷\"`Ksꕞ筼3HlȨvC堈\"I]㖡玎r먞#'W賜鴇k'c룼髋䆿飉㗆xg巤9;芔cጐ/ax䊨♢큓r吓㸫೼䢗da᩾\"]屣`", - ":M딪<䢥喠\u0013㖅x9蕐㑂XO]f*Q呰瞊吭VP@9,㨣 D\\穎vˤƩs㜂-曱唅L걬/롬j㈹EB8g<\/섩o渀\"u0y&룣": ">氍緩L/䕑돯Ꟙ蕞^aB뒣+0jK⪄瑨痜LXK^힦1qK{淚t츔X:Vm{2r獁B뾄H첚7氥?쉟䨗ꠂv팳圎踁齀\\", - "D彤5㢷Gꪻ[lㄆ@὜⓰絳[ଃ獽쮹☒[*0ꑚ㜳": 9022717159376231865, - "ҖaV銣tW+$魿\u20c3亜~뫡ᙰ禿쨽㏡fṼzE/h": "5臐㋇Ჯ쮺? 昨탰Wム밎#'\"崲钅U?幫뺀⍾@4kh>騧\\0ҾEV=爐͌U捀%ꉼ 㮋<{j]{R>:gԩL\u001c瀈锌ﯲﳡꚒ'⫿E4暍㌗뵉X\"H᝜", - "ᱚגּ;s醒}犍SἿ㦣&{T$jkB\\\tḮ앾䤹o<避(tW": "vb⯽䴪䮢@|)", - "⥒퐁껉%惀뗌+녣迺顀q條g⚯i⤭룐M琹j̈́⽜A": -8385214638503106917, - "逨ꊶZ<\/W⫟솪㎮ᘇb?ꠔi\"H㧺x෷韒Xꫨฟ|]窽\u001a熑}Agn?Mᶖa9韲4$3Ỵ^=쏍煤ፐ돷2䣃%鷠/eQ9頸쥎", - 2398360204813891033, - false, - 3.2658897259932633E-19, - null, - "?ꚃ8Nn㞷幵d䲳䱲뀙ꪛQ瑓鎴]䩋-鰾捡䳡??掊", - false, - -1309779089385483661, - "ᦲxu_/yecR.6芏.ᜇ過 ~", - -5658779764160586501, - "쒌:曠=l썜䢜wk#s蕚\"互㮉m䉤~0듐䋙#G;h숄옥顇෤勹(C7㢅雚㐯L⠅VV簅<", - null, - -4.664877097240962E18, - -4.1931322262828017E18, - { - ",": { - "v㮟麑䄠뤵g{M띮.\u001bzt뢜뵡0Ǥ龍떟Ᾰ怷ϓRT@Lꀌ樂U㏠⾕e扉|bJg(뵒㠶唺~ꂿ(땉x⻫싉쁊;%0鎻V(o\f,N鏊%nk郼螺": -1.73631993428376141E18, - "쟧摑繮Q@Rᕾ㭚㾣4隅待㓎3蒟": [ - 4971487283312058201, - 8973067552274458613, - { - "`a揙ᣗ\u0015iBo¸": 4.3236479112537999E18, - "HW&퉡ぁ圍Y?瑡Qy훍q!帰敏s舠㫸zꚗaS歲v`G株巷Jp6킼 (귶鍔⾏⡈>M汐㞍ቴ꙲dv@i㳓ᇆ?黍": [ - null, - 4997607199327183467, - "E㻎蠫ᐾ高䙟蘬洼旾﫠텛㇛?'M$㣒蔸=A_亀绉앭rN帮", - null, - [{ - "Eᑞ)8餧A5u&㗾q?": [ - -1.969987519306507E-19, - null, - [ - 3.42437673373841E-20, - true, - "e걷M墁\"割P␛퍧厀R䱜3ﻴO퓫r﹉⹊", - [ - -8164221302779285367, - [ - true, - null, - "爘y^-?蘞Ⲽꪓa␅ꍨ}I", - 1.4645984996724427E-19, - [{ - "tY좗⧑mrzﺝ㿥ⴖ᥷j諅\u0000q賋譁Ꞅ⮱S\nࡣB/큃굪3Zɑ复o<\/;롋": null, - "彟h浠_|V4䦭Dᙣ♞u쿻=삮㍦\u001e哀鬌": [{"6횣楠,qʎꗇ鎆빙]㱭R굋鈌%栲j分僅ペ䇰w폦p蛃N溈ꡐꏀ?@(GI뉬$ﮄ9誁ꓚ2e甸ڋ[䁺,\u0011\u001cࢃ=\\+衪䷨ᯕ鬸K": [[ - "ㅩ拏鈩勥\u000etgWVXs陂規p狵w퓼{뮵_i\u0002ퟑႢ⬐d6鋫F~챿搟\u0096䚼1ۼ칥0꣯儏=鋷牋ⅈꍞ龐", - -7283717290969427831, - true, - [ - 4911644391234541055, - { - "I鈒첽P릜朸W徨觘-Hᎄ퐟⓺>8kr1{겵䍃〛ᬡ̨O귑o䝕'쿡鉕p5": "fv粖RN瞖蛐a?q꤄\u001d⸥}'ꣴ犿ꦼ?뤋?鵆쥴덋䡫s矷̄?ඣ/;괱絢oWfV<\/\u202cC,㖦0䑾%n賹g&T;|lj_欂N4w", - "짨䠗;䌕u i+r๏0": [{"9䥁\\఩8\"馇z䇔<\/ႡY3e狚쐡\"ุ6ﰆZ遖c\"Ll:ꮾ疣<\/᭙O◌납୕湞9⡳Und㫜\u0018^4pj1;䧐儂䗷ୗ>@e톬": { - "a⑂F鋻Q螰'<퇽Q贝瀧{ᘪ,cP&~䮃Z?gI彃": [ - -1.69158726118025933E18, - [ - "궂z簽㔛㮨瘥⤜䛖Gℤ逆Y⪾j08Sn昞ꘔ캻禀鴚P謦b{ꓮmN靐Mᥙ5\"睏2냑I\u0011.L&=?6ᄠ뻷X鸌t刑\"#z)o꫚n쳟줋", - null, - 7517598198523963704, - "ኑQp襟`uᩄr方]*F48ꔵn俺ሙ9뇒", - null, - null, - 6645782462773449868, - 1219168146640438184, - null, - { - ")ယ넌竀Sd䰾zq⫣⏌ʥ\u0010ΐ' |磪&p牢蔑mV蘸૰짬꺵;K": [ - -7.539062290108008E-20, - [ - true, - false, - null, - true, - 6574577753576444630, - [[ - 1.2760162530699766E-19, - [ - null, - [ - "顊\\憎zXB,", - [{ - "㇆{CVC9-MN㜋ઘR눽#{h@ퟨ!鼚׼XOvXS\u0017ᝣ=cS+梽៲綆16s덽휐y屬?ᇳG2ᴭ\u00054쫖y룇nKcW̭炦s/鰘ᬽ?J|퓀髣n勌\u0010홠P>j": false, - "箴": [ - false, - "鍞j\"ꮾ*엇칬瘫xṬ⭽쩁䃳\"-⋵?ᦽ댎Ĝ": true, - "Pg帯佃籛n㔠⭹࠳뷏≻࿟3㞱!-쒾!}쭪䃕!籿n涻J5ਲ਼yvy;Rኂ%ᔡጀ裃;M⣼)쵂쑈": 1.80447711803435366E18, - "ꈑC⡂ᑆ㤉壂뎃Xub<\/쀆༈憓ق쨐ק\\": [ - 7706977185172797197, - {"": {"K╥踮砆NWࡆFy韣7ä밥{|紒︧䃀榫rᩛꦡTSy잺iH8}ퟴ,M?Ʂ勺ᴹ@T@~꾂=I㙕뾰_涀쑜嫴曣8IY?ҿo줫fऒ}\\S\"ᦨ뵼#nDX": { - "♘k6?଱癫d68?㽚乳䬳-V顷\u0005蝕?\u0018䞊V{邾zじl]雏k臤~ൖH뒐iꢥ]g?.G碄懺䔛pR$䅒X觨l봜A刊8R梒',}u邩퉕?;91Ea䈈믁G⊶芔h袪&廣㺄j;㡏綽\u001bN頸쳘橆": -2272208444812560733, - "拑Wﵚj鵼駳Oࣿ)#㾅顂N傓纝y僱栜'Bꐍ-!KF*ꭇK¦?䈴^:啤wG逭w᧯": "xᣱmYe1ۏ@霄F$ě꧘푫O䤕퀐Pq52憬ꀜ兴㑗ᡚ?L鷝ퟐ뭐zJꑙ}╆ᅨJB]\"袌㺲u8䯆f", - "꿽၅㔂긱Ǧ?SI": -1669030251960539193, - "쇝ɨ`!葎>瞺瘡驷錶❤ﻮ酜=": -6961311505642101651, - "?f7♄꫄Jᡔ훮e읇퍾፣䭴KhखT;Qty}O\\|뫁IῒNe(5惁ꥶㆷY9ﮡ\\ oy⭖-䆩婁m#x봉>Y鈕E疣s驇↙ᙰm<": {"퉻:dꂁ&efᅫ쫢[\"돈늖꺙|Ô剐1͖-K:ʚ᭕/;쏖㷛]I痐职4gZ4⍜kเꛘZ⥺\\Bʫᇩ鄨魢弞&幟ᓮ2̊盜", - -9006004849098116748, - -3118404930403695681, - { - "_彃Y艘-\"Xx㤩㳷瑃?%2䐡鵛o귵옔夘v*탋职&㳈챗|O钧": [ - false, - "daꧺdᗹ羞쯧H㍤鄳頳<型孒ン냆㹀f4㹰\u000f|C*ሟ鰠(O<ꨭ峹ipຠ*y೧4VQ蔔hV淬{?ᵌEfrI_", - "j;ꗣ밷邍副]ᗓ", - -4299029053086432759, - -5610837526958786727, - [ - null, - [ - -1.3958390678662759E-19, - { - "lh좈T_믝Y\"伨\u001cꔌG爔겕ꫳ晚踍⿻읐T䯎]~e#฽燇\"5hٔ嶰`泯r;ᗜ쮪Q):/t筑,榄&5懶뎫狝(": [{ - "2ፁⓛ]r3C攟וּ9賵s⛔6'ஂ|\"ⵈ鶆䐹禝3\"痰ࢤ霏䵩옆䌀?栕r7O簂Isd?K᫜`^讶}z8?z얰T:X倫⨎ꑹ": -6731128077618251511, - "|︦僰~m漿햭\\Y1'Vvخ굇ቍ챢c趖": [null] - }], - "虌魿閆5⛔煊뎰㞤ᗴꥰF䮥蘦䂪樳-K᝷-(^\u20dd_": 2.11318679791770592E17 - } - ] - ] - ]}, - "묗E䀳㧯᳀逞GMc\b墹㓄끖Ơ&U??펌鑍 媋k))ᄊ": null, - "묥7콽벼諌J_DɯﮪM殴䣏,煚ྼ`Y:씧<\/⩫%yf䦀!1Ჶk춎Q米W∠WC跉鬽*ᛱi㴕L꘻ꀏ쓪\"_g鿄'#t⽙?,Wg㥖|D鑆e⥏쪸僬h鯔咼ඡ;4TK聎졠嫞" - } - ] - ] - } - ] - ] - ]}} - } - ]} - }, - "뿋뀾淣截䔲踀&XJ펖꙯^Xb訅ꫥgᬐ>棟S\"혧騾밫겁7-": "擹8C憎W\"쵮yR뢩浗絆䠣簿9䏈引Wcy䤶孖ꯥ;퐌]輩䍐3@{叝 뽸0ᡈ쵡Ⲇ\u001dL匁꧐2F~ݕ㪂@W^靽L襒ᦘ~沦zZ棸!꒲栬R" - } - ] - ], - "Z:덃൛5Iz찇䅄駠㭧蓡K1": "e8᧤좱U%?ⵇ䯿鿝\u0013縮R∱骒EO\u000fg?幤@֗퉙vU`", - "䐃쪈埽້=Ij,쭗쓇చ": false - }]}} - ] - } - ]} - } - ] - ] - ], - "咰긖VM]᝼6䓑쇎琺etDҌ?㞏ꩄ퇫밉gj8蠃\"⩐5䛹1ࣚ㵪": "ക蹊?⎲⧘⾚̀I#\"䈈⦞돷`wo窭戕෱휾䃼)앷嵃꾞稧,Ⴆ윧9S?೗EMk3Მ3+e{⹔Te驨7䵒?타Ulg悳o43" - } - ], - "zQᤚ纂땺6#ٽ﹧v￿#ࠫ휊冟蹧텈ꃊʆ?&a䥯De潝|쿓pt瓞㭻啹^盚2Ꝋf醪,얏T窧\\Di䕎谄nn父ꋊE": -2914269627845628872, - "䉩跐|㨻ᷢ㝉B{蓧瞸`I!℄욃힕#ೲᙾ竛ᔺCjk췒늕貭词\u0017署?W딚%(pꍁ⤼띳^=on뺲l䆼bzrﳨ[&j狸䠠=ᜑꦦ\u2061յnj=牲攑)M\\龏": false, - "뎕y絬᫡⥮Ϙᯑ㌔/NF*˓.,QEzvK!Iwz?|쥾\"ꩻL꼗Bꔧ賴緜s뉣隤茛>ロ?(?^`>冺飒=噸泥⺭Ᲊ婓鎔븜z^坷裮êⓅ໗jM7ﶕ找\\O": 1.376745434746303E-19 - }, - "䐛r滖w㏤,|Nዜ": false - } - ]], - "@꿙?薕尬 gd晆(띄5躕ﻫS蔺4)떒錸瓍?~": 1665108992286702624, - "w믍nᏠ=`঺ᅥC>'從됐槷䤝眷螄㎻揰扰XᅧC贽uჍ낟jKD03T!lDV쀉Ӊy뢖,袛!终캨G?鉮Q)⑗1쾅庅O4ꁉH7?d\u0010蠈줘월ސ粯Q!낇껉6텝|{": null, - "~˷jg쿤촖쉯y": -5.5527605669177098E18, - "펅Wᶺzꐆと푭e?4j仪열[D<鈑皶婆䵽ehS?袪;HꍨM뗎ば[(嗏M3q퍟g4y╸鰧茀[Bi盤~﫝唎鋆彺⦊q?B4쉓癚O洙킋툈䶯_?ퟲ": null - } - ] - ]] - ]], - "꟱Ԕ㍤7曁聯ಃ錐V䷰?v㪃૦~K\"$%请|ꇹn\"k䫛㏨鲨\u2023䄢\u0004[︊VJ?䶟ាꮈ䗱=깘U빩": -4863152493797013264 - } - ]}]} - ] - }}} - ], - "쏷쐲۹퉃~aE唙a챑,9㮹gLHd'䔏|킗㍞䎥&KZYT맵7䥺Nⱳ同莞鿧w\\༌疣n/+ꎥU\"封랾○ퟙAJᭌ?9䛝$?驔9讐짘魡T֯c藳`虉C읇쐦T" - } - ], - "谶개gTR￐>ၵ͚dt晑䉇陏滺}9㉸P漄": -3350307268584339381 - }] - ] - ] - ]] - ] - ], - "0y꟭馋X뱔瑇:䌚￐廿jg-懲鸭䷭垤㒬茭u賚찶ಽ+\\mT땱\u20821殑㐄J쩩䭛ꬿNS潔*d\\X,壠뒦e殟%LxG9:摸": 3737064585881894882, - "풵O^-⧧ⅶvѪ8廸鉵㈉ר↝Q㿴뺟EႳvNM:磇>w/៻唎뷭୥!냹D䯙i뵱貁C#⼉NH6`柴ʗ#\\!2䂗Ⱨf?諳.P덈-返I꘶6?8ꐘ": -8934657287877777844, - "溎-蘍寃i诖ര\"汵\"\ftl,?d⼡쾪⺋h匱[,෩I8MҧF{k瓿PA'橸ꩯ綷퉲翓": null - } - ] - ], - "ោ係؁<元": 1.7926963090826924E-18 - }}] - } - ] - ]]}] - }] - ] - ] - ] - ], - "ጩV<\"ڸsOᤘ": 2.0527167903723048E-19 - }] - ]} - ] - ]], - "∳㙰3젴p᧗䱙?`yZA8Ez0,^ᙛ4_0븢\u001ft:~䎼s.bb룦明yNP8弆C偯;⪾짍'蕴뮛": -6976654157771105701, - "큵ꦀ\\㇑:nv+뒤燻䀪ﴣ﷍9ᚈ኷K㚊誦撪䚛,ꮪxሲ쳊\u0005HSf?asg昱dqꬌVꙇ㼺'k*'㈈": -5.937042203633044E-20 - } - ] - }], - "?}\u20e0],s嶳菋@#2u쒴sQS䩗=ꥮ;烌,|ꘔ䘆": "ᅩ영N璠kZ먕眻?2ቲ芋眑D륟渂⸑ﴃIRE]啗`K'" - }}, - "쨀jmV賂ﰊ姐䂦玞㬙ᏪM᪟Վ씜~`uOn*ॠ8\u000ef6??\\@/?9見d筜ﳋB|S䝬葫㽁o": true - }, - "즛ꄤ酳艚␂㺘봿㎨iG৕ࡿ?1\"䘓您\u001fSኝ⺿溏zៀ뻤B\u0019?윐a䳵᭱䉺膷d:<\/": 3935553551038864272 - } - ] - ]} - ]] - ]] - ]} - } - ] - } - ]]}}, - "᥺3h↛!ꋰy\"攜(ெl䪕oUkc1A㘞ᡲ촾ᣫ<\/䒌E㛝潨i{v?W౾H\\RჅpz蝬R脾;v:碽✘↯삞鷱o㸧瑠jcmK7㶧뾥찲n": true, - "ⶸ?x䊺⬝-䰅≁!e쩆2ꎿ准G踌XXᩯ1߁}0?.헀Z馟;稄\baDꟹ{-寪⚈ꉷ鮸_L7ƽᾚ<\u001bጨA䧆송뇵⨔\\礍뗔d设룱㶉cq{HyぱR㥽吢ſtp": -7985372423148569301, - "緫#콮IB6<\/=5Eh礹\t8럭@饹韠r㰛斣$甝LV췐a갵'请o0g:^": "䔨(.", - "띳℡圤pン௄ĝ倧訜B쁟G䙔\"Sb⓮;$$▏S1J뢙SF|赡g*\"Vu䲌y": "䪈&틐),\\kT鬜1풥;뷴'Zေ䩹@J鞽NぼM?坥eWb6榀ƩZڮ淽⺞삳煳xჿ絯8eⶍ羷V}ჿ쎱䄫R뱃9Z>'\u20f1ⓕ䏜齮" - } - ] - ]]] - }} - } - ] - ]}, - "펮b.h粔폯2npX詫g錰鷇㇒<쐙S値bBi@?镬矉`剔}c2壧ଭfhY깨R()痩⺃a\\⍔?M&ﯟ<劜꺄멊ᄟA\"_=": null - }, - "~潹Rqn榢㆓aR鬨侅?䜑亡V_翅㭔(䓷w劸ၳDp䀅<\/ﰎ鶊m䵱팱긽ꆘ긓准D3掱;o:_ќ)껚콥8곤d矦8nP倥ꃸI": null, - "뾎/Q㣩㫸벯➡㠦◕挮a鶧⋓偼\u00001뱓fm覞n?㛅\"": 2.8515592202045408E17 - }], - ",": -5426918750465854828, - "2櫫@0柡g䢻/gꆑ6演&D稒肩Y?艘/놘p{f투`飷ᒉ챻돎<늛䘍ﴡ줰쫄": false, - "8(鸑嵀⵹ퟡ<9㣎Tߗ┘d슒ل蘯&㠦뮮eࠍk砝g 엻": false, - "d-\u208b?0ﳮ嵙'(J`蔿d^踅⤔榥\\J⵲v7": 6.8002426206715341E17, - "ཎ耰큓ꐕ㱷\u0013y=詽I\"盈xm{0쾽倻䉚ષso#鰑/8㸴짯%ꀄ떸b츟*\\鲷礬ZQ兩?np㋄椂榨kc᡹醅3": false, - "싊j20": false - }]] - ]], - "俛\u0017n緽Tu뫉蜍鼟烬.ꭠIⰓ\"Ἀ᜾uC쎆J@古%ꛍm뻨ᾀ画蛐휃T:錖㑸ዚ9죡$": true - } - ] - ], - "㍵⇘ꦖ辈s}㱮慀밒s`\"㞟j:`i픻Z섫^諎0Ok{켿歁෣胰a2﨤[탳뚬쎼嫭뉮m": 409440660915023105, - "w墄#*ᢄ峠밮jLa`ㆪ꺊漓Lで끎!Agk'ꁛ뢃㯐岬D#㒦": false, - "ଦPGI䕺L몥罭ꃑ궩﮶#⮈ᢓӢ䚬p7웼臧%~S菠␌힀6&t䳙y㪘냏\\*;鉏ᅧ鿵'嗕pa\"oL쇿꬈Cg": "㶽1灸D⟸䴅ᆤ뉎﷛渤csx 䝔цꬃ锚捬?ຽ+x~꘩uI࡞\u0007栲5呚ẓem?袝\")=㥴䨃pac!/揎Y", - "ᷱo\\||뎂몷r篙|#X䦜I#딌媸픕叞RD斳X4t⯩夬=[뭲r=绥jh뷱츝⪘%]⚋܈㖴スH텹m(WO曝劉0~K3c柢Ր㏉着逳~": false, - "煽_qb[첑\\륌wE❽ZtCNﭝ+餌ᕜOꛭ": "{ﳾ쉌&s惧ᭁⵆ3䢫;䨞팑꒪흘褀࢖Q䠿V5뭀䎂澻%받u5텸oA⮥U㎦;B䳌wz䕙$ឿ\\௅婺돵⪾퐆\\`Kyौꋟ._\u0006L챯l뇠Hi䧈偒5", - "艊佁ࣃ롇䱠爬!*;⨣捎慓q靓|儑ᨋL+迥=6㒺딉6弄3辅J-㕎뛄듘SG㆛(\noAzQꝱ䰩X*ぢO퀌%펠낌mo틮a^<\/F&_눊ᾉ㨦ы4\"8H": 2974648459619059400, - "鬙@뎣䫳ၮ끡?){y?5K;TA*k溱䫜J汃ꂯ싔썍\u001dA}룖(<\/^,": false, - "몏@QꋦFꊩᒐ뎶lXl垨4^郣|ꮇ;䝴ᝓ}쵲z珖": null - } - ]]]], - ":_=닧弗D䙋暨鏛. 㱻붘䂍J儒&ZK/녩䪜r囁⽯D喠죥7⹌䪥c\u001a\u2076￞妈朹oLk菮F౟覛쐧㮏7T;}蛙2{9\"崓bB<\/⡷룀;즮鿹)丒툃୤뷠5W⊢嶜(fb뭳갣": "E{响1WM" - }}, - "䘨tjJ驳豨?y輊M*᳑梵瞻઻ofQG瑮e": 2.222802939724948E-19, - "䮴=❑➶T෋w䞜\"垦ꃼUt\u001dx;B$뵣䙶E↌艣ᡥ!᧟;䱀[䔯k쬃`੍8饙른熏'2_'袻tGf蒭J땟as꯳╖&啒zWࡇᒫYSᏬ\u0014ℑ첥鈤|cG~Pᓮ\">\"": "ႆl\f7V儊㦬nHꄬꨧC{쐢~C⮃⛓嶦vꄎ1w鰠嘩뿠魄&\"_qMⵖ釔녮ꝇ 㝚{糍J哋 cv?-jkﻯྌ鹑L舟r", - "龧葆yB✱H盋夔ﶉ?n*0(": "ꧣኆ㢓氥qZZ酒ຜ)鮢樛)X䣆gTSґG텞k.J圬疝롫쯭z L:\\ྤ@w炋塜쿖ᾳy뢀䶃뱝N䥨㚔勇겁#p", - "도畎Q娡\"@S/뼋:䵏!P衅촚fVHQs✜ᐫi㻑殡B䜇%믚k*U#濨낄~": "ꍟዕ쳸ꍈ敋&l妏\u0005憡멗瘌uPgᅪm<\/To쯬锩h뒓k" - } - ] - }], - "墥홞r绚<\/⸹ⰃB}<躅\\Y;๑@䔸>韫䜲뱀X뗩鿥쩗SI%ﴞ㳕䛇?<\/\u00018x\\&侂9鋙a[LR㋭W胕)⡿8㞙0JF,}?허d1cDMᐃ␛鄝ⱕ%X)!XQ": "ⳍꗳ=橇a;3t⦾꼑仈ူaᚯ⯋ꕃAs鴷N⍕_䎃ꙎAz\u0016䯷\\<࿫>8q{}キ?ᣰ}'0ᴕ펓B┦lF#趤厃T?㕊#撹圂䆲" - }, - "܋닐龫論c웑": false, - "ㇿ/q\"6-co髨휝C큦#\u001b4~?3䐹E삇<<": 7.600917488140322E-20, - "䁝E6?㣖ꃁ间t祗*鑠{ḣV(浾h逇큞=W?ૉ?nꇽ8ꅉຉj으쮺@Ꚅ㰤u]Oyr": "v≁᫸_*όAඤԆl)ۓᦇQ}폠z༏q滚", - "ソ᥊/넺I": true - }]] - ] - ] - ] - ]] - }, - "䭑Ik攑\u0002QV烄:芩.麑㟴㘨≕": true, - "坄꿕C쇻풉~崍%碼\\8\"䬦꣙": null, - "欌L圬䅘Y8c(♺2?ON}o椳s宥2䉀eJ%闹r冁O^K諭%凞⺉⡻,掜?$ꥉ?略焕찳㯊艼誜4?\"﯎<゛XፈINT:詓 +": -1.0750456770694562E-19, - "獒àc뜭싼ﺳ뎤K`]p隨LtE": null, - "甙8䵊神EIꩤ鐯ᢀ,ﵮU䝑u疒ử驺䚿≚ഋ梶秓F`覤譐#짾蔀묊4<媍쬦靪_Yzgcࡶ4k紥`kc[Lﮗ簐*I瀑[⾰L殽鑥_mGȠ<\/|囹灠g桰iri": true, - "챓ꖙꟻ좝菇ou,嗠0\\jK핻뜠qwQ?ഩ㼕3Y彦b\u009bJ榶N棨f?됦鏖綃6鳵M[OE봨u햏.Ꮁ癜蟳뽲ꩌ뻾rM豈R嗀羫 uDꎚ%": null - }, - "V傜2<": 7175127699521359521 - }], - "铫aG切<\/\"ী⊆e<^g࢛)D顝nאַ饼\u008c猪繩嵿ﱚCꡬ㻊g엺A엦\u000f暿_f꿤볝㦕桦`蒦䎔j甬%岝rj 糏": "䚢偎눴Au<4箞7礦Iﱔ坠eȧ䪸u䵁p|逹$嗫쨘ꖾ﷐!胠z寓팢^㨔|u8Nሇe텔ꅦ抷]،鹎㳁#༔繁 ", - "낂乕ꃻ볨ϱ-ꇋ㖍fs⿫)zꜦ/K?솞♞ꑌ宭hJ᤭瑥Fu": false, - "쟰ぜ魛G\u0003u?`㾕ℾ㣭5螠烶這趩ꖢ:@咕ꐶx뒘느m䰨b痃렐0鳊喵熬딃$摉_~7*ⱦ녯1錾GKhJ惎秴6'H妈Tᧅ窹㺒疄矤铟wላ": null, - "쯆q4!3錕㲏ⵆ㇛꘷Z瑩뭆\\◪NH\u001d\\㽰U~㯶<\"쑣낞3ᵤ'峉eꢬ;鬹o꣒木X*長PXᘱu\"䠹n惞": null, - "ᅸ祊\"&ꥴCjࢼ﴿?䡉`U效5殼㮞V昽ꏪ#ﺸ\\&t6x꠹盥꣰a[\u001aꪍSpe鎿蠹": -1.1564713893659811E-19 - } - ]] - ] - ] - ], - "羵䥳H,6ⱎ겾|@t\"#햊1|稃 섭)띜=뻔ꡜ???櫎~*ῡ꫌/繣ﻠq": null - } - ]} - ]}, - "츤": false - }}, - "s": 3.7339341963399598E18 - } - ], - "N,I?1+㢓|ࣱ嶃쩥V2\u0012(4EE虪朶$|w颇v步": "~읢~_,Mzr㐫YB溓E淚\"ⅹ䈔ᏺ抙 b,nt5V㐒J檶ꏨ⻔?", - "Q껑ꡡ}$넎qH煔惍/ez^!ẳF댙䝌馻剁8": "梲;yt钰$i冄}AL%a j뜐奷걳뚾d꿽*ሬuDY3?뮟鼯뮟w㍪틱V", - "o{Q/K O胟㍏zUdꀐm&⨺J舕⾏魸訟㌥[T籨櫉唐킝 aṭ뱫촙莛>碶覆⧬짙쭰ׯdAiH໥벤퐥_恸[ 0e:죃TC弼荎뵁DA:w唵ꣁ": null, - "὏樎䵮軧|?౗aWH쩃1 ꅭsu": null - } - ] - }, - "勂\\&m鰈J釮=Ⲽ鳋+䂡郑": null, - "殣b綊倶5㥗惢⳷萢ᑀ䬄镧M^ﱴ3⣢翣n櫻1㨵}ኯ뗙顖Z.Q➷ꮨ뗇\u0004": "ꔙ䁼>n^[GीA䨟AM琢ᒊS쨲w?d㶣젊嘶纝麓+愣a%気ྞSc됓ᔘ:8bM7Xd8㶑臌]Ꙥ0ꐭ쒙䫣挵C薽Dfⵃ떼᷸", - "?紡.셪_෨j\u0013Ox┠$Xᶨ-ᅇo薹-}軫;y毝㪜K㣁?.EV쮱4둽⛻䤜'2盡\u001f60(|e쐰㼎ᦀ㒧-$l@ﻑ坳\u0003䭱响巗WFo5c㧆T턁Y맸♤(": -2.50917882560589088E17 - }} - ], - "侸\\릩.᳠뎠狣살cs项䭩畳H1s瀉븇19?.w骴崖㤊h痠볭㞳㞳䁮Ql怠㦵": "@䟴-=7f", - "鹟1x௢+d ;vi䭴FSDS\u0004hꎹ㚍?⒍⦏ў6u,扩@됷Su)Pag휛TᒗV痩!瞏釀ꖞ蘥&ೞ蘐ꭰꞇᝎ": "ah懱Ժ&\u20f7䵅♎඀䞧鿪굛ౕ湚粎蚵ᯋ幌YOE)५襦㊝Y*^\"R+ඈ咷蝶9ꥂ榨艦멎헦閝돶v좛咊E)K㓷ྭr", - "搆q쮦4綱켙셁.f4<\/g<籽늷?#蚴픘:fF\u00051㹉뀭.ᰖ풎f֦Hv蔎㧤.!䭽=鞽]음H:?\"-4": 8.740133984938656E-20 - }]} - } - ], - "tVKn딩꘥⊾蹓᤹{\u0003lR꼽ᄲQFᅏ傅ﱋ猢⤊ᔁ,E㓒秤nTතv`♛I\u0000]꫔ṞD\"麵c踝杰X&濿또꣹깳౥葂鿎\\aꡨ?": 3900062609292104525 - } - ], - "ਉ샒⊩Lu@S䧰^g": -1.1487677090371648E18, - "⎢k⑊꬗yᏫ7^err糎Dt\u000bJ礯확ㆍ沑サꋽe赔㝢^J\u0004笲㿋idra剰-᪉C錇/Ĝ䂾ညS지?~콮gR敉⬹'䧭": 1901472137232418266, - "灗k䶥:?촽贍쓉꓈㒸g獘[뵎\\胕?\u0014_榙p.j稶,$`糉妋0>Fᡰly㘽$?": "]ꙛO赎&#㠃돱剳\"<◆>0誉齐_|z|裵씪>ᐌ㼍\"Z[琕}O?G뚇諦cs⠜撺5cu痑U圲\u001c?鴴計l춥/╓哼䄗茏ꮅ뫈댽A돌롖뤫V窗讬sHd&\nOi;_u" - } - ], - "Uﺗ\\Y\\梷䄬~\u0002": null, - "k\"Y磓ᗔ휎@U冈<\/w컑)[": false, - "曏J蝷⌻덦\u001f㙳s꥓⍟邫P늮쥄c∬ྡྷ舆렮칤Z趣5콡넛A쳨\\뀙骫(棻.*&輛LiIfi{@EA婳KᬰTXT": -4.3088230431977587E17 - }]} - ] - ], - "곃㲧<\/dఓꂟs其ࡧ&N葶=?c㠤Ჴ'횠숄臼#\u001a~": false - } - ] - ]}] - }] - }} - ], - "2f`⽰E쵟>J笂裭!〛觬囀ۺ쟰#桊l鹛ⲋ|RA_Vx፭gE됓h﵀mfỐ|?juTU档[d⢼⺻p濚7E峿": 5613688852456817133 - }, - "濘끶g忮7㏵殬W팕Q曁 뫰)惃廊5%-蹚zYZ樭ﴷQ锘쯤崫gg": true, - "絥ᇑ⦏쒓븣爚H.㗊߄o蘵貆ꂚ(쎔O᥉ﮓ]姨Wꁓ!RMA|o퉢THx轮7M껁U즨'i뾘舯o": "跥f꜃?" - }} - ], - "鷰鹮K-9k;ﰰ?_ݦѷ-ꅣ䩨Zꥱ\"mꠟ屎/콑Y╘2&鸞脇㏢ꀇ࠺ⰼ拾喭틮L꽩bt俸墶 [l/웄\"꾦\u20d3iও-&+\u000fQ+໱뵞": -1.296494662286671E-19 - }, - "HX੹/⨇୕붷Uﮘ旧\\쾜͔3l鄈磣糂̖䟎Eᐳw橖b῀_딕hu葰窳闹вU颵|染H죶.fP䗮:j䫢\\b뎖i燕ꜚG⮠W-≚뉗l趕": "ଊ칭Oa᡺$IV㷧L\u0019脴셀붿餲햪$迳向쐯켂PqfT\" ?I屉鴼쿕@硙z^鏕㊵M}㚛T젣쓌-W⩐-g%⺵<뮱~빅╴瑿浂脬\u0005왦燲4Ⴭb|D堧 <\/oEQh", - "䘶#㥘੐캔f巋ἡAJ䢚쭈ࣨ뫒*mᇊK,ࣺAꑱ\u000bR<\/A\"1a6鵌㯀bh곿w(\"$ꘁ*rಐ趣.d࿩k/抶면䒎9W⊃9": "漩b挋Sw藎\u0000", - "畀e㨼mK꙼HglKb,\"'䤜": null - }]}] - ] - ] - }] - ]} - ] - ]} - ], - "歙>駿ꣂ숰Q`J΋方樛(d鱾뼣(뫖턭\u20f9lচ9歌8o]8윶l얶?镖G摄탗6폋폵+g:䱫홊<멀뀿/س|ꭺs걐跶稚W々c㫣⎖": "㣮蔊깚Cꓔ舊|XRf遻㆚︆'쾉췝\\&言", - "殭\"cށɨꝙ䞘:嬮e潽Y펪㳅/\"O@ࠗ겴]췖YǞ(t>R\"N?梳LD恭=n氯T豰2R諸#N}*灧4}㶊G䍣b얚": null, - "襞<\/啧 B|싞W瓇)6簭鼡艆lN쩝`|펭佡\\間邝[z릶&쭟愱ꅅ\\T᰽1鯯偐栈4̸s윜R7⒝/똽?치X": "⏊躖Cﱰ2Qẫ脐&இ?%냝悊", - ",鰧偵셣싹xᎹ힨᯳EṬH㹖9": -4604276727380542356 - } - } - ]]]], - "웺㚑xs}q䭵䪠馯8?LB犯zK'os䚛HZ\"L?셎s^㿧㴘Cv2": null - }] - ] - ] - ], - "Kd2Kv+|z": 7367845130646124107, - "ᦂⶨ?ᝢ 祂些ഷ牢㋇操\"腭䙾㖪\\(y4cE뽺ㆷ쫺ᔖ%zfۻ$ў1柦,㶢9r漢": -3.133230960444846E-20, - "琘M焀q%㢟f鸯O⣏蓑맕鯊$O噷|)z褫^㢦⠮ꚯ꫞`毕1qꢚ{ĭ䎀বώT\"뱘3G൴?^^of": null - } - ], - "a8V᯺?:ﺃ/8ꉿBq|9啓댚;*i2": null, - "cpT瀇H珰Ừpೃi鎪Rr␣숬-鹸ҩ䠚z脚цGoN8入y%趌I┽2ឪЀiJNcN)槣/▟6S숆牟\"箑X僛G殱娇葱T%杻:J諹昰qV쨰": 8331037591040855245 - }], - "G5ᩜ䄗巢껳": true - } - }, - "Ồ巢ゕ@_譙A`碫鄐㡥砄㠓(^K": "?܃B혢▦@犑ὺD~T⧁|醁;o=J牌9냚⢽㨘{4觍蚔9#$∺\u0016p囅\\3Xk阖⪚\"UzA穕롬✎➁㭒춺C㣌ဉ\"2瓑员ᅽꝶ뫍}꽚ꞇ鶂舟彺]ꍽJC蝧銉", - "␆Ě膝\"b-퉐ACR言J謈53~V튥x䜢?ꃽɄY뮩ꚜ": "K/↾e萃}]Bs⾿q룅鷦-膋?m+死^魊镲6", - "粡霦c枋AHퟁo礼Ke?qWcA趸㡔ꂏ?\u000e춂8iতᦜ婪\u0015㢼nﵿꍻ!ᐴ関\u001d5j㨻gfῩUK5Ju丝tかTI'?㓏t>⼟o a>i}ᰗ;뤕ܝ": false, - "ꄮ匴껢ꂰ涽+䜨B蛹H䛓-k蕞fu7kL谖,'涃V~챳逋穞cT\"vQ쓕ObaCRQ㓡Ⲯ?轭⫦輢墳?vA餽=h䮇킵n폲퉅喙?\"'1疬V嬗Qd灗'Lự": "6v!s믁㭟㣯獃!磸餠ቂh0C뿯봗F鷭gꖶ~コkK<ᦈTt\\跓w㭣횋钘ᆹ듡䑚W䟾X'ꅔ4FL勉Vܴ邨y)2'〚쭉⽵-鞣E,Q.?块", - "?(˧쩯@崟吋歄K": null - }, - "Gc럃녧>?2DYI鴿\\륨)澔0ᔬlx'觔7젘⤡縷螩%Sv׫묈/]↱&S h\u0006歋ᑛxi̘}ひY蔯_醨鯘煑橾8?䵎쨋z儬ꁏ*@츾:": null - } - } - } - ] - ] - ]} - }, - "HO츧G": 3.694949578823609E17, - "QC\u0012(翻曇Tf㷟bGBJ옉53\\嚇ᛎD/\u001b夾၉4\"핀@祎)쫆yD\"i먎Vn㿿V1W᨝䶀": -6150931500380982286, - "Z㓮P翸鍱鉼K䋞꘺튿⭁Y": -7704503411315138850, - "]모开ꬖP븣c霤<[3aΠ\"黁䖖䰑뮋ꤦ秽∼㑷冹T+YUt\"싳F↭䖏&鋌": -2.7231911483181824E18, - "tꎖ": -4.9517948741799555E-19, - "䋘즊.⬅IꬃۣQ챢ꄑ黐|f?C⾺|兕읯sC鬸섾整腨솷V": "旆柩l쪦sᖸMy㦅울썉瘗㎜檵9ꍂ駓ૉᚿ/u3씅徐拉[Z䞸ࡗ1ꆱ&Q풘?ǂ8\u0011BCDY2볨;鸏": null, - "幫 n煥s쁇펇 왊-$C\"衝:\u0014㣯舼.3뙗Yl⋇\"K迎멎[꽵s}9鉳UK8쐥\"掄㹖h㙈!얄સ?Ꜳ봺R伕UTD媚I䜘W鏨蔮": -4.150842714188901E-17, - "ﺯ^㄄\b죵@fྉkf颡팋Ꞧ{/Pm0V둳⻿/落韒ꊔᚬ@5螺G\\咸a谆⊪ቧ慷绖?财(鷇u錝F=r၍橢ឳn:^iᴵtD볠覅N赴": null - }] - }] - } - ] - ]} - ]}, - "謯?w厓奰T李헗聝ឍ貖o⪇弒L!캶$ᆅ": -4299324168507841322, - "뺊奉_垐浸延몏孄Z舰2i$q붿좾껇d▵餏\"v暜Ҭ섁m￴g>": -1.60911932510533427E18 - } - ] - } - ] - ]], - "퉝꺔㠦楶Pꅱ": 7517896876489142899, - "": false - } - ]}, - "是u&I狻餼|谖j\"7c됮sסּ-踳鉷`䣷쉄_A艣鳞凃*m⯾☦椿q㎭N溔铉tlㆈ^": 1.93547720203604352E18, - "kⲨ\\%vr#\u000bⒺY\\t<\/3﬌R訤='﹠8蝤Ꞵ렴曔r": false - } - ]}, - "阨{c?C\u001d~K?鎌Ԭ8烫#뙣P초遗t㭱E­돒䆺}甗[R*1!\\~h㕅᰺@<9JꏏષI䳖栭6綘걹ᅩM\"▯是∔v鬽顭⋊譬": "운ﶁK敂(欖C취پ℄爦賾" - } - }} - }], - "鷨赼鸙+\\䭣t圙ڹx᜾ČN<\/踘\"S_맶a鷺漇T彚⎲i㈥LT-xA캔$\u001cUH=a0츺l릦": "溣㣂0濕=鉵氬駘>Pꌢpb솇쬤h힊줎獪㪬CrQ矠a&脍꼬爼M茴/΅\u0017弝轼y#Ꞡc6둴=?R崏뷠麖w?" - }, - "閕ᘜ]CT)䵞l9z'xZF{:ؐI/躅匽졁:䟇AGF૸\u001cퟗ9)駬慟ꡒꆒRS״툋A<>\u0010\"ꂔ炃7g덚E৏bꅰ輤]o㱏_뷕ܘ暂\"u": "芢+U^+㢩^鱆8*1鈶鮀\u0002뺰9⬳ꪮlL䃣괟,G8\u20a8DF㉪錖0ㄤ瓶8Nଷd?眡GLc陓\\_죌V쁰ल二?c띦捱 \u0019JC\u0011b⤉zẒT볕\"绣蘨뚋cꡉkI\u001e鳴", - "ꃣI'{6u^㡃#཰Kq4逹y൒䧠䵮!㱙/n??{L풓ZET㙠퍿X2᩟綳跠葿㚙w཮x캽扳B唕S|尾}촕%N?o䪨": null, - "ⰴFjෟ셈[\u0018辷px?椯\\1<ﲻ栘ᣁ봢憠뉴p": -5263694954586507640 - } - ] - ]] - ]} - ]}] - ] - ], - "?#癘82禩鋆ꊝty?&": -1.9419029518535086E-19 - } - ] - ] - ]} - ] - ] - ], - "훊榲.|῕戄&.㚏Zꛦ2\"䢥ሆ⤢fV_摕婔?≍Fji冀탆꜕i㏬_ẑKᅢ꫄蔻XWc|饡Siẘ^㲦?羡2ぴ1縁ᙅ?쐉Ou": false - }]] - ]}}}, - "慂뗄卓蓔ᐓ匐嚖/颹蘯/翻ㆼL?뇊,텵<\\獷ごCボ": null - }, - "p溉ᑟi짣z:䒤棇r^٫%G9缑r砌롧.물农g?0׼ሩ4ƸO㣥㯄쩞ጩ": null, - "껎繥YxK\"F젷쨹뤤1wq轫o?鱑뜀瘊?뎃h灑\\ꛣ}K峐^ኖ⤐林ꉓhy": null - } - ], - "᱀n肓ㄛ\"堻2>m殮'1橌%Ꞵ군=Ӳ鯨9耛<\/n據0u彘8㬇៩f᏿诙]嚊": "䋯쪦S럶匏ㅛ#)O`ሀX_鐪渲⛀㨻宅闩➈ꢙஶDR⪍" - }, - "tA썓龇 ⋥bj왎录r땽✒롰;羋^\\?툳*┎?썀ma䵳넅U䳆૘〹䆀LQ0\b疀U~u$M}(鵸g⳾i抦뛹?䤈땚검.鹆?ꩡtⶥGĒ;!ቹHS峻B츪켏f5≺": 2366175040075384032, - "전pJjleb]ួ": -7.5418493141528422E18, - "n.鎖ጲ\n?,$䪘": true - }, - "欈Ar㉣螵᪚茩?O)": null - }, - "쫸M#x}D秱欐K=侫们丐.KꕾxẠ\u001e㿯䣛F܍캗qq8꟞ṢFD훎⵳簕꭛^鳜\u205c٫~⑟~冫ऊ2쫰<\/戲윱o<\"": true - }, - "㷝聥/T뱂\u0010锕|内䞇x侁≦㭖:M?iM᣿IJe煜dG࣯尃⚩gPt*辂.{磼럾䝪@a\\袛?}ᓺB珼": true - } - } - ]]}]}}, - "tn\"6ꫤ샾䄄;銞^%VBPwu묪`Y僑N.↺Ws?3C⤻9唩S䠮ᐴm;sᇷ냞඘B/;툥B?lB∤)G+O9m裢0kC햪䪤": -4.5941249382502277E18, - "ᚔt'\\愫?鵀@\\びꂕP큠<<]煹G-b!S?\nꖽ鼫,ݛ&頺y踦?E揆릱H}햧캡b@手.p탻>췽㣬ꒅ`qe佭P>ᓂ&?u}毚ᜉ蟶頳졪ᎏzl2wO": -2.53561440423275936E17 - }]} - } - ] - ]], - "潈촒⿂叡": 5495738871964062986 - } - ]] - } - ] - ]} - ]] - ]] - ]} - ] - ]}, - "ႁq킍蓅R`謈蟐ᦏ儂槐僻ﹶ9婌櫞釈~\"%匹躾ɢ뤥>࢟瀴愅?殕节/냔O✬H鲽엢?ᮈੁ⋧d␽㫐zCe*": 2.15062231586689536E17, - "㶵Ui曚珰鋪ᾼ臧P{䍏䷪쨑̟A뼿T渠誈䏚D1!잶<\/㡍7?)2l≣穷᛾稝{:;㡹nemיּ訊`G": null, - "䀕\"飕辭p圁f#뫆䶷뛮;⛴ᩍ3灚덏ᰝ쎓⦷詵%᜖Մfs⇫(\u001e~P|ﭗCⲾផv湟W첋(텪બT<บSꏉ੗⋲X婵i ӵ⇮?L䬇|ꈏ?졸": 1.548341247351782E-19 - } - ] - }, - "t;:N\u0015q鐦Rt缆{ꮐC?஛㷱敪\\+鲊㉫㓪몗릙竏(氵kYS": "XᰂT?൮ô", - "碕飦幑|+ 㚦鏶`镥ꁩ B<\/加륙": -4314053432419755959, - "秌孳(p!G?V傫%8ሽ8w;5鲗㦙LI檸\u2098": "zG N볞䆭鎍흘\\ONK3횙<\/樚立圌Q튅k쩎Ff쁋aׂJK銆ઘ즐狩6༥✙䩜篥CzP(聻駇HHퟲ讃%,ά{렍p而刲vy䦅ክ^톺M楒鍢㹳]Mdg2>䤉洞", - "踛M젧>忔芿㌜Zk": 2215369545966507819, - "씐A`$槭頰퍻^U覒\bG毲aᣴU;8!팲f꜇E⸃_卵{嫏羃X쀳C7뗮m(嚼u N܁谟D劯9]#": true, - "ﻩ!뵸-筚P᭛}ἰ履lPh?౮ⶹꆛ穉뎃g萑㑓溢CX뾇G㖬A錟]RKaꄘ]Yo+@䘁's섎襠$^홰}F": null - }, - "粘ꪒ4HXᕘ蹵.$區\r\u001d묁77pPc^y笲Q<\/ꖶ 訍䃍ᨕG?*": 1.73773035935040224E17 - }, - "婅拳?bkU;#D矠❴vVN쩆t㜷A풃갮娪a%鮏絪3dAv룒#tm쑬⌛qYwc4|L8KZ;xU⓭㳔밆拓EZ7襨eD|隰ऌ䧼u9Ԣ+]贴P荿": 2.9628516456987075E18 - }]}}] - ]} - }} - ]}] - ], - "|g翉F*湹̶\u0005⏐1脉̀eI쩓ᖂ㫱0碞l䴨ꑅ㵽7AtἈ턧yq䳥塑:z:遀ᄐX눔擉)`N3昛oQ셖y-ڨ⾶恢ꈵq^<\/": null, - "菹\\랓G^璬x৴뭸ゆUS겧﮷Bꮤ ┉銜᯻0%N7}~f洋坄Xꔼ<\/4妟Vꄟ9:౟곡t킅冩䧉笭裟炂4봋ⱳ叺怊t+怯涗\"0㖈Hq": false, - "졬믟'ﺇফ圪쓬멤m邸QLব䗁愍4jvs翙 ྍ꧀艳H-|": null, - "컮襱⣱뗠 R毪/鹙꾀%헳8&": -5770986448525107020 - } - ], - "B䔚bꐻ뙏姓展槰T-똌鷺tc灿᫽^㓟䏀o3o$꘭趙萬I顩)뇭Ἑ䓝\f@{ᣨ`x3蔛": null - } - ] - ] - }], - "⦖扚vWꃱ꥙㾠壢輓{-⎳鹷贏璿䜑bG倛⋐磎c皇皩7a~ﳫU╣Q࠭ꎉS摅姽OW.홌ೞ.": null, - "蚪eVlH献r}ᮏ믠ﰩꔄ@瑄ⲱ": null, - "퀭$JWoꩢg역쁍䖔㑺h&ୢtXX愰㱇?㾫I_6 OaB瑈q裿": null, - "꽦ﲼLyr纛Zdu珍B絟쬴糔?㕂짹䏵e": "ḱ\u2009cX9멀i䶛簆㳀k" - } - ]]]], - "(_ꏮg່澮?ᩑyM<艷\u001aꪽ\\庼뙭Z맷㰩Vm\\lY筺]3㋲2㌩㄀Eਟ䝵⨄쐨ᔟgङHn鐖⤇놋瓇Q탚單oY\"♆臾jHᶈ征ቄ??uㇰA?#1侓": null - }, - "觓^~ሢ&iI띆g륎ḱ캀.ᓡꀮ胙鈉": 1.0664523593012836E-19, - "y詭Gbᔶऽs댁U:杜⤎ϲ쁗⮼D醄诿q뙰I#즧v蔎xHᵿt᡽[**?崮耖p缫쿃L菝,봬ꤦC쯵#=X1瞻@OZc鱗CQTx": null - } - ] - }}], - "剘紁\u0004\\Xn⊠6,တױ;嵣崇}讃iႽ)d1\\䔓": null - }, - "脨z\"{X,1u찜<'k&@?1}Yn$\u0015Rd輲ーa쮂굄+B$l": true, - "諳>*쭮괐䵟Ґ+<箁}빀䅱⡔檏臒hIH脟ꩪC핝ଗP좕\"0i<\/C褻D۞恗+^5?'ꂱ䚫^7}㡠cq6\\쨪ꔞꥢ?纖䫀氮蒫侲빦敶q{A煲G": -6880961710038544266 - }}] - }, - "5s⨲JvಽῶꭂᄢI.a৊": null, - "?1q꽏쿻ꛋDR%U娝>DgN乭G": -1.2105047302732358E-19 - } - ] - ]}, - "qZz`撋뙹둣j碇쁏\\ꆥ\u0018@藴疰Wz)O{F䶛l᷂绘訥$]뮍夻䢋䩇萿獰樧猵⣭j萶q)$꬚⵷0馢W:Ⱍ!Qoe": -1666634370862219540, - "t": "=wp|~碎Q鬳Ӎ\\l-<\/^ﳊhn퐖}䍔t碵ḛ혷?靻䊗", - "邙쇡㯇%#=,E4勃驆V繚q[Y댻XV㡸[逹ᰏ葢B@u=JS5?bLRn얮㍉⏅ﰳ?a6[&큟!藈": 1.2722786745736667E-19 - }, - "X블땨4{ph鵋ꉯ웸 5p簂䦭s_E徔濧d稝~No穔噕뽲)뉈c5M윅>⚋[岦䲟懷恁?鎐꓆ฬ爋獠䜔s{\u001bm鐚儸煛%bﯿXT>ꗘ@8G": 1157841540507770724, - "媤娪Q杸\u0011SAyᡈ쿯": true, - "灚^ಸ%걁<\/蛯?\"祴坓\\\\'흍": -3.4614808555942579E18, - "釴U:O湛㴑䀣렑縓\ta)(j:숾却䗌gCiB뽬Oyuq輥厁/7)?今hY︺Q": null - } - ] - ]]]}] - ], - "I笔趠Ph!<ཛྷ㸞诘X$畉F\u0005笷菟.Esr릙!W☆䲖뗷莾뒭U\"䀸犜Uo3Gꯌx4r蔇᡹㧪쨢準<䂀%ࡡꟼ瑍8炝Xs0䀝销?fi쥱ꆝલBB": -8571484181158525797, - "L⦁o#J|\"⽩-㱢d㌛8d\\㶤傩儻E[Y熯)r噤὘勇 }": "e(濨쓌K䧚僒㘍蠤Vᛸ\"络QJL2,嬓왍伢㋒䴿考澰@(㏾`kX$끑эE斡,蜍&~y", - "vj.|统圪ᵮPL?2oŶ`밧\"勃+0ue%⿥绬췈체$6:qa렐Q;~晘3㙘鹑": true, - "ශؙ4獄⶿c︋i⚅:ん閝Ⳙ苆籦kw{䙞셕pC췃ꍬ␜꟯ꚓ酄b힝hwk꭭M鬋8B耳쑘WQ\\偙ac'唀x᪌\u2048*h짎#ፇ鮠뾏ឿ뀌": false, - "⎀jꄒ牺3Ⓝ컴~?親ꕽぼܓ喏瘘!@<튋㐌꿱⩦{a?Yv%⪧笯Uܱ栅E搚i뚬:ꄃx7䙳ꦋ&䓹vq☶I䁘ᾘ涜\\썉뺌Lr%Bc㍜3?ꝭ砿裞]": null, - "⭤뙓z(㡂%亳K䌽꫿AԾ岺㦦㼴輞낚Vꦴw냟鬓㹈뽈+o3譻K1잞": 2091209026076965894, - "ㇲ\t⋇轑ꠤ룫X긒\"zoY읇희wj梐쐑l侸`e%s": -9.9240075473576563E17, - "啸ꮑ㉰!ᚓ}銏": -4.0694813896301194E18, - ">]囋੽EK뇜>_ꀣ緳碖{쐐裔[<ನ\"䇅\"5L?#xTwv#罐\u0005래t应\\N?빗;": "v쮽瞭p뭃" - } - ]], - "斴槾?Z翁\"~慍弞ﻆ=꜡o5鐋dw\"?K蠡i샾ogDﲰ_C*⬟iㇷ4nય蟏[㟉U꽌娛苸 ঢ়操贻洞펻)쿗૊許X⨪VY츚Z䍾㶭~튃ᵦ<\/E臭tve猑x嚢": null, - "锡⛩<\/칥ꈙᬙ蝀&Ꚑ籬■865?_>L詏쿨䈌浿弥爫̫lj&zx<\/C쉾?覯n?": null, - "꾳鑤/꼩d=ᘈn挫ᑩ䰬ZC": "3錢爋6Ƹ䴗v⪿Wr益G韠[\u0010屗9쁡钁u?殢c䳀蓃樄욂NAq赟c튒瘁렶Aૡɚ捍" - } - ] - ] - ]} - ] - ] - }]]]}} - ]}], - "Ej䗳U<\/Q=灒샎䞦,堰頠@褙g_\u0003ꤾfⶽ?퇋!łB〙ד3CC䌴鈌U:뭔咎(Qો臃䡬荋BO7㢝䟸\"Yb": 2.36010731779814E-20, - "逸'0岔j\u000e눘먷翌C츊秦=ꭣ棭ှ;鳸=麱$XP⩉駚橄A\\좱⛌jqv䰞3Ь踌v㳆¹gT┌gvLB賖烡m?@E঳i": null - }, - "曺v찘ׁ?&绫O័": 9107241066550187880 - } - ] - ], - "(e屄\u0019昜훕琖b蓘ᬄ0/۲묇Z蘮ဏ⨏蛘胯뢃@㘉8ሪWᨮ⦬ᅳ䅴HI၇쨳z囕陻엣1赳o": true, - ",b刈Z,ၠ晐T솝ŕB⩆ou'퐼≃绗雗d譊": null, - "a唥KB\"ﳝ肕$u\n^⅄P䟼냉䞸⩪u윗瀱ꔨ#yşs꒬=1|ﲤ爢`t౐튼쳫_Az(Ṋ擬㦷좕耈6": 2099309172767331582, - "?㴸U<\/䢔ꯡ阽扆㐤q鐋?f㔫wM嬙-;UV죫嚔픞G&\"Cᗍ䪏풊Q": "VM7疹+陕枡툩窲}翡䖶8欞čsT뮐}璤:jﺋ鎴}HfA൝⧻Zd#Qu茅J髒皣Y-︴[?-~쉜v딏璮㹚䅊﩯<-#\u000e걀h\u0004u抱﵊㼃U<㱷⊱IC進" - }, - "숌dee節鏽邺p넱蹓+e罕U": true - } - ], - "b⧴룏??ᔠ3ぱ>%郿劃翐ꏬꠛW瞳᫏누躨狀ໄy੽\"ីuS=㨞馸k乆E": "トz݈^9R䬑<ﮛGRꨳ\u000fTT泠纷꽀MRᴱ纊:㠭볮?%N56%鈕1䗍䜁a䲗j陇=뿻偂衋࿘ᓸ?ᕵZ+<\/}H耢b䀁z^f$&㝒LkꢳI脚뙛u": 5.694374481577558E-20 - }] - } - ]], - "obj": {"key": "wrong value"}, - "퓲꽪m{㶩/뇿#⼢&᭙硞㪔E嚉c樱㬇1a綑᝖DḾ䝩": null - }, - "key": "6.908319653520691E8", - "z": { - "6U閆崬밺뀫颒myj츥휘:$薈mY햚#rz飏+玭V㭢뾿愴YꖚX亥ᮉ푊\u0006垡㐭룝\"厓ᔧḅ^Sqpv媫\"⤽걒\"˽Ἆ?ꇆ䬔未tv{DV鯀Tἆl凸g\\㈭ĭ즿UH㽤": null, - "b茤z\\.N": [[ - "ZL:ᅣዎ*Y|猫劁櫕荾Oj为1糕쪥泏S룂w࡛Ᏺ⸥蚙)", - { - "\"䬰ỐwD捾V`邀⠕VD㺝sH6[칑.:醥葹*뻵倻aD\"": true, - "e浱up蔽Cr෠JK軵xCʨ<뜡癙Y獩ケ齈X/螗唻?<蘡+뷄㩤쳖3偑犾&\\첊xz坍崦ݻ鍴\"嵥B3㰃詤豺嚼aqJ⑆∥韼@\u000b㢊\u0015L臯.샥": false, - "l?Ǩ喳e6㔡$M꼄I,(3᝝縢,䊀疅뉲B㴔傳䂴\u0088㮰钘ꜵ!ᅛ韽>": -5514085325291784739, - "o㮚?\"춛㵉<\/﬊ࠃ䃪䝣wp6ἀ䱄[s*S嬈貒pᛥ㰉'돀": [{ - "(QP윤懊FI<ꃣ『䕷[\"珒嶮?%Ḭ壍಻䇟0荤!藲끹bd浶tl\u2049#쯀@僞": {"i妾8홫": { - ",M맃䞛K5nAㆴVN㒊햬$n꩑&ꎝ椞阫?/ṏ세뉪1x쥼㻤㪙`\"$쟒薟B煌܀쨝ଢ଼2掳7㙟鴙X婢\u0002": "Vዉ菈᧷⦌kﮞఈnz*﷜FM\"荭7ꍀ-VR<\/';䁙E9$䩉\f @s?퍪o3^衴cඎ䧪aK鼟q䆨c{䳠5mᒲՙ蘹ᮩ": { - "F㲷JGo⯍P덵x뒳p䘧☔\"+ꨲ吿JfR㔹)4n紬G练Q፞!C|": true, - "p^㫮솎oc.೚A㤠??r\u000f)⾽⌲們M2.䴘䩳:⫭胃\\፾@Fᭌ\\K": false, - "蟌Tk愙潦伩": { - "a<\/@ᾛ慂侇瘎": -7271305752851720826, - "艓藬/>၄ṯ,XW~㲆w": {"E痧郶)㜓ha朗!N赻瞉駠uC\u20ad辠x퓮⣫P1ࠫLMMX'M刼唳됤": null, - "P쓫晥%k覛ዩIUᇸ滨:噐혲lMR5䋈V梗>%幽u頖\\)쟟": null, - "eg+昉~矠䧞难\b?gQ쭷筝\\eꮠNl{ಢ哭|]Mn銌╥zꖘzⱷ⭤ᮜ^": [ - -1.30142114406914976E17, - -1.7555215491128452E-19, - null, - "渾㨝ߏ牄귛r?돌?w[⚞ӻ~廩輫㼧/", - -4.5737191805302129E18, - null, - "xy࿑M[oc셒竓Ⓔx?뜓y䊦>-D켍(&&?XKkc꩖ﺸᏋ뵞K伕6ী)딀P朁yW揙?훻魢傎EG碸9類៌g踲C⟌aEX舲:z꒸许", - 3808159498143417627, - null, - {"m試\u20df1{G8&뚈h홯J<\/": { - "3ஸ厠zs#1K7:rᥞoꅔꯧ&띇鵼鞫6跜#赿5l'8{7㕳(b/j\"厢aq籀ꏚ\u0015厼稥": [ - -2226135764510113982, - true, - null, - { - "h%'맞S싅Hs&dl슾W0j鿏MםD놯L~S-㇡R쭬%": null, - "⟓咔謡칲\u0000孺ꛭx旑檉㶆?": null, - "恇I転;￸B2Y`z\\獓w,놏濐撐埵䂄)!䶢D=ഭ㴟jyY": { - "$ࡘt厛毣ൢI芁<겿骫⫦6tr惺a": [ - 6.385779736989334E-20, - false, - true, - true, - [ - -6.891946211462334E-19, - null, - { - "]-\\Ꟑ1/薓❧Ὂ\\l牑\u0007A郃)阜ᇒᓌ-塯`W峬G}SDb㬨Q臉⮻빌O鞟톴첂B㺱<ƈmu챑J㴹㷳픷Oㆩs": { - "\"◉B\"pᶉt骔J꩸ᄇᛐi╰栛K쉷㉯鐩!㈐n칍䟅難>盥y铿e୔蒏M貹ヅ8嘋퀯䉶ጥ㏢殊뻳\"絧╿ꉑ䠥?∃蓊{}㣣Gk긔H1哵峱": false, - "6.瀫cN䇮F㧺?\\椯=ڈT䘆4␘8qv": -3.5687501019676885E-19, - "Q?yऴr혴{஀䳘p惭f1ﹸ䅷䕋贲<ྃᄊ繲hq\\b|#QSTs1c-7(䵢\u2069匏絘ꯉ:l毴汞t戀oෟᵶ뮱፣-醇Jx䙬䐁햢0࣫ᡁgrㄛ": "\u0011_xM/蘇Chv;dhA5.嗀绱V爤ﰦi뵲M", - "⏑[\"ugoy^儣횎~U\\섯겜論l2jw஌yD腅̂\u0019": true, - "ⵯɇ䐲᫿࢚!㯢l샅笶戮1꣖0Xe": null, - "劅f넀識b宁焊E찓橵G!ʱ獓뭔雩괛": [{"p⹣켙[q>燣䍃㞽ᩲx:쓤삘7玑퇼0<\/q璂ᑁ[Z\\3䅵䧳\u0011㤧|妱緒C['췓Yꞟ3Z鳱雼P錻BU씧U`ᢶg蓱>.1ӧ譫'L_5V䏵Ц": [ - false, - false, - {"22䂍盥N霂얢躰e9⑩_뵜斌n@B}$괻Yᐱ@䧋V\"☒-諯cV돯ʠ": true, - "Ű螧ᔼ檍鍎땒딜qꄃH뜣<獧ूCY吓⸏>XQ㵡趌o끬k픀빯a(ܵ甏끆୯/6Nᪧ}搚ᆚ짌P牰泱鈷^d꣟#L삀\"㕹襻;k㸊\\f+": true, - "쎣\",|⫝̸阊x庿k잣v庅$鈏괎炔k쬪O_": [ - "잩AzZGz3v愠ꉈⵎ?㊱}S尳௏p\r2>췝IP䘈M)w|\u000eE", - -9222726055990423201, - null, - [ - false, - {"´킮'뮤쯽Wx讐V,6ᩪ1紲aႈ\u205czD": [ - -930994432421097536, - 3157232031581030121, - "l貚PY䃛5@䭄귻m㎮琸f": 1.0318894506812084E-19, - "࢜⩢Ш䧔1肽씮+༎ᣰ闺馺窃䕨8Mƶq腽xc(៯夐J5굄䕁Qj_훨/~価.䢵慯틠퇱豠㼇Qﵘ$DuSp(8Uญ<\/ಟ룴𥳐ݩ$": 8350772684161555590, - "ㆎQ䄾\u001bpᩭ${[諟^^骴᤮b^ㅥI┧T㉇⾞\"绦r䰂f矩'-7䡭桥Dz兔V9谶居㺍ᔊ䩯덲.\u001eL0ὅㅷ釣": [{ - "<쯬J卷^숞u࠯䌗艞R9닪g㐾볎a䂈歖意:%鐔|ﵤ|y}>;2,覂⶚啵tb*仛8乒㓶B࿠㯉戩oX 貘5V嗆렽낁߼4h䧛ꍺM空\\b꿋貼": 8478577078537189402, - "VD*|吝z~h譺aᯒ": { - "YI췢K<\/濳xNne玗rJo쾘3핰鴊\"↱AR:ࢷ\"9?\"臁說)?誚ꊏe)_D翾W?&F6J@뺾ꍰNZ醊Z쾈വH嶿?炫㷱鬰M겈᭨b,⻁鈵P䕡䀠८ⱄ홎鄣": { - "@?k2鶖㋮\"Oರ K㨇廪儲\u0017䍾J?);\b*묀㗠섳햭1MC V": null, - "UIICP!BUA`ᢈ㋸~袩㗪⾒=fB﮴l1ꡛ죘R辂여ҳ7쮡<䩲`熕8頁": 4481809488267626463, - "Y?+8먙ᚔ鋳蜩럶1㥔y璜౩`": [ - null, - 1.2850335807501874E-19, - "~V2", - 2035406654801997866, - { - "<숻1>\"": -8062468865199390827, - "M㿣E]}qwG莎Gn᝶(ꔙ\\D⬲iꇲs寢t駇S뀡ꢜ": false, - "pꝤ㎏9W%>M;-U璏f(^j1?&RB隧 忓b똊E": "#G?C8.躬ꥯ'?냪#< 渟&헿란zpo왓Kj}鷧XﻘMツb䕖;㪻", - "vE풤幉xz뱕쫥Ug㦲aH} ᣟp:鬼YᰟH3镔ᴚ斦\\鏑r*2橱G⼔F/.j": true, - "RK좬뎂a홠f*f㱉ᮍ⦋潙㨋Gu곌SGI3I뿐\\F',)t`荁蘯囯ﮉ裲뇟쥼_ገ驪▵撏ᕤV": 1.52738225997956557E18, - "^k굲䪿꠹B逤%F㱢漥O披M㽯镞竇霒i꼂焅륓\u00059=皫之눃\u2047娤閍銤唫ၕb<\/w踲䔼u솆맚,䝒ᝳ'/it": "B餹饴is権ꖪ怯ꦂẉဎt\"!凢谵⧿0\\<=(uL䷍刨쑪>俆揓Cy襸Q힆䆭涷<\/ᐱ0ɧ䗾䚹\\ኜ?ꄢᇘ`䴢{囇}᠈䴥X4퓪檄]ꥷ/3謒ሴn+g騍X", - "GgG꽬[(嫓몍6\u0004궍宩㙻/>\u0011^辍dT腪hxǑ%ꊇk,8(W⧂結P鬜O": [{ - "M㴾c>\\ᓲ\u0019V{>ꤩ혙넪㭪躂TS-痴໸闓⍵/徯O.M㏥ʷD囎⧔쁳휤T??鉬뇙=#ꢫ숣BX䭼<\/d똬졬g榿)eꨋﯪ좇첻\u001a\u0011\";~쓆BH4坋攊7힪", - "iT:L闞椕윚*滛gI≀Wਟඊ'ꢆ縺뱹鮚Nꩁ᧬蕼21줧\\䋯``⍐\\㏱鳨": 1927052677739832894, - "쮁缦腃g]礿Y㬙 fヺSɪ꾾N㞈": [ - null, - null, - { - "!t,灝Y 1䗉罵?c饃호䉂Cᐭ쒘z(즽sZG㬣sഖE4뢜㓕䏞丮Qp簍6EZឪ겛fx'ꩱQ0罣i{k锩*㤴㯞r迎jTⲤ渔m炅肳": [ - -3.3325685522591933E18, - [{"㓁5]A䢕1룥BC?Ꙍ`r룔Ⳛ䙡u伲+\u0001്o": [ - null, - 4975309147809803991, - null, - null, - {"T팘8Dﯲ稟MM☻㧚䥧/8ﻥ⥯aXLaH\"顾S☟耲ît7fS෉놁뮔/ꕼ䓈쁺4\\霶䠴ᩢ<\/t4?죵>uD5➶༆쉌럮⢀秙䘥\u20972ETR3濡恆vB? ~鸆\u0005": { - "`閖m璝㥉b뜴?Wf;?DV콜\u2020퍉౓擝宏ZMj3mJ먡-傷뱙yח㸷꥿ ໘u=M읝!5吭L4v\\?ǎ7C홫": null, - "|": false, - "~Ztᛋ䚘\\擭㗝傪W陖+㗶qᵿ蘥ᙄp%䫎)}=⠔6ᮢS湟-螾-mXH?cp": 448751162044282216, - "\u209fad놹j檋䇌ᶾ梕㉝bוּ": {"?苴ꩠD䋓帘5騱qﱖPF?☸珗顒yU ᡫcb䫎 S@㥚gꮒ쎘泴멖\\:I鮱TZ듒ᶨQ3+f7캙\"?\f풾\\o杞紟﻽M.⏎靑OP": [ - -2.6990368911551596E18, - [{"䒖@<᰿<\/⽬tTr腞&G%᳊秩蜰擻f㎳?S㵧\r*k뎾-乢겹隷j軛겷0룁鮁": {")DO0腦:춍逿:1㥨่!蛍樋2": [{ - ",ꌣf侴笾m๫ꆽ?1?U?\u0011ꌈꂇ": { - "x捗甠nVq䅦w`CD⦂惺嘴0I#vỵ} \\귂S끴D얾?Ԓj溯\"v餄a": { - "@翙c⢃趚痋i\u0015OQ⍝lq돆Y0pࢥ3쉨䜩^<8g懥0w)]䊑n洺o5쭝QL댊랖L镈Qnt⪟㒅십q헎鳒⮤眉ᔹ梠@O縠u泌ㄘb榚癸XޔFtj;iC": false, - "I&뱋゘|蓔䔕측瓯%6ᗻHW\\N1貇#?僐ᗜgh᭪o'䗈꽹Rc욏/蔳迄༝!0邔䨷푪8疩)[쭶緄㇈୧ፐ": { - "B+:ꉰ`s쾭)빼C羍A䫊pMgjdx䐝Hf9᥸W0!C樃'蘿f䫤סи\u0017Jve? 覝f둀⬣퓉Whk\"஼=չﳐ皆笁BIW虨쫓F廰饞": -642906201042308791, - "sb,XcZ<\/m㉹ ;䑷@c䵀s奤⬷7`ꘖ蕘戚?Feb#輜}p4nH⬮eKL트}": [ - "RK鳗z=袤Pf|[,u욺", - "Ẏᏻ罯뉋⺖锅젯㷻{H䰞쬙-쩓D]~\u0013O㳢gb@揶蔉|kᦂ❗!\u001ebM褐sca쨜襒y⺉룓", - null, - null, - true, - -1.650777344339075E-19, - false, - "☑lꄆs힨꤇]'uTന⌳농].1⋔괁沰\"IWഩ\u0019氜8쟇䔻;3衲恋,窌z펏喁횗?4?C넁问?ᥙ橭{稻Ⴗ_썔", - "n?]讇빽嗁}1孅9#ꭨ靶v\u0014喈)vw祔}룼쮿I", - -2.7033457331882025E18, - { - ";⚃^㱋x:饬ኡj'꧵T☽O㔬RO婎?향ᒭ搩$渣y4i;(Q>꿘e8q": "j~錘}0g;L萺*;ᕭꄮ0l潛烢5H▄쳂ꏒוֹꙶT犘≫x閦웧v", - "~揯\u2018c4職렁E~ᑅቚꈂ?nq뎤.:慹`F햘+%鉎O瀜쟏敛菮⍌浢<\/㮺紿P鳆ࠉ8I-o?#jﮨ7v3Dt赻J9": null, - "ࣝW䌈0ꍎqC逖,횅c၃swj;jJS櫍5槗OaB>D踾Y": {"㒰䵝F%?59.㍈cᕨ흕틎ḏ㋩B=9IېⓌ{:9.yw}呰ㆮ肒᎒tI㾴62\"ዃ抡C﹬B<\/촋jo朣", - [ - -7675533242647793366, - {"ᙧ呃:[㒺쳀쌡쏂H稈㢤\u001dᶗGG-{GHྻຊꡃ哸䵬;$?&d\\⥬こN圴됤挨-'ꕮ$PU%?冕눖i魁q騎Q": [ - false, - [[ - 7929823049157504248, - [[ - true, - "Z菙\u0017'eꕤ᱕l,0\\X\u001c[=雿8蠬L<\/낲긯W99g톉4ퟋb㝺\u0007劁'!麕Q궈oW:@X၎z蘻m絙璩귓죉+3柚怫tS捇蒣䝠-擶D[0=퉿8)q0ٟ", - "唉\nFA椭穒巯\\䥴䅺鿤S#b迅獘 ﶗ꬘\\?q1qN犠pX꜅^䤊⛤㢌[⬛휖岺q唻ⳡ틍\"㙙Eh@oA賑㗠y必Nꊑᗘ", - -2154220236962890773, - -3.2442003245397908E18, - "Wᄿ筠:瘫퀩?o貸q⊻(᎞KWf宛尨h^残3[U(='橄", - -7857990034281549164, - 1.44283696979059942E18, - null, - {"ꫯAw跭喀 ?_9\"Aty背F=9缉ྦྷ@;?^鞀w:uN㘢Rỏ": [ - 7.393662029337442E15, - 3564680942654233068, - [ - false, - -5253931502642112194, - "煉\\辎ೆ罍5⒭1䪁䃑s䎢:[e5}峳ﴱn騎3?腳Hyꏃ膼N潭錖,Yᝋ˜YAၓ㬠bG렣䰣:", - true, - null, - { - "⒛'P&%죮|:⫶춞": -3818336746965687085, - "钖m<\/0ݎMtF2Pk=瓰୮洽겎.": [[ - -8757574841556350607, - -3045234949333270161, - null, - { - "Ꮬr輳>⫇9hU##w@귪A\\C 鋺㘓ꖐ梒뒬묹㹻+郸嬏윤'+g<\/碴,}ꙫ>손;情d齆J䬁ຩ撛챝탹/R澡7剌tꤼ?ặ!`⏲睤\u00002똥଴⟏": null, - "\u20f2ܹe\\tAꥍư\\x当뿖렉禛;G檳ﯪS૰3~㘠#[J<}{奲 5箉⨔{놁<\/釿抋,嚠/曳m&WaOvT赋皺璑텁": [[ - false, - null, - true, - -5.7131445659795661E18, - "萭m䓪D5|3婁ఞ>蠇晼6nﴺPp禽羱DS<睓닫屚삏姿", - true, - [ - -8759747687917306831, - { - ">ⓛ\t,odKr{䘠?b퓸C嶈=DyEᙬ@ᴔ쨺芛髿UT퓻春<\/yꏸ>豚W釺N뜨^?꽴﨟5殺ᗃ翐%>퍂ဿ䄸沂Ea;A_\u0005閹殀W+窊?Ꭼd\u0013P汴G5썓揘": 4.342729067882445E-18, - "Q^즾眆@AN\u0011Kb榰냎Y#䝀ꀒᳺ'q暇睵s\"!3#I⊆畼寤@HxJ9": false, - "⿾D[)袨㇩i]웪䀤ᛰMvR<蟏㣨": {"v퇓L㪱ꖣ豛톤\\곱#kDTN": [{ - "(쾴䡣,寴ph(C\"㳶w\"憳2s馆E!n!&柄<\/0Pꈗſ?㿳Qd鵔": {"娇堰孹L錮h嵅⛤躏顒?CglN束+쨣ﺜ\\MrH": {"獞䎇둃ቲ弭팭^ꄞ踦涟XK錆쳞ឌ`;੶S炥騞ଋ褂B៎{ڒ䭷ᶼ靜pI荗虶K$": [{"◖S~躘蒉꫿輜譝Q㽙闐@ᢗ¥E榁iء5┄^B[絮跉ᰥ遙PWi3wㄾⵀDJ9!w㞣ᄎ{듒ꓓb6\\篴??c⼰鶹⟧\\鮇ꮇ": [[ - 654120831325413520, - -1.9562073916357608E-19, - { - "DC(昐衵ἡ긙갵姭|֛[t": 7.6979110359897907E18, - "J␅))嫼❳9Xfd飉j7猬ᩉ+⤻眗벎E鰉Zᄊ63zၝ69}ZᶐL崭ᦥ⡦靚⋛ꎨ~i㨃咊ꧭo䰠阀3C(": -3.5844809362512589E17, - "p꣑팱쒬ꎑ뛡Ꙩ挴恍胔&7ᔈ묒4Hd硶훐㎖zꢼ豍㿢aሃ=<\/湉鵲EӅ%$F!퍶棌孼{O駍਺geu+": ")\u001b잓kŀX쩫A밁®ڣ癦狢)扔弒p}k縕ꩋ,䃉tࣼi", - "ァF肿輸<솄G-䢹䛸ꊏl`Tqꕗ蒞a氷⸅ᴉ蠰]S/{J왲m5{9.uέ~㕚㣹u>x8U讁B덺襪盎QhVS맅킃i识{벂磄Iහ䙅xZy/抍૭Z鲁-霳V据挦ℒ": null, - "㯛|Nꐸb7ⵐb?拠O\u0014ކ?-(EꞨ4ꕷᄤYᯕOW瞺~螸\"욿ќe㺰\"'㌢ƐW\u0004瞕>0?V鷵엳": true, - "뤥G\\迋䠿[庩'꼡\u001aiᩮV쯁ᳪ䦪Ô;倱ନ뛁誈": null, - "쥹䄆䚟Q榁䎐᢭<\/2㕣p}HW蟔|䃏꿈ꚉ锳2Pb7㙑Tⅹᵅ": { - "Y?֭$>#cVBꩨ:>eL蒁務": { - "86柡0po 䏚&-捑Ћ祌<\/휃-G*㶢הּ쩍s㶟餇c걺yu꽎還5*턧簕Og婥SꝐ": null, - "a+葞h٥ࠆ裈嗫ﵢ5輙퀟ᛜ,QDﹼ⟶Y騠锪E_|x죗j侵;m蜫轘趥?븅w5+mi콛L": { - ";⯭ﱢ!买F⽍柤鶂n䵣V㫚墱2렾ELEl⣆": [ - true, - -3.6479311868339015E-18, - -7270785619461995400, - 3.334081886177621E18, - 2.581457786298155E18, - -6.605252412954115E-20, - -3.9232347037744167E-20, - { - "B6㊕.k1": null, - "ZAꄮJ鮷ᳱo갘硥鈠䠒츼": { - "ᕅ}럡}.@y陪鶁r業'援퀉x䉴ﵴl퍘):씭脴ᥞhiꃰblﲂ䡲엕8߇M㶭0燋標挝-?PCwe⾕J碻Ᾱ䬈䈥뷰憵賣뵓痬+": {"a췩v礗X⋈耓ፊf罅靮!㔽YYᣓw澍33⎔芲F|\"䜏T↮輦挑6ᓘL侘?ᅥ]덆1R௯✎餘6ꏽ<\/௨\\?q喷ꁫj~@ulq": {"嗫欆뾔Xꆹ4H㌋F嵧]ࠎ]㠖1ꞤT<$m뫏O i댳0䲝i": {"?෩?\u20cd슮|ꯆjs{?d7?eNs⢚嫥氂䡮쎱:鑵롟2hJꎒﯭ鱢3춲亄:뼣v䊭諱Yj択cVmR䩃㘬T\"N홝*ै%x^F\\_s9보zz4淗?q": [ - null, - "?", - 2941869570821073737, - "{5{殇0䝾g6밖퍋臩綹R$䖭j紋釰7sXI繳漪행y", - false, - "aH磂?뛡#惇d婅?Fe,쐘+늵䍘\"3r瘆唊勐j⳧࠴ꇓ<\/唕윈x⬌讣䋵%拗ᛆⰿ妴᝔M2㳗必꧂淲?ゥ젯檢<8끒MidX䏒3᳻Q▮佐UT|⤪봦靏⊏", - [[{ - "颉(&뜸귙{y^\"P퟉춝Ჟ䮭D顡9=?}Y誱<$b뱣RvO8cH煉@tk~4ǂ⤧⩝屋SS;J{vV#剤餓ᯅc?#a6D,s": [ - -7.8781018564821536E16, - true, - [ - -2.28770899315832371E18, - false, - -1.0863912140143876E-20, - -6282721572097446995, - 6767121921199223078, - -2545487755405567831, - false, - null, - -9065970397975641765, - [ - -5.928721243413937E-20, - {"6촊\u001a홯kB0w撨燠룉{绎6⳹!턍贑y▾鱧ժ[;7ᨷ∀*땒䪮1x霆Hᩭ☔\"r䝐7毟ᝰr惃3ꉭE+>僒澐": [ - "Ta쎩aƝt쵯ⰪVb", - [ - -5222472249213580702, - null, - -2851641861541559595, - null, - 4808804630502809099, - 5657671602244269874, - "5犲﨣4mᥣ?yf젫꾯|䋬잁$`Iⳉﴷ扳兝,'c", - false, - [ - null, - { - "DyUIN쎾M仼惀⮥裎岶泭lh扠\u001e礼.tEC癯튻@_Qd4c5S熯A<\/\6U윲蹴Q=%푫汹\\\u20614b[௒C⒥Xe⊇囙b,服3ss땊뢍i~逇PA쇸1": -2.63273619193485312E17, - "Mq꺋貘k휕=nK硍뫞輩>㾆~἞ࡹ긐榵l⋙Hw뮢帋M엳뢯v⅃^": 1877913476688465125, - "ᶴ뻗`~筗免⚽টW˃⽝b犳䓺Iz篤p;乨A\u20ef쩏?疊m㝀컩뫡b탔鄃ᾈV(遢珳=뎲ିeF仢䆡谨8t0醄7㭧瘵⻰컆r厡궥d)a阄፷Ed&c﯄伮1p": null, - "⯁w4曢\"(欷輡": "\"M᭫]䣒頳B\\燧ࠃN㡇j姈g⊸⺌忉ꡥF矉স%^", - "㣡Oᄦ昵⫮Y祎S쐐級㭻撥>{I$": -378474210562741663, - "䛒掷留Q%쓗1*1J*끓헩ᦢ﫫哉쩧EↅIcꅡ\\?ⴊl귛顮4": false, - "寔愆샠5]䗄IH贈=d﯊/偶?ॊn%晥D視N򗘈'᫂⚦|X쵩넽z질tskxDQ莮Aoﱻ뛓": true, - "钣xp?&\u001e侉/y䴼~?U篔蘚缣/I畚?Q绊": -3034854258736382234, - "꺲໣眀)⿷J暘pИfAV삕쳭Nꯗ4々'唄ⶑ伻㷯騑倭D*Ok꧁3b␽_<\/챣Xm톰ၕ䆄`*fl㭀暮滠毡?": [ - "D男p`V뙸擨忝븪9c麺`淂⢦Yw⡢+kzܖ\fY1䬡H歁)벾Z♤溊-혰셢?1<-\u0005;搢Tᐁle\\ᛵߓﭩ榩訝-xJ;巡8깊蠝ﻓU$K": { - "Vꕡ諅搓W=斸s︪vﲜ츧$)iꡟ싉e寳?ጭムVથ嵬i楝Fg<\/Z|៪ꩆ-5'@ꃱ80!燱R쇤t糳]罛逇dṌ֣XHiͦ{": true, - "Ya矲C멗Q9膲墅携휻c\\딶G甔<\/.齵휴": -1.1456247877031811E-19, - "z#.OO￝J": -8263224695871959017, - "崍_3夼ᮟ1F븍뽯ᦓ鴭V豈Ь": [{ - "N蒬74": null, - "yuB?厅vK笗!ᔸcXQ旦컶P-녫mᄉ麟_": "1R@ 톘xa_|﩯遘s槞d!d껀筤⬫薐焵먑D{\\6k共倌☀G~AS_D\"딟쬚뮥馲렓쓠攥WTMܭ8nX㩴䕅檹E\u0007ﭨN 2 ℆涐ꥏ꠵3▙玽|됨_\u2048", - "恐A C䧩G": {":M큣5e들\\ꍀ恼ᔄ靸|I﨏$)n": { - "|U䬫㟯SKV6ꛤ㗮\bn봻䲄fXT:㾯쳤'笓0b/ೢC쳖?2浓uO.䰴": "ཐ꼋e?``,ᚇ慐^8ꜙNM䂱\u0001IᖙꝧM'vKdꌊH牮r\\O@䊷ᓵ쀆(fy聻i툺\"?<\/峧ࣞ⓺ᤤ쵒߯ꎺ騬?)刦\u2072l慪y꺜ﲖTj+u", - "뽫hh䈵w>1ⲏ쐭V[ⅎ\\헑벑F_㖝⠗㫇h恽;῝汰ᱼ瀖J옆9RR셏vsZ柺鶶툤r뢱橾/ꉇ囦FGm\"謗ꉦ⨶쒿⥡%]鵩#ᖣ_蹎 u5|祥?O", - null, - 2.0150326776036215E-19, - null, - true, - false, - true, - {"\fa᭶P捤WWc᠟f뚉ᬏ퓗ⳀW睹5:HXH=q7x찙X$)모r뚥ᆟ!Jﳸf": [ - -2995806398034583407, - [ - 6441377066589744683, - "Mﶒ醹i)Gἦ廃s6몞 KJ౹礎VZ螺费힀\u0000冺업{谥'꡾뱻:.ꘘ굄奉攼Di᷑K鶲y繈욊阓v㻘}枭캗e矮1c?휐\"4\u0005厑莔뀾墓낝⽴洗ṹ䇃糞@b1\u0016즽Y轹", - { - "1⽕⌰鉟픏M㤭n⧴ỼD#%鐘⊯쿼稁븣몐紧ᅇ㓕ᛖcw嬀~ഌ㖓(0r⧦Q䑕髍ര铂㓻R儮\"@ꇱm❈௿᦯頌8}㿹犴?xn잆꥽R": 2.07321075750427366E18, - "˳b18㗈䃟柵Z曆VTAu7+㛂cb0﯑Wp執<\/臋뭡뚋刼틮荋벲TLP预庰܈G\\O@VD'鱃#乖끺*鑪ꬳ?Mޞdﭹ{␇圯쇜㼞顄︖Y홡g": [{ - "0a,FZ": true, - "2z̬蝣ꧦ驸\u0006L↛Ḣ4๚뿀'?lcwᄧ㐮!蓚䃦-|7.飑挴.樵*+1ﮊ\u0010ꛌ%貨啺/JdM:똍!FBe?鰴㨗0O财I藻ʔWA᫓G쳛u`<\/I": [{ - "$τ5V鴐a뾆両環iZp頻යn븃v": -4869131188151215571, - "*즢[⦃b礞R◚nΰꕢH=귰燙[yc誘g䆌?ଜ臛": { - "洤湌鲒)⟻\\䥳va}PeAMnN[": "㐳ɪ/(軆lZR,Cp殍ȮN啷\"3B婴?i=r$펽ᤐ쀸", - "阄R4㒿㯔ڀ69ZᲦ2癁핌噗P崜#\\-쭍袛&鐑/$4童V꩑_ZHA澢fZ3": {"x;P{긳:G閉:9?活H": [ - "繺漮6?z犞焃슳\">ỏ[Ⳛ䌜녏䂹>聵⼶煜Y桥[泥뚩MvK$4jtロ", - "E#갶霠좭㦻ୗ먵F+䪀o蝒ba쮎4X㣵 h", - -335836610224228782, - null, - null, - [ - "r1᫩0>danjY짿bs{", - [ - -9.594464059325631E-23, - 1.0456894622831624E-20, - null, - 5.803973284253454E-20, - -8141787905188892123, - true, - -4735305442504973382, - 9.513150514479281E-20, - "7넳$螔忷㶪}䪪l짴\u0007鹁P鰚HF銏ZJﳴ/⍎1ᷓ忉睇ᜋ쓈x뵠m䷐窥Ꮤ^\u0019ᶌ偭#ヂt☆၃pᎍ臶䟱5$䰵&๵分숝]䝈뉍♂坎\u0011<>", - "C蒑貑藁lﰰ}X喇몛;t밿O7/᯹f\u0015kI嘦<ዴ㟮ᗎZ`GWퟩ瑹࡮ᅴB꿊칈??R校s脚", - { - "9珵戬+AU^洘拻ቒy柭床'粙XG鞕᠜繀伪%]hC,$輙?Ut乖Qm떚W8઼}~q⠪rU䤶CQ痗ig@#≲t샌f㈥酧l;y闥ZH斦e⸬]j⸗?ঢ拻퀆滌": null, - "畯}㧢J罚帐VX㨑>1ꢶkT⿄蘥㝑o|<嗸層沈挄GEOM@-䞚䧰$만峬輏䠱V✩5宸-揂D'㗪yP掶7b⠟J㕻SfP?d}v㼂Ꮕ'猘": { - "陓y잀v>╪": null, - "鬿L+7:됑Y=焠U;킻䯌잫!韎ஔ\f": { - "駫WmGጶ": { - "\\~m6狩K": -2586304199791962143, - "ႜࠀ%͑l⿅D.瑢Dk%0紪dḨTI픸%뗜☓s榗኉\"?V籄7w髄♲쟗翛歂E䤓皹t ?)ᄟ鬲鐜6C": { - "_췤a圷1\u000eB-XOy缿請∎$`쳌eZ~杁튻/蜞`塣৙\"⪰\"沒l}蕌\\롃荫氌.望wZ|o!)Hn獝qg}": null, - "kOSܧ䖨钨:಼鉝ꭝO醧S`십`ꓭ쭁ﯢN&Et㺪馻㍢ⅳ㢺崡ຊ蜚锫\\%ahx켨|ż劻ꎄ㢄쐟A躊᰹p譞綨Ir쿯\u0016ﵚOd럂*僨郀N*b㕷63z": { - ":L5r+T㡲": [{ - "VK泓돲ᮙRy㓤➙Ⱗ38oi}LJቨ7Ó㹡৘*q)1豢⛃e᫛뙪壥镇枝7G藯g㨛oI䄽 孂L缊ꋕ'EN`": -2148138481412096818, - "`⛝ᘑ$(खꊲ⤖ᄁꤒ䦦3=)]Y㢌跨NĴ驳줟秠++d孳>8ᎊ떩EꡣSv룃 쯫أ?#E|᭙㎐?zv:5祉^⋑V": [ - -1.4691944435285607E-19, - 3.4128661569395795E17, - "㐃촗^G9佭龶n募8R厞eEw⺡_ㆱ%⼨D뉄퉠2ꩵᛅⳍ搿L팹Lවn=\"慉념ᛮy>!`g!풲晴[/;?[v겁軇}⤳⤁핏∌T㽲R홓遉㓥", - "愰_⮹T䓒妒閤둥?0aB@㈧g焻-#~跬x<\/舁P݄ꐡ=\\׳P\u0015jᳪᢁq;㯏l%᭗;砢觨▝,謁ꍰGy?躤O黩퍋Y㒝a擯\n7覌똟_䔡]fJ晋IAS", - 4367930106786121250, - -4.9421193149720582E17, - null, - { - ";ᄌ똾柉곟ⰺKpፇ䱻ฺ䖝{o~h!eꁿ઻욄ښ\u0002y?xUd\u207c悜ꌭ": [ - 1.6010824122815255E-19, - [ - "宨︩9앉檥pr쇷?WxLb", - "氇9】J玚\u000f옛呲~ 輠1D嬛,*mW3?n휂糊γ虻*ᴫ꾠?q凐趗Ko↦GT铮", - "㶢ថmO㍔k'诔栀Z蛟}GZ钹D", - false, - -6.366995517736813E-20, - -4894479530745302899, - null, - "V%᫡II璅䅛䓎풹ﱢ/pU9se되뛞x梔~C)䨧䩻蜺(g㘚R?/Ự[忓C뾠ࢤc왈邠买?嫥挤풜隊枕", - ",v碍喔㌲쟚蔚톬៓ꭶ", - 3.9625444752577524E-19, - null, - [ - "kO8란뿒䱕馔b臻⍟隨\"㜮鲣Yq5m퐔K#ꢘug㼈ᝦ=P^6탲@䧔%$CqSw铜랊0&m⟭<\/a逎ym\u0013vᯗ": true, - "洫`|XN뤮\u0018詞=紩鴘_sX)㯅鿻Ố싹": 7.168252736947373E-20, - "ꛊ饤ﴏ袁(逊+~⽫얢鈮艬O힉7D筗S곯w操I斞᠈븘蓷x": [[[[ - -7.3136069426336952E18, - -2.13572396712722688E18, - { - "硢3㇩R:o칢行E<=\u0018ၬYuH!\u00044U%卝炼2>\u001eSi$⓷ꒈ'렢gᙫ番ꯒ㛹럥嶀澈v;葷鄕x蓎\\惩+稘UEᖸﳊ㊈壋N嫿⏾挎,袯苷ኢ\\x|3c": 7540762493381776411, - "?!*^ᢏ窯?\u0001ڔꙃw虜돳FgJ?&⨫*uo籤:?}ꃹ=ٴ惨瓜Z媊@ત戹㔏똩Ԛ耦Wt轁\\枒^\\ꩵ}}}ꀣD\\]6M_⌫)H豣:36섘㑜": { - ";홗ᰰU஋㙛`D왔ཿЃS회爁\u001b-㢈`봆?盂㛣듿ᦾ蒽_AD~EEຆ㊋(eNwk=Rɠ峭q\"5Ἠ婾^>'ls\n8QAK)- Q䲌mo펹L_칍樖庫9꩝쪹ᘹ䑖瀍aK ?*趤f뭓廝p=磕", - "哑z懅ᤏ-ꍹux쀭", - [ - true, - 3998739591332339511, - "ጻ㙙?᳸aK<\/囩U`B3袗ﱱ?\"/k鏔䍧2l@쿎VZ쨎/6ꃭ脥|B?31+on颼-ꮧ,O嫚m ࡭`KH葦:粘i]aSU쓙$쐂f+詛頖b", - [{"^<9<箝&絡;%i﫡2攑紴\\켉h쓙-柂䚝ven\u20f7浯-Ꮏ\r^훁䓚헬\u000e?\\ㅡֺJ떷VOt": [{ - "-௄卶k㘆혐஽y⎱㢬sS઄+^瞥h;ᾷj;抭\u0003밫f<\/5Ⱗ裏_朻%*[-撵䷮彈-芈": { - "㩩p3篊G|宮hz䑊o곥j^Co0": [ - 653239109285256503, - {"궲?|\":N1ۿ氃NZ#깩:쇡o8킗ࡊ[\"됸Po핇1(6鰏$膓}⽐*)渽J'DN<썙긘毦끲Ys칖": { - "2Pr?Xjㆠ?搮/?㓦柖馃5뚣Nᦼ|铢r衴㩖\"甝湗ܝ憍": "\"뾯i띇筝牻$珲/4ka $匝휴译zbAᩁꇸ瑅&뵲衯ꎀᆿ7@ꈋ'ᶨH@ᠴl+", - "7뢽뚐v?4^ꊥ_⪛.>pởr渲<\/⢕疻c\"g䇘vU剺dஔ鮥꒚(dv祴X⼹\\a8y5坆": true, - "o뼄B욞羁hr﷔폘뒚⿛U5pꪴfg!6\\\"爑쏍䢱W<ﶕ\\텣珇oI/BK뺡'谑♟[Ut븷亮g(\"t⡎有?ꬊ躺翁艩nl F⤿蠜": 1695826030502619742, - "ۊ깖>ࡹ햹^ⵕ쌾BnN〳2C䌕tʬ]찠?ݾ2饺蹳ぶꌭ訍\"◹ᬁD鯎4e滨T輀ﵣ੃3\u20f3킙D瘮g\\擦+泙ၧ 鬹ﯨַ肋7놷郟lP冝{ߒhড়r5,꓋": null, - "ΉN$y{}2\\N﹯ⱙK'8ɜͣwt,.钟廣䎘ꆚk媄_": null, - "䎥eᾆᝦ읉,Jުn岪㥐s搖謽䚔5t㯏㰳㱊ZhD䃭f絕s鋡篟a`Q鬃┦鸳n_靂(E4迠_觅뷝_宪D(NL疶hL追V熑%]v肫=惂!㇫5⬒\u001f喺4랪옑": { - "2a輍85먙R㮧㚪Sm}E2yꆣꫨrRym㐱膶ᔨ\\t綾A☰.焄뙗9<쫷챻䒵셴᭛䮜.<\/慌꽒9叻Ok䰊Z㥪幸k": [ - null, - true, - {"쌞쐍": { - "▟GL K2i뛱iQ\"̠.옛1X$}涺]靎懠ڦ늷?tf灟ݞゟ{": 1.227740268699265E-19, - "꒶]퓚%ฬK❅": [{ - "(ෛ@Ǯっ䧼䵤[aテൖvEnAdU렖뗈@볓yꈪ,mԴ|꟢캁(而첸죕CX4Y믅": "2⯩㳿ꢚ훀~迯?᪑\\啚;4X\u20c2襏B箹)俣eỻw䇄", - "75༂f詳䅫ꐧ鏿 }3\u20b5'∓䝱虀f菼Iq鈆﨤g퍩)BFa왢d0뮪痮M鋡nw∵謊;ꝧf美箈ḋ*\u001c`퇚퐋䳫$!V#N㹲抗ⱉ珎(V嵟鬒_b㳅\u0019": null, - "e_m@(i㜀3ꦗ䕯䭰Oc+-련0뭦⢹苿蟰ꂏSV䰭勢덥.ྈ爑Vd,ᕥ=퀍)vz뱊ꈊB_6듯\"?{㒲&㵞뵫疝돡믈%Qw限,?\r枮\"? N~癃ruࡗdn&": null, - "㉹&'Pfs䑜공j<\/?|8oc᧨L7\\pXᭁ 9᪘": -2.423073789014103E18, - "䝄瑄䢸穊f盈᥸,B뾧푗횵B1쟢f\u001f凄": "魖⚝2儉j꼂긾껢嗎0ࢇ纬xI4](੓`蕞;픬\fC\"斒\")2櫷I﹥迧", - "ퟯ詔x悝령+T?Bg⥄섅kOeQ큼㻴*{E靼6氿L缋\u001c둌๶-㥂2==-츫I즃㠐Lg踞ꙂEG貨鞠\"\u0014d'.缗gI-lIb䋱ᎂDy缦?": null, - "紝M㦁犿w浴詟棓쵫G:䜁?V2ힽ7N*n&㖊Nd-'ຊ?-樹DIv⊜)g䑜9뉂ㄹ푍阉~ꅐ쵃#R^\u000bB䌎䦾]p.䀳": [{"ϒ爛\"ꄱ︗竒G䃓-ま帳あ.j)qgu扐徣ਁZ鼗A9A鸦甈!k蔁喙:3T%&㠘+,䷞|챽v䚞문H<\/醯r셓㶾\\a볜卺zE䝷_죤ဵ뿰᎟CB": [ - 6233512720017661219, - null, - -1638543730522713294, - false, - -8901187771615024724, - [ - 3891351109509829590, - true, - false, - -1.03836679125188032E18, - { - "j랎:g曞ѕᘼ}链N", - -1.1103819473845426E-19, - true, - [ - true, - null, - -7.9091791735309888E17, - true, - {"}蔰鋈+ꐨ啵0?g*사%`J?*": [{ - "\"2wG?yn,癷BK\\龞䑞x?蠢": -3.7220345009853505E-19, - ";饹়❀)皋`噿焒j(3⿏w>偍5X薙婏聿3aFÆÝ": "2,ꓴg?_섦_>Y쪥션钺;=趘F~?D㨫\bX?㹤+>/믟kᠪ멅쬂Uzỵ]$珧`m雁瑊ඖ鯬cꙉ梢f묛bB", - "♽n$YjKiXX*GO贩鏃豮祴遞K醞眡}ꗨv嵎꼷0୸+M菋eH徸J꣆:⼐悥B켽迚㯃b諂\u000bjꠜ碱逮m8": [ - "푷᣺ﻯd8ﱖ嬇ភH鹎⡱᱅0g:果6$GQ췎{vᷧYy-脕x偹砡館⮸C蓼ꏚ=軄H犠G谖ES詤Z蠂3l봟hᅭ7䦹1GPQG癸숟~[#駥8zQ뛣J소obg,", - null, - 1513751096373485652, - null, - -6.851466660824754E-19, - {"䩂-⴮2ٰK솖풄꾚ႻP앳1H鷛wmR䗂皎칄?醜<\/&ࠧ㬍X濬䵈K`vJ륒Q/IC묛!;$vϑ": { - "@-ꚗxྐྵ@m瘬\u0010U絨ﮌ驐\\켑寛넆T=tQ㭤L연@脸삯e-:⩼u㎳VQ㋱襗ຓ<Ⅶ䌸cML3+\u001e_C)r\\9+Jn\\Pﺔ8蠱檾萅Pq鐳话T䄐I": -1.80683891195530061E18, - "ᷭዻU~ཷsgSJ`᪅'%㖔n5픆桪砳峣3獮枾䌷⊰呀": { - "Ş੉䓰邟自~X耤pl7间懑徛s첦5ਕXexh⬖鎥᐀nNr(J컗|ૃF\"Q겮葲놔엞^겄+㈆话〾희紐G'E?飕1f❼텬悚泬먐U睬훶Qs": false, - "(\u20dag8큽튣>^Y{뤋.袊䂓;_g]S\u202a꽬L;^'#땏bႌ?C緡<䝲䲝断ꏏ6\u001asD7IK5Wxo8\u0006p弊⼂ꯍ扵\u0003`뵂픋%ꄰ⫙됶l囏尛+䗅E쟇\\": [ - true, - { - "\n鱿aK㝡␒㼙2촹f;`쾏qIࡔG}㝷䐍瓰w늮*粅9뒪ㄊCj倡翑閳R渚MiUO~仨䜶RꙀA僈㉋⦋n{㖥0딿벑逦⥻0h薓쯴Ꝼ": [ - 5188716534221998369, - 2579413015347802508, - 9.010794400256652E-21, - -6.5327297761238093E17, - 1.11635352494065523E18, - -6656281618760253655, - { - "": ")?", - "TWKLꑙ裑꺔UE俸塑炌Ũ᜕-o\"徚#": {"M/癟6!oI51ni퐚=댡>xꍨ\u0004 ?": { - "皭": {"⢫䋖>u%w잼<䕏꘍P䋵$魋拝U䮎緧皇Y훂&|羋ꋕ잿cJ䨈跓齳5\u001a삱籷I꿾뤔S8㌷繖_Yឯ䲱B턼O歵F\\l醴o_欬6籏=D": [ - false, - true, - {"Mt|ꏞD|F궣MQ뵕T,띺k+?㍵i": [ - 7828094884540988137, - false, - { - "!༦鯠,&aﳑ>[euJꏽ綷搐B.h": -7648546591767075632, - "-n켧嘰{7挐毄Y,>❏螵煫乌pv醑Q嶚!|⌝責0왾덢ꏅ蛨S\\)竰'舓Q}A釡5#v": 3344849660672723988, - "8閪麁V=鈢1녈幬6棉⪮둌\u207d᚛驉ꛃ'r䆉惏ै|bἧﺢᒙ<=穊强s혧eꮿ慩⌡ \\槳W븧J檀C,ᘉ의0俯퀉M;筷ࣴ瓿{늊埂鄧_4揸Nn阼Jੵ˥(社": true, - "o뼀vw)4A뢵(a䵢)p姃뛸\u000fK#KiQp\u0005ꅍ芅쏅": null, - "砥$ꥸ┇耽u斮Gc{z빔깎밇\\숰\u001e괷各㶇쵿_ᴄ+h穢p촀Ნ䃬z䝁酳ӂ31xꔄ1_砚W렘G#2葊P ": [ - -3709692921720865059, - null, - [ - 6669892810652602379, - -135535375466621127, - "뎴iO}Z? 馢녱稹ᄾ䐩rSt帤넆&7i騏멗畖9誧鄜'w{Ͻ^2窭외b㑎粖i矪ꦨ탪跣)KEㆹ\u0015V8[W?⽉>'kc$䨘ᮛ뉻٬M5", - 1.10439588726055846E18, - false, - -4349729830749729097, - null, - [ - false, - "_蠢㠝^䟪/D녒㡋ỎC䒈판\u0006એq@O펢%;鹐쏌o戥~A[ꡉ濽ỳ&虃᩾荣唙藍茨Ig楡꒻M窓冉?", - true, - 2.17220752996421728E17, - -5079714907315156164, - -9.960375974658589E-20, - "ᾎ戞༒", - true, - false, - [[ - "ⶉᖌX⧕홇)g엃⹪x뚐癟\u0002", - -5185853871623955469, - { - "L㜤9ợㇶK鐰⋓V뽋˖!斫as|9"፬䆪?7胜&n薑~": -2.11545634977136992E17, - "O8뀩D}캖q萂6༣㏗䈓煮吽ਆᎼDᣘ폛;": false, - "YTᡅ^L㗎cbY$pᣞ縿#fh!ꘂb삵玊颟샞ဢ$䁗鼒몁~rkH^:닮먖츸륈⪺쒉砉?㙓扫㆕꣒`R䢱B酂?C뇞<5Iޚ讳騕S瞦z": null, - "\\RB?`mG댵鉡幐物䵎有5*e骄T㌓ᛪ琾駒Ku\u001a[柆jUq8⋈5鿋츿myﻗ?雍ux঴?": 5828963951918205428, - "n0晅:黯 xu씪^퓞cB㎊ᬍ⺘٤փ~B岚3㥕擄vᲂ~F?C䶖@$m~忔S왖㲚?챴⊟W#벌{'㰝I䝠縁s樘\\X뢻9핡I6菍ㄛ8쯶]wॽ0L\"q": null, - "x增줖j⦦t䏢᎙㛿Yf鼘~꫓恄4惊\u209c": "oOhbᤃ᛽z&Bi犑\\3B㩬劇䄑oŁ쨅孥멁ຖacA㖫借㞝vg싰샂㐜#譞⢤@k]鋰嘘䜾L熶塥_<\/⍾屈ﮊ_mY菹t뙺}Ox=w鮮4S1ꐩמּ'巑", - "㗓蟵ꂾe蠅匳(JP䗏෸\u0089耀왲": [{ - "ᤃ㵥韎뤽\r?挥O쯡⇔㞚3伖\u0005P⋪\"D궣QLn(⚘罩䩢Ŏv䤘尗뼤됛O淽鋋闚r崩a{4箙{煷m6〈": { - "l곺1L": { - "T'ਤ?砅|੬Km]䄩\"(࿶<\/6U爢䫈倔郴l2㴱^줣k'L浖L鰄Rp今鎗⒗C얨M훁㡧ΘX粜뫈N꤇輊㌻켑#㮮샶-䍗룲蠝癜㱐V>=\\I尬癤t=": 7648082845323511446, - "鋞EP:<\/_`ၧe混ㇹBd⯢㮂驋\\q碽饩跓྿ᴜ+j箿렏㗑yK毢宸p謹h䦹乕U媣\\炤": [[ - "3", - [ - true, - 3.4058271399411134E-20, - true, - "揀+憱f逮@먻BpW曉\u001a㣐⎊$n劈D枤㡞좾\u001aᛁ苔౩闝1B䷒Ṋ݋➐ꀞꐃ磍$t੤_:蘺⮼(#N", - 697483894874368636, - [ - "vᘯ锴)0訶}䳅⩚0O壱韈ߜ\u0018*U鍾䏖=䧉뽑单휻ID쿇嘗?ꌸῬ07", - -5.4858784319382006E18, - 7.5467775182251151E18, - -8911128589670029195, - -7531052386005780140, - null, - [ - null, - true, - [[{ - "1欯twG<\/Q:0怯押殃탷聫사<ỗꕧ蚨䡁nDꌕ\u001c녬~蓩鲃g儊>ꏡl㻿/⑷*챳6㻜W毤緛ﹺᨪ4\u0013뺚J髬e3쳸䘦伧?恪&{L掾p+꬜M䏊d娘6": { - "2p첼양棜h䜢﮶aQ*c扦v︥뮓kC寵횂S銩&ǝ{O*य़iH`U큅ࡓr䩕5ꄸ?`\\᧫?ᮼ?t〟崾훈k薐ì/iy꤃뵰z1<\/AQ#뿩8jJ1z@u䕥": 1.82135747285215155E18, - "ZdN &=d년ᅆ'쑏ⅉ:烋5&៏ᄂ汎来L㯄固{钧u\\㊏튚e摑&t嗄ꖄUb❌?m䴘熚9EW": [{ - "ଛ{i*a(": -8.0314147546006822E17, - "⫾ꃆY\u000e+W`௸ \"M뒶+\\뷐lKE}(NT킶Yj選篒쁶'jNQ硾(똡\\\"逌ⴍy? IRꜘ὞鄬﨧:M\\f⠋Cꚜ쫊ᚴNV^D䕗ㅖἔIao꿬C⍏8": [ - 287156137829026547, - { - "H丞N逕⯲": {"": { - "7-;枮阕梒9ᑄZ": [[[[ - null, - { - "": [[[[ - -7.365909561486078E-19, - 2948694324944243408, - null, - [ - true, - "荒\"并孷䂡쵼9o䀘F\u0002龬7⮹Wz%厖/*? a*R枈㌦됾g뒠䤈q딄㺿$쮸tᶎ릑弣^鏎<\/Y鷇驜L鿽<\/춋9Mᲆឨ^<\/庲3'l낢", - "c鮦\u001b두\\~?眾ಢu݆綑෪蘛轋◜gȃ<\/ⴃcpkDt誩܅\"Y", - [[ - null, - null, - [ - 3113744396744005402, - true, - "v(y", - { - "AQ幆h쾜O+꺷铀ꛉ練A蚗⼺螔j㌍3꽂楎䥯뎸먩?": null, - "蠗渗iz鱖w]擪E": 1.2927828494783804E-17, - "튷|䀭n*曎b✿~杤U]Gz鄭kW|㴚#㟗ഠ8u擨": [[ - true, - null, - null, - {"⾪壯톽g7?㥜ώQꑐ㦀恃㧽伓\\*᧰閖樧뢇赸N휶䎈pI氇镊maᬠ탷#X?A+kНM ༑᩟؝?5꧎鰜ṚY즫궔 =ঈ;ﳈ?*s|켦蜌wM笙莔": [ - null, - -3808207793125626469, - [ - -469910450345251234, - 7852761921290328872, - -2.7979740127017492E18, - 1.4458504352519893E-20, - true, - "㽙깹?먏䆢:䴎ۻg殠JBTU⇞}ꄹꗣi#I뵣鉍r혯~脀쏃#釯:场:䔁>䰮o'㼽HZ擓௧nd", - [ - 974441101787238751, - null, - -2.1647718292441327E-19, - 1.03602824249831488E18, - [ - null, - 1.0311977941822604E-17, - false, - true, - { - "": -3.7019778830816707E18, - "E峾恆茍6xLIm縂0n2视֯J-ᤜz+ᨣ跐mYD豍繹⹺䊓몓ﴀE(@詮(!Y膽#᎙2䟓섣A䈀㟎,囪QbK插wcG湎ꤧtG엝x⥏俎j'A一ᯥ뛙6ㅑ鬀": 8999803005418087004, - "よ殳\\zD⧅%Y泥簳Uꈩ*wRL{3#3FYHା[d岀䉯T稉駅䞘礄P:闈W怏ElB㤍喬赔bG䠼U଄Nw鰯闀楈ePsDꥷ꭬⊊": [ - 6.77723657904486E-20, - null, - [ - "ཚ_뷎꾑蹝q'㾱ꂓ钚蘞慵렜떆`ⴹ⎼櫯]J?[t9Ⓢ !컶躔I᮸uz>3a㠕i,錃L$氰텰@7녫W㸮?羧W뇧ꃞ,N鋮숪2ɼ콏┍䁲6", - "&y?뢶=킕올Za惻HZk>c\u20b58i?ꦶcfBv잉ET9j䡡", - "im珊Ճb칧校\\뼾쯀", - 9.555715121193197E-20, - true, - { - "<㫚v6腓㨭e1㕔&&V∌ᗈT奄5Lጥ>탤?튣瑦㳆ꉰ!(ᙪ㿬擇_n쌯IMΉ㕨␰櫈ᱷ5풔蟹&L.첽e鰷쯃劼﫭b#ﭶ퓀7뷄Wr㢈๧Tʴશ㶑澕鍍%": -1810142373373748101, - "fg晌o?߲ꗄ;>C>?=鑰監侯Kt굅": true, - "䫡蓺ꑷ]C蒹㦘\"1ః@呫\u0014NL䏾eg呮፳,r$裢k>/\\?ㄤᇰﻛ쉕1஥'Ċ\" \\_?쨔\"ʾr: 9S䘏禺ᪧꄂ㲄", - [[{ - "*硙^+E쌺I1䀖ju?:⦈Ꞓl๴竣迃xKC/饉:\fl\"XTFᄄ蟭,芢<\/骡軺띜hꏘ\u001f銿<棔햳▨(궆*=乥b8\\媦䷀뫝}닶ꇭ(Kej䤑M": [{ - "1Ꮼ?>옿I╅C<ގ?ꊌ冉SV5A㢊㶆z-๎玶绢2F뵨@㉌뀌o嶔f9-庒茪珓뷳4": null, - ";lᰳ": "CbB+肻a䄷苝*/볳+/4fq=㰁h6瘉샴4铢Y骐.⌖@哼猎㦞+'gꋸ㒕ߤ㞑(䶒跲ti⑴a硂#No볔", - "t?/jE幸YHT셵⩎K!Eq糦ꗣv刴w\"l$ο:=6:移": { - "z]鑪醊嫗J-Xm銌翁絨c里됏炙Ep㣋鏣똼嚌䀓GP﹖cmf4鹭T䅿꣭姧␸wy6ꦶ;S&(}ᎧKxᾂQ|t뻳k\"d6\"|Ml췆hwLt꼼4$&8Պ褵婶鯀9": {"嵃닢ᒯ'd᧫䳳#NXe3-붋鸿ଢ떓%dK\u0013䲎ꖍYV.裸R⍉rR3蟛\\:젯:南ĺLʆ넕>|텩鴷矔ꋅⒹ{t孶㓑4_": [ - true, - null, - [ - false, - "l怨콈lᏒ", - { - "0w䲏嬧-:`䉅쉇漧\\܂yㄨb%㽄j7ᦶ涶<": 3.7899452730383747E-19, - "ꯛTẀq纤q嶏V⿣?\"g}ი艹(쥯B T騠I=仵및X": {"KX6颠+&ᅃ^f畒y[": { - "H?뱜^?꤂-⦲1a㋞&ꍃ精Ii᤾챪咽쬘唂쫷<땡劈훫놡o㥂\\ KⴙD秼F氮[{'좴:례晰Iq+I쭥_T綺砸GO煝䟪ᚪ`↹l羉q쐼D꽁ᜅ훦: vUV": true, - "u^yﳍ0㱓#[y뜌앸ꊬL㷩?蕶蘾⻍KӼ": -7931695755102841701, - "䤬轉車>\u001c鴵惋\"$쯃྆⇻n뽀G氠S坪]ಲꨍ捇Qxኻ椕駔\\9ࣼ﫻읜磡煮뺪ᶚ볝l㕆t+sζ": [[[ - true, - false, - [ - null, - 3363739578828074923, - true, - { - "\"鸣詩 볰㑵gL㯦῅춝旫}ED辗ﮈI쀤-ꧤ|㠦Z\"娑ᕸ4爏騍㣐\"]쳝Af]茛⬻싦o蚁k䢯䩐菽3廇喑ޅ": 4.5017999150704666E17, - "TYႇ7ʠ值4챳唤~Zo&ݛ": false, - "`塄J袛㭆끺㳀N㺣`꽐嶥KﯝSVᶔ∲퀠獾N딂X\"ᤏhNﬨvI": {"\u20bb㭘I䖵䰼?sw䂷쇪](泒f\"~;꼪Fԝsᝦ": {"p,'ꉂ軿=A蚶?bƉ㏵䅰諬'LYKL6B깯⋩겦뎙(ᜭ\u0006噣d꾆㗼Z;䄝䚔cd<情@䞂3苼㸲U{)<6&ꩻ钛\u001au〷N숨囖愙j=BXW욕^x芜堏Ῑ爂뛷꒻t✘Q\b": [[ - "籛&ଃ䩹.ꃩ㦔\\C颫#暪&!勹ꇶ놽攺J堬镙~軌C'꾖䣹㮅岃ᙴ鵣", - 4.317829988264744E15, - 6.013585322002147E-20, - false, - true, - null, - null, - -3.084633632357326E-20, - false, - null, - { - "\"짫愔昻 X\"藣j\"\"먁ཅѻ㘤㬯0晲DU꟒㸃d벀윒l䦾c੻*3": null, - "谈Wm陧阦咟ฯ歖擓N喴㋐銭rCCnVࢥ^♼Ⅾ젲씗刊S༝+_t赔\\b䚍뉨ꬫ6펛cL䊘᜼<\/澤pF懽&H": [ - null, - { - "W\"HDUuΌ퀟M'P4࿰H똆ⰱﮯ<\/凐蘲\"C鴫ﭒж}ꭩ쥾t5yd诪ﮡ퍉ⴰ@?氐醳rj4I6Qt": 6.9090159359219891E17, - "絛ﳛ⺂": {"諰P㗮聦`ZQ?ꫦh*റcb⧱}埌茥h{棩렛툽o3钛5鮁l7Q榛6_g)ὄ\u0013kj뤬^爖eO4Ⱈ槞鉨ͺ订%qX0T썗嫷$?\\\"봅늆'%": [ - -2.348150870600346E-19, - [[ - true, - -6619392047819511778, - false, - [[ - -1.2929189982356161E-20, - 1.7417192219309838E-19, - {"?嵲2࿐2\u0001啑㷳c縯": [ - null, - [ - false, - true, - 2578060295690793218, - { - "?\"殃呎#㑑F": true, - "}F炊_殛oU헢兔Ꝉ,赭9703.B数gTz3⏬": { - "5&t3,햓Mݸᵣ㴵;꣫䩍↳#@뫷䠅+W-ࣇzᓃ鿕ಔ梭?T䮑ꥬ旴]u뫵막bB讍:왳둛lEh=숾鱠p咐$짏#?g⹷ᗊv㷵.斈u頻\u0018-G.": "뽙m-ouࣤ஫牷\"`Ksꕞ筼3HlȨvC堈\"I]㖡玎r먞#'W賜鴇k'c룼髋䆿飉㗆xg巤9;芔cጐ/ax䊨♢큓r吓㸫೼䢗da᩾\"]屣`", - ":M딪<䢥喠\u0013㖅x9蕐㑂XO]f*Q呰瞊吭VP@9,㨣 D\\穎vˤƩs㜂-曱唅L걬/롬j㈹EB8g<\/섩o渀\"u0y&룣": ">氍緩L/䕑돯Ꟙ蕞^aB뒣+0jK⪄瑨痜LXK^힦1qK{淚t츔X:Vm{2r獁B뾄H첚7氥?쉟䨗ꠂv팳圎踁齀\\", - "D彤5㢷Gꪻ[lㄆ@὜⓰絳[ଃ獽쮹☒[*0ꑚ㜳": 9022717159376231865, - "ҖaV銣tW+$魿\u20c3亜~뫡ᙰ禿쨽㏡fṼzE/h": "5臐㋇Ჯ쮺? 昨탰Wム밎#'\"崲钅U?幫뺀⍾@4kh>騧\\0ҾEV=爐͌U捀%ꉼ 㮋<{j]{R>:gԩL\u001c瀈锌ﯲﳡꚒ'⫿E4暍㌗뵉X\"H᝜", - "ᱚגּ;s醒}犍SἿ㦣&{T$jkB\\\tḮ앾䤹o<避(tW": "vb⯽䴪䮢@|)", - "⥒퐁껉%惀뗌+녣迺顀q條g⚯i⤭룐M琹j̈́⽜A": -8385214638503106917, - "逨ꊶZ<\/W⫟솪㎮ᘇb?ꠔi\"H㧺x෷韒Xꫨฟ|]窽\u001a熑}Agn?Mᶖa9韲4$3Ỵ^=쏍煤ፐ돷2䣃%鷠/eQ9頸쥎", - 2398360204813891033, - false, - 3.2658897259932633E-19, - null, - "?ꚃ8Nn㞷幵d䲳䱲뀙ꪛQ瑓鎴]䩋-鰾捡䳡??掊", - false, - -1309779089385483661, - "ᦲxu_/yecR.6芏.ᜇ過 ~", - -5658779764160586501, - "쒌:曠=l썜䢜wk#s蕚\"互㮉m䉤~0듐䋙#G;h숄옥顇෤勹(C7㢅雚㐯L⠅VV簅<", - null, - -4.664877097240962E18, - -4.1931322262828017E18, - { - ",": { - "v㮟麑䄠뤵g{M띮.\u001bzt뢜뵡0Ǥ龍떟Ᾰ怷ϓRT@Lꀌ樂U㏠⾕e扉|bJg(뵒㠶唺~ꂿ(땉x⻫싉쁊;%0鎻V(o\f,N鏊%nk郼螺": -1.73631993428376141E18, - "쟧摑繮Q@Rᕾ㭚㾣4隅待㓎3蒟": [ - 4971487283312058201, - 8973067552274458613, - { - "`a揙ᣗ\u0015iBo¸": 4.3236479112537999E18, - "HW&퉡ぁ圍Y?瑡Qy훍q!帰敏s舠㫸zꚗaS歲v`G株巷Jp6킼 (귶鍔⾏⡈>M汐㞍ቴ꙲dv@i㳓ᇆ?黍": [ - null, - 4997607199327183467, - "E㻎蠫ᐾ高䙟蘬洼旾﫠텛㇛?'M$㣒蔸=A_亀绉앭rN帮", - null, - [{ - "Eᑞ)8餧A5u&㗾q?": [ - -1.969987519306507E-19, - null, - [ - 3.42437673373841E-20, - true, - "e걷M墁\"割P␛퍧厀R䱜3ﻴO퓫r﹉⹊", - [ - -8164221302779285367, - [ - true, - null, - "爘y^-?蘞Ⲽꪓa␅ꍨ}I", - 1.4645984996724427E-19, - [{ - "tY좗⧑mrzﺝ㿥ⴖ᥷j諅\u0000q賋譁Ꞅ⮱S\nࡣB/큃굪3Zɑ复o<\/;롋": null, - "彟h浠_|V4䦭Dᙣ♞u쿻=삮㍦\u001e哀鬌": [{"6횣楠,qʎꗇ鎆빙]㱭R굋鈌%栲j分僅ペ䇰w폦p蛃N溈ꡐꏀ?@(GI뉬$ﮄ9誁ꓚ2e甸ڋ[䁺,\u0011\u001cࢃ=\\+衪䷨ᯕ鬸K": [[ - "ㅩ拏鈩勥\u000etgWVXs陂規p狵w퓼{뮵_i\u0002ퟑႢ⬐d6鋫F~챿搟\u0096䚼1ۼ칥0꣯儏=鋷牋ⅈꍞ龐", - -7283717290969427831, - true, - [ - 4911644391234541055, - { - "I鈒첽P릜朸W徨觘-Hᎄ퐟⓺>8kr1{겵䍃〛ᬡ̨O귑o䝕'쿡鉕p5": "fv粖RN瞖蛐a?q꤄\u001d⸥}'ꣴ犿ꦼ?뤋?鵆쥴덋䡫s矷̄?ඣ/;괱絢oWfV<\/\u202cC,㖦0䑾%n賹g&T;|lj_欂N4w", - "짨䠗;䌕u i+r๏0": [{"9䥁\\఩8\"馇z䇔<\/ႡY3e狚쐡\"ุ6ﰆZ遖c\"Ll:ꮾ疣<\/᭙O◌납୕湞9⡳Und㫜\u0018^4pj1;䧐儂䗷ୗ>@e톬": { - "a⑂F鋻Q螰'<퇽Q贝瀧{ᘪ,cP&~䮃Z?gI彃": [ - -1.69158726118025933E18, - [ - "궂z簽㔛㮨瘥⤜䛖Gℤ逆Y⪾j08Sn昞ꘔ캻禀鴚P謦b{ꓮmN靐Mᥙ5\"睏2냑I\u0011.L&=?6ᄠ뻷X鸌t刑\"#z)o꫚n쳟줋", - null, - 7517598198523963704, - "ኑQp襟`uᩄr方]*F48ꔵn俺ሙ9뇒", - null, - null, - 6645782462773449868, - 1219168146640438184, - null, - { - ")ယ넌竀Sd䰾zq⫣⏌ʥ\u0010ΐ' |磪&p牢蔑mV蘸૰짬꺵;K": [ - -7.539062290108008E-20, - [ - true, - false, - null, - true, - 6574577753576444630, - [[ - 1.2760162530699766E-19, - [ - null, - [ - "顊\\憎zXB,", - [{ - "㇆{CVC9-MN㜋ઘR눽#{h@ퟨ!鼚׼XOvXS\u0017ᝣ=cS+梽៲綆16s덽휐y屬?ᇳG2ᴭ\u00054쫖y룇nKcW̭炦s/鰘ᬽ?J|퓀髣n勌\u0010홠P>j": false, - "箴": [ - false, - "鍞j\"ꮾ*엇칬瘫xṬ⭽쩁䃳\"-⋵?ᦽ댎Ĝ": true, - "Pg帯佃籛n㔠⭹࠳뷏≻࿟3㞱!-쒾!}쭪䃕!籿n涻J5ਲ਼yvy;Rኂ%ᔡጀ裃;M⣼)쵂쑈": 1.80447711803435366E18, - "ꈑC⡂ᑆ㤉壂뎃Xub<\/쀆༈憓ق쨐ק\\": [ - 7706977185172797197, - {"": {"K╥踮砆NWࡆFy韣7ä밥{|紒︧䃀榫rᩛꦡTSy잺iH8}ퟴ,M?Ʂ勺ᴹ@T@~꾂=I㙕뾰_涀쑜嫴曣8IY?ҿo줫fऒ}\\S\"ᦨ뵼#nDX": { - "♘k6?଱癫d68?㽚乳䬳-V顷\u0005蝕?\u0018䞊V{邾zじl]雏k臤~ൖH뒐iꢥ]g?.G碄懺䔛pR$䅒X觨l봜A刊8R梒',}u邩퉕?;91Ea䈈믁G⊶芔h袪&廣㺄j;㡏綽\u001bN頸쳘橆": -2272208444812560733, - "拑Wﵚj鵼駳Oࣿ)#㾅顂N傓纝y僱栜'Bꐍ-!KF*ꭇK¦?䈴^:啤wG逭w᧯": "xᣱmYe1ۏ@霄F$ě꧘푫O䤕퀐Pq52憬ꀜ兴㑗ᡚ?L鷝ퟐ뭐zJꑙ}╆ᅨJB]\"袌㺲u8䯆f", - "꿽၅㔂긱Ǧ?SI": -1669030251960539193, - "쇝ɨ`!葎>瞺瘡驷錶❤ﻮ酜=": -6961311505642101651, - "?f7♄꫄Jᡔ훮e읇퍾፣䭴KhखT;Qty}O\\|뫁IῒNe(5惁ꥶㆷY9ﮡ\\ oy⭖-䆩婁m#x봉>Y鈕E疣s驇↙ᙰm<": {"퉻:dꂁ&efᅫ쫢[\"돈늖꺙|Ô剐1͖-K:ʚ᭕/;쏖㷛]I痐职4gZ4⍜kเꛘZ⥺\\Bʫᇩ鄨魢弞&幟ᓮ2̊盜", - -9006004849098116748, - -3118404930403695681, - { - "_彃Y艘-\"Xx㤩㳷瑃?%2䐡鵛o귵옔夘v*탋职&㳈챗|O钧": [ - false, - "daꧺdᗹ羞쯧H㍤鄳頳<型孒ン냆㹀f4㹰\u000f|C*ሟ鰠(O<ꨭ峹ipຠ*y೧4VQ蔔hV淬{?ᵌEfrI_", - "j;ꗣ밷邍副]ᗓ", - -4299029053086432759, - -5610837526958786727, - [ - null, - [ - -1.3958390678662759E-19, - { - "lh좈T_믝Y\"伨\u001cꔌG爔겕ꫳ晚踍⿻읐T䯎]~e#฽燇\"5hٔ嶰`泯r;ᗜ쮪Q):/t筑,榄&5懶뎫狝(": [{ - "2ፁⓛ]r3C攟וּ9賵s⛔6'ஂ|\"ⵈ鶆䐹禝3\"痰ࢤ霏䵩옆䌀?栕r7O簂Isd?K᫜`^讶}z8?z얰T:X倫⨎ꑹ": -6731128077618251511, - "|︦僰~m漿햭\\Y1'Vvخ굇ቍ챢c趖": [null] - }], - "虌魿閆5⛔煊뎰㞤ᗴꥰF䮥蘦䂪樳-K᝷-(^\u20dd_": 2.11318679791770592E17 - } - ] - ] - ]}, - "묗E䀳㧯᳀逞GMc\b墹㓄끖Ơ&U??펌鑍 媋k))ᄊ": null, - "묥7콽벼諌J_DɯﮪM殴䣏,煚ྼ`Y:씧<\/⩫%yf䦀!1Ჶk춎Q米W∠WC跉鬽*ᛱi㴕L꘻ꀏ쓪\"_g鿄'#t⽙?,Wg㥖|D鑆e⥏쪸僬h鯔咼ඡ;4TK聎졠嫞" - } - ] - ] - } - ] - ] - ]}} - } - ]} - }, - "뿋뀾淣截䔲踀&XJ펖꙯^Xb訅ꫥgᬐ>棟S\"혧騾밫겁7-": "擹8C憎W\"쵮yR뢩浗絆䠣簿9䏈引Wcy䤶孖ꯥ;퐌]輩䍐3@{叝 뽸0ᡈ쵡Ⲇ\u001dL匁꧐2F~ݕ㪂@W^靽L襒ᦘ~沦zZ棸!꒲栬R" - } - ] - ], - "Z:덃൛5Iz찇䅄駠㭧蓡K1": "e8᧤좱U%?ⵇ䯿鿝\u0013縮R∱骒EO\u000fg?幤@֗퉙vU`", - "䐃쪈埽້=Ij,쭗쓇చ": false - }]}} - ] - } - ]} - } - ] - ] - ], - "咰긖VM]᝼6䓑쇎琺etDҌ?㞏ꩄ퇫밉gj8蠃\"⩐5䛹1ࣚ㵪": "ക蹊?⎲⧘⾚̀I#\"䈈⦞돷`wo窭戕෱휾䃼)앷嵃꾞稧,Ⴆ윧9S?೗EMk3Მ3+e{⹔Te驨7䵒?타Ulg悳o43" - } - ], - "zQᤚ纂땺6#ٽ﹧v￿#ࠫ휊冟蹧텈ꃊʆ?&a䥯De潝|쿓pt瓞㭻啹^盚2Ꝋf醪,얏T窧\\Di䕎谄nn父ꋊE": -2914269627845628872, - "䉩跐|㨻ᷢ㝉B{蓧瞸`I!℄욃힕#ೲᙾ竛ᔺCjk췒늕貭词\u0017署?W딚%(pꍁ⤼띳^=on뺲l䆼bzrﳨ[&j狸䠠=ᜑꦦ\u2061յnj=牲攑)M\\龏": false, - "뎕y絬᫡⥮Ϙᯑ㌔/NF*˓.,QEzvK!Iwz?|쥾\"ꩻL꼗Bꔧ賴緜s뉣隤茛>ロ?(?^`>冺飒=噸泥⺭Ᲊ婓鎔븜z^坷裮êⓅ໗jM7ﶕ找\\O": 1.376745434746303E-19 - }, - "䐛r滖w㏤,|Nዜ": false - } - ]], - "@꿙?薕尬 gd晆(띄5躕ﻫS蔺4)떒錸瓍?~": 1665108992286702624, - "w믍nᏠ=`঺ᅥC>'從됐槷䤝眷螄㎻揰扰XᅧC贽uჍ낟jKD03T!lDV쀉Ӊy뢖,袛!终캨G?鉮Q)⑗1쾅庅O4ꁉH7?d\u0010蠈줘월ސ粯Q!낇껉6텝|{": null, - "~˷jg쿤촖쉯y": -5.5527605669177098E18, - "펅Wᶺzꐆと푭e?4j仪열[D<鈑皶婆䵽ehS?袪;HꍨM뗎ば[(嗏M3q퍟g4y╸鰧茀[Bi盤~﫝唎鋆彺⦊q?B4쉓癚O洙킋툈䶯_?ퟲ": null - } - ] - ]] - ]], - "꟱Ԕ㍤7曁聯ಃ錐V䷰?v㪃૦~K\"$%请|ꇹn\"k䫛㏨鲨\u2023䄢\u0004[︊VJ?䶟ាꮈ䗱=깘U빩": -4863152493797013264 - } - ]}]} - ] - }}} - ], - "쏷쐲۹퉃~aE唙a챑,9㮹gLHd'䔏|킗㍞䎥&KZYT맵7䥺Nⱳ同莞鿧w\\༌疣n/+ꎥU\"封랾○ퟙAJᭌ?9䛝$?驔9讐짘魡T֯c藳`虉C읇쐦T" - } - ], - "谶개gTR￐>ၵ͚dt晑䉇陏滺}9㉸P漄": -3350307268584339381 - }] - ] - ] - ]] - ] - ], - "0y꟭馋X뱔瑇:䌚￐廿jg-懲鸭䷭垤㒬茭u賚찶ಽ+\\mT땱\u20821殑㐄J쩩䭛ꬿNS潔*d\\X,壠뒦e殟%LxG9:摸": 3737064585881894882, - "풵O^-⧧ⅶvѪ8廸鉵㈉ר↝Q㿴뺟EႳvNM:磇>w/៻唎뷭୥!냹D䯙i뵱貁C#⼉NH6`柴ʗ#\\!2䂗Ⱨf?諳.P덈-返I꘶6?8ꐘ": -8934657287877777844, - "溎-蘍寃i诖ര\"汵\"\ftl,?d⼡쾪⺋h匱[,෩I8MҧF{k瓿PA'橸ꩯ綷퉲翓": null - } - ] - ], - "ោ係؁<元": 1.7926963090826924E-18 - }}] - } - ] - ]]}] - }] - ] - ] - ] - ], - "ጩV<\"ڸsOᤘ": 2.0527167903723048E-19 - }] - ]} - ] - ]], - "∳㙰3젴p᧗䱙?`yZA8Ez0,^ᙛ4_0븢\u001ft:~䎼s.bb룦明yNP8弆C偯;⪾짍'蕴뮛": -6976654157771105701, - "큵ꦀ\\㇑:nv+뒤燻䀪ﴣ﷍9ᚈ኷K㚊誦撪䚛,ꮪxሲ쳊\u0005HSf?asg昱dqꬌVꙇ㼺'k*'㈈": -5.937042203633044E-20 - } - ] - }], - "?}\u20e0],s嶳菋@#2u쒴sQS䩗=ꥮ;烌,|ꘔ䘆": "ᅩ영N璠kZ먕眻?2ቲ芋眑D륟渂⸑ﴃIRE]啗`K'" - }}, - "쨀jmV賂ﰊ姐䂦玞㬙ᏪM᪟Վ씜~`uOn*ॠ8\u000ef6??\\@/?9見d筜ﳋB|S䝬葫㽁o": true - }, - "즛ꄤ酳艚␂㺘봿㎨iG৕ࡿ?1\"䘓您\u001fSኝ⺿溏zៀ뻤B\u0019?윐a䳵᭱䉺膷d:<\/": 3935553551038864272 - } - ] - ]} - ]] - ]] - ]} - } - ] - } - ]]}}, - "᥺3h↛!ꋰy\"攜(ெl䪕oUkc1A㘞ᡲ촾ᣫ<\/䒌E㛝潨i{v?W౾H\\RჅpz蝬R脾;v:碽✘↯삞鷱o㸧瑠jcmK7㶧뾥찲n": true, - "ⶸ?x䊺⬝-䰅≁!e쩆2ꎿ准G踌XXᩯ1߁}0?.헀Z馟;稄\baDꟹ{-寪⚈ꉷ鮸_L7ƽᾚ<\u001bጨA䧆송뇵⨔\\礍뗔d设룱㶉cq{HyぱR㥽吢ſtp": -7985372423148569301, - "緫#콮IB6<\/=5Eh礹\t8럭@饹韠r㰛斣$甝LV췐a갵'请o0g:^": "䔨(.", - "띳℡圤pン௄ĝ倧訜B쁟G䙔\"Sb⓮;$$▏S1J뢙SF|赡g*\"Vu䲌y": "䪈&틐),\\kT鬜1풥;뷴'Zေ䩹@J鞽NぼM?坥eWb6榀ƩZڮ淽⺞삳煳xჿ絯8eⶍ羷V}ჿ쎱䄫R뱃9Z>'\u20f1ⓕ䏜齮" - } - ] - ]]] - }} - } - ] - ]}, - "펮b.h粔폯2npX詫g錰鷇㇒<쐙S値bBi@?镬矉`剔}c2壧ଭfhY깨R()痩⺃a\\⍔?M&ﯟ<劜꺄멊ᄟA\"_=": null - }, - "~潹Rqn榢㆓aR鬨侅?䜑亡V_翅㭔(䓷w劸ၳDp䀅<\/ﰎ鶊m䵱팱긽ꆘ긓准D3掱;o:_ќ)껚콥8곤d矦8nP倥ꃸI": null, - "뾎/Q㣩㫸벯➡㠦◕挮a鶧⋓偼\u00001뱓fm覞n?㛅\"": 2.8515592202045408E17 - }], - ",": -5426918750465854828, - "2櫫@0柡g䢻/gꆑ6演&D稒肩Y?艘/놘p{f투`飷ᒉ챻돎<늛䘍ﴡ줰쫄": false, - "8(鸑嵀⵹ퟡ<9㣎Tߗ┘d슒ل蘯&㠦뮮eࠍk砝g 엻": false, - "d-\u208b?0ﳮ嵙'(J`蔿d^踅⤔榥\\J⵲v7": 6.8002426206715341E17, - "ཎ耰큓ꐕ㱷\u0013y=詽I\"盈xm{0쾽倻䉚ષso#鰑/8㸴짯%ꀄ떸b츟*\\鲷礬ZQ兩?np㋄椂榨kc᡹醅3": false, - "싊j20": false - }]] - ]], - "俛\u0017n緽Tu뫉蜍鼟烬.ꭠIⰓ\"Ἀ᜾uC쎆J@古%ꛍm뻨ᾀ画蛐휃T:錖㑸ዚ9죡$": true - } - ] - ], - "㍵⇘ꦖ辈s}㱮慀밒s`\"㞟j:`i픻Z섫^諎0Ok{켿歁෣胰a2﨤[탳뚬쎼嫭뉮m": 409440660915023105, - "w墄#*ᢄ峠밮jLa`ㆪ꺊漓Lで끎!Agk'ꁛ뢃㯐岬D#㒦": false, - "ଦPGI䕺L몥罭ꃑ궩﮶#⮈ᢓӢ䚬p7웼臧%~S菠␌힀6&t䳙y㪘냏\\*;鉏ᅧ鿵'嗕pa\"oL쇿꬈Cg": "㶽1灸D⟸䴅ᆤ뉎﷛渤csx 䝔цꬃ锚捬?ຽ+x~꘩uI࡞\u0007栲5呚ẓem?袝\")=㥴䨃pac!/揎Y", - "ᷱo\\||뎂몷r篙|#X䦜I#딌媸픕叞RD斳X4t⯩夬=[뭲r=绥jh뷱츝⪘%]⚋܈㖴スH텹m(WO曝劉0~K3c柢Ր㏉着逳~": false, - "煽_qb[첑\\륌wE❽ZtCNﭝ+餌ᕜOꛭ": "{ﳾ쉌&s惧ᭁⵆ3䢫;䨞팑꒪흘褀࢖Q䠿V5뭀䎂澻%받u5텸oA⮥U㎦;B䳌wz䕙$ឿ\\௅婺돵⪾퐆\\`Kyौꋟ._\u0006L챯l뇠Hi䧈偒5", - "艊佁ࣃ롇䱠爬!*;⨣捎慓q靓|儑ᨋL+迥=6㒺딉6弄3辅J-㕎뛄듘SG㆛(\noAzQꝱ䰩X*ぢO퀌%펠낌mo틮a^<\/F&_눊ᾉ㨦ы4\"8H": 2974648459619059400, - "鬙@뎣䫳ၮ끡?){y?5K;TA*k溱䫜J汃ꂯ싔썍\u001dA}룖(<\/^,": false, - "몏@QꋦFꊩᒐ뎶lXl垨4^郣|ꮇ;䝴ᝓ}쵲z珖": null - } - ]]]], - ":_=닧弗D䙋暨鏛. 㱻붘䂍J儒&ZK/녩䪜r囁⽯D喠죥7⹌䪥c\u001a\u2076￞妈朹oLk菮F౟覛쐧㮏7T;}蛙2{9\"崓bB<\/⡷룀;즮鿹)丒툃୤뷠5W⊢嶜(fb뭳갣": "E{响1WM" - }}, - "䘨tjJ驳豨?y輊M*᳑梵瞻઻ofQG瑮e": 2.222802939724948E-19, - "䮴=❑➶T෋w䞜\"垦ꃼUt\u001dx;B$뵣䙶E↌艣ᡥ!᧟;䱀[䔯k쬃`੍8饙른熏'2_'袻tGf蒭J땟as꯳╖&啒zWࡇᒫYSᏬ\u0014ℑ첥鈤|cG~Pᓮ\">\"": "ႆl\f7V儊㦬nHꄬꨧC{쐢~C⮃⛓嶦vꄎ1w鰠嘩뿠魄&\"_qMⵖ釔녮ꝇ 㝚{糍J哋 cv?-jkﻯྌ鹑L舟r", - "龧葆yB✱H盋夔ﶉ?n*0(": "ꧣኆ㢓氥qZZ酒ຜ)鮢樛)X䣆gTSґG텞k.J圬疝롫쯭z L:\\ྤ@w炋塜쿖ᾳy뢀䶃뱝N䥨㚔勇겁#p", - "도畎Q娡\"@S/뼋:䵏!P衅촚fVHQs✜ᐫi㻑殡B䜇%믚k*U#濨낄~": "ꍟዕ쳸ꍈ敋&l妏\u0005憡멗瘌uPgᅪm<\/To쯬锩h뒓k" - } - ] - }], - "墥홞r绚<\/⸹ⰃB}<躅\\Y;๑@䔸>韫䜲뱀X뗩鿥쩗SI%ﴞ㳕䛇?<\/\u00018x\\&侂9鋙a[LR㋭W胕)⡿8㞙0JF,}?허d1cDMᐃ␛鄝ⱕ%X)!XQ": "ⳍꗳ=橇a;3t⦾꼑仈ူaᚯ⯋ꕃAs鴷N⍕_䎃ꙎAz\u0016䯷\\<࿫>8q{}キ?ᣰ}'0ᴕ펓B┦lF#趤厃T?㕊#撹圂䆲" - }, - "܋닐龫論c웑": false, - "ㇿ/q\"6-co髨휝C큦#\u001b4~?3䐹E삇<<": 7.600917488140322E-20, - "䁝E6?㣖ꃁ间t祗*鑠{ḣV(浾h逇큞=W?ૉ?nꇽ8ꅉຉj으쮺@Ꚅ㰤u]Oyr": "v≁᫸_*όAඤԆl)ۓᦇQ}폠z༏q滚", - "ソ᥊/넺I": true - }]] - ] - ] - ] - ]] - }, - "䭑Ik攑\u0002QV烄:芩.麑㟴㘨≕": true, - "坄꿕C쇻풉~崍%碼\\8\"䬦꣙": null, - "欌L圬䅘Y8c(♺2?ON}o椳s宥2䉀eJ%闹r冁O^K諭%凞⺉⡻,掜?$ꥉ?略焕찳㯊艼誜4?\"﯎<゛XፈINT:詓 +": -1.0750456770694562E-19, - "獒àc뜭싼ﺳ뎤K`]p隨LtE": null, - "甙8䵊神EIꩤ鐯ᢀ,ﵮU䝑u疒ử驺䚿≚ഋ梶秓F`覤譐#짾蔀묊4<媍쬦靪_Yzgcࡶ4k紥`kc[Lﮗ簐*I瀑[⾰L殽鑥_mGȠ<\/|囹灠g桰iri": true, - "챓ꖙꟻ좝菇ou,嗠0\\jK핻뜠qwQ?ഩ㼕3Y彦b\u009bJ榶N棨f?됦鏖綃6鳵M[OE봨u햏.Ꮁ癜蟳뽲ꩌ뻾rM豈R嗀羫 uDꎚ%": null - }, - "V傜2<": 7175127699521359521 - }], - "铫aG切<\/\"ী⊆e<^g࢛)D顝nאַ饼\u008c猪繩嵿ﱚCꡬ㻊g엺A엦\u000f暿_f꿤볝㦕桦`蒦䎔j甬%岝rj 糏": "䚢偎눴Au<4箞7礦Iﱔ坠eȧ䪸u䵁p|逹$嗫쨘ꖾ﷐!胠z寓팢^㨔|u8Nሇe텔ꅦ抷]،鹎㳁#༔繁 ", - "낂乕ꃻ볨ϱ-ꇋ㖍fs⿫)zꜦ/K?솞♞ꑌ宭hJ᤭瑥Fu": false, - "쟰ぜ魛G\u0003u?`㾕ℾ㣭5螠烶這趩ꖢ:@咕ꐶx뒘느m䰨b痃렐0鳊喵熬딃$摉_~7*ⱦ녯1錾GKhJ惎秴6'H妈Tᧅ窹㺒疄矤铟wላ": null, - "쯆q4!3錕㲏ⵆ㇛꘷Z瑩뭆\\◪NH\u001d\\㽰U~㯶<\"쑣낞3ᵤ'峉eꢬ;鬹o꣒木X*長PXᘱu\"䠹n惞": null, - "ᅸ祊\"&ꥴCjࢼ﴿?䡉`U效5殼㮞V昽ꏪ#ﺸ\\&t6x꠹盥꣰a[\u001aꪍSpe鎿蠹": -1.1564713893659811E-19 - } - ]] - ] - ] - ], - "羵䥳H,6ⱎ겾|@t\"#햊1|稃 섭)띜=뻔ꡜ???櫎~*ῡ꫌/繣ﻠq": null - } - ]} - ]}, - "츤": false - }}, - "s": 3.7339341963399598E18 - } - ], - "N,I?1+㢓|ࣱ嶃쩥V2\u0012(4EE虪朶$|w颇v步": "~읢~_,Mzr㐫YB溓E淚\"ⅹ䈔ᏺ抙 b,nt5V㐒J檶ꏨ⻔?", - "Q껑ꡡ}$넎qH煔惍/ez^!ẳF댙䝌馻剁8": "梲;yt钰$i冄}AL%a j뜐奷걳뚾d꿽*ሬuDY3?뮟鼯뮟w㍪틱V", - "o{Q/K O胟㍏zUdꀐm&⨺J舕⾏魸訟㌥[T籨櫉唐킝 aṭ뱫촙莛>碶覆⧬짙쭰ׯdAiH໥벤퐥_恸[ 0e:죃TC弼荎뵁DA:w唵ꣁ": null, - "὏樎䵮軧|?౗aWH쩃1 ꅭsu": null - } - ] - }, - "勂\\&m鰈J釮=Ⲽ鳋+䂡郑": null, - "殣b綊倶5㥗惢⳷萢ᑀ䬄镧M^ﱴ3⣢翣n櫻1㨵}ኯ뗙顖Z.Q➷ꮨ뗇\u0004": "ꔙ䁼>n^[GीA䨟AM琢ᒊS쨲w?d㶣젊嘶纝麓+愣a%気ྞSc됓ᔘ:8bM7Xd8㶑臌]Ꙥ0ꐭ쒙䫣挵C薽Dfⵃ떼᷸", - "?紡.셪_෨j\u0013Ox┠$Xᶨ-ᅇo薹-}軫;y毝㪜K㣁?.EV쮱4둽⛻䤜'2盡\u001f60(|e쐰㼎ᦀ㒧-$l@ﻑ坳\u0003䭱响巗WFo5c㧆T턁Y맸♤(": -2.50917882560589088E17 - }} - ], - "侸\\릩.᳠뎠狣살cs项䭩畳H1s瀉븇19?.w骴崖㤊h痠볭㞳㞳䁮Ql怠㦵": "@䟴-=7f", - "鹟1x௢+d ;vi䭴FSDS\u0004hꎹ㚍?⒍⦏ў6u,扩@됷Su)Pag휛TᒗV痩!瞏釀ꖞ蘥&ೞ蘐ꭰꞇᝎ": "ah懱Ժ&\u20f7䵅♎඀䞧鿪굛ౕ湚粎蚵ᯋ幌YOE)५襦㊝Y*^\"R+ඈ咷蝶9ꥂ榨艦멎헦閝돶v좛咊E)K㓷ྭr", - "搆q쮦4綱켙셁.f4<\/g<籽늷?#蚴픘:fF\u00051㹉뀭.ᰖ풎f֦Hv蔎㧤.!䭽=鞽]음H:?\"-4": 8.740133984938656E-20 - }]} - } - ], - "tVKn딩꘥⊾蹓᤹{\u0003lR꼽ᄲQFᅏ傅ﱋ猢⤊ᔁ,E㓒秤nTතv`♛I\u0000]꫔ṞD\"麵c踝杰X&濿또꣹깳౥葂鿎\\aꡨ?": 3900062609292104525 - } - ], - "ਉ샒⊩Lu@S䧰^g": -1.1487677090371648E18, - "⎢k⑊꬗yᏫ7^err糎Dt\u000bJ礯확ㆍ沑サꋽe赔㝢^J\u0004笲㿋idra剰-᪉C錇/Ĝ䂾ညS지?~콮gR敉⬹'䧭": 1901472137232418266, - "灗k䶥:?촽贍쓉꓈㒸g獘[뵎\\胕?\u0014_榙p.j稶,$`糉妋0>Fᡰly㘽$?": "]ꙛO赎&#㠃돱剳\"<◆>0誉齐_|z|裵씪>ᐌ㼍\"Z[琕}O?G뚇諦cs⠜撺5cu痑U圲\u001c?鴴計l춥/╓哼䄗茏ꮅ뫈댽A돌롖뤫V窗讬sHd&\nOi;_u" - } - ], - "Uﺗ\\Y\\梷䄬~\u0002": null, - "k\"Y磓ᗔ휎@U冈<\/w컑)[": false, - "曏J蝷⌻덦\u001f㙳s꥓⍟邫P늮쥄c∬ྡྷ舆렮칤Z趣5콡넛A쳨\\뀙骫(棻.*&輛LiIfi{@EA婳KᬰTXT": -4.3088230431977587E17 - }]} - ] - ], - "곃㲧<\/dఓꂟs其ࡧ&N葶=?c㠤Ჴ'횠숄臼#\u001a~": false - } - ] - ]}] - }] - }} - ], - "2f`⽰E쵟>J笂裭!〛觬囀ۺ쟰#桊l鹛ⲋ|RA_Vx፭gE됓h﵀mfỐ|?juTU档[d⢼⺻p濚7E峿": 5613688852456817133 - }, - "濘끶g忮7㏵殬W팕Q曁 뫰)惃廊5%-蹚zYZ樭ﴷQ锘쯤崫gg": true, - "絥ᇑ⦏쒓븣爚H.㗊߄o蘵貆ꂚ(쎔O᥉ﮓ]姨Wꁓ!RMA|o퉢THx轮7M껁U즨'i뾘舯o": "跥f꜃?" - }} - ], - "鷰鹮K-9k;ﰰ?_ݦѷ-ꅣ䩨Zꥱ\"mꠟ屎/콑Y╘2&鸞脇㏢ꀇ࠺ⰼ拾喭틮L꽩bt俸墶 [l/웄\"꾦\u20d3iও-&+\u000fQ+໱뵞": -1.296494662286671E-19 - }, - "HX੹/⨇୕붷Uﮘ旧\\쾜͔3l鄈磣糂̖䟎Eᐳw橖b῀_딕hu葰窳闹вU颵|染H죶.fP䗮:j䫢\\b뎖i燕ꜚG⮠W-≚뉗l趕": "ଊ칭Oa᡺$IV㷧L\u0019脴셀붿餲햪$迳向쐯켂PqfT\" ?I屉鴼쿕@硙z^鏕㊵M}㚛T젣쓌-W⩐-g%⺵<뮱~빅╴瑿浂脬\u0005왦燲4Ⴭb|D堧 <\/oEQh", - "䘶#㥘੐캔f巋ἡAJ䢚쭈ࣨ뫒*mᇊK,ࣺAꑱ\u000bR<\/A\"1a6鵌㯀bh곿w(\"$ꘁ*rಐ趣.d࿩k/抶면䒎9W⊃9": "漩b挋Sw藎\u0000", - "畀e㨼mK꙼HglKb,\"'䤜": null - }]}] - ] - ] - }] - ]} - ] - ]} - ], - "歙>駿ꣂ숰Q`J΋方樛(d鱾뼣(뫖턭\u20f9lচ9歌8o]8윶l얶?镖G摄탗6폋폵+g:䱫홊<멀뀿/س|ꭺs걐跶稚W々c㫣⎖": "㣮蔊깚Cꓔ舊|XRf遻㆚︆'쾉췝\\&言", - "殭\"cށɨꝙ䞘:嬮e潽Y펪㳅/\"O@ࠗ겴]췖YǞ(t>R\"N?梳LD恭=n氯T豰2R諸#N}*灧4}㶊G䍣b얚": null, - "襞<\/啧 B|싞W瓇)6簭鼡艆lN쩝`|펭佡\\間邝[z릶&쭟愱ꅅ\\T᰽1鯯偐栈4̸s윜R7⒝/똽?치X": "⏊躖Cﱰ2Qẫ脐&இ?%냝悊", - ",鰧偵셣싹xᎹ힨᯳EṬH㹖9": -4604276727380542356 - } - } - ]]]], - "웺㚑xs}q䭵䪠馯8?LB犯zK'os䚛HZ\"L?셎s^㿧㴘Cv2": null - }] - ] - ] - ], - "Kd2Kv+|z": 7367845130646124107, - "ᦂⶨ?ᝢ 祂些ഷ牢㋇操\"腭䙾㖪\\(y4cE뽺ㆷ쫺ᔖ%zfۻ$ў1柦,㶢9r漢": -3.133230960444846E-20, - "琘M焀q%㢟f鸯O⣏蓑맕鯊$O噷|)z褫^㢦⠮ꚯ꫞`毕1qꢚ{ĭ䎀বώT\"뱘3G൴?^^of": null - } - ], - "a8V᯺?:ﺃ/8ꉿBq|9啓댚;*i2": null, - "cpT瀇H珰Ừpೃi鎪Rr␣숬-鹸ҩ䠚z脚цGoN8入y%趌I┽2ឪЀiJNcN)槣/▟6S숆牟\"箑X僛G殱娇葱T%杻:J諹昰qV쨰": 8331037591040855245 - }], - "G5ᩜ䄗巢껳": true - } - }, - "Ồ巢ゕ@_譙A`碫鄐㡥砄㠓(^K": "?܃B혢▦@犑ὺD~T⧁|醁;o=J牌9냚⢽㨘{4觍蚔9#$∺\u0016p囅\\3Xk阖⪚\"UzA穕롬✎➁㭒춺C㣌ဉ\"2瓑员ᅽꝶ뫍}꽚ꞇ鶂舟彺]ꍽJC蝧銉", - "␆Ě膝\"b-퉐ACR言J謈53~V튥x䜢?ꃽɄY뮩ꚜ": "K/↾e萃}]Bs⾿q룅鷦-膋?m+死^魊镲6", - "粡霦c枋AHퟁo礼Ke?qWcA趸㡔ꂏ?\u000e춂8iতᦜ婪\u0015㢼nﵿꍻ!ᐴ関\u001d5j㨻gfῩUK5Ju丝tかTI'?㓏t>⼟o a>i}ᰗ;뤕ܝ": false, - "ꄮ匴껢ꂰ涽+䜨B蛹H䛓-k蕞fu7kL谖,'涃V~챳逋穞cT\"vQ쓕ObaCRQ㓡Ⲯ?轭⫦輢墳?vA餽=h䮇킵n폲퉅喙?\"'1疬V嬗Qd灗'Lự": "6v!s믁㭟㣯獃!磸餠ቂh0C뿯봗F鷭gꖶ~コkK<ᦈTt\\跓w㭣횋钘ᆹ듡䑚W䟾X'ꅔ4FL勉Vܴ邨y)2'〚쭉⽵-鞣E,Q.?块", - "?(˧쩯@崟吋歄K": null - }, - "Gc럃녧>?2DYI鴿\\륨)澔0ᔬlx'觔7젘⤡縷螩%Sv׫묈/]↱&S h\u0006歋ᑛxi̘}ひY蔯_醨鯘煑橾8?䵎쨋z儬ꁏ*@츾:": null - } - } - } - ] - ] - ]} - }, - "HO츧G": 3.694949578823609E17, - "QC\u0012(翻曇Tf㷟bGBJ옉53\\嚇ᛎD/\u001b夾၉4\"핀@祎)쫆yD\"i먎Vn㿿V1W᨝䶀": -6150931500380982286, - "Z㓮P翸鍱鉼K䋞꘺튿⭁Y": -7704503411315138850, - "]모开ꬖP븣c霤<[3aΠ\"黁䖖䰑뮋ꤦ秽∼㑷冹T+YUt\"싳F↭䖏&鋌": -2.7231911483181824E18, - "tꎖ": -4.9517948741799555E-19, - "䋘즊.⬅IꬃۣQ챢ꄑ黐|f?C⾺|兕읯sC鬸섾整腨솷V": "旆柩l쪦sᖸMy㦅울썉瘗㎜檵9ꍂ駓ૉᚿ/u3씅徐拉[Z䞸ࡗ1ꆱ&Q풘?ǂ8\u0011BCDY2볨;鸏": null, - "幫 n煥s쁇펇 왊-$C\"衝:\u0014㣯舼.3뙗Yl⋇\"K迎멎[꽵s}9鉳UK8쐥\"掄㹖h㙈!얄સ?Ꜳ봺R伕UTD媚I䜘W鏨蔮": -4.150842714188901E-17, - "ﺯ^㄄\b죵@fྉkf颡팋Ꞧ{/Pm0V둳⻿/落韒ꊔᚬ@5螺G\\咸a谆⊪ቧ慷绖?财(鷇u錝F=r၍橢ឳn:^iᴵtD볠覅N赴": null - }] - }] - } - ] - ]} - ]}, - "謯?w厓奰T李헗聝ឍ貖o⪇弒L!캶$ᆅ": -4299324168507841322, - "뺊奉_垐浸延몏孄Z舰2i$q붿좾껇d▵餏\"v暜Ҭ섁m￴g>": -1.60911932510533427E18 - } - ] - } - ] - ]], - "퉝꺔㠦楶Pꅱ": 7517896876489142899, - "": false - } - ]}, - "是u&I狻餼|谖j\"7c됮sסּ-踳鉷`䣷쉄_A艣鳞凃*m⯾☦椿q㎭N溔铉tlㆈ^": 1.93547720203604352E18, - "kⲨ\\%vr#\u000bⒺY\\t<\/3﬌R訤='﹠8蝤Ꞵ렴曔r": false - } - ]}, - "阨{c?C\u001d~K?鎌Ԭ8烫#뙣P초遗t㭱E­돒䆺}甗[R*1!\\~h㕅᰺@<9JꏏષI䳖栭6綘걹ᅩM\"▯是∔v鬽顭⋊譬": "운ﶁK敂(欖C취پ℄爦賾" - } - }} - }], - "鷨赼鸙+\\䭣t圙ڹx᜾ČN<\/踘\"S_맶a鷺漇T彚⎲i㈥LT-xA캔$\u001cUH=a0츺l릦": "溣㣂0濕=鉵氬駘>Pꌢpb솇쬤h힊줎獪㪬CrQ矠a&脍꼬爼M茴/΅\u0017弝轼y#Ꞡc6둴=?R崏뷠麖w?" - }, - "閕ᘜ]CT)䵞l9z'xZF{:ؐI/躅匽졁:䟇AGF૸\u001cퟗ9)駬慟ꡒꆒRS״툋A<>\u0010\"ꂔ炃7g덚E৏bꅰ輤]o㱏_뷕ܘ暂\"u": "芢+U^+㢩^鱆8*1鈶鮀\u0002뺰9⬳ꪮlL䃣괟,G8\u20a8DF㉪錖0ㄤ瓶8Nଷd?眡GLc陓\\_죌V쁰ल二?c띦捱 \u0019JC\u0011b⤉zẒT볕\"绣蘨뚋cꡉkI\u001e鳴", - "ꃣI'{6u^㡃#཰Kq4逹y൒䧠䵮!㱙/n??{L풓ZET㙠퍿X2᩟綳跠葿㚙w཮x캽扳B唕S|尾}촕%N?o䪨": null, - "ⰴFjෟ셈[\u0018辷px?椯\\1<ﲻ栘ᣁ봢憠뉴p": -5263694954586507640 - } - ] - ]] - ]} - ]}] - ] - ], - "?#癘82禩鋆ꊝty?&": -1.9419029518535086E-19 - } - ] - ] - ]} - ] - ] - ], - "훊榲.|῕戄&.㚏Zꛦ2\"䢥ሆ⤢fV_摕婔?≍Fji冀탆꜕i㏬_ẑKᅢ꫄蔻XWc|饡Siẘ^㲦?羡2ぴ1縁ᙅ?쐉Ou": false - }]] - ]}}}, - "慂뗄卓蓔ᐓ匐嚖/颹蘯/翻ㆼL?뇊,텵<\\獷ごCボ": null - }, - "p溉ᑟi짣z:䒤棇r^٫%G9缑r砌롧.물农g?0׼ሩ4ƸO㣥㯄쩞ጩ": null, - "껎繥YxK\"F젷쨹뤤1wq轫o?鱑뜀瘊?뎃h灑\\ꛣ}K峐^ኖ⤐林ꉓhy": null - } - ], - "᱀n肓ㄛ\"堻2>m殮'1橌%Ꞵ군=Ӳ鯨9耛<\/n據0u彘8㬇៩f᏿诙]嚊": "䋯쪦S럶匏ㅛ#)O`ሀX_鐪渲⛀㨻宅闩➈ꢙஶDR⪍" - }, - "tA썓龇 ⋥bj왎录r땽✒롰;羋^\\?툳*┎?썀ma䵳넅U䳆૘〹䆀LQ0\b疀U~u$M}(鵸g⳾i抦뛹?䤈땚검.鹆?ꩡtⶥGĒ;!ቹHS峻B츪켏f5≺": 2366175040075384032, - "전pJjleb]ួ": -7.5418493141528422E18, - "n.鎖ጲ\n?,$䪘": true - }, - "欈Ar㉣螵᪚茩?O)": null - }, - "쫸M#x}D秱欐K=侫们丐.KꕾxẠ\u001e㿯䣛F܍캗qq8꟞ṢFD훎⵳簕꭛^鳜\u205c٫~⑟~冫ऊ2쫰<\/戲윱o<\"": true - }, - "㷝聥/T뱂\u0010锕|内䞇x侁≦㭖:M?iM᣿IJe煜dG࣯尃⚩gPt*辂.{磼럾䝪@a\\袛?}ᓺB珼": true - } - } - ]]}]}}, - "tn\"6ꫤ샾䄄;銞^%VBPwu묪`Y僑N.↺Ws?3C⤻9唩S䠮ᐴm;sᇷ냞඘B/;툥B?lB∤)G+O9m裢0kC햪䪤": -4.5941249382502277E18, - "ᚔt'\\愫?鵀@\\びꂕP큠<<]煹G-b!S?\nꖽ鼫,ݛ&頺y踦?E揆릱H}햧캡b@手.p탻>췽㣬ꒅ`qe佭P>ᓂ&?u}毚ᜉ蟶頳졪ᎏzl2wO": -2.53561440423275936E17 - }]} - } - ] - ]], - "潈촒⿂叡": 5495738871964062986 - } - ]] - } - ] - ]} - ]] - ]] - ]} - ] - ]}, - "ႁq킍蓅R`謈蟐ᦏ儂槐僻ﹶ9婌櫞釈~\"%匹躾ɢ뤥>࢟瀴愅?殕节/냔O✬H鲽엢?ᮈੁ⋧d␽㫐zCe*": 2.15062231586689536E17, - "㶵Ui曚珰鋪ᾼ臧P{䍏䷪쨑̟A뼿T渠誈䏚D1!잶<\/㡍7?)2l≣穷᛾稝{:;㡹nemיּ訊`G": null, - "䀕\"飕辭p圁f#뫆䶷뛮;⛴ᩍ3灚덏ᰝ쎓⦷詵%᜖Մfs⇫(\u001e~P|ﭗCⲾផv湟W첋(텪બT<บSꏉ੗⋲X婵i ӵ⇮?L䬇|ꈏ?졸": 1.548341247351782E-19 - } - ] - }, - "t;:N\u0015q鐦Rt缆{ꮐC?஛㷱敪\\+鲊㉫㓪몗릙竏(氵kYS": "XᰂT?൮ô", - "碕飦幑|+ 㚦鏶`镥ꁩ B<\/加륙": -4314053432419755959, - "秌孳(p!G?V傫%8ሽ8w;5鲗㦙LI檸\u2098": "zG N볞䆭鎍흘\\ONK3횙<\/樚立圌Q튅k쩎Ff쁋aׂJK銆ઘ즐狩6༥✙䩜篥CzP(聻駇HHퟲ讃%,ά{렍p而刲vy䦅ክ^톺M楒鍢㹳]Mdg2>䤉洞", - "踛M젧>忔芿㌜Zk": 2215369545966507819, - "씐A`$槭頰퍻^U覒\bG毲aᣴU;8!팲f꜇E⸃_卵{嫏羃X쀳C7뗮m(嚼u N܁谟D劯9]#": true, - "ﻩ!뵸-筚P᭛}ἰ履lPh?౮ⶹꆛ穉뎃g萑㑓溢CX뾇G㖬A錟]RKaꄘ]Yo+@䘁's섎襠$^홰}F": null - }, - "粘ꪒ4HXᕘ蹵.$區\r\u001d묁77pPc^y笲Q<\/ꖶ 訍䃍ᨕG?*": 1.73773035935040224E17 - }, - "婅拳?bkU;#D矠❴vVN쩆t㜷A풃갮娪a%鮏絪3dAv룒#tm쑬⌛qYwc4|L8KZ;xU⓭㳔밆拓EZ7襨eD|隰ऌ䧼u9Ԣ+]贴P荿": 2.9628516456987075E18 - }]}}] - ]} - }} - ]}] - ], - "|g翉F*湹̶\u0005⏐1脉̀eI쩓ᖂ㫱0碞l䴨ꑅ㵽7AtἈ턧yq䳥塑:z:遀ᄐX눔擉)`N3昛oQ셖y-ڨ⾶恢ꈵq^<\/": null, - "菹\\랓G^璬x৴뭸ゆUS겧﮷Bꮤ ┉銜᯻0%N7}~f洋坄Xꔼ<\/4妟Vꄟ9:౟곡t킅冩䧉笭裟炂4봋ⱳ叺怊t+怯涗\"0㖈Hq": false, - "졬믟'ﺇফ圪쓬멤m邸QLব䗁愍4jvs翙 ྍ꧀艳H-|": null, - "컮襱⣱뗠 R毪/鹙꾀%헳8&": -5770986448525107020 - } - ], - "B䔚bꐻ뙏姓展槰T-똌鷺tc灿᫽^㓟䏀o3o$꘭趙萬I顩)뇭Ἑ䓝\f@{ᣨ`x3蔛": null - } - ] - ] - }], - "⦖扚vWꃱ꥙㾠壢輓{-⎳鹷贏璿䜑bG倛⋐磎c皇皩7a~ﳫU╣Q࠭ꎉS摅姽OW.홌ೞ.": null, - "蚪eVlH献r}ᮏ믠ﰩꔄ@瑄ⲱ": null, - "퀭$JWoꩢg역쁍䖔㑺h&ୢtXX愰㱇?㾫I_6 OaB瑈q裿": null, - "꽦ﲼLyr纛Zdu珍B絟쬴糔?㕂짹䏵e": "ḱ\u2009cX9멀i䶛簆㳀k" - } - ]]]], - "(_ꏮg່澮?ᩑyM<艷\u001aꪽ\\庼뙭Z맷㰩Vm\\lY筺]3㋲2㌩㄀Eਟ䝵⨄쐨ᔟgङHn鐖⤇놋瓇Q탚單oY\"♆臾jHᶈ征ቄ??uㇰA?#1侓": null - }, - "觓^~ሢ&iI띆g륎ḱ캀.ᓡꀮ胙鈉": 1.0664523593012836E-19, - "y詭Gbᔶऽs댁U:杜⤎ϲ쁗⮼D醄诿q뙰I#즧v蔎xHᵿt᡽[**?崮耖p缫쿃L菝,봬ꤦC쯵#=X1瞻@OZc鱗CQTx": null - } - ] - }}], - "剘紁\u0004\\Xn⊠6,တױ;嵣崇}讃iႽ)d1\\䔓": null - }, - "脨z\"{X,1u찜<'k&@?1}Yn$\u0015Rd輲ーa쮂굄+B$l": true, - "諳>*쭮괐䵟Ґ+<箁}빀䅱⡔檏臒hIH脟ꩪC핝ଗP좕\"0i<\/C褻D۞恗+^5?'ꂱ䚫^7}㡠cq6\\쨪ꔞꥢ?纖䫀氮蒫侲빦敶q{A煲G": -6880961710038544266 - }}] - }, - "5s⨲JvಽῶꭂᄢI.a৊": null, - "?1q꽏쿻ꛋDR%U娝>DgN乭G": -1.2105047302732358E-19 - } - ] - ]}, - "qZz`撋뙹둣j碇쁏\\ꆥ\u0018@藴疰Wz)O{F䶛l᷂绘訥$]뮍夻䢋䩇萿獰樧猵⣭j萶q)$꬚⵷0馢W:Ⱍ!Qoe": -1666634370862219540, - "t": "=wp|~碎Q鬳Ӎ\\l-<\/^ﳊhn퐖}䍔t碵ḛ혷?靻䊗", - "邙쇡㯇%#=,E4勃驆V繚q[Y댻XV㡸[逹ᰏ葢B@u=JS5?bLRn얮㍉⏅ﰳ?a6[&큟!藈": 1.2722786745736667E-19 - }, - "X블땨4{ph鵋ꉯ웸 5p簂䦭s_E徔濧d稝~No穔噕뽲)뉈c5M윅>⚋[岦䲟懷恁?鎐꓆ฬ爋獠䜔s{\u001bm鐚儸煛%bﯿXT>ꗘ@8G": 1157841540507770724, - "媤娪Q杸\u0011SAyᡈ쿯": true, - "灚^ಸ%걁<\/蛯?\"祴坓\\\\'흍": -3.4614808555942579E18, - "釴U:O湛㴑䀣렑縓\ta)(j:숾却䗌gCiB뽬Oyuq輥厁/7)?今hY︺Q": null - } - ] - ]]]}] - ], - "I笔趠Ph!<ཛྷ㸞诘X$畉F\u0005笷菟.Esr릙!W☆䲖뗷莾뒭U\"䀸犜Uo3Gꯌx4r蔇᡹㧪쨢準<䂀%ࡡꟼ瑍8炝Xs0䀝销?fi쥱ꆝલBB": -8571484181158525797, - "L⦁o#J|\"⽩-㱢d㌛8d\\㶤傩儻E[Y熯)r噤὘勇 }": "e(濨쓌K䧚僒㘍蠤Vᛸ\"络QJL2,嬓왍伢㋒䴿考澰@(㏾`kX$끑эE斡,蜍&~y", - "vj.|统圪ᵮPL?2oŶ`밧\"勃+0ue%⿥绬췈체$6:qa렐Q;~晘3㙘鹑": true, - "ශؙ4獄⶿c︋i⚅:ん閝Ⳙ苆籦kw{䙞셕pC췃ꍬ␜꟯ꚓ酄b힝hwk꭭M鬋8B耳쑘WQ\\偙ac'唀x᪌\u2048*h짎#ፇ鮠뾏ឿ뀌": false, - "⎀jꄒ牺3Ⓝ컴~?親ꕽぼܓ喏瘘!@<튋㐌꿱⩦{a?Yv%⪧笯Uܱ栅E搚i뚬:ꄃx7䙳ꦋ&䓹vq☶I䁘ᾘ涜\\썉뺌Lr%Bc㍜3?ꝭ砿裞]": null, - "⭤뙓z(㡂%亳K䌽꫿AԾ岺㦦㼴輞낚Vꦴw냟鬓㹈뽈+o3譻K1잞": 2091209026076965894, - "ㇲ\t⋇轑ꠤ룫X긒\"zoY읇희wj梐쐑l侸`e%s": -9.9240075473576563E17, - "啸ꮑ㉰!ᚓ}銏": -4.0694813896301194E18, - ">]囋੽EK뇜>_ꀣ緳碖{쐐裔[<ನ\"䇅\"5L?#xTwv#罐\u0005래t应\\N?빗;": "v쮽瞭p뭃" - } - ]], - "斴槾?Z翁\"~慍弞ﻆ=꜡o5鐋dw\"?K蠡i샾ogDﲰ_C*⬟iㇷ4nય蟏[㟉U꽌娛苸 ঢ়操贻洞펻)쿗૊許X⨪VY츚Z䍾㶭~튃ᵦ<\/E臭tve猑x嚢": null, - "锡⛩<\/칥ꈙᬙ蝀&Ꚑ籬■865?_>L詏쿨䈌浿弥爫̫lj&zx<\/C쉾?覯n?": null, - "꾳鑤/꼩d=ᘈn挫ᑩ䰬ZC": "3錢爋6Ƹ䴗v⪿Wr益G韠[\u0010屗9쁡钁u?殢c䳀蓃樄욂NAq赟c튒瘁렶Aૡɚ捍" - } - ] - ] - ]} - ] - ] - }]]]}} - ]}], - "Ej䗳U<\/Q=灒샎䞦,堰頠@褙g_\u0003ꤾfⶽ?퇋!łB〙ד3CC䌴鈌U:뭔咎(Qો臃䡬荋BO7㢝䟸\"Yb": 2.36010731779814E-20, - "逸'0岔j\u000e눘먷翌C츊秦=ꭣ棭ှ;鳸=麱$XP⩉駚橄A\\좱⛌jqv䰞3Ь踌v㳆¹gT┌gvLB賖烡m?@E঳i": null - }, - "曺v찘ׁ?&绫O័": 9107241066550187880 - } - ] - ], - "(e屄\u0019昜훕琖b蓘ᬄ0/۲묇Z蘮ဏ⨏蛘胯뢃@㘉8ሪWᨮ⦬ᅳ䅴HI၇쨳z囕陻엣1赳o": true, - ",b刈Z,ၠ晐T솝ŕB⩆ou'퐼≃绗雗d譊": null, - "a唥KB\"ﳝ肕$u\n^⅄P䟼냉䞸⩪u윗瀱ꔨ#yşs꒬=1|ﲤ爢`t౐튼쳫_Az(Ṋ擬㦷좕耈6": 2099309172767331582, - "?㴸U<\/䢔ꯡ阽扆㐤q鐋?f㔫wM嬙-;UV죫嚔픞G&\"Cᗍ䪏풊Q": "VM7疹+陕枡툩窲}翡䖶8欞čsT뮐}璤:jﺋ鎴}HfA൝⧻Zd#Qu茅J髒皣Y-︴[?-~쉜v딏璮㹚䅊﩯<-#\u000e걀h\u0004u抱﵊㼃U<㱷⊱IC進" - }, - "숌dee節鏽邺p넱蹓+e罕U": true - } - ], - "b⧴룏??ᔠ3ぱ>%郿劃翐ꏬꠛW瞳᫏누躨狀ໄy੽\"ីuS=㨞馸k乆E": "トz݈^9R䬑<ﮛGRꨳ\u000fTT泠纷꽀MRᴱ纊:㠭볮?%N56%鈕1䗍䜁a䲗j陇=뿻偂衋࿘ᓸ?ᕵZ+<\/}H耢b䀁z^f$&㝒LkꢳI脚뙛u": 5.694374481577558E-20 - }] - } - ]], - "obj": {"key": "wrong value"}, - "퓲꽪m{㶩/뇿#⼢&᭙硞㪔E嚉c樱㬇1a綑᝖DḾ䝩": null - } -} \ No newline at end of file diff --git a/resources/3rdparty/modernjson/test/src/catch.hpp b/resources/3rdparty/modernjson/test/src/catch.hpp deleted file mode 100755 index 5cc33a838..000000000 --- a/resources/3rdparty/modernjson/test/src/catch.hpp +++ /dev/null @@ -1,10359 +0,0 @@ -/* - * Catch v1.3.4 - * Generated: 2016-02-10 19:24:03.089683 - * ---------------------------------------------------------- - * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ -#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - -#define TWOBLUECUBES_CATCH_HPP_INCLUDED - -#ifdef __clang__ -# pragma clang system_header -#elif defined __GNUC__ -# pragma GCC system_header -#endif - -// #included from: internal/catch_suppress_warnings.h - -#ifdef __clang__ -# ifdef __ICC // icpc defines the __clang__ macro -# pragma warning(push) -# pragma warning(disable: 161 1682) -# else // __ICC -# pragma clang diagnostic ignored "-Wglobal-constructors" -# pragma clang diagnostic ignored "-Wvariadic-macros" -# pragma clang diagnostic ignored "-Wc99-extensions" -# pragma clang diagnostic ignored "-Wunused-variable" -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wpadded" -# pragma clang diagnostic ignored "-Wc++98-compat" -# pragma clang diagnostic ignored "-Wc++98-compat-pedantic" -# pragma clang diagnostic ignored "-Wswitch-enum" -# pragma clang diagnostic ignored "-Wcovered-switch-default" -# endif -#elif defined __GNUC__ -# pragma GCC diagnostic ignored "-Wvariadic-macros" -# pragma GCC diagnostic ignored "-Wunused-variable" -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wpadded" -#endif -#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) -# define CATCH_IMPL -#endif - -#ifdef CATCH_IMPL -# ifndef CLARA_CONFIG_MAIN -# define CLARA_CONFIG_MAIN_NOT_DEFINED -# define CLARA_CONFIG_MAIN -# endif -#endif - -// #included from: internal/catch_notimplemented_exception.h -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED - -// #included from: catch_common.h -#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED - -#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line -#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) - -#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr -#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) - -#include -#include -#include - -// #included from: catch_compiler_capabilities.h -#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED - -// Detect a number of compiler features - mostly C++11/14 conformance - by compiler -// The following features are defined: -// -// CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported? -// CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported? -// CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods -// CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported? -// CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported -// CATCH_CONFIG_CPP11_LONG_LONG : is long long supported? -// CATCH_CONFIG_CPP11_OVERRIDE : is override supported? -// CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) - -// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported? - -// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? - -// **************** -// Note to maintainers: if new toggles are added please document them -// in configuration.md, too -// **************** - -// In general each macro has a _NO_ form -// (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature. -// Many features, at point of detection, define an _INTERNAL_ macro, so they -// can be combined, en-mass, with the _NO_ forms later. - -// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 - -#ifdef __clang__ - -# if __has_feature(cxx_nullptr) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -# if __has_feature(cxx_noexcept) -# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// Borland -#ifdef __BORLANDC__ - -#endif // __BORLANDC__ - -//////////////////////////////////////////////////////////////////////////////// -// EDG -#ifdef __EDG_VERSION__ - -#endif // __EDG_VERSION__ - -//////////////////////////////////////////////////////////////////////////////// -// Digital Mars -#ifdef __DMC__ - -#endif // __DMC__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -// - otherwise more recent versions define __cplusplus >= 201103L -// and will get picked up below - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#if (_MSC_VER >= 1600) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) -#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#endif - -#endif // _MSC_VER - -//////////////////////////////////////////////////////////////////////////////// - -// Use variadic macros if the compiler supports them -#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ - ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ - ( defined __GNUC__ && __GNUC__ >= 3 ) || \ - ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) - -#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS - -#endif - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// catch all support for C++11 -#if defined(__cplusplus) && __cplusplus >= 201103L - -# define CATCH_CPP11_OR_GREATER - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -# define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM -# define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE -# define CATCH_INTERNAL_CONFIG_CPP11_TUPLE -# endif - -# ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS -# define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS -# endif - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) -# define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG -# endif - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) -# define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE -# endif -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) -# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -# endif - -#endif // __cplusplus >= 201103L - -// Now set the actual defines based on the above + anything the user has configured -#if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_NULLPTR -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_NOEXCEPT -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_GENERATED_METHODS -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_IS_ENUM -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_TUPLE -#endif -#if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS) -# define CATCH_CONFIG_VARIADIC_MACROS -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_LONG_LONG -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_OVERRIDE -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_UNIQUE_PTR -#endif - -// noexcept support: -#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) -# define CATCH_NOEXCEPT noexcept -# define CATCH_NOEXCEPT_IS(x) noexcept(x) -#else -# define CATCH_NOEXCEPT throw() -# define CATCH_NOEXCEPT_IS(x) -#endif - -// nullptr support -#ifdef CATCH_CONFIG_CPP11_NULLPTR -# define CATCH_NULL nullptr -#else -# define CATCH_NULL NULL -#endif - -// override support -#ifdef CATCH_CONFIG_CPP11_OVERRIDE -# define CATCH_OVERRIDE override -#else -# define CATCH_OVERRIDE -#endif - -// unique_ptr support -#ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR -# define CATCH_AUTO_PTR( T ) std::unique_ptr -#else -# define CATCH_AUTO_PTR( T ) std::auto_ptr -#endif - -namespace Catch { - - struct IConfig; - - struct CaseSensitive { enum Choice { - Yes, - No - }; }; - - class NonCopyable { -#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - NonCopyable( NonCopyable const& ) = delete; - NonCopyable( NonCopyable && ) = delete; - NonCopyable& operator = ( NonCopyable const& ) = delete; - NonCopyable& operator = ( NonCopyable && ) = delete; -#else - NonCopyable( NonCopyable const& info ); - NonCopyable& operator = ( NonCopyable const& ); -#endif - - protected: - NonCopyable() {} - virtual ~NonCopyable(); - }; - - class SafeBool { - public: - typedef void (SafeBool::*type)() const; - - static type makeSafe( bool value ) { - return value ? &SafeBool::trueValue : 0; - } - private: - void trueValue() const {} - }; - - template - inline void deleteAll( ContainerT& container ) { - typename ContainerT::const_iterator it = container.begin(); - typename ContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete *it; - } - template - inline void deleteAllValues( AssociativeContainerT& container ) { - typename AssociativeContainerT::const_iterator it = container.begin(); - typename AssociativeContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete it->second; - } - - bool startsWith( std::string const& s, std::string const& prefix ); - bool endsWith( std::string const& s, std::string const& suffix ); - bool contains( std::string const& s, std::string const& infix ); - void toLowerInPlace( std::string& s ); - std::string toLower( std::string const& s ); - std::string trim( std::string const& str ); - bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); - - struct pluralise { - pluralise( std::size_t count, std::string const& label ); - - friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); - - std::size_t m_count; - std::string m_label; - }; - - struct SourceLineInfo { - - SourceLineInfo(); - SourceLineInfo( char const* _file, std::size_t _line ); - SourceLineInfo( SourceLineInfo const& other ); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - SourceLineInfo( SourceLineInfo && ) = default; - SourceLineInfo& operator = ( SourceLineInfo const& ) = default; - SourceLineInfo& operator = ( SourceLineInfo && ) = default; -# endif - bool empty() const; - bool operator == ( SourceLineInfo const& other ) const; - bool operator < ( SourceLineInfo const& other ) const; - - std::string file; - std::size_t line; - }; - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); - - // This is just here to avoid compiler warnings with macro constants and boolean literals - inline bool isTrue( bool value ){ return value; } - inline bool alwaysTrue() { return true; } - inline bool alwaysFalse() { return false; } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); - - void seedRng( IConfig const& config ); - unsigned int rngSeed(); - - // Use this in variadic streaming macros to allow - // >> +StreamEndStop - // as well as - // >> stuff +StreamEndStop - struct StreamEndStop { - std::string operator+() { - return std::string(); - } - }; - template - T const& operator + ( T const& value, StreamEndStop ) { - return value; - } -} - -#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) -#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); - -#include - -namespace Catch { - - class NotImplementedException : public std::exception - { - public: - NotImplementedException( SourceLineInfo const& lineInfo ); - NotImplementedException( NotImplementedException const& ) {} - - virtual ~NotImplementedException() CATCH_NOEXCEPT {} - - virtual const char* what() const CATCH_NOEXCEPT; - - private: - std::string m_what; - SourceLineInfo m_lineInfo; - }; - -} // end namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) - -// #included from: internal/catch_context.h -#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED - -// #included from: catch_interfaces_generators.h -#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED - -#include - -namespace Catch { - - struct IGeneratorInfo { - virtual ~IGeneratorInfo(); - virtual bool moveNext() = 0; - virtual std::size_t getCurrentIndex() const = 0; - }; - - struct IGeneratorsForTest { - virtual ~IGeneratorsForTest(); - - virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; - virtual bool moveNext() = 0; - }; - - IGeneratorsForTest* createGeneratorsForTest(); - -} // end namespace Catch - -// #included from: catch_ptr.hpp -#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - // An intrusive reference counting smart pointer. - // T must implement addRef() and release() methods - // typically implementing the IShared interface - template - class Ptr { - public: - Ptr() : m_p( CATCH_NULL ){} - Ptr( T* p ) : m_p( p ){ - if( m_p ) - m_p->addRef(); - } - Ptr( Ptr const& other ) : m_p( other.m_p ){ - if( m_p ) - m_p->addRef(); - } - ~Ptr(){ - if( m_p ) - m_p->release(); - } - void reset() { - if( m_p ) - m_p->release(); - m_p = CATCH_NULL; - } - Ptr& operator = ( T* p ){ - Ptr temp( p ); - swap( temp ); - return *this; - } - Ptr& operator = ( Ptr const& other ){ - Ptr temp( other ); - swap( temp ); - return *this; - } - void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } - T* get() const{ return m_p; } - T& operator*() const { return *m_p; } - T* operator->() const { return m_p; } - bool operator !() const { return m_p == CATCH_NULL; } - operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); } - - private: - T* m_p; - }; - - struct IShared : NonCopyable { - virtual ~IShared(); - virtual void addRef() const = 0; - virtual void release() const = 0; - }; - - template - struct SharedImpl : T { - - SharedImpl() : m_rc( 0 ){} - - virtual void addRef() const { - ++m_rc; - } - virtual void release() const { - if( --m_rc == 0 ) - delete this; - } - - mutable unsigned int m_rc; - }; - -} // end namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#include -#include -#include - -namespace Catch { - - class TestCase; - class Stream; - struct IResultCapture; - struct IRunner; - struct IGeneratorsForTest; - struct IConfig; - - struct IContext - { - virtual ~IContext(); - - virtual IResultCapture* getResultCapture() = 0; - virtual IRunner* getRunner() = 0; - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; - virtual bool advanceGeneratorsForCurrentTest() = 0; - virtual Ptr getConfig() const = 0; - }; - - struct IMutableContext : IContext - { - virtual ~IMutableContext(); - virtual void setResultCapture( IResultCapture* resultCapture ) = 0; - virtual void setRunner( IRunner* runner ) = 0; - virtual void setConfig( Ptr const& config ) = 0; - }; - - IContext& getCurrentContext(); - IMutableContext& getCurrentMutableContext(); - void cleanUpContext(); - Stream createStream( std::string const& streamName ); - -} - -// #included from: internal/catch_test_registry.hpp -#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED - -// #included from: catch_interfaces_testcase.h -#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED - -#include - -namespace Catch { - - class TestSpec; - - struct ITestCase : IShared { - virtual void invoke () const = 0; - protected: - virtual ~ITestCase(); - }; - - class TestCase; - struct IConfig; - - struct ITestCaseRegistry { - virtual ~ITestCaseRegistry(); - virtual std::vector const& getAllTests() const = 0; - virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; - }; - - bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); - std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); - std::vector const& getAllTestCasesSorted( IConfig const& config ); - -} - -namespace Catch { - -template -class MethodTestCase : public SharedImpl { - -public: - MethodTestCase( void (C::*method)() ) : m_method( method ) {} - - virtual void invoke() const { - C obj; - (obj.*m_method)(); - } - -private: - virtual ~MethodTestCase() {} - - void (C::*m_method)(); -}; - -typedef void(*TestFunction)(); - -struct NameAndDesc { - NameAndDesc( const char* _name = "", const char* _description= "" ) - : name( _name ), description( _description ) - {} - - const char* name; - const char* description; -}; - -void registerTestCase - ( ITestCase* testCase, - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ); - -struct AutoReg { - - AutoReg - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - - template - AutoReg - ( void (C::*method)(), - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - registerTestCase - ( new MethodTestCase( method ), - className, - nameAndDesc, - lineInfo ); - } - - ~AutoReg(); - -private: - AutoReg( AutoReg const& ); - void operator= ( AutoReg const& ); -}; - -void registerTestCaseFunction - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE( ... ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ - namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ - } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ - Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); - -#else - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ - namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ - } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \ - Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); -#endif - -// #included from: internal/catch_capture.hpp -#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED - -// #included from: catch_result_builder.h -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED - -// #included from: catch_result_type.h -#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED - -namespace Catch { - - // ResultWas::OfType enum - struct ResultWas { enum OfType { - Unknown = -1, - Ok = 0, - Info = 1, - Warning = 2, - - FailureBit = 0x10, - - ExpressionFailed = FailureBit | 1, - ExplicitFailure = FailureBit | 2, - - Exception = 0x100 | FailureBit, - - ThrewException = Exception | 1, - DidntThrowException = Exception | 2, - - FatalErrorCondition = 0x200 | FailureBit - - }; }; - - inline bool isOk( ResultWas::OfType resultType ) { - return ( resultType & ResultWas::FailureBit ) == 0; - } - inline bool isJustInfo( int flags ) { - return flags == ResultWas::Info; - } - - // ResultDisposition::Flags enum - struct ResultDisposition { enum Flags { - Normal = 0x01, - - ContinueOnFailure = 0x02, // Failures fail test, but execution continues - FalseTest = 0x04, // Prefix expression with ! - SuppressFail = 0x08 // Failures are reported but do not fail the test - }; }; - - inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { - return static_cast( static_cast( lhs ) | static_cast( rhs ) ); - } - - inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } - inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } - inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } - -} // end namespace Catch - -// #included from: catch_assertionresult.h -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED - -#include - -namespace Catch { - - struct AssertionInfo - { - AssertionInfo() {} - AssertionInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ); - - std::string macroName; - SourceLineInfo lineInfo; - std::string capturedExpression; - ResultDisposition::Flags resultDisposition; - }; - - struct AssertionResultData - { - AssertionResultData() : resultType( ResultWas::Unknown ) {} - - std::string reconstructedExpression; - std::string message; - ResultWas::OfType resultType; - }; - - class AssertionResult { - public: - AssertionResult(); - AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); - ~AssertionResult(); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - AssertionResult( AssertionResult const& ) = default; - AssertionResult( AssertionResult && ) = default; - AssertionResult& operator = ( AssertionResult const& ) = default; - AssertionResult& operator = ( AssertionResult && ) = default; -# endif - - bool isOk() const; - bool succeeded() const; - ResultWas::OfType getResultType() const; - bool hasExpression() const; - bool hasMessage() const; - std::string getExpression() const; - std::string getExpressionInMacro() const; - bool hasExpandedExpression() const; - std::string getExpandedExpression() const; - std::string getMessage() const; - SourceLineInfo getSourceInfo() const; - std::string getTestMacroName() const; - - protected: - AssertionInfo m_info; - AssertionResultData m_resultData; - }; - -} // end namespace Catch - -// #included from: catch_matchers.hpp -#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED - -namespace Catch { -namespace Matchers { - namespace Impl { - - namespace Generic { - template class AllOf; - template class AnyOf; - template class Not; - } - - template - struct Matcher : SharedImpl - { - typedef ExpressionT ExpressionType; - - virtual ~Matcher() {} - virtual Ptr clone() const = 0; - virtual bool match( ExpressionT const& expr ) const = 0; - virtual std::string toString() const = 0; - - Generic::AllOf operator && ( Matcher const& other ) const; - Generic::AnyOf operator || ( Matcher const& other ) const; - Generic::Not operator ! () const; - }; - - template - struct MatcherImpl : Matcher { - - virtual Ptr > clone() const { - return Ptr >( new DerivedT( static_cast( *this ) ) ); - } - }; - - namespace Generic { - template - class Not : public MatcherImpl, ExpressionT> { - public: - explicit Not( Matcher const& matcher ) : m_matcher(matcher.clone()) {} - Not( Not const& other ) : m_matcher( other.m_matcher ) {} - - virtual bool match( ExpressionT const& expr ) const CATCH_OVERRIDE { - return !m_matcher->match( expr ); - } - - virtual std::string toString() const CATCH_OVERRIDE { - return "not " + m_matcher->toString(); - } - private: - Ptr< Matcher > m_matcher; - }; - - template - class AllOf : public MatcherImpl, ExpressionT> { - public: - - AllOf() {} - AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {} - - AllOf& add( Matcher const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( !m_matchers[i]->match( expr ) ) - return false; - return true; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " and "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - AllOf operator && ( Matcher const& other ) const { - AllOf allOfExpr( *this ); - allOfExpr.add( other ); - return allOfExpr; - } - - private: - std::vector > > m_matchers; - }; - - template - class AnyOf : public MatcherImpl, ExpressionT> { - public: - - AnyOf() {} - AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {} - - AnyOf& add( Matcher const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( m_matchers[i]->match( expr ) ) - return true; - return false; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " or "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - AnyOf operator || ( Matcher const& other ) const { - AnyOf anyOfExpr( *this ); - anyOfExpr.add( other ); - return anyOfExpr; - } - - private: - std::vector > > m_matchers; - }; - - } // namespace Generic - - template - Generic::AllOf Matcher::operator && ( Matcher const& other ) const { - Generic::AllOf allOfExpr; - allOfExpr.add( *this ); - allOfExpr.add( other ); - return allOfExpr; - } - - template - Generic::AnyOf Matcher::operator || ( Matcher const& other ) const { - Generic::AnyOf anyOfExpr; - anyOfExpr.add( *this ); - anyOfExpr.add( other ); - return anyOfExpr; - } - - template - Generic::Not Matcher::operator ! () const { - return Generic::Not( *this ); - } - - namespace StdString { - - inline std::string makeString( std::string const& str ) { return str; } - inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); } - - struct CasedString - { - CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) - : m_caseSensitivity( caseSensitivity ), - m_str( adjustString( str ) ) - {} - std::string adjustString( std::string const& str ) const { - return m_caseSensitivity == CaseSensitive::No - ? toLower( str ) - : str; - - } - std::string toStringSuffix() const - { - return m_caseSensitivity == CaseSensitive::No - ? " (case insensitive)" - : ""; - } - CaseSensitive::Choice m_caseSensitivity; - std::string m_str; - }; - - struct Equals : MatcherImpl { - Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) - : m_data( str, caseSensitivity ) - {} - Equals( Equals const& other ) : m_data( other.m_data ){} - - virtual ~Equals(); - - virtual bool match( std::string const& expr ) const { - return m_data.m_str == m_data.adjustString( expr );; - } - virtual std::string toString() const { - return "equals: \"" + m_data.m_str + "\"" + m_data.toStringSuffix(); - } - - CasedString m_data; - }; - - struct Contains : MatcherImpl { - Contains( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) - : m_data( substr, caseSensitivity ){} - Contains( Contains const& other ) : m_data( other.m_data ){} - - virtual ~Contains(); - - virtual bool match( std::string const& expr ) const { - return m_data.adjustString( expr ).find( m_data.m_str ) != std::string::npos; - } - virtual std::string toString() const { - return "contains: \"" + m_data.m_str + "\"" + m_data.toStringSuffix(); - } - - CasedString m_data; - }; - - struct StartsWith : MatcherImpl { - StartsWith( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) - : m_data( substr, caseSensitivity ){} - - StartsWith( StartsWith const& other ) : m_data( other.m_data ){} - - virtual ~StartsWith(); - - virtual bool match( std::string const& expr ) const { - return startsWith( m_data.adjustString( expr ), m_data.m_str ); - } - virtual std::string toString() const { - return "starts with: \"" + m_data.m_str + "\"" + m_data.toStringSuffix(); - } - - CasedString m_data; - }; - - struct EndsWith : MatcherImpl { - EndsWith( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) - : m_data( substr, caseSensitivity ){} - EndsWith( EndsWith const& other ) : m_data( other.m_data ){} - - virtual ~EndsWith(); - - virtual bool match( std::string const& expr ) const { - return endsWith( m_data.adjustString( expr ), m_data.m_str ); - } - virtual std::string toString() const { - return "ends with: \"" + m_data.m_str + "\"" + m_data.toStringSuffix(); - } - - CasedString m_data; - }; - } // namespace StdString - } // namespace Impl - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - template - inline Impl::Generic::Not Not( Impl::Matcher const& m ) { - return Impl::Generic::Not( m ); - } - - template - inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, - Impl::Matcher const& m2 ) { - return Impl::Generic::AllOf().add( m1 ).add( m2 ); - } - template - inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, - Impl::Matcher const& m2, - Impl::Matcher const& m3 ) { - return Impl::Generic::AllOf().add( m1 ).add( m2 ).add( m3 ); - } - template - inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, - Impl::Matcher const& m2 ) { - return Impl::Generic::AnyOf().add( m1 ).add( m2 ); - } - template - inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, - Impl::Matcher const& m2, - Impl::Matcher const& m3 ) { - return Impl::Generic::AnyOf().add( m1 ).add( m2 ).add( m3 ); - } - - inline Impl::StdString::Equals Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { - return Impl::StdString::Equals( str, caseSensitivity ); - } - inline Impl::StdString::Equals Equals( const char* str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { - return Impl::StdString::Equals( Impl::StdString::makeString( str ), caseSensitivity ); - } - inline Impl::StdString::Contains Contains( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { - return Impl::StdString::Contains( substr, caseSensitivity ); - } - inline Impl::StdString::Contains Contains( const char* substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { - return Impl::StdString::Contains( Impl::StdString::makeString( substr ), caseSensitivity ); - } - inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) { - return Impl::StdString::StartsWith( substr ); - } - inline Impl::StdString::StartsWith StartsWith( const char* substr ) { - return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) ); - } - inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) { - return Impl::StdString::EndsWith( substr ); - } - inline Impl::StdString::EndsWith EndsWith( const char* substr ) { - return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) ); - } - -} // namespace Matchers - -using namespace Matchers; - -} // namespace Catch - -namespace Catch { - - struct TestFailureException{}; - - template class ExpressionLhs; - - struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; - - struct CopyableStream { - CopyableStream() {} - CopyableStream( CopyableStream const& other ) { - oss << other.oss.str(); - } - CopyableStream& operator=( CopyableStream const& other ) { - oss.str(""); - oss << other.oss.str(); - return *this; - } - std::ostringstream oss; - }; - - class ResultBuilder { - public: - ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition, - char const* secondArg = "" ); - - template - ExpressionLhs operator <= ( T const& operand ); - ExpressionLhs operator <= ( bool value ); - - template - ResultBuilder& operator << ( T const& value ) { - m_stream.oss << value; - return *this; - } - - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - - ResultBuilder& setResultType( ResultWas::OfType result ); - ResultBuilder& setResultType( bool result ); - ResultBuilder& setLhs( std::string const& lhs ); - ResultBuilder& setRhs( std::string const& rhs ); - ResultBuilder& setOp( std::string const& op ); - - void endExpression(); - - std::string reconstructExpression() const; - AssertionResult build() const; - - void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); - void captureResult( ResultWas::OfType resultType ); - void captureExpression(); - void captureExpectedException( std::string const& expectedMessage ); - void captureExpectedException( Matchers::Impl::Matcher const& matcher ); - void handleResult( AssertionResult const& result ); - void react(); - bool shouldDebugBreak() const; - bool allowThrows() const; - - private: - AssertionInfo m_assertionInfo; - AssertionResultData m_data; - struct ExprComponents { - ExprComponents() : testFalse( false ) {} - bool testFalse; - std::string lhs, rhs, op; - } m_exprComponents; - CopyableStream m_stream; - - bool m_shouldDebugBreak; - bool m_shouldThrow; - }; - -} // namespace Catch - -// Include after due to circular dependency: -// #included from: catch_expression_lhs.hpp -#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED - -// #included from: catch_evaluate.hpp -#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4389) // '==' : signed/unsigned mismatch -#endif - -#include - -namespace Catch { -namespace Internal { - - enum Operator { - IsEqualTo, - IsNotEqualTo, - IsLessThan, - IsGreaterThan, - IsLessThanOrEqualTo, - IsGreaterThanOrEqualTo - }; - - template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; - template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; - template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; - - template - inline T& opCast(T const& t) { return const_cast(t); } - -// nullptr_t support based on pull request #154 from Konstantin Baumann -#ifdef CATCH_CONFIG_CPP11_NULLPTR - inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } -#endif // CATCH_CONFIG_CPP11_NULLPTR - - // So the compare overloads can be operator agnostic we convey the operator as a template - // enum, which is used to specialise an Evaluator for doing the comparison. - template - class Evaluator{}; - - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs) { - return opCast( lhs ) == opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) != opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) < opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) > opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) >= opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) <= opCast( rhs ); - } - }; - - template - bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // This level of indirection allows us to specialise for integer types - // to avoid signed/ unsigned warnings - - // "base" overload - template - bool compare( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // unsigned X to int - template bool compare( unsigned int lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // unsigned X to long - template bool compare( unsigned int lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // int to unsigned X - template bool compare( int lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // long to unsigned X - template bool compare( long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long (when comparing against NULL) - template bool compare( long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - - // pointer to int (when comparing against NULL) - template bool compare( int lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, int rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG - // long long to unsigned X - template bool compare( long long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned long long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // unsigned long long to X - template bool compare( unsigned long long lhs, int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, long long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long long (when comparing against NULL) - template bool compare( long long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } -#endif // CATCH_CONFIG_CPP11_LONG_LONG - -#ifdef CATCH_CONFIG_CPP11_NULLPTR - // pointer to nullptr_t (when comparing against nullptr) - template bool compare( std::nullptr_t, T* rhs ) { - return Evaluator::evaluate( nullptr, rhs ); - } - template bool compare( T* lhs, std::nullptr_t ) { - return Evaluator::evaluate( lhs, nullptr ); - } -#endif // CATCH_CONFIG_CPP11_NULLPTR - -} // end of namespace Internal -} // end of namespace Catch - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -// #included from: catch_tostring.h -#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED - -#include -#include -#include -#include -#include - -#ifdef __OBJC__ -// #included from: catch_objc_arc.hpp -#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED - -#import - -#ifdef __has_feature -#define CATCH_ARC_ENABLED __has_feature(objc_arc) -#else -#define CATCH_ARC_ENABLED 0 -#endif - -void arcSafeRelease( NSObject* obj ); -id performOptionalSelector( id obj, SEL sel ); - -#if !CATCH_ARC_ENABLED -inline void arcSafeRelease( NSObject* obj ) { - [obj release]; -} -inline id performOptionalSelector( id obj, SEL sel ) { - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; - return nil; -} -#define CATCH_UNSAFE_UNRETAINED -#define CATCH_ARC_STRONG -#else -inline void arcSafeRelease( NSObject* ){} -inline id performOptionalSelector( id obj, SEL sel ) { -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" -#endif - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - return nil; -} -#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained -#define CATCH_ARC_STRONG __strong -#endif - -#endif - -#ifdef CATCH_CONFIG_CPP11_TUPLE -#include -#endif - -#ifdef CATCH_CONFIG_CPP11_IS_ENUM -#include -#endif - -namespace Catch { - -// Why we're here. -template -std::string toString( T const& value ); - -// Built in overloads - -std::string toString( std::string const& value ); -std::string toString( std::wstring const& value ); -std::string toString( const char* const value ); -std::string toString( char* const value ); -std::string toString( const wchar_t* const value ); -std::string toString( wchar_t* const value ); -std::string toString( int value ); -std::string toString( unsigned long value ); -std::string toString( unsigned int value ); -std::string toString( const double value ); -std::string toString( const float value ); -std::string toString( bool value ); -std::string toString( char value ); -std::string toString( signed char value ); -std::string toString( unsigned char value ); - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG -std::string toString( long long value ); -std::string toString( unsigned long long value ); -#endif - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ); -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ); - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ); - std::string toString( NSObject* const& nsObject ); -#endif - -namespace Detail { - - extern const std::string unprintableString; - - struct BorgType { - template BorgType( T const& ); - }; - - struct TrueType { char sizer[1]; }; - struct FalseType { char sizer[2]; }; - - TrueType& testStreamable( std::ostream& ); - FalseType testStreamable( FalseType ); - - FalseType operator<<( std::ostream const&, BorgType const& ); - - template - struct IsStreamInsertable { - static std::ostream &s; - static T const&t; - enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; - }; - -#if defined(CATCH_CONFIG_CPP11_IS_ENUM) - template::value - > - struct EnumStringMaker - { - static std::string convert( T const& ) { return unprintableString; } - }; - - template - struct EnumStringMaker - { - static std::string convert( T const& v ) - { - return ::Catch::toString( - static_cast::type>(v) - ); - } - }; -#endif - template - struct StringMakerBase { -#if defined(CATCH_CONFIG_CPP11_IS_ENUM) - template - static std::string convert( T const& v ) - { - return EnumStringMaker::convert( v ); - } -#else - template - static std::string convert( T const& ) { return unprintableString; } -#endif - }; - - template<> - struct StringMakerBase { - template - static std::string convert( T const& _value ) { - std::ostringstream oss; - oss << _value; - return oss.str(); - } - }; - - std::string rawMemoryToString( const void *object, std::size_t size ); - - template - inline std::string rawMemoryToString( const T& object ) { - return rawMemoryToString( &object, sizeof(object) ); - } - -} // end namespace Detail - -template -struct StringMaker : - Detail::StringMakerBase::value> {}; - -template -struct StringMaker { - template - static std::string convert( U* p ) { - if( !p ) - return "NULL"; - else - return Detail::rawMemoryToString( p ); - } -}; - -template -struct StringMaker { - static std::string convert( R C::* p ) { - if( !p ) - return "NULL"; - else - return Detail::rawMemoryToString( p ); - } -}; - -namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ); -} - -//template -//struct StringMaker > { -// static std::string convert( std::vector const& v ) { -// return Detail::rangeToString( v.begin(), v.end() ); -// } -//}; - -template -std::string toString( std::vector const& v ) { - return Detail::rangeToString( v.begin(), v.end() ); -} - -#ifdef CATCH_CONFIG_CPP11_TUPLE - -// toString for tuples -namespace TupleDetail { - template< - typename Tuple, - std::size_t N = 0, - bool = (N < std::tuple_size::value) - > - struct ElementPrinter { - static void print( const Tuple& tuple, std::ostream& os ) - { - os << ( N ? ", " : " " ) - << Catch::toString(std::get(tuple)); - ElementPrinter::print(tuple,os); - } - }; - - template< - typename Tuple, - std::size_t N - > - struct ElementPrinter { - static void print( const Tuple&, std::ostream& ) {} - }; - -} - -template -struct StringMaker> { - - static std::string convert( const std::tuple& tuple ) - { - std::ostringstream os; - os << '{'; - TupleDetail::ElementPrinter>::print( tuple, os ); - os << " }"; - return os.str(); - } -}; -#endif // CATCH_CONFIG_CPP11_TUPLE - -namespace Detail { - template - std::string makeString( T const& value ) { - return StringMaker::convert( value ); - } -} // end namespace Detail - -/// \brief converts any type to a string -/// -/// The default template forwards on to ostringstream - except when an -/// ostringstream overload does not exist - in which case it attempts to detect -/// that and writes {?}. -/// Overload (not specialise) this template for custom typs that you don't want -/// to provide an ostream overload for. -template -std::string toString( T const& value ) { - return StringMaker::convert( value ); -} - - namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ) { - std::ostringstream oss; - oss << "{ "; - if( first != last ) { - oss << Catch::toString( *first ); - for( ++first ; first != last ; ++first ) - oss << ", " << Catch::toString( *first ); - } - oss << " }"; - return oss.str(); - } -} - -} // end namespace Catch - -namespace Catch { - -// Wraps the LHS of an expression and captures the operator and RHS (if any) - -// wrapping them all in a ResultBuilder object -template -class ExpressionLhs { - ExpressionLhs& operator = ( ExpressionLhs const& ); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - ExpressionLhs& operator = ( ExpressionLhs && ) = delete; -# endif - -public: - ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {} -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - ExpressionLhs( ExpressionLhs const& ) = default; - ExpressionLhs( ExpressionLhs && ) = default; -# endif - - template - ResultBuilder& operator == ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator != ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator < ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator > ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator <= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator >= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - ResultBuilder& operator == ( bool rhs ) { - return captureExpression( rhs ); - } - - ResultBuilder& operator != ( bool rhs ) { - return captureExpression( rhs ); - } - - void endExpression() { - bool value = m_lhs ? true : false; - m_rb - .setLhs( Catch::toString( value ) ) - .setResultType( value ) - .endExpression(); - } - - // Only simple binary expressions are allowed on the LHS. - // If more complex compositions are required then place the sub expression in parentheses - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - -private: - template - ResultBuilder& captureExpression( RhsT const& rhs ) { - return m_rb - .setResultType( Internal::compare( m_lhs, rhs ) ) - .setLhs( Catch::toString( m_lhs ) ) - .setRhs( Catch::toString( rhs ) ) - .setOp( Internal::OperatorTraits::getName() ); - } - -private: - ResultBuilder& m_rb; - T m_lhs; -}; - -} // end namespace Catch - - -namespace Catch { - - template - inline ExpressionLhs ResultBuilder::operator <= ( T const& operand ) { - return ExpressionLhs( *this, operand ); - } - - inline ExpressionLhs ResultBuilder::operator <= ( bool value ) { - return ExpressionLhs( *this, value ); - } - -} // namespace Catch - -// #included from: catch_message.h -#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED - -#include - -namespace Catch { - - struct MessageInfo { - MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ); - - std::string macroName; - SourceLineInfo lineInfo; - ResultWas::OfType type; - std::string message; - unsigned int sequence; - - bool operator == ( MessageInfo const& other ) const { - return sequence == other.sequence; - } - bool operator < ( MessageInfo const& other ) const { - return sequence < other.sequence; - } - private: - static unsigned int globalCount; - }; - - struct MessageBuilder { - MessageBuilder( std::string const& macroName, - SourceLineInfo const& lineInfo, - ResultWas::OfType type ) - : m_info( macroName, lineInfo, type ) - {} - - template - MessageBuilder& operator << ( T const& value ) { - m_stream << value; - return *this; - } - - MessageInfo m_info; - std::ostringstream m_stream; - }; - - class ScopedMessage { - public: - ScopedMessage( MessageBuilder const& builder ); - ScopedMessage( ScopedMessage const& other ); - ~ScopedMessage(); - - MessageInfo m_info; - }; - -} // end namespace Catch - -// #included from: catch_interfaces_capture.h -#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - class AssertionResult; - struct AssertionInfo; - struct SectionInfo; - struct SectionEndInfo; - struct MessageInfo; - class ScopedMessageBuilder; - struct Counts; - - struct IResultCapture { - - virtual ~IResultCapture(); - - virtual void assertionEnded( AssertionResult const& result ) = 0; - virtual bool sectionStarted( SectionInfo const& sectionInfo, - Counts& assertions ) = 0; - virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; - virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; - virtual void pushScopedMessage( MessageInfo const& message ) = 0; - virtual void popScopedMessage( MessageInfo const& message ) = 0; - - virtual std::string getCurrentTestName() const = 0; - virtual const AssertionResult* getLastResult() const = 0; - - virtual void handleFatalErrorCondition( std::string const& message ) = 0; - }; - - IResultCapture& getResultCapture(); -} - -// #included from: catch_debugger.h -#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED - -// #included from: catch_platform.h -#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED - -#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_MAC -#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_IPHONE -#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -#define CATCH_PLATFORM_WINDOWS -#endif - -#include - -namespace Catch{ - - bool isDebuggerActive(); - void writeToDebugConsole( std::string const& text ); -} - -#ifdef CATCH_PLATFORM_MAC - - // The following code snippet based on: - // http://cocoawithlove.com/2008/03/break-into-debugger.html - #ifdef DEBUG - #if defined(__ppc64__) || defined(__ppc__) - #define CATCH_BREAK_INTO_DEBUGGER() \ - if( Catch::isDebuggerActive() ) { \ - __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ - : : : "memory","r0","r3","r4" ); \ - } - #else - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );} - #endif - #endif - -#elif defined(_MSC_VER) - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { __debugbreak(); } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) void __stdcall DebugBreak(); - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { DebugBreak(); } -#endif - -#ifndef CATCH_BREAK_INTO_DEBUGGER -#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); -#endif - -// #included from: catch_interfaces_runner.h -#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED - -namespace Catch { - class TestCase; - - struct IRunner { - virtual ~IRunner(); - virtual bool aborting() const = 0; - }; -} - -/////////////////////////////////////////////////////////////////////////////// -// In the event of a failure works out if the debugger needs to be invoked -// and/or an exception thrown and takes appropriate action. -// This needs to be done as a macro so the debugger will stop in the user -// source code rather than in Catch library code -#define INTERNAL_CATCH_REACT( resultBuilder ) \ - if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ - resultBuilder.react(); - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - ( __catchResult <= expr ).endExpression(); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && static_cast(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( !Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS( expr, resultDisposition, matcher, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher ); \ - if( __catchResult.allowThrows() ) \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( ... ) { \ - __catchResult.captureExpectedException( matcher ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - if( __catchResult.allowThrows() ) \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( exceptionType ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#else - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << log + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#endif - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_INFO( log, macroName ) \ - Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ - try { \ - std::string matcherAsString = (matcher).toString(); \ - __catchResult \ - .setLhs( Catch::toString( arg ) ) \ - .setRhs( matcherAsString == Catch::Detail::unprintableString ? #matcher : matcherAsString ) \ - .setOp( "matches" ) \ - .setResultType( (matcher).match( arg ) ); \ - __catchResult.captureExpression(); \ - } catch( ... ) { \ - __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -// #included from: internal/catch_section.h -#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED - -// #included from: catch_section_info.h -#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED - -// #included from: catch_totals.hpp -#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED - -#include - -namespace Catch { - - struct Counts { - Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} - - Counts operator - ( Counts const& other ) const { - Counts diff; - diff.passed = passed - other.passed; - diff.failed = failed - other.failed; - diff.failedButOk = failedButOk - other.failedButOk; - return diff; - } - Counts& operator += ( Counts const& other ) { - passed += other.passed; - failed += other.failed; - failedButOk += other.failedButOk; - return *this; - } - - std::size_t total() const { - return passed + failed + failedButOk; - } - bool allPassed() const { - return failed == 0 && failedButOk == 0; - } - bool allOk() const { - return failed == 0; - } - - std::size_t passed; - std::size_t failed; - std::size_t failedButOk; - }; - - struct Totals { - - Totals operator - ( Totals const& other ) const { - Totals diff; - diff.assertions = assertions - other.assertions; - diff.testCases = testCases - other.testCases; - return diff; - } - - Totals delta( Totals const& prevTotals ) const { - Totals diff = *this - prevTotals; - if( diff.assertions.failed > 0 ) - ++diff.testCases.failed; - else if( diff.assertions.failedButOk > 0 ) - ++diff.testCases.failedButOk; - else - ++diff.testCases.passed; - return diff; - } - - Totals& operator += ( Totals const& other ) { - assertions += other.assertions; - testCases += other.testCases; - return *this; - } - - Counts assertions; - Counts testCases; - }; -} - -namespace Catch { - - struct SectionInfo { - SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description = std::string() ); - - std::string name; - std::string description; - SourceLineInfo lineInfo; - }; - - struct SectionEndInfo { - SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds ) - : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) - {} - - SectionInfo sectionInfo; - Counts prevAssertions; - double durationInSeconds; - }; - -} // end namespace Catch - -// #included from: catch_timer.h -#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED - -#ifdef CATCH_PLATFORM_WINDOWS -typedef unsigned long long uint64_t; -#else -#include -#endif - -namespace Catch { - - class Timer { - public: - Timer() : m_ticks( 0 ) {} - void start(); - unsigned int getElapsedMicroseconds() const; - unsigned int getElapsedMilliseconds() const; - double getElapsedSeconds() const; - - private: - uint64_t m_ticks; - }; - -} // namespace Catch - -#include - -namespace Catch { - - class Section : NonCopyable { - public: - Section( SectionInfo const& info ); - ~Section(); - - // This indicates whether the section should be executed or not - operator bool() const; - - private: - SectionInfo m_info; - - std::string m_name; - Counts m_assertions; - bool m_sectionIncluded; - Timer m_timer; - }; - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_SECTION( ... ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) -#else - #define INTERNAL_CATCH_SECTION( name, desc ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) -#endif - -// #included from: internal/catch_generators.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - -template -struct IGenerator { - virtual ~IGenerator() {} - virtual T getValue( std::size_t index ) const = 0; - virtual std::size_t size () const = 0; -}; - -template -class BetweenGenerator : public IGenerator { -public: - BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} - - virtual T getValue( std::size_t index ) const { - return m_from+static_cast( index ); - } - - virtual std::size_t size() const { - return static_cast( 1+m_to-m_from ); - } - -private: - - T m_from; - T m_to; -}; - -template -class ValuesGenerator : public IGenerator { -public: - ValuesGenerator(){} - - void add( T value ) { - m_values.push_back( value ); - } - - virtual T getValue( std::size_t index ) const { - return m_values[index]; - } - - virtual std::size_t size() const { - return m_values.size(); - } - -private: - std::vector m_values; -}; - -template -class CompositeGenerator { -public: - CompositeGenerator() : m_totalSize( 0 ) {} - - // *** Move semantics, similar to auto_ptr *** - CompositeGenerator( CompositeGenerator& other ) - : m_fileInfo( other.m_fileInfo ), - m_totalSize( 0 ) - { - move( other ); - } - - CompositeGenerator& setFileInfo( const char* fileInfo ) { - m_fileInfo = fileInfo; - return *this; - } - - ~CompositeGenerator() { - deleteAll( m_composed ); - } - - operator T () const { - size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); - - typename std::vector*>::const_iterator it = m_composed.begin(); - typename std::vector*>::const_iterator itEnd = m_composed.end(); - for( size_t index = 0; it != itEnd; ++it ) - { - const IGenerator* generator = *it; - if( overallIndex >= index && overallIndex < index + generator->size() ) - { - return generator->getValue( overallIndex-index ); - } - index += generator->size(); - } - CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); - return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so - } - - void add( const IGenerator* generator ) { - m_totalSize += generator->size(); - m_composed.push_back( generator ); - } - - CompositeGenerator& then( CompositeGenerator& other ) { - move( other ); - return *this; - } - - CompositeGenerator& then( T value ) { - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( value ); - add( valuesGen ); - return *this; - } - -private: - - void move( CompositeGenerator& other ) { - std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) ); - m_totalSize += other.m_totalSize; - other.m_composed.clear(); - } - - std::vector*> m_composed; - std::string m_fileInfo; - size_t m_totalSize; -}; - -namespace Generators -{ - template - CompositeGenerator between( T from, T to ) { - CompositeGenerator generators; - generators.add( new BetweenGenerator( from, to ) ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3 ){ - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3, T val4 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - valuesGen->add( val4 ); - generators.add( valuesGen ); - return generators; - } - -} // end namespace Generators - -using namespace Generators; - -} // end namespace Catch - -#define INTERNAL_CATCH_LINESTR2( line ) #line -#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) - -#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) - -// #included from: internal/catch_interfaces_exception.h -#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED - -#include -#include - -// #included from: catch_interfaces_registry_hub.h -#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - struct ITestCaseRegistry; - struct IExceptionTranslatorRegistry; - struct IExceptionTranslator; - struct IReporterRegistry; - struct IReporterFactory; - - struct IRegistryHub { - virtual ~IRegistryHub(); - - virtual IReporterRegistry const& getReporterRegistry() const = 0; - virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; - }; - - struct IMutableRegistryHub { - virtual ~IMutableRegistryHub(); - virtual void registerReporter( std::string const& name, Ptr const& factory ) = 0; - virtual void registerListener( Ptr const& factory ) = 0; - virtual void registerTest( TestCase const& testInfo ) = 0; - virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; - }; - - IRegistryHub& getRegistryHub(); - IMutableRegistryHub& getMutableRegistryHub(); - void cleanUp(); - std::string translateActiveException(); - -} - -namespace Catch { - - typedef std::string(*exceptionTranslateFunction)(); - - struct IExceptionTranslator; - typedef std::vector ExceptionTranslators; - - struct IExceptionTranslator { - virtual ~IExceptionTranslator(); - virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; - }; - - struct IExceptionTranslatorRegistry { - virtual ~IExceptionTranslatorRegistry(); - - virtual std::string translateActiveException() const = 0; - }; - - class ExceptionTranslatorRegistrar { - template - class ExceptionTranslator : public IExceptionTranslator { - public: - - ExceptionTranslator( std::string(*translateFunction)( T& ) ) - : m_translateFunction( translateFunction ) - {} - - virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE { - try { - if( it == itEnd ) - throw; - else - return (*it)->translate( it+1, itEnd ); - } - catch( T& ex ) { - return m_translateFunction( ex ); - } - } - - protected: - std::string(*m_translateFunction)( T& ); - }; - - public: - template - ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { - getMutableRegistryHub().registerTranslator - ( new ExceptionTranslator( translateFunction ) ); - } - }; -} - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ - namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ) - -// #included from: internal/catch_approx.hpp -#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED - -#include -#include - -namespace Catch { -namespace Detail { - - class Approx { - public: - explicit Approx ( double value ) - : m_epsilon( std::numeric_limits::epsilon()*100 ), - m_scale( 1.0 ), - m_value( value ) - {} - - Approx( Approx const& other ) - : m_epsilon( other.m_epsilon ), - m_scale( other.m_scale ), - m_value( other.m_value ) - {} - - static Approx custom() { - return Approx( 0 ); - } - - Approx operator()( double value ) { - Approx approx( value ); - approx.epsilon( m_epsilon ); - approx.scale( m_scale ); - return approx; - } - - friend bool operator == ( double lhs, Approx const& rhs ) { - // Thanks to Richard Harris for his help refining this formula - return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) ); - } - - friend bool operator == ( Approx const& lhs, double rhs ) { - return operator==( rhs, lhs ); - } - - friend bool operator != ( double lhs, Approx const& rhs ) { - return !operator==( lhs, rhs ); - } - - friend bool operator != ( Approx const& lhs, double rhs ) { - return !operator==( rhs, lhs ); - } - - Approx& epsilon( double newEpsilon ) { - m_epsilon = newEpsilon; - return *this; - } - - Approx& scale( double newScale ) { - m_scale = newScale; - return *this; - } - - std::string toString() const { - std::ostringstream oss; - oss << "Approx( " << Catch::toString( m_value ) << " )"; - return oss.str(); - } - - private: - double m_epsilon; - double m_scale; - double m_value; - }; -} - -template<> -inline std::string toString( Detail::Approx const& value ) { - return value.toString(); -} - -} // end namespace Catch - -// #included from: internal/catch_interfaces_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED - -// #included from: catch_tag_alias.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED - -#include - -namespace Catch { - - struct TagAlias { - TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} - - std::string tag; - SourceLineInfo lineInfo; - }; - - struct RegistrarForTagAliases { - RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - }; - -} // end namespace Catch - -#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } -// #included from: catch_option.hpp -#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED - -namespace Catch { - - // An optional type - template - class Option { - public: - Option() : nullableValue( CATCH_NULL ) {} - Option( T const& _value ) - : nullableValue( new( storage ) T( _value ) ) - {} - Option( Option const& _other ) - : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL ) - {} - - ~Option() { - reset(); - } - - Option& operator= ( Option const& _other ) { - if( &_other != this ) { - reset(); - if( _other ) - nullableValue = new( storage ) T( *_other ); - } - return *this; - } - Option& operator = ( T const& _value ) { - reset(); - nullableValue = new( storage ) T( _value ); - return *this; - } - - void reset() { - if( nullableValue ) - nullableValue->~T(); - nullableValue = CATCH_NULL; - } - - T& operator*() { return *nullableValue; } - T const& operator*() const { return *nullableValue; } - T* operator->() { return nullableValue; } - const T* operator->() const { return nullableValue; } - - T valueOr( T const& defaultValue ) const { - return nullableValue ? *nullableValue : defaultValue; - } - - bool some() const { return nullableValue != CATCH_NULL; } - bool none() const { return nullableValue == CATCH_NULL; } - - bool operator !() const { return nullableValue == CATCH_NULL; } - operator SafeBool::type() const { - return SafeBool::makeSafe( some() ); - } - - private: - T* nullableValue; - char storage[sizeof(T)]; - }; - -} // end namespace Catch - -namespace Catch { - - struct ITagAliasRegistry { - virtual ~ITagAliasRegistry(); - virtual Option find( std::string const& alias ) const = 0; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; - - static ITagAliasRegistry const& get(); - }; - -} // end namespace Catch - -// These files are included here so the single_include script doesn't put them -// in the conditionally compiled sections -// #included from: internal/catch_test_case_info.h -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED - -#include -#include - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - struct ITestCase; - - struct TestCaseInfo { - enum SpecialProperties{ - None = 0, - IsHidden = 1 << 1, - ShouldFail = 1 << 2, - MayFail = 1 << 3, - Throws = 1 << 4 - }; - - TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ); - - TestCaseInfo( TestCaseInfo const& other ); - - friend void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ); - - bool isHidden() const; - bool throws() const; - bool okToFail() const; - bool expectedToFail() const; - - std::string name; - std::string className; - std::string description; - std::set tags; - std::set lcaseTags; - std::string tagsAsString; - SourceLineInfo lineInfo; - SpecialProperties properties; - }; - - class TestCase : public TestCaseInfo { - public: - - TestCase( ITestCase* testCase, TestCaseInfo const& info ); - TestCase( TestCase const& other ); - - TestCase withName( std::string const& _newName ) const; - - void invoke() const; - - TestCaseInfo const& getTestCaseInfo() const; - - void swap( TestCase& other ); - bool operator == ( TestCase const& other ) const; - bool operator < ( TestCase const& other ) const; - TestCase& operator = ( TestCase const& other ); - - private: - Ptr test; - }; - - TestCase makeTestCase( ITestCase* testCase, - std::string const& className, - std::string const& name, - std::string const& description, - SourceLineInfo const& lineInfo ); -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - - -#ifdef __OBJC__ -// #included from: internal/catch_objc.hpp -#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED - -#import - -#include - -// NB. Any general catch headers included here must be included -// in catch.hpp first to make sure they are included by the single -// header for non obj-usage - -/////////////////////////////////////////////////////////////////////////////// -// This protocol is really only here for (self) documenting purposes, since -// all its methods are optional. -@protocol OcFixture - -@optional - --(void) setUp; --(void) tearDown; - -@end - -namespace Catch { - - class OcMethod : public SharedImpl { - - public: - OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} - - virtual void invoke() const { - id obj = [[m_cls alloc] init]; - - performOptionalSelector( obj, @selector(setUp) ); - performOptionalSelector( obj, m_sel ); - performOptionalSelector( obj, @selector(tearDown) ); - - arcSafeRelease( obj ); - } - private: - virtual ~OcMethod() {} - - Class m_cls; - SEL m_sel; - }; - - namespace Detail{ - - inline std::string getAnnotation( Class cls, - std::string const& annotationName, - std::string const& testCaseName ) { - NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; - SEL sel = NSSelectorFromString( selStr ); - arcSafeRelease( selStr ); - id value = performOptionalSelector( cls, sel ); - if( value ) - return [(NSString*)value UTF8String]; - return ""; - } - } - - inline size_t registerTestMethods() { - size_t noTestMethods = 0; - int noClasses = objc_getClassList( CATCH_NULL, 0 ); - - Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); - objc_getClassList( classes, noClasses ); - - for( int c = 0; c < noClasses; c++ ) { - Class cls = classes[c]; - { - u_int count; - Method* methods = class_copyMethodList( cls, &count ); - for( u_int m = 0; m < count ; m++ ) { - SEL selector = method_getName(methods[m]); - std::string methodName = sel_getName(selector); - if( startsWith( methodName, "Catch_TestCase_" ) ) { - std::string testCaseName = methodName.substr( 15 ); - std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); - std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); - const char* className = class_getName( cls ); - - getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); - noTestMethods++; - } - } - free(methods); - } - } - return noTestMethods; - } - - namespace Matchers { - namespace Impl { - namespace NSStringMatchers { - - template - struct StringHolder : MatcherImpl{ - StringHolder( NSString* substr ) : m_substr( [substr copy] ){} - StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} - StringHolder() { - arcSafeRelease( m_substr ); - } - - NSString* m_substr; - }; - - struct Equals : StringHolder { - Equals( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str isEqualToString:m_substr]; - } - - virtual std::string toString() const { - return "equals string: " + Catch::toString( m_substr ); - } - }; - - struct Contains : StringHolder { - Contains( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location != NSNotFound; - } - - virtual std::string toString() const { - return "contains string: " + Catch::toString( m_substr ); - } - }; - - struct StartsWith : StringHolder { - StartsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == 0; - } - - virtual std::string toString() const { - return "starts with: " + Catch::toString( m_substr ); - } - }; - struct EndsWith : StringHolder { - EndsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == [str length] - [m_substr length]; - } - - virtual std::string toString() const { - return "ends with: " + Catch::toString( m_substr ); - } - }; - - } // namespace NSStringMatchers - } // namespace Impl - - inline Impl::NSStringMatchers::Equals - Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } - - inline Impl::NSStringMatchers::Contains - Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } - - inline Impl::NSStringMatchers::StartsWith - StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } - - inline Impl::NSStringMatchers::EndsWith - EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } - - } // namespace Matchers - - using namespace Matchers; - -} // namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define OC_TEST_CASE( name, desc )\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ -{\ -return @ name; \ -}\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ -{ \ -return @ desc; \ -} \ --(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) - -#endif - -#ifdef CATCH_IMPL -// #included from: internal/catch_impl.hpp -#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED - -// Collect all the implementation files together here -// These are the equivalent of what would usually be cpp files - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wweak-vtables" -#endif - -// #included from: ../catch_session.hpp -#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED - -// #included from: internal/catch_commandline.hpp -#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED - -// #included from: catch_config.hpp -#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED - -// #included from: catch_test_spec_parser.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_test_spec.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_wildcard_pattern.hpp -#define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED - -namespace Catch -{ - class WildcardPattern { - enum WildcardPosition { - NoWildcard = 0, - WildcardAtStart = 1, - WildcardAtEnd = 2, - WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd - }; - - public: - - WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) - : m_caseSensitivity( caseSensitivity ), - m_wildcard( NoWildcard ), - m_pattern( adjustCase( pattern ) ) - { - if( startsWith( m_pattern, "*" ) ) { - m_pattern = m_pattern.substr( 1 ); - m_wildcard = WildcardAtStart; - } - if( endsWith( m_pattern, "*" ) ) { - m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); - m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); - } - } - virtual ~WildcardPattern(); - virtual bool matches( std::string const& str ) const { - switch( m_wildcard ) { - case NoWildcard: - return m_pattern == adjustCase( str ); - case WildcardAtStart: - return endsWith( adjustCase( str ), m_pattern ); - case WildcardAtEnd: - return startsWith( adjustCase( str ), m_pattern ); - case WildcardAtBothEnds: - return contains( adjustCase( str ), m_pattern ); - } - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunreachable-code" -#endif - throw std::logic_error( "Unknown enum" ); -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - } - private: - std::string adjustCase( std::string const& str ) const { - return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; - } - CaseSensitive::Choice m_caseSensitivity; - WildcardPosition m_wildcard; - std::string m_pattern; - }; -} - -#include -#include - -namespace Catch { - - class TestSpec { - struct Pattern : SharedImpl<> { - virtual ~Pattern(); - virtual bool matches( TestCaseInfo const& testCase ) const = 0; - }; - class NamePattern : public Pattern { - public: - NamePattern( std::string const& name ) - : m_wildcardPattern( toLower( name ), CaseSensitive::No ) - {} - virtual ~NamePattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return m_wildcardPattern.matches( toLower( testCase.name ) ); - } - private: - WildcardPattern m_wildcardPattern; - }; - - class TagPattern : public Pattern { - public: - TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} - virtual ~TagPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); - } - private: - std::string m_tag; - }; - - class ExcludedPattern : public Pattern { - public: - ExcludedPattern( Ptr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} - virtual ~ExcludedPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } - private: - Ptr m_underlyingPattern; - }; - - struct Filter { - std::vector > m_patterns; - - bool matches( TestCaseInfo const& testCase ) const { - // All patterns in a filter must match for the filter to be a match - for( std::vector >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) - if( !(*it)->matches( testCase ) ) - return false; - return true; - } - }; - - public: - bool hasFilters() const { - return !m_filters.empty(); - } - bool matches( TestCaseInfo const& testCase ) const { - // A TestSpec matches if any filter matches - for( std::vector::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) - if( it->matches( testCase ) ) - return true; - return false; - } - - private: - std::vector m_filters; - - friend class TestSpecParser; - }; -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -namespace Catch { - - class TestSpecParser { - enum Mode{ None, Name, QuotedName, Tag }; - Mode m_mode; - bool m_exclusion; - std::size_t m_start, m_pos; - std::string m_arg; - TestSpec::Filter m_currentFilter; - TestSpec m_testSpec; - ITagAliasRegistry const* m_tagAliases; - - public: - TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} - - TestSpecParser& parse( std::string const& arg ) { - m_mode = None; - m_exclusion = false; - m_start = std::string::npos; - m_arg = m_tagAliases->expandAliases( arg ); - for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) - visitChar( m_arg[m_pos] ); - if( m_mode == Name ) - addPattern(); - return *this; - } - TestSpec testSpec() { - addFilter(); - return m_testSpec; - } - private: - void visitChar( char c ) { - if( m_mode == None ) { - switch( c ) { - case ' ': return; - case '~': m_exclusion = true; return; - case '[': return startNewMode( Tag, ++m_pos ); - case '"': return startNewMode( QuotedName, ++m_pos ); - default: startNewMode( Name, m_pos ); break; - } - } - if( m_mode == Name ) { - if( c == ',' ) { - addPattern(); - addFilter(); - } - else if( c == '[' ) { - if( subString() == "exclude:" ) - m_exclusion = true; - else - addPattern(); - startNewMode( Tag, ++m_pos ); - } - } - else if( m_mode == QuotedName && c == '"' ) - addPattern(); - else if( m_mode == Tag && c == ']' ) - addPattern(); - } - void startNewMode( Mode mode, std::size_t start ) { - m_mode = mode; - m_start = start; - } - std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } - template - void addPattern() { - std::string token = subString(); - if( startsWith( token, "exclude:" ) ) { - m_exclusion = true; - token = token.substr( 8 ); - } - if( !token.empty() ) { - Ptr pattern = new T( token ); - if( m_exclusion ) - pattern = new TestSpec::ExcludedPattern( pattern ); - m_currentFilter.m_patterns.push_back( pattern ); - } - m_exclusion = false; - m_mode = None; - } - void addFilter() { - if( !m_currentFilter.m_patterns.empty() ) { - m_testSpec.m_filters.push_back( m_currentFilter ); - m_currentFilter = TestSpec::Filter(); - } - } - }; - inline TestSpec parseTestSpec( std::string const& arg ) { - return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -// #included from: catch_interfaces_config.h -#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct Verbosity { enum Level { - NoOutput = 0, - Quiet, - Normal - }; }; - - struct WarnAbout { enum What { - Nothing = 0x00, - NoAssertions = 0x01 - }; }; - - struct ShowDurations { enum OrNot { - DefaultForReporter, - Always, - Never - }; }; - struct RunTests { enum InWhatOrder { - InDeclarationOrder, - InLexicographicalOrder, - InRandomOrder - }; }; - - class TestSpec; - - struct IConfig : IShared { - - virtual ~IConfig(); - - virtual bool allowThrows() const = 0; - virtual std::ostream& stream() const = 0; - virtual std::string name() const = 0; - virtual bool includeSuccessfulResults() const = 0; - virtual bool shouldDebugBreak() const = 0; - virtual bool warnAboutMissingAssertions() const = 0; - virtual int abortAfter() const = 0; - virtual bool showInvisibles() const = 0; - virtual ShowDurations::OrNot showDurations() const = 0; - virtual TestSpec const& testSpec() const = 0; - virtual RunTests::InWhatOrder runOrder() const = 0; - virtual unsigned int rngSeed() const = 0; - virtual bool forceColour() const = 0; - }; -} - -// #included from: catch_stream.h -#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED - -// #included from: catch_streambuf.h -#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED - -#include - -namespace Catch { - - class StreamBufBase : public std::streambuf { - public: - virtual ~StreamBufBase() CATCH_NOEXCEPT; - }; -} - -#include -#include -#include - -namespace Catch { - - std::ostream& cout(); - std::ostream& cerr(); - - struct IStream { - virtual ~IStream() CATCH_NOEXCEPT; - virtual std::ostream& stream() const = 0; - }; - - class FileStream : public IStream { - mutable std::ofstream m_ofs; - public: - FileStream( std::string const& filename ); - virtual ~FileStream() CATCH_NOEXCEPT; - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; - - class CoutStream : public IStream { - mutable std::ostream m_os; - public: - CoutStream(); - virtual ~CoutStream() CATCH_NOEXCEPT; - - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; - - class DebugOutStream : public IStream { - std::auto_ptr m_streamBuf; - mutable std::ostream m_os; - public: - DebugOutStream(); - virtual ~DebugOutStream() CATCH_NOEXCEPT; - - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; -} - -#include -#include -#include -#include -#include - -#ifndef CATCH_CONFIG_CONSOLE_WIDTH -#define CATCH_CONFIG_CONSOLE_WIDTH 80 -#endif - -namespace Catch { - - struct ConfigData { - - ConfigData() - : listTests( false ), - listTags( false ), - listReporters( false ), - listTestNamesOnly( false ), - showSuccessfulTests( false ), - shouldDebugBreak( false ), - noThrow( false ), - showHelp( false ), - showInvisibles( false ), - forceColour( false ), - filenamesAsTags( false ), - abortAfter( -1 ), - rngSeed( 0 ), - verbosity( Verbosity::Normal ), - warnings( WarnAbout::Nothing ), - showDurations( ShowDurations::DefaultForReporter ), - runOrder( RunTests::InDeclarationOrder ) - {} - - bool listTests; - bool listTags; - bool listReporters; - bool listTestNamesOnly; - - bool showSuccessfulTests; - bool shouldDebugBreak; - bool noThrow; - bool showHelp; - bool showInvisibles; - bool forceColour; - bool filenamesAsTags; - - int abortAfter; - unsigned int rngSeed; - - Verbosity::Level verbosity; - WarnAbout::What warnings; - ShowDurations::OrNot showDurations; - RunTests::InWhatOrder runOrder; - - std::string outputFilename; - std::string name; - std::string processName; - - std::vector reporterNames; - std::vector testsOrTags; - }; - - class Config : public SharedImpl { - private: - Config( Config const& other ); - Config& operator = ( Config const& other ); - virtual void dummy(); - public: - - Config() - {} - - Config( ConfigData const& data ) - : m_data( data ), - m_stream( openStream() ) - { - if( !data.testsOrTags.empty() ) { - TestSpecParser parser( ITagAliasRegistry::get() ); - for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) - parser.parse( data.testsOrTags[i] ); - m_testSpec = parser.testSpec(); - } - } - - virtual ~Config() { - } - - std::string const& getFilename() const { - return m_data.outputFilename ; - } - - bool listTests() const { return m_data.listTests; } - bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } - bool listTags() const { return m_data.listTags; } - bool listReporters() const { return m_data.listReporters; } - - std::string getProcessName() const { return m_data.processName; } - - bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } - - std::vector getReporterNames() const { return m_data.reporterNames; } - - int abortAfter() const { return m_data.abortAfter; } - - TestSpec const& testSpec() const { return m_testSpec; } - - bool showHelp() const { return m_data.showHelp; } - bool showInvisibles() const { return m_data.showInvisibles; } - - // IConfig interface - virtual bool allowThrows() const { return !m_data.noThrow; } - virtual std::ostream& stream() const { return m_stream->stream(); } - virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } - virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } - virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; } - virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } - virtual RunTests::InWhatOrder runOrder() const { return m_data.runOrder; } - virtual unsigned int rngSeed() const { return m_data.rngSeed; } - virtual bool forceColour() const { return m_data.forceColour; } - - private: - - IStream const* openStream() { - if( m_data.outputFilename.empty() ) - return new CoutStream(); - else if( m_data.outputFilename[0] == '%' ) { - if( m_data.outputFilename == "%debug" ) - return new DebugOutStream(); - else - throw std::domain_error( "Unrecognised stream: " + m_data.outputFilename ); - } - else - return new FileStream( m_data.outputFilename ); - } - ConfigData m_data; - - std::auto_ptr m_stream; - TestSpec m_testSpec; - }; - -} // end namespace Catch - -// #included from: catch_clara.h -#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED - -// Use Catch's value for console width (store Clara's off to the side, if present) -#ifdef CLARA_CONFIG_CONSOLE_WIDTH -#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH -#undef CLARA_CONFIG_CONSOLE_WIDTH -#endif -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -// Declare Clara inside the Catch namespace -#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { -// #included from: ../external/clara.h - -// Version 0.0.1.1 - -// Only use header guard if we are not using an outer namespace -#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) - -#ifndef STITCH_CLARA_OPEN_NAMESPACE -#define TWOBLUECUBES_CLARA_H_INCLUDED -#define STITCH_CLARA_OPEN_NAMESPACE -#define STITCH_CLARA_CLOSE_NAMESPACE -#else -#define STITCH_CLARA_CLOSE_NAMESPACE } -#endif - -#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE - -// ----------- #included from tbc_text_format.h ----------- - -// Only use header guard if we are not using an outer namespace -#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) -#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -#define TBC_TEXT_FORMAT_H_INCLUDED -#endif - -#include -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TBC_TEXT_FORMAT_H_INCLUDED - -// ----------- end of #include from tbc_text_format.h ----------- -// ........... back in clara.h - -#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE - -// ----------- #included from clara_compilers.h ----------- - -#ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED -#define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED - -// Detect a number of compiler features - mostly C++11/14 conformance - by compiler -// The following features are defined: -// -// CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported? -// CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported? -// CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods -// CLARA_CONFIG_CPP11_OVERRIDE : is override supported? -// CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) - -// CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported? - -// CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported? - -// In general each macro has a _NO_ form -// (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature. -// Many features, at point of detection, define an _INTERNAL_ macro, so they -// can be combined, en-mass, with the _NO_ forms later. - -// All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11 - -#ifdef __clang__ - -#if __has_feature(cxx_nullptr) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -#if __has_feature(cxx_noexcept) -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -// - otherwise more recent versions define __cplusplus >= 201103L -// and will get picked up below - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#if (_MSC_VER >= 1600) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#endif - -#endif // _MSC_VER - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// catch all support for C++11 -#if defined(__cplusplus) && __cplusplus >= 201103L - -#define CLARA_CPP11_OR_GREATER - -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -#ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#endif - -#ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#endif - -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) -#define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE -#endif -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) -#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#endif // __cplusplus >= 201103L - -// Now set the actual defines based on the above + anything the user has configured -#if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_NULLPTR -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_NOEXCEPT -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_GENERATED_METHODS -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_OVERRIDE -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_UNIQUE_PTR) && !defined(CLARA_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_UNIQUE_PTR -#endif - -// noexcept support: -#if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT) -#define CLARA_NOEXCEPT noexcept -# define CLARA_NOEXCEPT_IS(x) noexcept(x) -#else -#define CLARA_NOEXCEPT throw() -# define CLARA_NOEXCEPT_IS(x) -#endif - -// nullptr support -#ifdef CLARA_CONFIG_CPP11_NULLPTR -#define CLARA_NULL nullptr -#else -#define CLARA_NULL NULL -#endif - -// override support -#ifdef CLARA_CONFIG_CPP11_OVERRIDE -#define CLARA_OVERRIDE override -#else -#define CLARA_OVERRIDE -#endif - -// unique_ptr support -#ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR -# define CLARA_AUTO_PTR( T ) std::unique_ptr -#else -# define CLARA_AUTO_PTR( T ) std::auto_ptr -#endif - -#endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED - -// ----------- end of #include from clara_compilers.h ----------- -// ........... back in clara.h - -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_CLARA_OPEN_NAMESPACE -STITCH_CLARA_OPEN_NAMESPACE -#endif - -namespace Clara { - - struct UnpositionalTag {}; - - extern UnpositionalTag _; - -#ifdef CLARA_CONFIG_MAIN - UnpositionalTag _; -#endif - - namespace Detail { - -#ifdef CLARA_CONSOLE_WIDTH - const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - // Use this to try and stop compiler from warning about unreachable code - inline bool isTrue( bool value ) { return value; } - - using namespace Tbc; - - inline bool startsWith( std::string const& str, std::string const& prefix ) { - return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; - } - - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - - template struct IsBool { static const bool value = false; }; - template<> struct IsBool { static const bool value = true; }; - - template - void convertInto( std::string const& _source, T& _dest ) { - std::stringstream ss; - ss << _source; - ss >> _dest; - if( ss.fail() ) - throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); - } - inline void convertInto( std::string const& _source, std::string& _dest ) { - _dest = _source; - } - inline void convertInto( std::string const& _source, bool& _dest ) { - std::string sourceLC = _source; - std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower ); - if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) - _dest = true; - else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) - _dest = false; - else - throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); - } - inline void convertInto( bool _source, bool& _dest ) { - _dest = _source; - } - template - inline void convertInto( bool, T& ) { - if( isTrue( true ) ) - throw std::runtime_error( "Invalid conversion" ); - } - - template - struct IArgFunction { - virtual ~IArgFunction() {} -#ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS - IArgFunction() = default; - IArgFunction( IArgFunction const& ) = default; -#endif - virtual void set( ConfigT& config, std::string const& value ) const = 0; - virtual void setFlag( ConfigT& config ) const = 0; - virtual bool takesArg() const = 0; - virtual IArgFunction* clone() const = 0; - }; - - template - class BoundArgFunction { - public: - BoundArgFunction() : functionObj( CLARA_NULL ) {} - BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} - BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {} - BoundArgFunction& operator = ( BoundArgFunction const& other ) { - IArgFunction* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL; - delete functionObj; - functionObj = newFunctionObj; - return *this; - } - ~BoundArgFunction() { delete functionObj; } - - void set( ConfigT& config, std::string const& value ) const { - functionObj->set( config, value ); - } - void setFlag( ConfigT& config ) const { - functionObj->setFlag( config ); - } - bool takesArg() const { return functionObj->takesArg(); } - - bool isSet() const { - return functionObj != CLARA_NULL; - } - private: - IArgFunction* functionObj; - }; - - template - struct NullBinder : IArgFunction{ - virtual void set( C&, std::string const& ) const {} - virtual void setFlag( C& ) const {} - virtual bool takesArg() const { return true; } - virtual IArgFunction* clone() const { return new NullBinder( *this ); } - }; - - template - struct BoundDataMember : IArgFunction{ - BoundDataMember( M C::* _member ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - convertInto( stringValue, p.*member ); - } - virtual void setFlag( C& p ) const { - convertInto( true, p.*member ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } - M C::* member; - }; - template - struct BoundUnaryMethod : IArgFunction{ - BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - (p.*member)( value ); - } - virtual void setFlag( C& p ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - (p.*member)( value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } - void (C::*member)( M ); - }; - template - struct BoundNullaryMethod : IArgFunction{ - BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - (p.*member)(); - } - virtual void setFlag( C& p ) const { - (p.*member)(); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } - void (C::*member)(); - }; - - template - struct BoundUnaryFunction : IArgFunction{ - BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - function( obj ); - } - virtual void setFlag( C& p ) const { - function( p ); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } - void (*function)( C& ); - }; - - template - struct BoundBinaryFunction : IArgFunction{ - BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - function( obj, value ); - } - virtual void setFlag( C& obj ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - function( obj, value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } - void (*function)( C&, T ); - }; - - } // namespace Detail - - struct Parser { - Parser() : separators( " \t=:" ) {} - - struct Token { - enum Type { Positional, ShortOpt, LongOpt }; - Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} - Type type; - std::string data; - }; - - void parseIntoTokens( int argc, char const* const argv[], std::vector& tokens ) const { - const std::string doubleDash = "--"; - for( int i = 1; i < argc && argv[i] != doubleDash; ++i ) - parseIntoTokens( argv[i] , tokens); - } - void parseIntoTokens( std::string arg, std::vector& tokens ) const { - while( !arg.empty() ) { - Parser::Token token( Parser::Token::Positional, arg ); - arg = ""; - if( token.data[0] == '-' ) { - if( token.data.size() > 1 && token.data[1] == '-' ) { - token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) ); - } - else { - token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) ); - if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) { - arg = "-" + token.data.substr( 1 ); - token.data = token.data.substr( 0, 1 ); - } - } - } - if( token.type != Parser::Token::Positional ) { - std::size_t pos = token.data.find_first_of( separators ); - if( pos != std::string::npos ) { - arg = token.data.substr( pos+1 ); - token.data = token.data.substr( 0, pos ); - } - } - tokens.push_back( token ); - } - } - std::string separators; - }; - - template - struct CommonArgProperties { - CommonArgProperties() {} - CommonArgProperties( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ) {} - - Detail::BoundArgFunction boundField; - std::string description; - std::string detail; - std::string placeholder; // Only value if boundField takes an arg - - bool takesArg() const { - return !placeholder.empty(); - } - void validate() const { - if( !boundField.isSet() ) - throw std::logic_error( "option not bound" ); - } - }; - struct OptionArgProperties { - std::vector shortNames; - std::string longName; - - bool hasShortName( std::string const& shortName ) const { - return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); - } - bool hasLongName( std::string const& _longName ) const { - return _longName == longName; - } - }; - struct PositionalArgProperties { - PositionalArgProperties() : position( -1 ) {} - int position; // -1 means non-positional (floating) - - bool isFixedPositional() const { - return position != -1; - } - }; - - template - class CommandLine { - - struct Arg : CommonArgProperties, OptionArgProperties, PositionalArgProperties { - Arg() {} - Arg( Detail::BoundArgFunction const& _boundField ) : CommonArgProperties( _boundField ) {} - - using CommonArgProperties::placeholder; // !TBD - - std::string dbgName() const { - if( !longName.empty() ) - return "--" + longName; - if( !shortNames.empty() ) - return "-" + shortNames[0]; - return "positional args"; - } - std::string commands() const { - std::ostringstream oss; - bool first = true; - std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); - for(; it != itEnd; ++it ) { - if( first ) - first = false; - else - oss << ", "; - oss << "-" << *it; - } - if( !longName.empty() ) { - if( !first ) - oss << ", "; - oss << "--" << longName; - } - if( !placeholder.empty() ) - oss << " <" << placeholder << ">"; - return oss.str(); - } - }; - - typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr; - - friend void addOptName( Arg& arg, std::string const& optName ) - { - if( optName.empty() ) - return; - if( Detail::startsWith( optName, "--" ) ) { - if( !arg.longName.empty() ) - throw std::logic_error( "Only one long opt may be specified. '" - + arg.longName - + "' already specified, now attempting to add '" - + optName + "'" ); - arg.longName = optName.substr( 2 ); - } - else if( Detail::startsWith( optName, "-" ) ) - arg.shortNames.push_back( optName.substr( 1 ) ); - else - throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); - } - friend void setPositionalArg( Arg& arg, int position ) - { - arg.position = position; - } - - class ArgBuilder { - public: - ArgBuilder( Arg* arg ) : m_arg( arg ) {} - - // Bind a non-boolean data member (requires placeholder string) - template - void bind( M C::* field, std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - m_arg->placeholder = placeholder; - } - // Bind a boolean data member (no placeholder required) - template - void bind( bool C::* field ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - } - - // Bind a method taking a single, non-boolean argument (requires a placeholder string) - template - void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - m_arg->placeholder = placeholder; - } - - // Bind a method taking a single, boolean argument (no placeholder string required) - template - void bind( void (C::* unaryMethod)( bool ) ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - } - - // Bind a method that takes no arguments (will be called if opt is present) - template - void bind( void (C::* nullaryMethod)() ) { - m_arg->boundField = new Detail::BoundNullaryMethod( nullaryMethod ); - } - - // Bind a free function taking a single argument - the object to operate on (no placeholder string required) - template - void bind( void (* unaryFunction)( C& ) ) { - m_arg->boundField = new Detail::BoundUnaryFunction( unaryFunction ); - } - - // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) - template - void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundBinaryFunction( binaryFunction ); - m_arg->placeholder = placeholder; - } - - ArgBuilder& describe( std::string const& description ) { - m_arg->description = description; - return *this; - } - ArgBuilder& detail( std::string const& detail ) { - m_arg->detail = detail; - return *this; - } - - protected: - Arg* m_arg; - }; - - class OptBuilder : public ArgBuilder { - public: - OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} - OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} - - OptBuilder& operator[]( std::string const& optName ) { - addOptName( *ArgBuilder::m_arg, optName ); - return *this; - } - }; - - public: - - CommandLine() - : m_boundProcessName( new Detail::NullBinder() ), - m_highestSpecifiedArgPosition( 0 ), - m_throwOnUnrecognisedTokens( false ) - {} - CommandLine( CommandLine const& other ) - : m_boundProcessName( other.m_boundProcessName ), - m_options ( other.m_options ), - m_positionalArgs( other.m_positionalArgs ), - m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), - m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) - { - if( other.m_floatingArg.get() ) - m_floatingArg.reset( new Arg( *other.m_floatingArg ) ); - } - - CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { - m_throwOnUnrecognisedTokens = shouldThrow; - return *this; - } - - OptBuilder operator[]( std::string const& optName ) { - m_options.push_back( Arg() ); - addOptName( m_options.back(), optName ); - OptBuilder builder( &m_options.back() ); - return builder; - } - - ArgBuilder operator[]( int position ) { - m_positionalArgs.insert( std::make_pair( position, Arg() ) ); - if( position > m_highestSpecifiedArgPosition ) - m_highestSpecifiedArgPosition = position; - setPositionalArg( m_positionalArgs[position], position ); - ArgBuilder builder( &m_positionalArgs[position] ); - return builder; - } - - // Invoke this with the _ instance - ArgBuilder operator[]( UnpositionalTag ) { - if( m_floatingArg.get() ) - throw std::logic_error( "Only one unpositional argument can be added" ); - m_floatingArg.reset( new Arg() ); - ArgBuilder builder( m_floatingArg.get() ); - return builder; - } - - template - void bindProcessName( M C::* field ) { - m_boundProcessName = new Detail::BoundDataMember( field ); - } - template - void bindProcessName( void (C::*_unaryMethod)( M ) ) { - m_boundProcessName = new Detail::BoundUnaryMethod( _unaryMethod ); - } - - void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { - typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; - std::size_t maxWidth = 0; - for( it = itBegin; it != itEnd; ++it ) - maxWidth = (std::max)( maxWidth, it->commands().size() ); - - for( it = itBegin; it != itEnd; ++it ) { - Detail::Text usage( it->commands(), Detail::TextAttributes() - .setWidth( maxWidth+indent ) - .setIndent( indent ) ); - Detail::Text desc( it->description, Detail::TextAttributes() - .setWidth( width - maxWidth - 3 ) ); - - for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { - std::string usageCol = i < usage.size() ? usage[i] : ""; - os << usageCol; - - if( i < desc.size() && !desc[i].empty() ) - os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) - << desc[i]; - os << "\n"; - } - } - } - std::string optUsage() const { - std::ostringstream oss; - optUsage( oss ); - return oss.str(); - } - - void argSynopsis( std::ostream& os ) const { - for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { - if( i > 1 ) - os << " "; - typename std::map::const_iterator it = m_positionalArgs.find( i ); - if( it != m_positionalArgs.end() ) - os << "<" << it->second.placeholder << ">"; - else if( m_floatingArg.get() ) - os << "<" << m_floatingArg->placeholder << ">"; - else - throw std::logic_error( "non consecutive positional arguments with no floating args" ); - } - // !TBD No indication of mandatory args - if( m_floatingArg.get() ) { - if( m_highestSpecifiedArgPosition > 1 ) - os << " "; - os << "[<" << m_floatingArg->placeholder << "> ...]"; - } - } - std::string argSynopsis() const { - std::ostringstream oss; - argSynopsis( oss ); - return oss.str(); - } - - void usage( std::ostream& os, std::string const& procName ) const { - validate(); - os << "usage:\n " << procName << " "; - argSynopsis( os ); - if( !m_options.empty() ) { - os << " [options]\n\nwhere options are: \n"; - optUsage( os, 2 ); - } - os << "\n"; - } - std::string usage( std::string const& procName ) const { - std::ostringstream oss; - usage( oss, procName ); - return oss.str(); - } - - ConfigT parse( int argc, char const* const argv[] ) const { - ConfigT config; - parseInto( argc, argv, config ); - return config; - } - - std::vector parseInto( int argc, char const* argv[], ConfigT& config ) const { - std::string processName = argv[0]; - std::size_t lastSlash = processName.find_last_of( "/\\" ); - if( lastSlash != std::string::npos ) - processName = processName.substr( lastSlash+1 ); - m_boundProcessName.set( config, processName ); - std::vector tokens; - Parser parser; - parser.parseIntoTokens( argc, argv, tokens ); - return populate( tokens, config ); - } - - std::vector populate( std::vector const& tokens, ConfigT& config ) const { - validate(); - std::vector unusedTokens = populateOptions( tokens, config ); - unusedTokens = populateFixedArgs( unusedTokens, config ); - unusedTokens = populateFloatingArgs( unusedTokens, config ); - return unusedTokens; - } - - std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - std::vector errors; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); - for(; it != itEnd; ++it ) { - Arg const& arg = *it; - - try { - if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || - ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { - if( arg.takesArg() ) { - if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) - errors.push_back( "Expected argument to option: " + token.data ); - else - arg.boundField.set( config, tokens[++i].data ); - } - else { - arg.boundField.setFlag( config ); - } - break; - } - } - catch( std::exception& ex ) { - errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); - } - } - if( it == itEnd ) { - if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) - unusedTokens.push_back( token ); - else if( errors.empty() && m_throwOnUnrecognisedTokens ) - errors.push_back( "unrecognised option: " + token.data ); - } - } - if( !errors.empty() ) { - std::ostringstream oss; - for( std::vector::const_iterator it = errors.begin(), itEnd = errors.end(); - it != itEnd; - ++it ) { - if( it != errors.begin() ) - oss << "\n"; - oss << *it; - } - throw std::runtime_error( oss.str() ); - } - return unusedTokens; - } - std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - int position = 1; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::map::const_iterator it = m_positionalArgs.find( position ); - if( it != m_positionalArgs.end() ) - it->second.boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - if( token.type == Parser::Token::Positional ) - position++; - } - return unusedTokens; - } - std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { - if( !m_floatingArg.get() ) - return tokens; - std::vector unusedTokens; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - if( token.type == Parser::Token::Positional ) - m_floatingArg->boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - } - return unusedTokens; - } - - void validate() const - { - if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) - throw std::logic_error( "No options or arguments specified" ); - - for( typename std::vector::const_iterator it = m_options.begin(), - itEnd = m_options.end(); - it != itEnd; ++it ) - it->validate(); - } - - private: - Detail::BoundArgFunction m_boundProcessName; - std::vector m_options; - std::map m_positionalArgs; - ArgAutoPtr m_floatingArg; - int m_highestSpecifiedArgPosition; - bool m_throwOnUnrecognisedTokens; - }; - -} // end namespace Clara - -STITCH_CLARA_CLOSE_NAMESPACE -#undef STITCH_CLARA_OPEN_NAMESPACE -#undef STITCH_CLARA_CLOSE_NAMESPACE - -#endif // TWOBLUECUBES_CLARA_H_INCLUDED -#undef STITCH_CLARA_OPEN_NAMESPACE - -// Restore Clara's value for console width, if present -#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#endif - -#include - -namespace Catch { - - inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } - inline void abortAfterX( ConfigData& config, int x ) { - if( x < 1 ) - throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); - config.abortAfter = x; - } - inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } - inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); } - - inline void addWarning( ConfigData& config, std::string const& _warning ) { - if( _warning == "NoAssertions" ) - config.warnings = static_cast( config.warnings | WarnAbout::NoAssertions ); - else - throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" ); - } - inline void setOrder( ConfigData& config, std::string const& order ) { - if( startsWith( "declared", order ) ) - config.runOrder = RunTests::InDeclarationOrder; - else if( startsWith( "lexical", order ) ) - config.runOrder = RunTests::InLexicographicalOrder; - else if( startsWith( "random", order ) ) - config.runOrder = RunTests::InRandomOrder; - else - throw std::runtime_error( "Unrecognised ordering: '" + order + "'" ); - } - inline void setRngSeed( ConfigData& config, std::string const& seed ) { - if( seed == "time" ) { - config.rngSeed = static_cast( std::time(0) ); - } - else { - std::stringstream ss; - ss << seed; - ss >> config.rngSeed; - if( ss.fail() ) - throw std::runtime_error( "Argment to --rng-seed should be the word 'time' or a number" ); - } - } - inline void setVerbosity( ConfigData& config, int level ) { - // !TBD: accept strings? - config.verbosity = static_cast( level ); - } - inline void setShowDurations( ConfigData& config, bool _showDurations ) { - config.showDurations = _showDurations - ? ShowDurations::Always - : ShowDurations::Never; - } - inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { - std::ifstream f( _filename.c_str() ); - if( !f.is_open() ) - throw std::domain_error( "Unable to load input file: " + _filename ); - - std::string line; - while( std::getline( f, line ) ) { - line = trim(line); - if( !line.empty() && !startsWith( line, "#" ) ) - addTestOrTags( config, "\"" + line + "\"," ); - } - } - - inline Clara::CommandLine makeCommandLineParser() { - - using namespace Clara; - CommandLine cli; - - cli.bindProcessName( &ConfigData::processName ); - - cli["-?"]["-h"]["--help"] - .describe( "display usage information" ) - .bind( &ConfigData::showHelp ); - - cli["-l"]["--list-tests"] - .describe( "list all/matching test cases" ) - .bind( &ConfigData::listTests ); - - cli["-t"]["--list-tags"] - .describe( "list all/matching tags" ) - .bind( &ConfigData::listTags ); - - cli["-s"]["--success"] - .describe( "include successful tests in output" ) - .bind( &ConfigData::showSuccessfulTests ); - - cli["-b"]["--break"] - .describe( "break into debugger on failure" ) - .bind( &ConfigData::shouldDebugBreak ); - - cli["-e"]["--nothrow"] - .describe( "skip exception tests" ) - .bind( &ConfigData::noThrow ); - - cli["-i"]["--invisibles"] - .describe( "show invisibles (tabs, newlines)" ) - .bind( &ConfigData::showInvisibles ); - - cli["-o"]["--out"] - .describe( "output filename" ) - .bind( &ConfigData::outputFilename, "filename" ); - - cli["-r"]["--reporter"] -// .placeholder( "name[:filename]" ) - .describe( "reporter to use (defaults to console)" ) - .bind( &addReporterName, "name" ); - - cli["-n"]["--name"] - .describe( "suite name" ) - .bind( &ConfigData::name, "name" ); - - cli["-a"]["--abort"] - .describe( "abort at first failure" ) - .bind( &abortAfterFirst ); - - cli["-x"]["--abortx"] - .describe( "abort after x failures" ) - .bind( &abortAfterX, "no. failures" ); - - cli["-w"]["--warn"] - .describe( "enable warnings" ) - .bind( &addWarning, "warning name" ); - -// - needs updating if reinstated -// cli.into( &setVerbosity ) -// .describe( "level of verbosity (0=no output)" ) -// .shortOpt( "v") -// .longOpt( "verbosity" ) -// .placeholder( "level" ); - - cli[_] - .describe( "which test or tests to use" ) - .bind( &addTestOrTags, "test name, pattern or tags" ); - - cli["-d"]["--durations"] - .describe( "show test durations" ) - .bind( &setShowDurations, "yes/no" ); - - cli["-f"]["--input-file"] - .describe( "load test names to run from a file" ) - .bind( &loadTestNamesFromFile, "filename" ); - - cli["-#"]["--filenames-as-tags"] - .describe( "adds a tag for the filename" ) - .bind( &ConfigData::filenamesAsTags ); - - // Less common commands which don't have a short form - cli["--list-test-names-only"] - .describe( "list all/matching test cases names only" ) - .bind( &ConfigData::listTestNamesOnly ); - - cli["--list-reporters"] - .describe( "list all reporters" ) - .bind( &ConfigData::listReporters ); - - cli["--order"] - .describe( "test case order (defaults to decl)" ) - .bind( &setOrder, "decl|lex|rand" ); - - cli["--rng-seed"] - .describe( "set a specific seed for random numbers" ) - .bind( &setRngSeed, "'time'|number" ); - - cli["--force-colour"] - .describe( "force colourised output" ) - .bind( &ConfigData::forceColour ); - - return cli; - } - -} // end namespace Catch - -// #included from: internal/catch_list.hpp -#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED - -// #included from: catch_text.h -#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED - -#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch -// #included from: ../external/tbc_text_format.h -// Only use header guard if we are not using an outer namespace -#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# endif -# else -# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# endif -#endif -#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#include -#include -#include - -// Use optional outer namespace -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE - -namespace Catch { - using Tbc::Text; - using Tbc::TextAttributes; -} - -// #included from: catch_console_colour.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED - -namespace Catch { - - struct Colour { - enum Code { - None = 0, - - White, - Red, - Green, - Blue, - Cyan, - Yellow, - Grey, - - Bright = 0x10, - - BrightRed = Bright | Red, - BrightGreen = Bright | Green, - LightGrey = Bright | Grey, - BrightWhite = Bright | White, - - // By intention - FileName = LightGrey, - Warning = Yellow, - ResultError = BrightRed, - ResultSuccess = BrightGreen, - ResultExpectedFailure = Warning, - - Error = BrightRed, - Success = Green, - - OriginalExpression = Cyan, - ReconstructedExpression = Yellow, - - SecondaryText = LightGrey, - Headers = White - }; - - // Use constructed object for RAII guard - Colour( Code _colourCode ); - Colour( Colour const& other ); - ~Colour(); - - // Use static method for one-shot changes - static void use( Code _colourCode ); - - private: - bool m_moved; - }; - - inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } - -} // end namespace Catch - -// #included from: catch_interfaces_reporter.h -#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED - -#include -#include -#include -#include - -namespace Catch -{ - struct ReporterConfig { - explicit ReporterConfig( Ptr const& _fullConfig ) - : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} - - ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) - : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} - - std::ostream& stream() const { return *m_stream; } - Ptr fullConfig() const { return m_fullConfig; } - - private: - std::ostream* m_stream; - Ptr m_fullConfig; - }; - - struct ReporterPreferences { - ReporterPreferences() - : shouldRedirectStdOut( false ) - {} - - bool shouldRedirectStdOut; - }; - - template - struct LazyStat : Option { - LazyStat() : used( false ) {} - LazyStat& operator=( T const& _value ) { - Option::operator=( _value ); - used = false; - return *this; - } - void reset() { - Option::reset(); - used = false; - } - bool used; - }; - - struct TestRunInfo { - TestRunInfo( std::string const& _name ) : name( _name ) {} - std::string name; - }; - struct GroupInfo { - GroupInfo( std::string const& _name, - std::size_t _groupIndex, - std::size_t _groupsCount ) - : name( _name ), - groupIndex( _groupIndex ), - groupsCounts( _groupsCount ) - {} - - std::string name; - std::size_t groupIndex; - std::size_t groupsCounts; - }; - - struct AssertionStats { - AssertionStats( AssertionResult const& _assertionResult, - std::vector const& _infoMessages, - Totals const& _totals ) - : assertionResult( _assertionResult ), - infoMessages( _infoMessages ), - totals( _totals ) - { - if( assertionResult.hasMessage() ) { - // Copy message into messages list. - // !TBD This should have been done earlier, somewhere - MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); - builder << assertionResult.getMessage(); - builder.m_info.message = builder.m_stream.str(); - - infoMessages.push_back( builder.m_info ); - } - } - virtual ~AssertionStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - AssertionStats( AssertionStats const& ) = default; - AssertionStats( AssertionStats && ) = default; - AssertionStats& operator = ( AssertionStats const& ) = default; - AssertionStats& operator = ( AssertionStats && ) = default; -# endif - - AssertionResult assertionResult; - std::vector infoMessages; - Totals totals; - }; - - struct SectionStats { - SectionStats( SectionInfo const& _sectionInfo, - Counts const& _assertions, - double _durationInSeconds, - bool _missingAssertions ) - : sectionInfo( _sectionInfo ), - assertions( _assertions ), - durationInSeconds( _durationInSeconds ), - missingAssertions( _missingAssertions ) - {} - virtual ~SectionStats(); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - SectionStats( SectionStats const& ) = default; - SectionStats( SectionStats && ) = default; - SectionStats& operator = ( SectionStats const& ) = default; - SectionStats& operator = ( SectionStats && ) = default; -# endif - - SectionInfo sectionInfo; - Counts assertions; - double durationInSeconds; - bool missingAssertions; - }; - - struct TestCaseStats { - TestCaseStats( TestCaseInfo const& _testInfo, - Totals const& _totals, - std::string const& _stdOut, - std::string const& _stdErr, - bool _aborting ) - : testInfo( _testInfo ), - totals( _totals ), - stdOut( _stdOut ), - stdErr( _stdErr ), - aborting( _aborting ) - {} - virtual ~TestCaseStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestCaseStats( TestCaseStats const& ) = default; - TestCaseStats( TestCaseStats && ) = default; - TestCaseStats& operator = ( TestCaseStats const& ) = default; - TestCaseStats& operator = ( TestCaseStats && ) = default; -# endif - - TestCaseInfo testInfo; - Totals totals; - std::string stdOut; - std::string stdErr; - bool aborting; - }; - - struct TestGroupStats { - TestGroupStats( GroupInfo const& _groupInfo, - Totals const& _totals, - bool _aborting ) - : groupInfo( _groupInfo ), - totals( _totals ), - aborting( _aborting ) - {} - TestGroupStats( GroupInfo const& _groupInfo ) - : groupInfo( _groupInfo ), - aborting( false ) - {} - virtual ~TestGroupStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestGroupStats( TestGroupStats const& ) = default; - TestGroupStats( TestGroupStats && ) = default; - TestGroupStats& operator = ( TestGroupStats const& ) = default; - TestGroupStats& operator = ( TestGroupStats && ) = default; -# endif - - GroupInfo groupInfo; - Totals totals; - bool aborting; - }; - - struct TestRunStats { - TestRunStats( TestRunInfo const& _runInfo, - Totals const& _totals, - bool _aborting ) - : runInfo( _runInfo ), - totals( _totals ), - aborting( _aborting ) - {} - virtual ~TestRunStats(); - -# ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestRunStats( TestRunStats const& _other ) - : runInfo( _other.runInfo ), - totals( _other.totals ), - aborting( _other.aborting ) - {} -# else - TestRunStats( TestRunStats const& ) = default; - TestRunStats( TestRunStats && ) = default; - TestRunStats& operator = ( TestRunStats const& ) = default; - TestRunStats& operator = ( TestRunStats && ) = default; -# endif - - TestRunInfo runInfo; - Totals totals; - bool aborting; - }; - - struct IStreamingReporter : IShared { - virtual ~IStreamingReporter(); - - // Implementing class must also provide the following static method: - // static std::string getDescription(); - - virtual ReporterPreferences getPreferences() const = 0; - - virtual void noMatchingTestCases( std::string const& spec ) = 0; - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; - virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; - virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; - - // The return value indicates if the messages buffer should be cleared: - virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; - - virtual void sectionEnded( SectionStats const& sectionStats ) = 0; - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; - virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; - - virtual void skipTest( TestCaseInfo const& testInfo ) = 0; - }; - - struct IReporterFactory : IShared { - virtual ~IReporterFactory(); - virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; - virtual std::string getDescription() const = 0; - }; - - struct IReporterRegistry { - typedef std::map > FactoryMap; - typedef std::vector > Listeners; - - virtual ~IReporterRegistry(); - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; - virtual FactoryMap const& getFactories() const = 0; - virtual Listeners const& getListeners() const = 0; - }; - - Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ); - -} - -#include -#include - -namespace Catch { - - inline std::size_t listTests( Config const& config ) { - - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - Catch::cout() << "Matching test cases:\n"; - else { - Catch::cout() << "All available test cases:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::size_t matchedTests = 0; - TextAttributes nameAttr, tagsAttr; - nameAttr.setInitialIndent( 2 ).setIndent( 4 ); - tagsAttr.setIndent( 6 ); - - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - Colour::Code colour = testCaseInfo.isHidden() - ? Colour::SecondaryText - : Colour::None; - Colour colourGuard( colour ); - - Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl; - if( !testCaseInfo.tags.empty() ) - Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; - } - - if( !config.testSpec().hasFilters() ) - Catch::cout() << pluralise( matchedTests, "test case" ) << "\n" << std::endl; - else - Catch::cout() << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl; - return matchedTests; - } - - inline std::size_t listTestsNamesOnly( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( !config.testSpec().hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - std::size_t matchedTests = 0; - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - Catch::cout() << testCaseInfo.name << std::endl; - } - return matchedTests; - } - - struct TagInfo { - TagInfo() : count ( 0 ) {} - void add( std::string const& spelling ) { - ++count; - spellings.insert( spelling ); - } - std::string all() const { - std::string out; - for( std::set::const_iterator it = spellings.begin(), itEnd = spellings.end(); - it != itEnd; - ++it ) - out += "[" + *it + "]"; - return out; - } - std::set spellings; - std::size_t count; - }; - - inline std::size_t listTags( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - Catch::cout() << "Tags for matching test cases:\n"; - else { - Catch::cout() << "All available tags:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::map tagCounts; - - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), - tagItEnd = it->getTestCaseInfo().tags.end(); - tagIt != tagItEnd; - ++tagIt ) { - std::string tagName = *tagIt; - std::string lcaseTagName = toLower( tagName ); - std::map::iterator countIt = tagCounts.find( lcaseTagName ); - if( countIt == tagCounts.end() ) - countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; - countIt->second.add( tagName ); - } - } - - for( std::map::const_iterator countIt = tagCounts.begin(), - countItEnd = tagCounts.end(); - countIt != countItEnd; - ++countIt ) { - std::ostringstream oss; - oss << " " << std::setw(2) << countIt->second.count << " "; - Text wrapper( countIt->second.all(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( oss.str().size() ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); - Catch::cout() << oss.str() << wrapper << "\n"; - } - Catch::cout() << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl; - return tagCounts.size(); - } - - inline std::size_t listReporters( Config const& /*config*/ ) { - Catch::cout() << "Available reporters:\n"; - IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); - IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; - std::size_t maxNameLen = 0; - for(it = itBegin; it != itEnd; ++it ) - maxNameLen = (std::max)( maxNameLen, it->first.size() ); - - for(it = itBegin; it != itEnd; ++it ) { - Text wrapper( it->second->getDescription(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( 7+maxNameLen ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); - Catch::cout() << " " - << it->first - << ":" - << std::string( maxNameLen - it->first.size() + 2, ' ' ) - << wrapper << "\n"; - } - Catch::cout() << std::endl; - return factories.size(); - } - - inline Option list( Config const& config ) { - Option listedCount; - if( config.listTests() ) - listedCount = listedCount.valueOr(0) + listTests( config ); - if( config.listTestNamesOnly() ) - listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); - if( config.listTags() ) - listedCount = listedCount.valueOr(0) + listTags( config ); - if( config.listReporters() ) - listedCount = listedCount.valueOr(0) + listReporters( config ); - return listedCount; - } - -} // end namespace Catch - -// #included from: internal/catch_run_context.hpp -#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED - -// #included from: catch_test_case_tracker.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { -namespace TestCaseTracking { - - struct ITracker : SharedImpl<> { - virtual ~ITracker(); - - // static queries - virtual std::string name() const = 0; - - // dynamic queries - virtual bool isComplete() const = 0; // Successfully completed or failed - virtual bool isSuccessfullyCompleted() const = 0; - virtual bool isOpen() const = 0; // Started but not complete - virtual bool hasChildren() const = 0; - - virtual ITracker& parent() = 0; - - // actions - virtual void close() = 0; // Successfully complete - virtual void fail() = 0; - virtual void markAsNeedingAnotherRun() = 0; - - virtual void addChild( Ptr const& child ) = 0; - virtual ITracker* findChild( std::string const& name ) = 0; - virtual void openChild() = 0; - }; - - class TrackerContext { - - enum RunState { - NotStarted, - Executing, - CompletedCycle - }; - - Ptr m_rootTracker; - ITracker* m_currentTracker; - RunState m_runState; - - public: - - static TrackerContext& instance() { - static TrackerContext s_instance; - return s_instance; - } - - TrackerContext() - : m_currentTracker( CATCH_NULL ), - m_runState( NotStarted ) - {} - - ITracker& startRun(); - - void endRun() { - m_rootTracker.reset(); - m_currentTracker = CATCH_NULL; - m_runState = NotStarted; - } - - void startCycle() { - m_currentTracker = m_rootTracker.get(); - m_runState = Executing; - } - void completeCycle() { - m_runState = CompletedCycle; - } - - bool completedCycle() const { - return m_runState == CompletedCycle; - } - ITracker& currentTracker() { - return *m_currentTracker; - } - void setCurrentTracker( ITracker* tracker ) { - m_currentTracker = tracker; - } - }; - - class TrackerBase : public ITracker { - protected: - enum CycleState { - NotStarted, - Executing, - ExecutingChildren, - NeedsAnotherRun, - CompletedSuccessfully, - Failed - }; - class TrackerHasName { - std::string m_name; - public: - TrackerHasName( std::string const& name ) : m_name( name ) {} - bool operator ()( Ptr const& tracker ) { - return tracker->name() == m_name; - } - }; - typedef std::vector > Children; - std::string m_name; - TrackerContext& m_ctx; - ITracker* m_parent; - Children m_children; - CycleState m_runState; - public: - TrackerBase( std::string const& name, TrackerContext& ctx, ITracker* parent ) - : m_name( name ), - m_ctx( ctx ), - m_parent( parent ), - m_runState( NotStarted ) - {} - virtual ~TrackerBase(); - - virtual std::string name() const CATCH_OVERRIDE { - return m_name; - } - virtual bool isComplete() const CATCH_OVERRIDE { - return m_runState == CompletedSuccessfully || m_runState == Failed; - } - virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE { - return m_runState == CompletedSuccessfully; - } - virtual bool isOpen() const CATCH_OVERRIDE { - return m_runState != NotStarted && !isComplete(); - } - virtual bool hasChildren() const CATCH_OVERRIDE { - return !m_children.empty(); - } - - virtual void addChild( Ptr const& child ) CATCH_OVERRIDE { - m_children.push_back( child ); - } - - virtual ITracker* findChild( std::string const& name ) CATCH_OVERRIDE { - Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( name ) ); - return( it != m_children.end() ) - ? it->get() - : CATCH_NULL; - } - virtual ITracker& parent() CATCH_OVERRIDE { - assert( m_parent ); // Should always be non-null except for root - return *m_parent; - } - - virtual void openChild() CATCH_OVERRIDE { - if( m_runState != ExecutingChildren ) { - m_runState = ExecutingChildren; - if( m_parent ) - m_parent->openChild(); - } - } - void open() { - m_runState = Executing; - moveToThis(); - if( m_parent ) - m_parent->openChild(); - } - - virtual void close() CATCH_OVERRIDE { - - // Close any still open children (e.g. generators) - while( &m_ctx.currentTracker() != this ) - m_ctx.currentTracker().close(); - - switch( m_runState ) { - case NotStarted: - case CompletedSuccessfully: - case Failed: - throw std::logic_error( "Illogical state" ); - - case NeedsAnotherRun: - break;; - - case Executing: - m_runState = CompletedSuccessfully; - break; - case ExecutingChildren: - if( m_children.empty() || m_children.back()->isComplete() ) - m_runState = CompletedSuccessfully; - break; - - default: - throw std::logic_error( "Unexpected state" ); - } - moveToParent(); - m_ctx.completeCycle(); - } - virtual void fail() CATCH_OVERRIDE { - m_runState = Failed; - if( m_parent ) - m_parent->markAsNeedingAnotherRun(); - moveToParent(); - m_ctx.completeCycle(); - } - virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE { - m_runState = NeedsAnotherRun; - } - private: - void moveToParent() { - assert( m_parent ); - m_ctx.setCurrentTracker( m_parent ); - } - void moveToThis() { - m_ctx.setCurrentTracker( this ); - } - }; - - class SectionTracker : public TrackerBase { - public: - SectionTracker( std::string const& name, TrackerContext& ctx, ITracker* parent ) - : TrackerBase( name, ctx, parent ) - {} - virtual ~SectionTracker(); - - static SectionTracker& acquire( TrackerContext& ctx, std::string const& name ) { - SectionTracker* section = CATCH_NULL; - - ITracker& currentTracker = ctx.currentTracker(); - if( ITracker* childTracker = currentTracker.findChild( name ) ) { - section = dynamic_cast( childTracker ); - assert( section ); - } - else { - section = new SectionTracker( name, ctx, ¤tTracker ); - currentTracker.addChild( section ); - } - if( !ctx.completedCycle() && !section->isComplete() ) { - - section->open(); - } - return *section; - } - }; - - class IndexTracker : public TrackerBase { - int m_size; - int m_index; - public: - IndexTracker( std::string const& name, TrackerContext& ctx, ITracker* parent, int size ) - : TrackerBase( name, ctx, parent ), - m_size( size ), - m_index( -1 ) - {} - virtual ~IndexTracker(); - - static IndexTracker& acquire( TrackerContext& ctx, std::string const& name, int size ) { - IndexTracker* tracker = CATCH_NULL; - - ITracker& currentTracker = ctx.currentTracker(); - if( ITracker* childTracker = currentTracker.findChild( name ) ) { - tracker = dynamic_cast( childTracker ); - assert( tracker ); - } - else { - tracker = new IndexTracker( name, ctx, ¤tTracker, size ); - currentTracker.addChild( tracker ); - } - - if( !ctx.completedCycle() && !tracker->isComplete() ) { - if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun ) - tracker->moveNext(); - tracker->open(); - } - - return *tracker; - } - - int index() const { return m_index; } - - void moveNext() { - m_index++; - m_children.clear(); - } - - virtual void close() CATCH_OVERRIDE { - TrackerBase::close(); - if( m_runState == CompletedSuccessfully && m_index < m_size-1 ) - m_runState = Executing; - } - }; - - inline ITracker& TrackerContext::startRun() { - m_rootTracker = new SectionTracker( "{root}", *this, CATCH_NULL ); - m_currentTracker = CATCH_NULL; - m_runState = Executing; - return *m_rootTracker; - } - -} // namespace TestCaseTracking - -using TestCaseTracking::ITracker; -using TestCaseTracking::TrackerContext; -using TestCaseTracking::SectionTracker; -using TestCaseTracking::IndexTracker; - -} // namespace Catch - -// #included from: catch_fatal_condition.hpp -#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED - -namespace Catch { - - // Report the error condition then exit the process - inline void fatal( std::string const& message, int exitCode ) { - IContext& context = Catch::getCurrentContext(); - IResultCapture* resultCapture = context.getResultCapture(); - resultCapture->handleFatalErrorCondition( message ); - - if( Catch::alwaysTrue() ) // avoids "no return" warnings - exit( exitCode ); - } - -} // namespace Catch - -#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// - -namespace Catch { - - struct FatalConditionHandler { - void reset() {} - }; - -} // namespace Catch - -#else // Not Windows - assumed to be POSIX compatible ////////////////////////// - -#include - -namespace Catch { - - struct SignalDefs { int id; const char* name; }; - extern SignalDefs signalDefs[]; - SignalDefs signalDefs[] = { - { SIGINT, "SIGINT - Terminal interrupt signal" }, - { SIGILL, "SIGILL - Illegal instruction signal" }, - { SIGFPE, "SIGFPE - Floating point error signal" }, - { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, - { SIGTERM, "SIGTERM - Termination request signal" }, - { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } - }; - - struct FatalConditionHandler { - - static void handleSignal( int sig ) { - for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) - if( sig == signalDefs[i].id ) - fatal( signalDefs[i].name, -sig ); - fatal( "", -sig ); - } - - FatalConditionHandler() : m_isSet( true ) { - for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) - signal( signalDefs[i].id, handleSignal ); - } - ~FatalConditionHandler() { - reset(); - } - void reset() { - if( m_isSet ) { - for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) - signal( signalDefs[i].id, SIG_DFL ); - m_isSet = false; - } - } - - bool m_isSet; - }; - -} // namespace Catch - -#endif // not Windows - -#include -#include - -namespace Catch { - - class StreamRedirect { - - public: - StreamRedirect( std::ostream& stream, std::string& targetString ) - : m_stream( stream ), - m_prevBuf( stream.rdbuf() ), - m_targetString( targetString ) - { - stream.rdbuf( m_oss.rdbuf() ); - } - - ~StreamRedirect() { - m_targetString += m_oss.str(); - m_stream.rdbuf( m_prevBuf ); - } - - private: - std::ostream& m_stream; - std::streambuf* m_prevBuf; - std::ostringstream m_oss; - std::string& m_targetString; - }; - - /////////////////////////////////////////////////////////////////////////// - - class RunContext : public IResultCapture, public IRunner { - - RunContext( RunContext const& ); - void operator =( RunContext const& ); - - public: - - explicit RunContext( Ptr const& _config, Ptr const& reporter ) - : m_runInfo( _config->name() ), - m_context( getCurrentMutableContext() ), - m_activeTestCase( CATCH_NULL ), - m_config( _config ), - m_reporter( reporter ) - { - m_context.setRunner( this ); - m_context.setConfig( m_config ); - m_context.setResultCapture( this ); - m_reporter->testRunStarting( m_runInfo ); - } - - virtual ~RunContext() { - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); - } - - void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); - } - void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); - } - - Totals runTest( TestCase const& testCase ) { - Totals prevTotals = m_totals; - - std::string redirectedCout; - std::string redirectedCerr; - - TestCaseInfo testInfo = testCase.getTestCaseInfo(); - - m_reporter->testCaseStarting( testInfo ); - - m_activeTestCase = &testCase; - - do { - m_trackerContext.startRun(); - do { - m_trackerContext.startCycle(); - m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, testInfo.name ); - runCurrentTest( redirectedCout, redirectedCerr ); - } - while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); - } - // !TBD: deprecated - this will be replaced by indexed trackers - while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); - - Totals deltaTotals = m_totals.delta( prevTotals ); - m_totals.testCases += deltaTotals.testCases; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - redirectedCout, - redirectedCerr, - aborting() ) ); - - m_activeTestCase = CATCH_NULL; - m_testCaseTracker = CATCH_NULL; - - return deltaTotals; - } - - Ptr config() const { - return m_config; - } - - private: // IResultCapture - - virtual void assertionEnded( AssertionResult const& result ) { - if( result.getResultType() == ResultWas::Ok ) { - m_totals.assertions.passed++; - } - else if( !result.isOk() ) { - m_totals.assertions.failed++; - } - - if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) - m_messages.clear(); - - // Reset working state - m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); - m_lastResult = result; - } - - virtual bool sectionStarted ( - SectionInfo const& sectionInfo, - Counts& assertions - ) - { - std::ostringstream oss; - oss << sectionInfo.name << "@" << sectionInfo.lineInfo; - - ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, oss.str() ); - if( !sectionTracker.isOpen() ) - return false; - m_activeSections.push_back( §ionTracker ); - - m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; - - m_reporter->sectionStarting( sectionInfo ); - - assertions = m_totals.assertions; - - return true; - } - bool testForMissingAssertions( Counts& assertions ) { - if( assertions.total() != 0 ) - return false; - if( !m_config->warnAboutMissingAssertions() ) - return false; - if( m_trackerContext.currentTracker().hasChildren() ) - return false; - m_totals.assertions.failed++; - assertions.failed++; - return true; - } - - virtual void sectionEnded( SectionEndInfo const& endInfo ) { - Counts assertions = m_totals.assertions - endInfo.prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( !m_activeSections.empty() ) { - m_activeSections.back()->close(); - m_activeSections.pop_back(); - } - - m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) ); - m_messages.clear(); - } - - virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) { - if( m_unfinishedSections.empty() ) - m_activeSections.back()->fail(); - else - m_activeSections.back()->close(); - m_activeSections.pop_back(); - - m_unfinishedSections.push_back( endInfo ); - } - - virtual void pushScopedMessage( MessageInfo const& message ) { - m_messages.push_back( message ); - } - - virtual void popScopedMessage( MessageInfo const& message ) { - m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); - } - - virtual std::string getCurrentTestName() const { - return m_activeTestCase - ? m_activeTestCase->getTestCaseInfo().name - : ""; - } - - virtual const AssertionResult* getLastResult() const { - return &m_lastResult; - } - - virtual void handleFatalErrorCondition( std::string const& message ) { - ResultBuilder resultBuilder = makeUnexpectedResultBuilder(); - resultBuilder.setResultType( ResultWas::FatalErrorCondition ); - resultBuilder << message; - resultBuilder.captureExpression(); - - handleUnfinishedSections(); - - // Recreate section for test case (as we will lose the one that was in scope) - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - - Counts assertions; - assertions.failed = 1; - SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false ); - m_reporter->sectionEnded( testCaseSectionStats ); - - TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo(); - - Totals deltaTotals; - deltaTotals.testCases.failed = 1; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - "", - "", - false ) ); - m_totals.testCases.failed++; - testGroupEnded( "", m_totals, 1, 1 ); - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) ); - } - - public: - // !TBD We need to do this another way! - bool aborting() const { - return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); - } - - private: - - void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - m_reporter->sectionStarting( testCaseSection ); - Counts prevAssertions = m_totals.assertions; - double duration = 0; - try { - m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); - - seedRng( *m_config ); - - Timer timer; - timer.start(); - if( m_reporter->getPreferences().shouldRedirectStdOut ) { - StreamRedirect coutRedir( Catch::cout(), redirectedCout ); - StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr ); - invokeActiveTestCase(); - } - else { - invokeActiveTestCase(); - } - duration = timer.getElapsedSeconds(); - } - catch( TestFailureException& ) { - // This just means the test was aborted due to failure - } - catch(...) { - makeUnexpectedResultBuilder().useActiveException(); - } - m_testCaseTracker->close(); - handleUnfinishedSections(); - m_messages.clear(); - - Counts assertions = m_totals.assertions - prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( testCaseInfo.okToFail() ) { - std::swap( assertions.failedButOk, assertions.failed ); - m_totals.assertions.failed -= assertions.failedButOk; - m_totals.assertions.failedButOk += assertions.failedButOk; - } - - SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); - m_reporter->sectionEnded( testCaseSectionStats ); - } - - void invokeActiveTestCase() { - FatalConditionHandler fatalConditionHandler; // Handle signals - m_activeTestCase->invoke(); - fatalConditionHandler.reset(); - } - - private: - - ResultBuilder makeUnexpectedResultBuilder() const { - return ResultBuilder( m_lastAssertionInfo.macroName.c_str(), - m_lastAssertionInfo.lineInfo, - m_lastAssertionInfo.capturedExpression.c_str(), - m_lastAssertionInfo.resultDisposition ); - } - - void handleUnfinishedSections() { - // If sections ended prematurely due to an exception we stored their - // infos here so we can tear them down outside the unwind process. - for( std::vector::const_reverse_iterator it = m_unfinishedSections.rbegin(), - itEnd = m_unfinishedSections.rend(); - it != itEnd; - ++it ) - sectionEnded( *it ); - m_unfinishedSections.clear(); - } - - TestRunInfo m_runInfo; - IMutableContext& m_context; - TestCase const* m_activeTestCase; - ITracker* m_testCaseTracker; - ITracker* m_currentSectionTracker; - AssertionResult m_lastResult; - - Ptr m_config; - Totals m_totals; - Ptr m_reporter; - std::vector m_messages; - AssertionInfo m_lastAssertionInfo; - std::vector m_unfinishedSections; - std::vector m_activeSections; - TrackerContext m_trackerContext; - }; - - IResultCapture& getResultCapture() { - if( IResultCapture* capture = getCurrentContext().getResultCapture() ) - return *capture; - else - throw std::logic_error( "No result capture instance" ); - } - -} // end namespace Catch - -// #included from: internal/catch_version.h -#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED - -namespace Catch { - - // Versioning information - struct Version { - Version( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _patchNumber, - std::string const& _branchName, - unsigned int _buildNumber ); - - unsigned int const majorVersion; - unsigned int const minorVersion; - unsigned int const patchNumber; - - // buildNumber is only used if branchName is not null - std::string const branchName; - unsigned int const buildNumber; - - friend std::ostream& operator << ( std::ostream& os, Version const& version ); - - private: - void operator=( Version const& ); - }; - - extern Version libraryVersion; -} - -#include -#include -#include - -namespace Catch { - - Ptr createReporter( std::string const& reporterName, Ptr const& config ) { - Ptr reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() ); - if( !reporter ) { - std::ostringstream oss; - oss << "No reporter registered with name: '" << reporterName << "'"; - throw std::domain_error( oss.str() ); - } - return reporter; - } - - Ptr makeReporter( Ptr const& config ) { - std::vector reporters = config->getReporterNames(); - if( reporters.empty() ) - reporters.push_back( "console" ); - - Ptr reporter; - for( std::vector::const_iterator it = reporters.begin(), itEnd = reporters.end(); - it != itEnd; - ++it ) - reporter = addReporter( reporter, createReporter( *it, config ) ); - return reporter; - } - Ptr addListeners( Ptr const& config, Ptr reporters ) { - IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners(); - for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end(); - it != itEnd; - ++it ) - reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) ); - return reporters; - } - - Totals runTests( Ptr const& config ) { - - Ptr iconfig = config.get(); - - Ptr reporter = makeReporter( config ); - reporter = addListeners( iconfig, reporter ); - - RunContext context( iconfig, reporter ); - - Totals totals; - - context.testGroupStarting( config->name(), 1, 1 ); - - TestSpec testSpec = config->testSpec(); - if( !testSpec.hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests - - std::vector const& allTestCases = getAllTestCasesSorted( *iconfig ); - for( std::vector::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end(); - it != itEnd; - ++it ) { - if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) ) - totals += context.runTest( *it ); - else - reporter->skipTest( *it ); - } - - context.testGroupEnded( iconfig->name(), totals, 1, 1 ); - return totals; - } - - void applyFilenamesAsTags( IConfig const& config ) { - std::vector const& tests = getAllTestCasesSorted( config ); - for(std::size_t i = 0; i < tests.size(); ++i ) { - TestCase& test = const_cast( tests[i] ); - std::set tags = test.tags; - - std::string filename = test.lineInfo.file; - std::string::size_type lastSlash = filename.find_last_of( "\\/" ); - if( lastSlash != std::string::npos ) - filename = filename.substr( lastSlash+1 ); - - std::string::size_type lastDot = filename.find_last_of( "." ); - if( lastDot != std::string::npos ) - filename = filename.substr( 0, lastDot ); - - tags.insert( "#" + filename ); - setTags( test, tags ); - } - } - - class Session : NonCopyable { - static bool alreadyInstantiated; - - public: - - struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; - - Session() - : m_cli( makeCommandLineParser() ) { - if( alreadyInstantiated ) { - std::string msg = "Only one instance of Catch::Session can ever be used"; - Catch::cerr() << msg << std::endl; - throw std::logic_error( msg ); - } - alreadyInstantiated = true; - } - ~Session() { - Catch::cleanUp(); - } - - void showHelp( std::string const& processName ) { - Catch::cout() << "\nCatch v" << libraryVersion << "\n"; - - m_cli.usage( Catch::cout(), processName ); - Catch::cout() << "For more detail usage please see the project docs\n" << std::endl; - } - - int applyCommandLine( int argc, char const* argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { - try { - m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); - m_unusedTokens = m_cli.parseInto( argc, argv, m_configData ); - if( m_configData.showHelp ) - showHelp( m_configData.processName ); - m_config.reset(); - } - catch( std::exception& ex ) { - { - Colour colourGuard( Colour::Red ); - Catch::cerr() - << "\nError(s) in input:\n" - << Text( ex.what(), TextAttributes().setIndent(2) ) - << "\n\n"; - } - m_cli.usage( Catch::cout(), m_configData.processName ); - return (std::numeric_limits::max)(); - } - return 0; - } - - void useConfigData( ConfigData const& _configData ) { - m_configData = _configData; - m_config.reset(); - } - - int run( int argc, char const* argv[] ) { - - int returnCode = applyCommandLine( argc, argv ); - if( returnCode == 0 ) - returnCode = run(); - return returnCode; - } - int run( int argc, char* argv[] ) { - return run( argc, const_cast( argv ) ); - } - - int run() { - if( m_configData.showHelp ) - return 0; - - try - { - config(); // Force config to be constructed - - seedRng( *m_config ); - - if( m_configData.filenamesAsTags ) - applyFilenamesAsTags( *m_config ); - - // Handle list request - if( Option listed = list( config() ) ) - return static_cast( *listed ); - - return static_cast( runTests( m_config ).assertions.failed ); - } - catch( std::exception& ex ) { - Catch::cerr() << ex.what() << std::endl; - return (std::numeric_limits::max)(); - } - } - - Clara::CommandLine const& cli() const { - return m_cli; - } - std::vector const& unusedTokens() const { - return m_unusedTokens; - } - ConfigData& configData() { - return m_configData; - } - Config& config() { - if( !m_config ) - m_config = new Config( m_configData ); - return *m_config; - } - private: - Clara::CommandLine m_cli; - std::vector m_unusedTokens; - ConfigData m_configData; - Ptr m_config; - }; - - bool Session::alreadyInstantiated = false; - -} // end namespace Catch - -// #included from: catch_registry_hub.hpp -#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED - -// #included from: catch_test_case_registry_impl.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED - -#include -#include -#include -#include -#include - -namespace Catch { - - struct LexSort { - bool operator() (TestCase i,TestCase j) const { return (i sortTests( IConfig const& config, std::vector const& unsortedTestCases ) { - - std::vector sorted = unsortedTestCases; - - switch( config.runOrder() ) { - case RunTests::InLexicographicalOrder: - std::sort( sorted.begin(), sorted.end(), LexSort() ); - break; - case RunTests::InRandomOrder: - { - seedRng( config ); - - RandomNumberGenerator rng; - std::random_shuffle( sorted.begin(), sorted.end(), rng ); - } - break; - case RunTests::InDeclarationOrder: - // already in declaration order - break; - } - return sorted; - } - bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { - return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() ); - } - - void enforceNoDuplicateTestCases( std::vector const& functions ) { - std::set seenFunctions; - for( std::vector::const_iterator it = functions.begin(), itEnd = functions.end(); - it != itEnd; - ++it ) { - std::pair::const_iterator, bool> prev = seenFunctions.insert( *it ); - if( !prev.second ){ - Catch::cerr() - << Colour( Colour::Red ) - << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" - << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; - exit(1); - } - } - } - - std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ) { - std::vector filtered; - filtered.reserve( testCases.size() ); - for( std::vector::const_iterator it = testCases.begin(), itEnd = testCases.end(); - it != itEnd; - ++it ) - if( matchTest( *it, testSpec, config ) ) - filtered.push_back( *it ); - return filtered; - } - std::vector const& getAllTestCasesSorted( IConfig const& config ) { - return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); - } - - class TestRegistry : public ITestCaseRegistry { - public: - TestRegistry() - : m_currentSortOrder( RunTests::InDeclarationOrder ), - m_unnamedCount( 0 ) - {} - virtual ~TestRegistry(); - - virtual void registerTest( TestCase const& testCase ) { - std::string name = testCase.getTestCaseInfo().name; - if( name == "" ) { - std::ostringstream oss; - oss << "Anonymous test case " << ++m_unnamedCount; - return registerTest( testCase.withName( oss.str() ) ); - } - m_functions.push_back( testCase ); - } - - virtual std::vector const& getAllTests() const { - return m_functions; - } - virtual std::vector const& getAllTestsSorted( IConfig const& config ) const { - if( m_sortedFunctions.empty() ) - enforceNoDuplicateTestCases( m_functions ); - - if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { - m_sortedFunctions = sortTests( config, m_functions ); - m_currentSortOrder = config.runOrder(); - } - return m_sortedFunctions; - } - - private: - std::vector m_functions; - mutable RunTests::InWhatOrder m_currentSortOrder; - mutable std::vector m_sortedFunctions; - size_t m_unnamedCount; - std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised - }; - - /////////////////////////////////////////////////////////////////////////// - - class FreeFunctionTestCase : public SharedImpl { - public: - - FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} - - virtual void invoke() const { - m_fun(); - } - - private: - virtual ~FreeFunctionTestCase(); - - TestFunction m_fun; - }; - - inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { - std::string className = classOrQualifiedMethodName; - if( startsWith( className, "&" ) ) - { - std::size_t lastColons = className.rfind( "::" ); - std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); - if( penultimateColons == std::string::npos ) - penultimateColons = 1; - className = className.substr( penultimateColons, lastColons-penultimateColons ); - } - return className; - } - - void registerTestCase - ( ITestCase* testCase, - char const* classOrQualifiedMethodName, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - getMutableRegistryHub().registerTest - ( makeTestCase - ( testCase, - extractClassName( classOrQualifiedMethodName ), - nameAndDesc.name, - nameAndDesc.description, - lineInfo ) ); - } - void registerTestCaseFunction - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); - } - - /////////////////////////////////////////////////////////////////////////// - - AutoReg::AutoReg - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCaseFunction( function, lineInfo, nameAndDesc ); - } - - AutoReg::~AutoReg() {} - -} // end namespace Catch - -// #included from: catch_reporter_registry.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED - -#include - -namespace Catch { - - class ReporterRegistry : public IReporterRegistry { - - public: - - virtual ~ReporterRegistry() CATCH_OVERRIDE {} - - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const CATCH_OVERRIDE { - FactoryMap::const_iterator it = m_factories.find( name ); - if( it == m_factories.end() ) - return CATCH_NULL; - return it->second->create( ReporterConfig( config ) ); - } - - void registerReporter( std::string const& name, Ptr const& factory ) { - m_factories.insert( std::make_pair( name, factory ) ); - } - void registerListener( Ptr const& factory ) { - m_listeners.push_back( factory ); - } - - virtual FactoryMap const& getFactories() const CATCH_OVERRIDE { - return m_factories; - } - virtual Listeners const& getListeners() const CATCH_OVERRIDE { - return m_listeners; - } - - private: - FactoryMap m_factories; - Listeners m_listeners; - }; -} - -// #included from: catch_exception_translator_registry.hpp -#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED - -#ifdef __OBJC__ -#import "Foundation/Foundation.h" -#endif - -namespace Catch { - - class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { - public: - ~ExceptionTranslatorRegistry() { - deleteAll( m_translators ); - } - - virtual void registerTranslator( const IExceptionTranslator* translator ) { - m_translators.push_back( translator ); - } - - virtual std::string translateActiveException() const { - try { -#ifdef __OBJC__ - // In Objective-C try objective-c exceptions first - @try { - return tryTranslators(); - } - @catch (NSException *exception) { - return Catch::toString( [exception description] ); - } -#else - return tryTranslators(); -#endif - } - catch( TestFailureException& ) { - throw; - } - catch( std::exception& ex ) { - return ex.what(); - } - catch( std::string& msg ) { - return msg; - } - catch( const char* msg ) { - return msg; - } - catch(...) { - return "Unknown exception"; - } - } - - std::string tryTranslators() const { - if( m_translators.empty() ) - throw; - else - return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() ); - } - - private: - std::vector m_translators; - }; -} - -namespace Catch { - - namespace { - - class RegistryHub : public IRegistryHub, public IMutableRegistryHub { - - RegistryHub( RegistryHub const& ); - void operator=( RegistryHub const& ); - - public: // IRegistryHub - RegistryHub() { - } - virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE { - return m_reporterRegistry; - } - virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE { - return m_testCaseRegistry; - } - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE { - return m_exceptionTranslatorRegistry; - } - - public: // IMutableRegistryHub - virtual void registerReporter( std::string const& name, Ptr const& factory ) CATCH_OVERRIDE { - m_reporterRegistry.registerReporter( name, factory ); - } - virtual void registerListener( Ptr const& factory ) CATCH_OVERRIDE { - m_reporterRegistry.registerListener( factory ); - } - virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE { - m_testCaseRegistry.registerTest( testInfo ); - } - virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE { - m_exceptionTranslatorRegistry.registerTranslator( translator ); - } - - private: - TestRegistry m_testCaseRegistry; - ReporterRegistry m_reporterRegistry; - ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; - }; - - // Single, global, instance - inline RegistryHub*& getTheRegistryHub() { - static RegistryHub* theRegistryHub = CATCH_NULL; - if( !theRegistryHub ) - theRegistryHub = new RegistryHub(); - return theRegistryHub; - } - } - - IRegistryHub& getRegistryHub() { - return *getTheRegistryHub(); - } - IMutableRegistryHub& getMutableRegistryHub() { - return *getTheRegistryHub(); - } - void cleanUp() { - delete getTheRegistryHub(); - getTheRegistryHub() = CATCH_NULL; - cleanUpContext(); - } - std::string translateActiveException() { - return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); - } - -} // end namespace Catch - -// #included from: catch_notimplemented_exception.hpp -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED - -#include - -namespace Catch { - - NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) - : m_lineInfo( lineInfo ) { - std::ostringstream oss; - oss << lineInfo << ": function "; - oss << "not implemented"; - m_what = oss.str(); - } - - const char* NotImplementedException::what() const CATCH_NOEXCEPT { - return m_what.c_str(); - } - -} // end namespace Catch - -// #included from: catch_context_impl.hpp -#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED - -// #included from: catch_stream.hpp -#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - template - class StreamBufImpl : public StreamBufBase { - char data[bufferSize]; - WriterF m_writer; - - public: - StreamBufImpl() { - setp( data, data + sizeof(data) ); - } - - ~StreamBufImpl() CATCH_NOEXCEPT { - sync(); - } - - private: - int overflow( int c ) { - sync(); - - if( c != EOF ) { - if( pbase() == epptr() ) - m_writer( std::string( 1, static_cast( c ) ) ); - else - sputc( static_cast( c ) ); - } - return 0; - } - - int sync() { - if( pbase() != pptr() ) { - m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); - setp( pbase(), epptr() ); - } - return 0; - } - }; - - /////////////////////////////////////////////////////////////////////////// - - FileStream::FileStream( std::string const& filename ) { - m_ofs.open( filename.c_str() ); - if( m_ofs.fail() ) { - std::ostringstream oss; - oss << "Unable to open file: '" << filename << "'"; - throw std::domain_error( oss.str() ); - } - } - - std::ostream& FileStream::stream() const { - return m_ofs; - } - - struct OutputDebugWriter { - - void operator()( std::string const&str ) { - writeToDebugConsole( str ); - } - }; - - DebugOutStream::DebugOutStream() - : m_streamBuf( new StreamBufImpl() ), - m_os( m_streamBuf.get() ) - {} - - std::ostream& DebugOutStream::stream() const { - return m_os; - } - - // Store the streambuf from cout up-front because - // cout may get redirected when running tests - CoutStream::CoutStream() - : m_os( Catch::cout().rdbuf() ) - {} - - std::ostream& CoutStream::stream() const { - return m_os; - } - -#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions - std::ostream& cout() { - return std::cout; - } - std::ostream& cerr() { - return std::cerr; - } -#endif -} - -namespace Catch { - - class Context : public IMutableContext { - - Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {} - Context( Context const& ); - void operator=( Context const& ); - - public: // IContext - virtual IResultCapture* getResultCapture() { - return m_resultCapture; - } - virtual IRunner* getRunner() { - return m_runner; - } - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { - return getGeneratorsForCurrentTest() - .getGeneratorInfo( fileInfo, totalSize ) - .getCurrentIndex(); - } - virtual bool advanceGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - return generators && generators->moveNext(); - } - - virtual Ptr getConfig() const { - return m_config; - } - - public: // IMutableContext - virtual void setResultCapture( IResultCapture* resultCapture ) { - m_resultCapture = resultCapture; - } - virtual void setRunner( IRunner* runner ) { - m_runner = runner; - } - virtual void setConfig( Ptr const& config ) { - m_config = config; - } - - friend IMutableContext& getCurrentMutableContext(); - - private: - IGeneratorsForTest* findGeneratorsForCurrentTest() { - std::string testName = getResultCapture()->getCurrentTestName(); - - std::map::const_iterator it = - m_generatorsByTestName.find( testName ); - return it != m_generatorsByTestName.end() - ? it->second - : CATCH_NULL; - } - - IGeneratorsForTest& getGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - if( !generators ) { - std::string testName = getResultCapture()->getCurrentTestName(); - generators = createGeneratorsForTest(); - m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); - } - return *generators; - } - - private: - Ptr m_config; - IRunner* m_runner; - IResultCapture* m_resultCapture; - std::map m_generatorsByTestName; - }; - - namespace { - Context* currentContext = CATCH_NULL; - } - IMutableContext& getCurrentMutableContext() { - if( !currentContext ) - currentContext = new Context(); - return *currentContext; - } - IContext& getCurrentContext() { - return getCurrentMutableContext(); - } - - void cleanUpContext() { - delete currentContext; - currentContext = CATCH_NULL; - } -} - -// #included from: catch_console_colour_impl.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED - -namespace Catch { - namespace { - - struct IColourImpl { - virtual ~IColourImpl() {} - virtual void use( Colour::Code _colourCode ) = 0; - }; - - struct NoColourImpl : IColourImpl { - void use( Colour::Code ) {} - - static IColourImpl* instance() { - static NoColourImpl s_instance; - return &s_instance; - } - }; - - } // anon namespace -} // namespace Catch - -#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) -# ifdef CATCH_PLATFORM_WINDOWS -# define CATCH_CONFIG_COLOUR_WINDOWS -# else -# define CATCH_CONFIG_COLOUR_ANSI -# endif -#endif - -#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// - -#ifndef NOMINMAX -#define NOMINMAX -#endif - -#ifdef __AFXDLL -#include -#else -#include -#endif - -namespace Catch { -namespace { - - class Win32ColourImpl : public IColourImpl { - public: - Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) - { - CONSOLE_SCREEN_BUFFER_INFO csbiInfo; - GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); - originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); - originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); - } - - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: return setTextAttribute( originalForegroundAttributes ); - case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - case Colour::Red: return setTextAttribute( FOREGROUND_RED ); - case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); - case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); - case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); - case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); - case Colour::Grey: return setTextAttribute( 0 ); - - case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); - case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); - case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); - case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - - private: - void setTextAttribute( WORD _textAttribute ) { - SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); - } - HANDLE stdoutHandle; - WORD originalForegroundAttributes; - WORD originalBackgroundAttributes; - }; - - IColourImpl* platformColourInstance() { - static Win32ColourImpl s_instance; - return &s_instance; - } - -} // end anon namespace -} // end namespace Catch - -#elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// - -#include - -namespace Catch { -namespace { - - // use POSIX/ ANSI console terminal codes - // Thanks to Adam Strzelecki for original contribution - // (http://github.com/nanoant) - // https://github.com/philsquared/Catch/pull/131 - class PosixColourImpl : public IColourImpl { - public: - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: - case Colour::White: return setColour( "[0m" ); - case Colour::Red: return setColour( "[0;31m" ); - case Colour::Green: return setColour( "[0;32m" ); - case Colour::Blue: return setColour( "[0:34m" ); - case Colour::Cyan: return setColour( "[0;36m" ); - case Colour::Yellow: return setColour( "[0;33m" ); - case Colour::Grey: return setColour( "[1;30m" ); - - case Colour::LightGrey: return setColour( "[0;37m" ); - case Colour::BrightRed: return setColour( "[1;31m" ); - case Colour::BrightGreen: return setColour( "[1;32m" ); - case Colour::BrightWhite: return setColour( "[1;37m" ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - static IColourImpl* instance() { - static PosixColourImpl s_instance; - return &s_instance; - } - - private: - void setColour( const char* _escapeCode ) { - Catch::cout() << '\033' << _escapeCode; - } - }; - - IColourImpl* platformColourInstance() { - Ptr config = getCurrentContext().getConfig(); - return (config && config->forceColour()) || isatty(STDOUT_FILENO) - ? PosixColourImpl::instance() - : NoColourImpl::instance(); - } - -} // end anon namespace -} // end namespace Catch - -#else // not Windows or ANSI /////////////////////////////////////////////// - -namespace Catch { - - static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } - -} // end namespace Catch - -#endif // Windows/ ANSI/ None - -namespace Catch { - - Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } - Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast( _other ).m_moved = true; } - Colour::~Colour(){ if( !m_moved ) use( None ); } - - void Colour::use( Code _colourCode ) { - static IColourImpl* impl = isDebuggerActive() - ? NoColourImpl::instance() - : platformColourInstance(); - impl->use( _colourCode ); - } - -} // end namespace Catch - -// #included from: catch_generators_impl.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct GeneratorInfo : IGeneratorInfo { - - GeneratorInfo( std::size_t size ) - : m_size( size ), - m_currentIndex( 0 ) - {} - - bool moveNext() { - if( ++m_currentIndex == m_size ) { - m_currentIndex = 0; - return false; - } - return true; - } - - std::size_t getCurrentIndex() const { - return m_currentIndex; - } - - std::size_t m_size; - std::size_t m_currentIndex; - }; - - /////////////////////////////////////////////////////////////////////////// - - class GeneratorsForTest : public IGeneratorsForTest { - - public: - ~GeneratorsForTest() { - deleteAll( m_generatorsInOrder ); - } - - IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { - std::map::const_iterator it = m_generatorsByName.find( fileInfo ); - if( it == m_generatorsByName.end() ) { - IGeneratorInfo* info = new GeneratorInfo( size ); - m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); - m_generatorsInOrder.push_back( info ); - return *info; - } - return *it->second; - } - - bool moveNext() { - std::vector::const_iterator it = m_generatorsInOrder.begin(); - std::vector::const_iterator itEnd = m_generatorsInOrder.end(); - for(; it != itEnd; ++it ) { - if( (*it)->moveNext() ) - return true; - } - return false; - } - - private: - std::map m_generatorsByName; - std::vector m_generatorsInOrder; - }; - - IGeneratorsForTest* createGeneratorsForTest() - { - return new GeneratorsForTest(); - } - -} // end namespace Catch - -// #included from: catch_assertionresult.hpp -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED - -namespace Catch { - - AssertionInfo::AssertionInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - capturedExpression( _capturedExpression ), - resultDisposition( _resultDisposition ) - {} - - AssertionResult::AssertionResult() {} - - AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) - : m_info( info ), - m_resultData( data ) - {} - - AssertionResult::~AssertionResult() {} - - // Result was a success - bool AssertionResult::succeeded() const { - return Catch::isOk( m_resultData.resultType ); - } - - // Result was a success, or failure is suppressed - bool AssertionResult::isOk() const { - return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); - } - - ResultWas::OfType AssertionResult::getResultType() const { - return m_resultData.resultType; - } - - bool AssertionResult::hasExpression() const { - return !m_info.capturedExpression.empty(); - } - - bool AssertionResult::hasMessage() const { - return !m_resultData.message.empty(); - } - - std::string AssertionResult::getExpression() const { - if( isFalseTest( m_info.resultDisposition ) ) - return "!" + m_info.capturedExpression; - else - return m_info.capturedExpression; - } - std::string AssertionResult::getExpressionInMacro() const { - if( m_info.macroName.empty() ) - return m_info.capturedExpression; - else - return m_info.macroName + "( " + m_info.capturedExpression + " )"; - } - - bool AssertionResult::hasExpandedExpression() const { - return hasExpression() && getExpandedExpression() != getExpression(); - } - - std::string AssertionResult::getExpandedExpression() const { - return m_resultData.reconstructedExpression; - } - - std::string AssertionResult::getMessage() const { - return m_resultData.message; - } - SourceLineInfo AssertionResult::getSourceInfo() const { - return m_info.lineInfo; - } - - std::string AssertionResult::getTestMacroName() const { - return m_info.macroName; - } - -} // end namespace Catch - -// #included from: catch_test_case_info.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED - -namespace Catch { - - inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { - if( startsWith( tag, "." ) || - tag == "hide" || - tag == "!hide" ) - return TestCaseInfo::IsHidden; - else if( tag == "!throws" ) - return TestCaseInfo::Throws; - else if( tag == "!shouldfail" ) - return TestCaseInfo::ShouldFail; - else if( tag == "!mayfail" ) - return TestCaseInfo::MayFail; - else - return TestCaseInfo::None; - } - inline bool isReservedTag( std::string const& tag ) { - return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] ); - } - inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { - if( isReservedTag( tag ) ) { - { - Colour colourGuard( Colour::Red ); - Catch::cerr() - << "Tag name [" << tag << "] not allowed.\n" - << "Tag names starting with non alpha-numeric characters are reserved\n"; - } - { - Colour colourGuard( Colour::FileName ); - Catch::cerr() << _lineInfo << std::endl; - } - exit(1); - } - } - - TestCase makeTestCase( ITestCase* _testCase, - std::string const& _className, - std::string const& _name, - std::string const& _descOrTags, - SourceLineInfo const& _lineInfo ) - { - bool isHidden( startsWith( _name, "./" ) ); // Legacy support - - // Parse out tags - std::set tags; - std::string desc, tag; - bool inTag = false; - for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { - char c = _descOrTags[i]; - if( !inTag ) { - if( c == '[' ) - inTag = true; - else - desc += c; - } - else { - if( c == ']' ) { - TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); - if( prop == TestCaseInfo::IsHidden ) - isHidden = true; - else if( prop == TestCaseInfo::None ) - enforceNotReservedTag( tag, _lineInfo ); - - tags.insert( tag ); - tag.clear(); - inTag = false; - } - else - tag += c; - } - } - if( isHidden ) { - tags.insert( "hide" ); - tags.insert( "." ); - } - - TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); - return TestCase( _testCase, info ); - } - - void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ) - { - testCaseInfo.tags = tags; - testCaseInfo.lcaseTags.clear(); - - std::ostringstream oss; - for( std::set::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) { - oss << "[" << *it << "]"; - std::string lcaseTag = toLower( *it ); - testCaseInfo.properties = static_cast( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); - testCaseInfo.lcaseTags.insert( lcaseTag ); - } - testCaseInfo.tagsAsString = oss.str(); - } - - TestCaseInfo::TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ) - : name( _name ), - className( _className ), - description( _description ), - lineInfo( _lineInfo ), - properties( None ) - { - setTags( *this, _tags ); - } - - TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) - : name( other.name ), - className( other.className ), - description( other.description ), - tags( other.tags ), - lcaseTags( other.lcaseTags ), - tagsAsString( other.tagsAsString ), - lineInfo( other.lineInfo ), - properties( other.properties ) - {} - - bool TestCaseInfo::isHidden() const { - return ( properties & IsHidden ) != 0; - } - bool TestCaseInfo::throws() const { - return ( properties & Throws ) != 0; - } - bool TestCaseInfo::okToFail() const { - return ( properties & (ShouldFail | MayFail ) ) != 0; - } - bool TestCaseInfo::expectedToFail() const { - return ( properties & (ShouldFail ) ) != 0; - } - - TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} - - TestCase::TestCase( TestCase const& other ) - : TestCaseInfo( other ), - test( other.test ) - {} - - TestCase TestCase::withName( std::string const& _newName ) const { - TestCase other( *this ); - other.name = _newName; - return other; - } - - void TestCase::swap( TestCase& other ) { - test.swap( other.test ); - name.swap( other.name ); - className.swap( other.className ); - description.swap( other.description ); - tags.swap( other.tags ); - lcaseTags.swap( other.lcaseTags ); - tagsAsString.swap( other.tagsAsString ); - std::swap( TestCaseInfo::properties, static_cast( other ).properties ); - std::swap( lineInfo, other.lineInfo ); - } - - void TestCase::invoke() const { - test->invoke(); - } - - bool TestCase::operator == ( TestCase const& other ) const { - return test.get() == other.test.get() && - name == other.name && - className == other.className; - } - - bool TestCase::operator < ( TestCase const& other ) const { - return name < other.name; - } - TestCase& TestCase::operator = ( TestCase const& other ) { - TestCase temp( other ); - swap( temp ); - return *this; - } - - TestCaseInfo const& TestCase::getTestCaseInfo() const - { - return *this; - } - -} // end namespace Catch - -// #included from: catch_version.hpp -#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED - -namespace Catch { - - Version::Version - ( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _patchNumber, - std::string const& _branchName, - unsigned int _buildNumber ) - : majorVersion( _majorVersion ), - minorVersion( _minorVersion ), - patchNumber( _patchNumber ), - branchName( _branchName ), - buildNumber( _buildNumber ) - {} - - std::ostream& operator << ( std::ostream& os, Version const& version ) { - os << version.majorVersion << "." - << version.minorVersion << "." - << version.patchNumber; - - if( !version.branchName.empty() ) { - os << "-" << version.branchName - << "." << version.buildNumber; - } - return os; - } - - Version libraryVersion( 1, 3, 4, "", 0 ); - -} - -// #included from: catch_message.hpp -#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED - -namespace Catch { - - MessageInfo::MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - type( _type ), - sequence( ++globalCount ) - {} - - // This may need protecting if threading support is added - unsigned int MessageInfo::globalCount = 0; - - //////////////////////////////////////////////////////////////////////////// - - ScopedMessage::ScopedMessage( MessageBuilder const& builder ) - : m_info( builder.m_info ) - { - m_info.message = builder.m_stream.str(); - getResultCapture().pushScopedMessage( m_info ); - } - ScopedMessage::ScopedMessage( ScopedMessage const& other ) - : m_info( other.m_info ) - {} - - ScopedMessage::~ScopedMessage() { - getResultCapture().popScopedMessage( m_info ); - } - -} // end namespace Catch - -// #included from: catch_legacy_reporter_adapter.hpp -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED - -// #included from: catch_legacy_reporter_adapter.h -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED - -namespace Catch -{ - // Deprecated - struct IReporter : IShared { - virtual ~IReporter(); - - virtual bool shouldRedirectStdout() const = 0; - - virtual void StartTesting() = 0; - virtual void EndTesting( Totals const& totals ) = 0; - virtual void StartGroup( std::string const& groupName ) = 0; - virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; - virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; - virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; - virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; - virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; - virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; - virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; - virtual void Aborted() = 0; - virtual void Result( AssertionResult const& result ) = 0; - }; - - class LegacyReporterAdapter : public SharedImpl - { - public: - LegacyReporterAdapter( Ptr const& legacyReporter ); - virtual ~LegacyReporterAdapter(); - - virtual ReporterPreferences getPreferences() const; - virtual void noMatchingTestCases( std::string const& ); - virtual void testRunStarting( TestRunInfo const& ); - virtual void testGroupStarting( GroupInfo const& groupInfo ); - virtual void testCaseStarting( TestCaseInfo const& testInfo ); - virtual void sectionStarting( SectionInfo const& sectionInfo ); - virtual void assertionStarting( AssertionInfo const& ); - virtual bool assertionEnded( AssertionStats const& assertionStats ); - virtual void sectionEnded( SectionStats const& sectionStats ); - virtual void testCaseEnded( TestCaseStats const& testCaseStats ); - virtual void testGroupEnded( TestGroupStats const& testGroupStats ); - virtual void testRunEnded( TestRunStats const& testRunStats ); - virtual void skipTest( TestCaseInfo const& ); - - private: - Ptr m_legacyReporter; - }; -} - -namespace Catch -{ - LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) - : m_legacyReporter( legacyReporter ) - {} - LegacyReporterAdapter::~LegacyReporterAdapter() {} - - ReporterPreferences LegacyReporterAdapter::getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); - return prefs; - } - - void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} - void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { - m_legacyReporter->StartTesting(); - } - void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { - m_legacyReporter->StartGroup( groupInfo.name ); - } - void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { - m_legacyReporter->StartTestCase( testInfo ); - } - void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { - m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); - } - void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { - // Not on legacy interface - } - - bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); - rb << it->message; - rb.setResultType( ResultWas::Info ); - AssertionResult result = rb.build(); - m_legacyReporter->Result( result ); - } - } - } - m_legacyReporter->Result( assertionStats.assertionResult ); - return true; - } - void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { - if( sectionStats.missingAssertions ) - m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); - m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); - } - void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { - m_legacyReporter->EndTestCase - ( testCaseStats.testInfo, - testCaseStats.totals, - testCaseStats.stdOut, - testCaseStats.stdErr ); - } - void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { - if( testGroupStats.aborting ) - m_legacyReporter->Aborted(); - m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); - } - void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { - m_legacyReporter->EndTesting( testRunStats.totals ); - } - void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) { - } -} - -// #included from: catch_timer.hpp - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wc++11-long-long" -#endif - -#ifdef CATCH_PLATFORM_WINDOWS -#include -#else -#include -#endif - -namespace Catch { - - namespace { -#ifdef CATCH_PLATFORM_WINDOWS - uint64_t getCurrentTicks() { - static uint64_t hz=0, hzo=0; - if (!hz) { - QueryPerformanceFrequency( reinterpret_cast( &hz ) ); - QueryPerformanceCounter( reinterpret_cast( &hzo ) ); - } - uint64_t t; - QueryPerformanceCounter( reinterpret_cast( &t ) ); - return ((t-hzo)*1000000)/hz; - } -#else - uint64_t getCurrentTicks() { - timeval t; - gettimeofday(&t,CATCH_NULL); - return static_cast( t.tv_sec ) * 1000000ull + static_cast( t.tv_usec ); - } -#endif - } - - void Timer::start() { - m_ticks = getCurrentTicks(); - } - unsigned int Timer::getElapsedMicroseconds() const { - return static_cast(getCurrentTicks() - m_ticks); - } - unsigned int Timer::getElapsedMilliseconds() const { - return static_cast(getElapsedMicroseconds()/1000); - } - double Timer::getElapsedSeconds() const { - return getElapsedMicroseconds()/1000000.0; - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -// #included from: catch_common.hpp -#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED - -namespace Catch { - - bool startsWith( std::string const& s, std::string const& prefix ) { - return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix; - } - bool endsWith( std::string const& s, std::string const& suffix ) { - return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix; - } - bool contains( std::string const& s, std::string const& infix ) { - return s.find( infix ) != std::string::npos; - } - void toLowerInPlace( std::string& s ) { - std::transform( s.begin(), s.end(), s.begin(), ::tolower ); - } - std::string toLower( std::string const& s ) { - std::string lc = s; - toLowerInPlace( lc ); - return lc; - } - std::string trim( std::string const& str ) { - static char const* whitespaceChars = "\n\r\t "; - std::string::size_type start = str.find_first_not_of( whitespaceChars ); - std::string::size_type end = str.find_last_not_of( whitespaceChars ); - - return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; - } - - bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { - bool replaced = false; - std::size_t i = str.find( replaceThis ); - while( i != std::string::npos ) { - replaced = true; - str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); - if( i < str.size()-withThis.size() ) - i = str.find( replaceThis, i+withThis.size() ); - else - i = std::string::npos; - } - return replaced; - } - - pluralise::pluralise( std::size_t count, std::string const& label ) - : m_count( count ), - m_label( label ) - {} - - std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { - os << pluraliser.m_count << " " << pluraliser.m_label; - if( pluraliser.m_count != 1 ) - os << "s"; - return os; - } - - SourceLineInfo::SourceLineInfo() : line( 0 ){} - SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) - : file( _file ), - line( _line ) - {} - SourceLineInfo::SourceLineInfo( SourceLineInfo const& other ) - : file( other.file ), - line( other.line ) - {} - bool SourceLineInfo::empty() const { - return file.empty(); - } - bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { - return line == other.line && file == other.file; - } - bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const { - return line < other.line || ( line == other.line && file < other.file ); - } - - void seedRng( IConfig const& config ) { - if( config.rngSeed() != 0 ) - std::srand( config.rngSeed() ); - } - unsigned int rngSeed() { - return getCurrentContext().getConfig()->rngSeed(); - } - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { -#ifndef __GNUG__ - os << info.file << "(" << info.line << ")"; -#else - os << info.file << ":" << info.line; -#endif - return os; - } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { - std::ostringstream oss; - oss << locationInfo << ": Internal Catch error: '" << message << "'"; - if( alwaysTrue() ) - throw std::logic_error( oss.str() ); - } -} - -// #included from: catch_section.hpp -#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED - -namespace Catch { - - SectionInfo::SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description ) - : name( _name ), - description( _description ), - lineInfo( _lineInfo ) - {} - - Section::Section( SectionInfo const& info ) - : m_info( info ), - m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) - { - m_timer.start(); - } - - Section::~Section() { - if( m_sectionIncluded ) { - SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() ); - if( std::uncaught_exception() ) - getResultCapture().sectionEndedEarly( endInfo ); - else - getResultCapture().sectionEnded( endInfo ); - } - } - - // This indicates whether the section should be executed or not - Section::operator bool() const { - return m_sectionIncluded; - } - -} // end namespace Catch - -// #included from: catch_debugger.hpp -#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED - -#include - -#ifdef CATCH_PLATFORM_MAC - - #include - #include - #include - #include - #include - - namespace Catch{ - - // The following function is taken directly from the following technical note: - // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html - - // Returns true if the current process is being debugged (either - // running under the debugger or has a debugger attached post facto). - bool isDebuggerActive(){ - - int mib[4]; - struct kinfo_proc info; - size_t size; - - // Initialize the flags so that, if sysctl fails for some bizarre - // reason, we get a predictable result. - - info.kp_proc.p_flag = 0; - - // Initialize mib, which tells sysctl the info we want, in this case - // we're looking for information about a specific process ID. - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - // Call sysctl. - - size = sizeof(info); - if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) { - Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; - return false; - } - - // We're being debugged if the P_TRACED flag is set. - - return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); - } - } // namespace Catch - -#elif defined(_MSC_VER) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#else - namespace Catch { - inline bool isDebuggerActive() { return false; } - } -#endif // Platform - -#ifdef CATCH_PLATFORM_WINDOWS - extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* ); - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - ::OutputDebugStringA( text.c_str() ); - } - } -#else - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - // !TBD: Need a version for Mac/ XCode and other IDEs - Catch::cout() << text; - } - } -#endif // Platform - -// #included from: catch_tostring.hpp -#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED - -namespace Catch { - -namespace Detail { - - const std::string unprintableString = "{?}"; - - namespace { - const int hexThreshold = 255; - - struct Endianness { - enum Arch { Big, Little }; - - static Arch which() { - union _{ - int asInt; - char asChar[sizeof (int)]; - } u; - - u.asInt = 1; - return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; - } - }; - } - - std::string rawMemoryToString( const void *object, std::size_t size ) - { - // Reverse order for little endian architectures - int i = 0, end = static_cast( size ), inc = 1; - if( Endianness::which() == Endianness::Little ) { - i = end-1; - end = inc = -1; - } - - unsigned char const *bytes = static_cast(object); - std::ostringstream os; - os << "0x" << std::setfill('0') << std::hex; - for( ; i != end; i += inc ) - os << std::setw(2) << static_cast(bytes[i]); - return os.str(); - } -} - -std::string toString( std::string const& value ) { - std::string s = value; - if( getCurrentContext().getConfig()->showInvisibles() ) { - for(size_t i = 0; i < s.size(); ++i ) { - std::string subs; - switch( s[i] ) { - case '\n': subs = "\\n"; break; - case '\t': subs = "\\t"; break; - default: break; - } - if( !subs.empty() ) { - s = s.substr( 0, i ) + subs + s.substr( i+1 ); - ++i; - } - } - } - return "\"" + s + "\""; -} -std::string toString( std::wstring const& value ) { - - std::string s; - s.reserve( value.size() ); - for(size_t i = 0; i < value.size(); ++i ) - s += value[i] <= 0xff ? static_cast( value[i] ) : '?'; - return Catch::toString( s ); -} - -std::string toString( const char* const value ) { - return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); -} - -std::string toString( char* const value ) { - return Catch::toString( static_cast( value ) ); -} - -std::string toString( const wchar_t* const value ) -{ - return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" ); -} - -std::string toString( wchar_t* const value ) -{ - return Catch::toString( static_cast( value ) ); -} - -std::string toString( int value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ")"; - return oss.str(); -} - -std::string toString( unsigned long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ")"; - return oss.str(); -} - -std::string toString( unsigned int value ) { - return Catch::toString( static_cast( value ) ); -} - -template -std::string fpToString( T value, int precision ) { - std::ostringstream oss; - oss << std::setprecision( precision ) - << std::fixed - << value; - std::string d = oss.str(); - std::size_t i = d.find_last_not_of( '0' ); - if( i != std::string::npos && i != d.size()-1 ) { - if( d[i] == '.' ) - i++; - d = d.substr( 0, i+1 ); - } - return d; -} - -std::string toString( const double value ) { - return fpToString( value, 10 ); -} -std::string toString( const float value ) { - return fpToString( value, 5 ) + "f"; -} - -std::string toString( bool value ) { - return value ? "true" : "false"; -} - -std::string toString( char value ) { - return value < ' ' - ? toString( static_cast( value ) ) - : Detail::makeString( value ); -} - -std::string toString( signed char value ) { - return toString( static_cast( value ) ); -} - -std::string toString( unsigned char value ) { - return toString( static_cast( value ) ); -} - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG -std::string toString( long long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ")"; - return oss.str(); -} -std::string toString( unsigned long long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ")"; - return oss.str(); -} -#endif - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ) { - return "nullptr"; -} -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSObject* const& nsObject ) { - return toString( [nsObject description] ); - } -#endif - -} // end namespace Catch - -// #included from: catch_result_builder.hpp -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED - -namespace Catch { - - std::string capturedExpressionWithSecondArgument( std::string const& capturedExpression, std::string const& secondArg ) { - return secondArg.empty() || secondArg == "\"\"" - ? capturedExpression - : capturedExpression + ", " + secondArg; - } - ResultBuilder::ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition, - char const* secondArg ) - : m_assertionInfo( macroName, lineInfo, capturedExpressionWithSecondArgument( capturedExpression, secondArg ), resultDisposition ), - m_shouldDebugBreak( false ), - m_shouldThrow( false ) - {} - - ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { - m_data.resultType = result; - return *this; - } - ResultBuilder& ResultBuilder::setResultType( bool result ) { - m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; - return *this; - } - ResultBuilder& ResultBuilder::setLhs( std::string const& lhs ) { - m_exprComponents.lhs = lhs; - return *this; - } - ResultBuilder& ResultBuilder::setRhs( std::string const& rhs ) { - m_exprComponents.rhs = rhs; - return *this; - } - ResultBuilder& ResultBuilder::setOp( std::string const& op ) { - m_exprComponents.op = op; - return *this; - } - - void ResultBuilder::endExpression() { - m_exprComponents.testFalse = isFalseTest( m_assertionInfo.resultDisposition ); - captureExpression(); - } - - void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { - m_assertionInfo.resultDisposition = resultDisposition; - m_stream.oss << Catch::translateActiveException(); - captureResult( ResultWas::ThrewException ); - } - - void ResultBuilder::captureResult( ResultWas::OfType resultType ) { - setResultType( resultType ); - captureExpression(); - } - void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) { - if( expectedMessage.empty() ) - captureExpectedException( Matchers::Impl::Generic::AllOf() ); - else - captureExpectedException( Matchers::Equals( expectedMessage ) ); - } - - void ResultBuilder::captureExpectedException( Matchers::Impl::Matcher const& matcher ) { - - assert( m_exprComponents.testFalse == false ); - AssertionResultData data = m_data; - data.resultType = ResultWas::Ok; - data.reconstructedExpression = m_assertionInfo.capturedExpression; - - std::string actualMessage = Catch::translateActiveException(); - if( !matcher.match( actualMessage ) ) { - data.resultType = ResultWas::ExpressionFailed; - data.reconstructedExpression = actualMessage; - } - AssertionResult result( m_assertionInfo, data ); - handleResult( result ); - } - - void ResultBuilder::captureExpression() { - AssertionResult result = build(); - handleResult( result ); - } - void ResultBuilder::handleResult( AssertionResult const& result ) - { - getResultCapture().assertionEnded( result ); - - if( !result.isOk() ) { - if( getCurrentContext().getConfig()->shouldDebugBreak() ) - m_shouldDebugBreak = true; - if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) ) - m_shouldThrow = true; - } - } - void ResultBuilder::react() { - if( m_shouldThrow ) - throw Catch::TestFailureException(); - } - - bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } - bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } - - AssertionResult ResultBuilder::build() const - { - assert( m_data.resultType != ResultWas::Unknown ); - - AssertionResultData data = m_data; - - // Flip bool results if testFalse is set - if( m_exprComponents.testFalse ) { - if( data.resultType == ResultWas::Ok ) - data.resultType = ResultWas::ExpressionFailed; - else if( data.resultType == ResultWas::ExpressionFailed ) - data.resultType = ResultWas::Ok; - } - - data.message = m_stream.oss.str(); - data.reconstructedExpression = reconstructExpression(); - if( m_exprComponents.testFalse ) { - if( m_exprComponents.op == "" ) - data.reconstructedExpression = "!" + data.reconstructedExpression; - else - data.reconstructedExpression = "!(" + data.reconstructedExpression + ")"; - } - return AssertionResult( m_assertionInfo, data ); - } - std::string ResultBuilder::reconstructExpression() const { - if( m_exprComponents.op == "" ) - return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.op + m_exprComponents.lhs; - else if( m_exprComponents.op == "matches" ) - return m_exprComponents.lhs + " " + m_exprComponents.rhs; - else if( m_exprComponents.op != "!" ) { - if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 && - m_exprComponents.lhs.find("\n") == std::string::npos && - m_exprComponents.rhs.find("\n") == std::string::npos ) - return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs; - else - return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs; - } - else - return "{can't expand - use " + m_assertionInfo.macroName + "_FALSE( " + m_assertionInfo.capturedExpression.substr(1) + " ) instead of " + m_assertionInfo.macroName + "( " + m_assertionInfo.capturedExpression + " ) for better diagnostics}"; - } - -} // end namespace Catch - -// #included from: catch_tag_alias_registry.hpp -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED - -// #included from: catch_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED - -#include - -namespace Catch { - - class TagAliasRegistry : public ITagAliasRegistry { - public: - virtual ~TagAliasRegistry(); - virtual Option find( std::string const& alias ) const; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; - void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - static TagAliasRegistry& get(); - - private: - std::map m_registry; - }; - -} // end namespace Catch - -#include -#include - -namespace Catch { - - TagAliasRegistry::~TagAliasRegistry() {} - - Option TagAliasRegistry::find( std::string const& alias ) const { - std::map::const_iterator it = m_registry.find( alias ); - if( it != m_registry.end() ) - return it->second; - else - return Option(); - } - - std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { - std::string expandedTestSpec = unexpandedTestSpec; - for( std::map::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); - it != itEnd; - ++it ) { - std::size_t pos = expandedTestSpec.find( it->first ); - if( pos != std::string::npos ) { - expandedTestSpec = expandedTestSpec.substr( 0, pos ) + - it->second.tag + - expandedTestSpec.substr( pos + it->first.size() ); - } - } - return expandedTestSpec; - } - - void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - - if( !startsWith( alias, "[@" ) || !endsWith( alias, "]" ) ) { - std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" << lineInfo; - throw std::domain_error( oss.str().c_str() ); - } - if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { - std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" already registered.\n" - << "\tFirst seen at " << find(alias)->lineInfo << "\n" - << "\tRedefined at " << lineInfo; - throw std::domain_error( oss.str().c_str() ); - } - } - - TagAliasRegistry& TagAliasRegistry::get() { - static TagAliasRegistry instance; - return instance; - - } - - ITagAliasRegistry::~ITagAliasRegistry() {} - ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); } - - RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - try { - TagAliasRegistry::get().add( alias, tag, lineInfo ); - } - catch( std::exception& ex ) { - Colour colourGuard( Colour::Red ); - Catch::cerr() << ex.what() << std::endl; - exit(1); - } - } - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_multi.hpp -#define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED - -namespace Catch { - -class MultipleReporters : public SharedImpl { - typedef std::vector > Reporters; - Reporters m_reporters; - -public: - void add( Ptr const& reporter ) { - m_reporters.push_back( reporter ); - } - -public: // IStreamingReporter - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporters[0]->getPreferences(); - } - - virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->noMatchingTestCases( spec ); - } - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testRunStarting( testRunInfo ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testGroupStarting( groupInfo ); - } - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testCaseStarting( testInfo ); - } - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->sectionStarting( sectionInfo ); - } - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->assertionStarting( assertionInfo ); - } - - // The return value indicates if the messages buffer should be cleared: - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - bool clearBuffer = false; - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - clearBuffer |= (*it)->assertionEnded( assertionStats ); - return clearBuffer; - } - - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->sectionEnded( sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testGroupEnded( testGroupStats ); - } - - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testRunEnded( testRunStats ); - } - - virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->skipTest( testInfo ); - } -}; - -Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ) { - Ptr resultingReporter; - - if( existingReporter ) { - MultipleReporters* multi = dynamic_cast( existingReporter.get() ); - if( !multi ) { - multi = new MultipleReporters; - resultingReporter = Ptr( multi ); - if( existingReporter ) - multi->add( existingReporter ); - } - else - resultingReporter = existingReporter; - multi->add( additionalReporter ); - } - else - resultingReporter = additionalReporter; - - return resultingReporter; -} - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_xml.hpp -#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED - -// #included from: catch_reporter_bases.hpp -#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED - -#include - -namespace Catch { - - struct StreamingReporterBase : SharedImpl { - - StreamingReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = false; - } - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporterPrefs; - } - - virtual ~StreamingReporterBase() CATCH_OVERRIDE; - - virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {} - - virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE { - currentTestRunInfo = _testRunInfo; - } - virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE { - currentGroupInfo = _groupInfo; - } - - virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE { - currentTestCaseInfo = _testInfo; - } - virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { - m_sectionStack.push_back( _sectionInfo ); - } - - virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE { - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE { - currentTestCaseInfo.reset(); - } - virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE { - currentGroupInfo.reset(); - } - virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE { - currentTestCaseInfo.reset(); - currentGroupInfo.reset(); - currentTestRunInfo.reset(); - } - - virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE { - // Don't do anything with this by default. - // It can optionally be overridden in the derived class. - } - - Ptr m_config; - std::ostream& stream; - - LazyStat currentTestRunInfo; - LazyStat currentGroupInfo; - LazyStat currentTestCaseInfo; - - std::vector m_sectionStack; - ReporterPreferences m_reporterPrefs; - }; - - struct CumulativeReporterBase : SharedImpl { - template - struct Node : SharedImpl<> { - explicit Node( T const& _value ) : value( _value ) {} - virtual ~Node() {} - - typedef std::vector > ChildNodes; - T value; - ChildNodes children; - }; - struct SectionNode : SharedImpl<> { - explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} - virtual ~SectionNode(); - - bool operator == ( SectionNode const& other ) const { - return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; - } - bool operator == ( Ptr const& other ) const { - return operator==( *other ); - } - - SectionStats stats; - typedef std::vector > ChildSections; - typedef std::vector Assertions; - ChildSections childSections; - Assertions assertions; - std::string stdOut; - std::string stdErr; - }; - - struct BySectionInfo { - BySectionInfo( SectionInfo const& other ) : m_other( other ) {} - BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} - bool operator() ( Ptr const& node ) const { - return node->stats.sectionInfo.lineInfo == m_other.lineInfo; - } - private: - void operator=( BySectionInfo const& ); - SectionInfo const& m_other; - }; - - typedef Node TestCaseNode; - typedef Node TestGroupNode; - typedef Node TestRunNode; - - CumulativeReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = false; - } - ~CumulativeReporterBase(); - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporterPrefs; - } - - virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {} - virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {} - - virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {} - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); - Ptr node; - if( m_sectionStack.empty() ) { - if( !m_rootSection ) - m_rootSection = new SectionNode( incompleteStats ); - node = m_rootSection; - } - else { - SectionNode& parentNode = *m_sectionStack.back(); - SectionNode::ChildSections::const_iterator it = - std::find_if( parentNode.childSections.begin(), - parentNode.childSections.end(), - BySectionInfo( sectionInfo ) ); - if( it == parentNode.childSections.end() ) { - node = new SectionNode( incompleteStats ); - parentNode.childSections.push_back( node ); - } - else - node = *it; - } - m_sectionStack.push_back( node ); - m_deepestSection = node; - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - - virtual bool assertionEnded( AssertionStats const& assertionStats ) { - assert( !m_sectionStack.empty() ); - SectionNode& sectionNode = *m_sectionStack.back(); - sectionNode.assertions.push_back( assertionStats ); - return true; - } - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - assert( !m_sectionStack.empty() ); - SectionNode& node = *m_sectionStack.back(); - node.stats = sectionStats; - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - Ptr node = new TestCaseNode( testCaseStats ); - assert( m_sectionStack.size() == 0 ); - node->children.push_back( m_rootSection ); - m_testCases.push_back( node ); - m_rootSection.reset(); - - assert( m_deepestSection ); - m_deepestSection->stdOut = testCaseStats.stdOut; - m_deepestSection->stdErr = testCaseStats.stdErr; - } - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - Ptr node = new TestGroupNode( testGroupStats ); - node->children.swap( m_testCases ); - m_testGroups.push_back( node ); - } - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - Ptr node = new TestRunNode( testRunStats ); - node->children.swap( m_testGroups ); - m_testRuns.push_back( node ); - testRunEndedCumulative(); - } - virtual void testRunEndedCumulative() = 0; - - virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {} - - Ptr m_config; - std::ostream& stream; - std::vector m_assertions; - std::vector > > m_sections; - std::vector > m_testCases; - std::vector > m_testGroups; - - std::vector > m_testRuns; - - Ptr m_rootSection; - Ptr m_deepestSection; - std::vector > m_sectionStack; - ReporterPreferences m_reporterPrefs; - - }; - - template - char const* getLineOfChars() { - static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; - if( !*line ) { - memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); - line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; - } - return line; - } - - struct TestEventListenerBase : StreamingReporterBase { - TestEventListenerBase( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE { - return false; - } - }; - -} // end namespace Catch - -// #included from: ../internal/catch_reporter_registrars.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED - -namespace Catch { - - template - class LegacyReporterRegistrar { - - class ReporterFactory : public IReporterFactory { - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new LegacyReporterAdapter( new T( config ) ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - LegacyReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ReporterRegistrar { - - class ReporterFactory : public SharedImpl { - - // *** Please Note ***: - // - If you end up here looking at a compiler error because it's trying to register - // your custom reporter class be aware that the native reporter interface has changed - // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via - // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. - // However please consider updating to the new interface as the old one is now - // deprecated and will probably be removed quite soon! - // Please contact me via github if you have any questions at all about this. - // In fact, ideally, please contact me anyway to let me know you've hit this - as I have - // no idea who is actually using custom reporters at all (possibly no-one!). - // The new interface is designed to minimise exposure to interface changes in the future. - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - ReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ListenerRegistrar { - - class ListenerFactory : public SharedImpl { - - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - virtual std::string getDescription() const { - return ""; - } - }; - - public: - - ListenerRegistrar() { - getMutableRegistryHub().registerListener( new ListenerFactory() ); - } - }; -} - -#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ - namespace{ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ - namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -#define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \ - namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } - -// #included from: ../internal/catch_xmlwriter.hpp -#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - class XmlEncode { - public: - enum ForWhat { ForTextNodes, ForAttributes }; - - XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ) - : m_str( str ), - m_forWhat( forWhat ) - {} - - void encodeTo( std::ostream& os ) const { - - // Apostrophe escaping not necessary if we always use " to write attributes - // (see: http://www.w3.org/TR/xml/#syntax) - - for( std::size_t i = 0; i < m_str.size(); ++ i ) { - char c = m_str[i]; - switch( c ) { - case '<': os << "<"; break; - case '&': os << "&"; break; - - case '>': - // See: http://www.w3.org/TR/xml/#syntax - if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' ) - os << ">"; - else - os << c; - break; - - case '\"': - if( m_forWhat == ForAttributes ) - os << """; - else - os << c; - break; - - default: - // Escape control chars - based on contribution by @espenalb in PR #465 - if ( ( c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' ) - os << "&#x" << std::uppercase << std::hex << static_cast( c ); - else - os << c; - } - } - } - - friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { - xmlEncode.encodeTo( os ); - return os; - } - - private: - std::string m_str; - ForWhat m_forWhat; - }; - - class XmlWriter { - public: - - class ScopedElement { - public: - ScopedElement( XmlWriter* writer ) - : m_writer( writer ) - {} - - ScopedElement( ScopedElement const& other ) - : m_writer( other.m_writer ){ - other.m_writer = CATCH_NULL; - } - - ~ScopedElement() { - if( m_writer ) - m_writer->endElement(); - } - - ScopedElement& writeText( std::string const& text, bool indent = true ) { - m_writer->writeText( text, indent ); - return *this; - } - - template - ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { - m_writer->writeAttribute( name, attribute ); - return *this; - } - - private: - mutable XmlWriter* m_writer; - }; - - XmlWriter() - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( &Catch::cout() ) - {} - - XmlWriter( std::ostream& os ) - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( &os ) - {} - - ~XmlWriter() { - while( !m_tags.empty() ) - endElement(); - } - - XmlWriter& startElement( std::string const& name ) { - ensureTagClosed(); - newlineIfNecessary(); - stream() << m_indent << "<" << name; - m_tags.push_back( name ); - m_indent += " "; - m_tagIsOpen = true; - return *this; - } - - ScopedElement scopedElement( std::string const& name ) { - ScopedElement scoped( this ); - startElement( name ); - return scoped; - } - - XmlWriter& endElement() { - newlineIfNecessary(); - m_indent = m_indent.substr( 0, m_indent.size()-2 ); - if( m_tagIsOpen ) { - stream() << "/>\n"; - m_tagIsOpen = false; - } - else { - stream() << m_indent << "\n"; - } - m_tags.pop_back(); - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { - if( !name.empty() && !attribute.empty() ) - stream() << " " << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << "\""; - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, bool attribute ) { - stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\""; - return *this; - } - - template - XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { - std::ostringstream oss; - oss << attribute; - return writeAttribute( name, oss.str() ); - } - - XmlWriter& writeText( std::string const& text, bool indent = true ) { - if( !text.empty() ){ - bool tagWasOpen = m_tagIsOpen; - ensureTagClosed(); - if( tagWasOpen && indent ) - stream() << m_indent; - stream() << XmlEncode( text ); - m_needsNewline = true; - } - return *this; - } - - XmlWriter& writeComment( std::string const& text ) { - ensureTagClosed(); - stream() << m_indent << ""; - m_needsNewline = true; - return *this; - } - - XmlWriter& writeBlankLine() { - ensureTagClosed(); - stream() << "\n"; - return *this; - } - - void setStream( std::ostream& os ) { - m_os = &os; - } - - private: - XmlWriter( XmlWriter const& ); - void operator=( XmlWriter const& ); - - std::ostream& stream() { - return *m_os; - } - - void ensureTagClosed() { - if( m_tagIsOpen ) { - stream() << ">\n"; - m_tagIsOpen = false; - } - } - - void newlineIfNecessary() { - if( m_needsNewline ) { - stream() << "\n"; - m_needsNewline = false; - } - } - - bool m_tagIsOpen; - bool m_needsNewline; - std::vector m_tags; - std::string m_indent; - std::ostream* m_os; - }; - -} -// #included from: catch_reenable_warnings.h - -#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED - -#ifdef __clang__ -# ifdef __ICC // icpc defines the __clang__ macro -# pragma warning(pop) -# else -# pragma clang diagnostic pop -# endif -#elif defined __GNUC__ -# pragma GCC diagnostic pop -#endif - - -namespace Catch { - class XmlReporter : public StreamingReporterBase { - public: - XmlReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_sectionDepth( 0 ) - { - m_reporterPrefs.shouldRedirectStdOut = true; - } - - virtual ~XmlReporter() CATCH_OVERRIDE; - - static std::string getDescription() { - return "Reports test results as an XML document"; - } - - public: // StreamingReporterBase - - virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE { - StreamingReporterBase::noMatchingTestCases( s ); - } - - virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testRunStarting( testInfo ); - m_xml.setStream( stream ); - m_xml.startElement( "Catch" ); - if( !m_config->name().empty() ) - m_xml.writeAttribute( "name", m_config->name() ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testGroupStarting( groupInfo ); - m_xml.startElement( "Group" ) - .writeAttribute( "name", groupInfo.name ); - } - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseStarting(testInfo); - m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) ); - - if ( m_config->showDurations() == ShowDurations::Always ) - m_testCaseTimer.start(); - } - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - StreamingReporterBase::sectionStarting( sectionInfo ); - if( m_sectionDepth++ > 0 ) { - m_xml.startElement( "Section" ) - .writeAttribute( "name", trim( sectionInfo.name ) ) - .writeAttribute( "description", sectionInfo.description ); - } - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } - - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - const AssertionResult& assertionResult = assertionStats.assertionResult; - - // Print any info messages in tags. - if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - m_xml.scopedElement( "Info" ) - .writeText( it->message ); - } else if ( it->type == ResultWas::Warning ) { - m_xml.scopedElement( "Warning" ) - .writeText( it->message ); - } - } - } - - // Drop out if result was successful but we're not printing them. - if( !m_config->includeSuccessfulResults() && isOk(assertionResult.getResultType()) ) - return true; - - // Print the expression if there is one. - if( assertionResult.hasExpression() ) { - m_xml.startElement( "Expression" ) - .writeAttribute( "success", assertionResult.succeeded() ) - .writeAttribute( "type", assertionResult.getTestMacroName() ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ); - - m_xml.scopedElement( "Original" ) - .writeText( assertionResult.getExpression() ); - m_xml.scopedElement( "Expanded" ) - .writeText( assertionResult.getExpandedExpression() ); - } - - // And... Print a result applicable to each result type. - switch( assertionResult.getResultType() ) { - case ResultWas::ThrewException: - m_xml.scopedElement( "Exception" ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::FatalErrorCondition: - m_xml.scopedElement( "Fatal Error Condition" ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::Info: - m_xml.scopedElement( "Info" ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::Warning: - // Warning will already have been written - break; - case ResultWas::ExplicitFailure: - m_xml.scopedElement( "Failure" ) - .writeText( assertionResult.getMessage() ); - break; - default: - break; - } - - if( assertionResult.hasExpression() ) - m_xml.endElement(); - - return true; - } - - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - StreamingReporterBase::sectionEnded( sectionStats ); - if( --m_sectionDepth > 0 ) { - XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); - e.writeAttribute( "successes", sectionStats.assertions.passed ); - e.writeAttribute( "failures", sectionStats.assertions.failed ); - e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); - - if ( m_config->showDurations() == ShowDurations::Always ) - e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); - - m_xml.endElement(); - } - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseEnded( testCaseStats ); - XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); - e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); - - if ( m_config->showDurations() == ShowDurations::Always ) - e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); - - m_xml.endElement(); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - StreamingReporterBase::testGroupEnded( testGroupStats ); - // TODO: Check testGroupStats.aborting and act accordingly. - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) - .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) - .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - StreamingReporterBase::testRunEnded( testRunStats ); - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", testRunStats.totals.assertions.passed ) - .writeAttribute( "failures", testRunStats.totals.assertions.failed ) - .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); - m_xml.endElement(); - } - - private: - Timer m_testCaseTimer; - XmlWriter m_xml; - int m_sectionDepth; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_junit.hpp -#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED - -#include - -namespace Catch { - - class JunitReporter : public CumulativeReporterBase { - public: - JunitReporter( ReporterConfig const& _config ) - : CumulativeReporterBase( _config ), - xml( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = true; - } - - virtual ~JunitReporter() CATCH_OVERRIDE; - - static std::string getDescription() { - return "Reports test results in an XML format that looks like Ant's junitreport target"; - } - - virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {} - - virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE { - CumulativeReporterBase::testRunStarting( runInfo ); - xml.startElement( "testsuites" ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - suiteTimer.start(); - stdOutForSuite.str(""); - stdErrForSuite.str(""); - unexpectedExceptions = 0; - CumulativeReporterBase::testGroupStarting( groupInfo ); - } - - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) - unexpectedExceptions++; - return CumulativeReporterBase::assertionEnded( assertionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - stdOutForSuite << testCaseStats.stdOut; - stdErrForSuite << testCaseStats.stdErr; - CumulativeReporterBase::testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - double suiteTime = suiteTimer.getElapsedSeconds(); - CumulativeReporterBase::testGroupEnded( testGroupStats ); - writeGroup( *m_testGroups.back(), suiteTime ); - } - - virtual void testRunEndedCumulative() CATCH_OVERRIDE { - xml.endElement(); - } - - void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); - TestGroupStats const& stats = groupNode.value; - xml.writeAttribute( "name", stats.groupInfo.name ); - xml.writeAttribute( "errors", unexpectedExceptions ); - xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); - xml.writeAttribute( "tests", stats.totals.assertions.total() ); - xml.writeAttribute( "hostname", "tbd" ); // !TBD - if( m_config->showDurations() == ShowDurations::Never ) - xml.writeAttribute( "time", "" ); - else - xml.writeAttribute( "time", suiteTime ); - xml.writeAttribute( "timestamp", "tbd" ); // !TBD - - // Write test cases - for( TestGroupNode::ChildNodes::const_iterator - it = groupNode.children.begin(), itEnd = groupNode.children.end(); - it != itEnd; - ++it ) - writeTestCase( **it ); - - xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); - xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); - } - - void writeTestCase( TestCaseNode const& testCaseNode ) { - TestCaseStats const& stats = testCaseNode.value; - - // All test cases have exactly one section - which represents the - // test case itself. That section may have 0-n nested sections - assert( testCaseNode.children.size() == 1 ); - SectionNode const& rootSection = *testCaseNode.children.front(); - - std::string className = stats.testInfo.className; - - if( className.empty() ) { - if( rootSection.childSections.empty() ) - className = "global"; - } - writeSection( className, "", rootSection ); - } - - void writeSection( std::string const& className, - std::string const& rootName, - SectionNode const& sectionNode ) { - std::string name = trim( sectionNode.stats.sectionInfo.name ); - if( !rootName.empty() ) - name = rootName + "/" + name; - - if( !sectionNode.assertions.empty() || - !sectionNode.stdOut.empty() || - !sectionNode.stdErr.empty() ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); - if( className.empty() ) { - xml.writeAttribute( "classname", name ); - xml.writeAttribute( "name", "root" ); - } - else { - xml.writeAttribute( "classname", className ); - xml.writeAttribute( "name", name ); - } - xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) ); - - writeAssertions( sectionNode ); - - if( !sectionNode.stdOut.empty() ) - xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); - if( !sectionNode.stdErr.empty() ) - xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); - } - for( SectionNode::ChildSections::const_iterator - it = sectionNode.childSections.begin(), - itEnd = sectionNode.childSections.end(); - it != itEnd; - ++it ) - if( className.empty() ) - writeSection( name, "", **it ); - else - writeSection( className, name, **it ); - } - - void writeAssertions( SectionNode const& sectionNode ) { - for( SectionNode::Assertions::const_iterator - it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); - it != itEnd; - ++it ) - writeAssertion( *it ); - } - void writeAssertion( AssertionStats const& stats ) { - AssertionResult const& result = stats.assertionResult; - if( !result.isOk() ) { - std::string elementName; - switch( result.getResultType() ) { - case ResultWas::ThrewException: - case ResultWas::FatalErrorCondition: - elementName = "error"; - break; - case ResultWas::ExplicitFailure: - elementName = "failure"; - break; - case ResultWas::ExpressionFailed: - elementName = "failure"; - break; - case ResultWas::DidntThrowException: - elementName = "failure"; - break; - - // We should never see these here: - case ResultWas::Info: - case ResultWas::Warning: - case ResultWas::Ok: - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - elementName = "internalError"; - break; - } - - XmlWriter::ScopedElement e = xml.scopedElement( elementName ); - - xml.writeAttribute( "message", result.getExpandedExpression() ); - xml.writeAttribute( "type", result.getTestMacroName() ); - - std::ostringstream oss; - if( !result.getMessage().empty() ) - oss << result.getMessage() << "\n"; - for( std::vector::const_iterator - it = stats.infoMessages.begin(), - itEnd = stats.infoMessages.end(); - it != itEnd; - ++it ) - if( it->type == ResultWas::Info ) - oss << it->message << "\n"; - - oss << "at " << result.getSourceInfo(); - xml.writeText( oss.str(), false ); - } - } - - XmlWriter xml; - Timer suiteTimer; - std::ostringstream stdOutForSuite; - std::ostringstream stdErrForSuite; - unsigned int unexpectedExceptions; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_console.hpp -#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED - -namespace Catch { - - struct ConsoleReporter : StreamingReporterBase { - ConsoleReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_headerPrinted( false ) - {} - - virtual ~ConsoleReporter() CATCH_OVERRIDE; - static std::string getDescription() { - return "Reports test results as plain lines of text"; - } - - virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { - stream << "No test cases matched '" << spec << "'" << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - lazyPrint(); - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - stream << std::endl; - return true; - } - - virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { - m_headerPrinted = false; - StreamingReporterBase::sectionStarting( _sectionInfo ); - } - virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE { - if( _sectionStats.missingAssertions ) { - lazyPrint(); - Colour colour( Colour::ResultError ); - if( m_sectionStack.size() > 1 ) - stream << "\nNo assertions in section"; - else - stream << "\nNo assertions in test case"; - stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; - } - if( m_headerPrinted ) { - if( m_config->showDurations() == ShowDurations::Always ) - stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - m_headerPrinted = false; - } - else { - if( m_config->showDurations() == ShowDurations::Always ) - stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - } - StreamingReporterBase::sectionEnded( _sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseEnded( _testCaseStats ); - m_headerPrinted = false; - } - virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE { - if( currentGroupInfo.used ) { - printSummaryDivider(); - stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; - printTotals( _testGroupStats.totals ); - stream << "\n" << std::endl; - } - StreamingReporterBase::testGroupEnded( _testGroupStats ); - } - virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE { - printTotalsDivider( _testRunStats.totals ); - printTotals( _testRunStats.totals ); - stream << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ), - stats( _stats ), - result( _stats.assertionResult ), - colour( Colour::None ), - message( result.getMessage() ), - messages( _stats.infoMessages ), - printInfoMessages( _printInfoMessages ) - { - switch( result.getResultType() ) { - case ResultWas::Ok: - colour = Colour::Success; - passOrFail = "PASSED"; - //if( result.hasMessage() ) - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) { - colour = Colour::Success; - passOrFail = "FAILED - but was ok"; - } - else { - colour = Colour::Error; - passOrFail = "FAILED"; - } - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ThrewException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to unexpected exception with message"; - break; - case ResultWas::FatalErrorCondition: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to a fatal error condition"; - break; - case ResultWas::DidntThrowException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "because no exception was thrown where one was expected"; - break; - case ResultWas::Info: - messageLabel = "info"; - break; - case ResultWas::Warning: - messageLabel = "warning"; - break; - case ResultWas::ExplicitFailure: - passOrFail = "FAILED"; - colour = Colour::Error; - if( _stats.infoMessages.size() == 1 ) - messageLabel = "explicitly with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "explicitly with messages"; - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - passOrFail = "** internal error **"; - colour = Colour::Error; - break; - } - } - - void print() const { - printSourceInfo(); - if( stats.totals.assertions.total() > 0 ) { - if( result.isOk() ) - stream << "\n"; - printResultType(); - printOriginalExpression(); - printReconstructedExpression(); - } - else { - stream << "\n"; - } - printMessage(); - } - - private: - void printResultType() const { - if( !passOrFail.empty() ) { - Colour colourGuard( colour ); - stream << passOrFail << ":\n"; - } - } - void printOriginalExpression() const { - if( result.hasExpression() ) { - Colour colourGuard( Colour::OriginalExpression ); - stream << " "; - stream << result.getExpressionInMacro(); - stream << "\n"; - } - } - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - stream << "with expansion:\n"; - Colour colourGuard( Colour::ReconstructedExpression ); - stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n"; - } - } - void printMessage() const { - if( !messageLabel.empty() ) - stream << messageLabel << ":" << "\n"; - for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); - it != itEnd; - ++it ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || it->type != ResultWas::Info ) - stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n"; - } - } - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ": "; - } - - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - Colour::Code colour; - std::string passOrFail; - std::string messageLabel; - std::string message; - std::vector messages; - bool printInfoMessages; - }; - - void lazyPrint() { - - if( !currentTestRunInfo.used ) - lazyPrintRunInfo(); - if( !currentGroupInfo.used ) - lazyPrintGroupInfo(); - - if( !m_headerPrinted ) { - printTestCaseAndSectionHeader(); - m_headerPrinted = true; - } - } - void lazyPrintRunInfo() { - stream << "\n" << getLineOfChars<'~'>() << "\n"; - Colour colour( Colour::SecondaryText ); - stream << currentTestRunInfo->name - << " is a Catch v" << libraryVersion << " host application.\n" - << "Run with -? for options\n\n"; - - if( m_config->rngSeed() != 0 ) - stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; - - currentTestRunInfo.used = true; - } - void lazyPrintGroupInfo() { - if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { - printClosedHeader( "Group: " + currentGroupInfo->name ); - currentGroupInfo.used = true; - } - } - void printTestCaseAndSectionHeader() { - assert( !m_sectionStack.empty() ); - printOpenHeader( currentTestCaseInfo->name ); - - if( m_sectionStack.size() > 1 ) { - Colour colourGuard( Colour::Headers ); - - std::vector::const_iterator - it = m_sectionStack.begin()+1, // Skip first section (test case) - itEnd = m_sectionStack.end(); - for( ; it != itEnd; ++it ) - printHeaderString( it->name, 2 ); - } - - SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; - - if( !lineInfo.empty() ){ - stream << getLineOfChars<'-'>() << "\n"; - Colour colourGuard( Colour::FileName ); - stream << lineInfo << "\n"; - } - stream << getLineOfChars<'.'>() << "\n" << std::endl; - } - - void printClosedHeader( std::string const& _name ) { - printOpenHeader( _name ); - stream << getLineOfChars<'.'>() << "\n"; - } - void printOpenHeader( std::string const& _name ) { - stream << getLineOfChars<'-'>() << "\n"; - { - Colour colourGuard( Colour::Headers ); - printHeaderString( _name ); - } - } - - // if string has a : in first line will set indent to follow it on - // subsequent lines - void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { - std::size_t i = _string.find( ": " ); - if( i != std::string::npos ) - i+=2; - else - i = 0; - stream << Text( _string, TextAttributes() - .setIndent( indent+i) - .setInitialIndent( indent ) ) << "\n"; - } - - struct SummaryColumn { - - SummaryColumn( std::string const& _label, Colour::Code _colour ) - : label( _label ), - colour( _colour ) - {} - SummaryColumn addRow( std::size_t count ) { - std::ostringstream oss; - oss << count; - std::string row = oss.str(); - for( std::vector::iterator it = rows.begin(); it != rows.end(); ++it ) { - while( it->size() < row.size() ) - *it = " " + *it; - while( it->size() > row.size() ) - row = " " + row; - } - rows.push_back( row ); - return *this; - } - - std::string label; - Colour::Code colour; - std::vector rows; - - }; - - void printTotals( Totals const& totals ) { - if( totals.testCases.total() == 0 ) { - stream << Colour( Colour::Warning ) << "No tests ran\n"; - } - else if( totals.assertions.total() > 0 && totals.assertions.allPassed() ) { - stream << Colour( Colour::ResultSuccess ) << "All tests passed"; - stream << " (" - << pluralise( totals.assertions.passed, "assertion" ) << " in " - << pluralise( totals.testCases.passed, "test case" ) << ")" - << "\n"; - } - else { - - std::vector columns; - columns.push_back( SummaryColumn( "", Colour::None ) - .addRow( totals.testCases.total() ) - .addRow( totals.assertions.total() ) ); - columns.push_back( SummaryColumn( "passed", Colour::Success ) - .addRow( totals.testCases.passed ) - .addRow( totals.assertions.passed ) ); - columns.push_back( SummaryColumn( "failed", Colour::ResultError ) - .addRow( totals.testCases.failed ) - .addRow( totals.assertions.failed ) ); - columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) - .addRow( totals.testCases.failedButOk ) - .addRow( totals.assertions.failedButOk ) ); - - printSummaryRow( "test cases", columns, 0 ); - printSummaryRow( "assertions", columns, 1 ); - } - } - void printSummaryRow( std::string const& label, std::vector const& cols, std::size_t row ) { - for( std::vector::const_iterator it = cols.begin(); it != cols.end(); ++it ) { - std::string value = it->rows[row]; - if( it->label.empty() ) { - stream << label << ": "; - if( value != "0" ) - stream << value; - else - stream << Colour( Colour::Warning ) << "- none -"; - } - else if( value != "0" ) { - stream << Colour( Colour::LightGrey ) << " | "; - stream << Colour( it->colour ) - << value << " " << it->label; - } - } - stream << "\n"; - } - - static std::size_t makeRatio( std::size_t number, std::size_t total ) { - std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; - return ( ratio == 0 && number > 0 ) ? 1 : ratio; - } - static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { - if( i > j && i > k ) - return i; - else if( j > k ) - return j; - else - return k; - } - - void printTotalsDivider( Totals const& totals ) { - if( totals.testCases.total() > 0 ) { - std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); - std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); - std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); - while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )++; - while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )--; - - stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); - stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); - if( totals.testCases.allPassed() ) - stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); - else - stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); - } - else { - stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); - } - stream << "\n"; - } - void printSummaryDivider() { - stream << getLineOfChars<'-'>() << "\n"; - } - - private: - bool m_headerPrinted; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_compact.hpp -#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED - -namespace Catch { - - struct CompactReporter : StreamingReporterBase { - - CompactReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual ~CompactReporter(); - - static std::string getDescription() { - return "Reports test results on a single line, suitable for IDEs"; - } - - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; - } - - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << "'" << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - - stream << std::endl; - return true; - } - - virtual void testRunEnded( TestRunStats const& _testRunStats ) { - printTotals( _testRunStats.totals ); - stream << "\n" << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ) - , stats( _stats ) - , result( _stats.assertionResult ) - , messages( _stats.infoMessages ) - , itMessage( _stats.infoMessages.begin() ) - , printInfoMessages( _printInfoMessages ) - {} - - void print() { - printSourceInfo(); - - itMessage = messages.begin(); - - switch( result.getResultType() ) { - case ResultWas::Ok: - printResultType( Colour::ResultSuccess, passedString() ); - printOriginalExpression(); - printReconstructedExpression(); - if ( ! result.hasExpression() ) - printRemainingMessages( Colour::None ); - else - printRemainingMessages(); - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) - printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); - else - printResultType( Colour::Error, failedString() ); - printOriginalExpression(); - printReconstructedExpression(); - printRemainingMessages(); - break; - case ResultWas::ThrewException: - printResultType( Colour::Error, failedString() ); - printIssue( "unexpected exception with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::FatalErrorCondition: - printResultType( Colour::Error, failedString() ); - printIssue( "fatal error condition with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::DidntThrowException: - printResultType( Colour::Error, failedString() ); - printIssue( "expected exception, got none" ); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::Info: - printResultType( Colour::None, "info" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::Warning: - printResultType( Colour::None, "warning" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::ExplicitFailure: - printResultType( Colour::Error, failedString() ); - printIssue( "explicitly" ); - printRemainingMessages( Colour::None ); - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - printResultType( Colour::Error, "** internal error **" ); - break; - } - } - - private: - // Colour::LightGrey - - static Colour::Code dimColour() { return Colour::FileName; } - -#ifdef CATCH_PLATFORM_MAC - static const char* failedString() { return "FAILED"; } - static const char* passedString() { return "PASSED"; } -#else - static const char* failedString() { return "failed"; } - static const char* passedString() { return "passed"; } -#endif - - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ":"; - } - - void printResultType( Colour::Code colour, std::string passOrFail ) const { - if( !passOrFail.empty() ) { - { - Colour colourGuard( colour ); - stream << " " << passOrFail; - } - stream << ":"; - } - } - - void printIssue( std::string issue ) const { - stream << " " << issue; - } - - void printExpressionWas() { - if( result.hasExpression() ) { - stream << ";"; - { - Colour colour( dimColour() ); - stream << " expression was:"; - } - printOriginalExpression(); - } - } - - void printOriginalExpression() const { - if( result.hasExpression() ) { - stream << " " << result.getExpression(); - } - } - - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - { - Colour colour( dimColour() ); - stream << " for: "; - } - stream << result.getExpandedExpression(); - } - } - - void printMessage() { - if ( itMessage != messages.end() ) { - stream << " '" << itMessage->message << "'"; - ++itMessage; - } - } - - void printRemainingMessages( Colour::Code colour = dimColour() ) { - if ( itMessage == messages.end() ) - return; - - // using messages.end() directly yields compilation error: - std::vector::const_iterator itEnd = messages.end(); - const std::size_t N = static_cast( std::distance( itMessage, itEnd ) ); - - { - Colour colourGuard( colour ); - stream << " with " << pluralise( N, "message" ) << ":"; - } - - for(; itMessage != itEnd; ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || itMessage->type != ResultWas::Info ) { - stream << " '" << itMessage->message << "'"; - if ( ++itMessage != itEnd ) { - Colour colourGuard( dimColour() ); - stream << " and"; - } - } - } - } - - private: - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - std::vector messages; - std::vector::const_iterator itMessage; - bool printInfoMessages; - }; - - // Colour, message variants: - // - white: No tests ran. - // - red: Failed [both/all] N test cases, failed [both/all] M assertions. - // - white: Passed [both/all] N test cases (no assertions). - // - red: Failed N tests cases, failed M assertions. - // - green: Passed [both/all] N tests cases with M assertions. - - std::string bothOrAll( std::size_t count ) const { - return count == 1 ? "" : count == 2 ? "both " : "all " ; - } - - void printTotals( const Totals& totals ) const { - if( totals.testCases.total() == 0 ) { - stream << "No tests ran."; - } - else if( totals.testCases.failed == totals.testCases.total() ) { - Colour colour( Colour::ResultError ); - const std::string qualify_assertions_failed = - totals.assertions.failed == totals.assertions.total() ? - bothOrAll( totals.assertions.failed ) : ""; - stream << - "Failed " << bothOrAll( totals.testCases.failed ) - << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << qualify_assertions_failed << - pluralise( totals.assertions.failed, "assertion" ) << "."; - } - else if( totals.assertions.total() == 0 ) { - stream << - "Passed " << bothOrAll( totals.testCases.total() ) - << pluralise( totals.testCases.total(), "test case" ) - << " (no assertions)."; - } - else if( totals.assertions.failed ) { - Colour colour( Colour::ResultError ); - stream << - "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << pluralise( totals.assertions.failed, "assertion" ) << "."; - } - else { - Colour colour( Colour::ResultSuccess ); - stream << - "Passed " << bothOrAll( totals.testCases.passed ) - << pluralise( totals.testCases.passed, "test case" ) << - " with " << pluralise( totals.assertions.passed, "assertion" ) << "."; - } - } - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) - -} // end namespace Catch - -namespace Catch { - // These are all here to avoid warnings about not having any out of line - // virtual methods - NonCopyable::~NonCopyable() {} - IShared::~IShared() {} - IStream::~IStream() CATCH_NOEXCEPT {} - FileStream::~FileStream() CATCH_NOEXCEPT {} - CoutStream::~CoutStream() CATCH_NOEXCEPT {} - DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {} - StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} - IContext::~IContext() {} - IResultCapture::~IResultCapture() {} - ITestCase::~ITestCase() {} - ITestCaseRegistry::~ITestCaseRegistry() {} - IRegistryHub::~IRegistryHub() {} - IMutableRegistryHub::~IMutableRegistryHub() {} - IExceptionTranslator::~IExceptionTranslator() {} - IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} - IReporter::~IReporter() {} - IReporterFactory::~IReporterFactory() {} - IReporterRegistry::~IReporterRegistry() {} - IStreamingReporter::~IStreamingReporter() {} - AssertionStats::~AssertionStats() {} - SectionStats::~SectionStats() {} - TestCaseStats::~TestCaseStats() {} - TestGroupStats::~TestGroupStats() {} - TestRunStats::~TestRunStats() {} - CumulativeReporterBase::SectionNode::~SectionNode() {} - CumulativeReporterBase::~CumulativeReporterBase() {} - - StreamingReporterBase::~StreamingReporterBase() {} - ConsoleReporter::~ConsoleReporter() {} - CompactReporter::~CompactReporter() {} - IRunner::~IRunner() {} - IMutableContext::~IMutableContext() {} - IConfig::~IConfig() {} - XmlReporter::~XmlReporter() {} - JunitReporter::~JunitReporter() {} - TestRegistry::~TestRegistry() {} - FreeFunctionTestCase::~FreeFunctionTestCase() {} - IGeneratorInfo::~IGeneratorInfo() {} - IGeneratorsForTest::~IGeneratorsForTest() {} - WildcardPattern::~WildcardPattern() {} - TestSpec::Pattern::~Pattern() {} - TestSpec::NamePattern::~NamePattern() {} - TestSpec::TagPattern::~TagPattern() {} - TestSpec::ExcludedPattern::~ExcludedPattern() {} - - Matchers::Impl::StdString::Equals::~Equals() {} - Matchers::Impl::StdString::Contains::~Contains() {} - Matchers::Impl::StdString::StartsWith::~StartsWith() {} - Matchers::Impl::StdString::EndsWith::~EndsWith() {} - - void Config::dummy() {} - - namespace TestCaseTracking { - ITracker::~ITracker() {} - TrackerBase::~TrackerBase() {} - SectionTracker::~SectionTracker() {} - IndexTracker::~IndexTracker() {} - } -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif - -#ifdef CATCH_CONFIG_MAIN -// #included from: internal/catch_default_main.hpp -#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED - -#ifndef __OBJC__ - -// Standard C/C++ main entry point -int main (int argc, char * argv[]) { - return Catch::Session().run( argc, argv ); -} - -#else // __OBJC__ - -// Objective-C entry point -int main (int argc, char * const argv[]) { -#if !CATCH_ARC_ENABLED - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; -#endif - - Catch::registerTestMethods(); - int result = Catch::Session().run( argc, (char* const*)argv ); - -#if !CATCH_ARC_ENABLED - [pool drain]; -#endif - - return result; -} - -#endif // __OBJC__ - -#endif - -#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED -# undef CLARA_CONFIG_MAIN -#endif - -////// - -// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ -#ifdef CATCH_CONFIG_PREFIX_ALL - -#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" ) -#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE" ) - -#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "", "CATCH_REQUIRE_THROWS" ) -#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" ) -#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, matcher, "CATCH_REQUIRE_THROWS_WITH" ) -#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" ) - -#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" ) -#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE" ) -#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" ) -#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" ) -#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" ) - -#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" ) -#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" ) -#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CATCH_CHECK_THROWS_WITH" ) -#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" ) -#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" ) - -#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg ) -#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) -#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) - #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ ) - #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ ) -#else - #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description ) - #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg ) - #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg ) -#endif -#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) -#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) -#else -#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) -#define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) -#endif -#define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc, "" ) -#define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc, "" ) -#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) -#define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc, "" ) -#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) - -// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required -#else - -#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" ) -#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE" ) - -#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "", "REQUIRE_THROWS" ) -#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" ) -#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, matcher, "REQUIRE_THROWS_WITH" ) -#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" ) - -#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" ) -#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE" ) -#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" ) -#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" ) -#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" ) - -#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "", "CHECK_THROWS" ) -#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" ) -#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CHECK_THROWS_WITH" ) -#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" ) -#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" ) - -#define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg ) -#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) -#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) - #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ ) - #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ ) -#else - #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description ) - #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg ) - #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg ) -#endif -#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -#endif - -#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) -#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) -#else -#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) -#define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) -#endif -#define GIVEN( desc ) SECTION( std::string(" Given: ") + desc, "" ) -#define WHEN( desc ) SECTION( std::string(" When: ") + desc, "" ) -#define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" ) -#define THEN( desc ) SECTION( std::string(" Then: ") + desc, "" ) -#define AND_THEN( desc ) SECTION( std::string(" And: ") + desc, "" ) - -using Catch::Detail::Approx; - -#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - diff --git a/resources/3rdparty/modernjson/test/src/fuzz.cpp b/resources/3rdparty/modernjson/test/src/fuzz.cpp deleted file mode 100755 index d8b7ef7cf..000000000 --- a/resources/3rdparty/modernjson/test/src/fuzz.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - __ _____ _____ _____ - __| | __| | | | JSON for Modern C++ (fuzz test support) -| | |__ | | | | | | version 2.0.0 -|_____|_____|_____|_|___| https://github.com/nlohmann/json - -Run "make fuzz_testing" and follow the instructions. - -Licensed under the MIT License . -*/ - -#include - -using json = nlohmann::json; - -int main() -{ -#ifdef __AFL_HAVE_MANUAL_CONTROL - while (__AFL_LOOP(1000)) - { -#endif - try - { - json j(std::cin); - std::cout << j << std::endl; - } - catch (std::invalid_argument& e) - { - std::cout << "Invalid argument in parsing" << e.what() << '\n'; - } -#ifdef __AFL_HAVE_MANUAL_CONTROL - } -#endif -} diff --git a/resources/3rdparty/modernjson/test/src/unit.cpp b/resources/3rdparty/modernjson/test/src/unit.cpp deleted file mode 100755 index 0a2bdd104..000000000 --- a/resources/3rdparty/modernjson/test/src/unit.cpp +++ /dev/null @@ -1,14107 +0,0 @@ -/* - __ _____ _____ _____ - __| | __| | | | JSON for Modern C++ (test suite) -| | |__ | | | | | | version 2.0.0 -|_____|_____|_____|_|___| https://github.com/nlohmann/json - -Licensed under the MIT License . -Copyright (c) 2013-2016 Niels Lohmann . - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -#define CATCH_CONFIG_MAIN -#include "catch.hpp" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define private public -#include "json.hpp" -using nlohmann::json; - -// disable float-equal warnings on GCC/clang -#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #pragma GCC diagnostic ignored "-Wfloat-equal" -#endif - -TEST_CASE("constructors") -{ - SECTION("create an empty value with a given type") - { - SECTION("null") - { - auto t = json::value_t::null; - json j(t); - CHECK(j.type() == t); - } - - SECTION("discarded") - { - auto t = json::value_t::discarded; - json j(t); - CHECK(j.type() == t); - } - - SECTION("object") - { - auto t = json::value_t::object; - json j(t); - CHECK(j.type() == t); - } - - SECTION("array") - { - auto t = json::value_t::array; - json j(t); - CHECK(j.type() == t); - } - - SECTION("boolean") - { - auto t = json::value_t::boolean; - json j(t); - CHECK(j.type() == t); - } - - SECTION("string") - { - auto t = json::value_t::string; - json j(t); - CHECK(j.type() == t); - } - - SECTION("number_integer") - { - auto t = json::value_t::number_integer; - json j(t); - CHECK(j.type() == t); - } - - SECTION("number_unsigned") - { - auto t = json::value_t::number_unsigned; - json j(t); - CHECK(j.type() == t); - } - - SECTION("number_float") - { - auto t = json::value_t::number_float; - json j(t); - CHECK(j.type() == t); - } - } - - SECTION("create a null object (implicitly)") - { - SECTION("no parameter") - { - json j{}; - CHECK(j.type() == json::value_t::null); - } - } - - SECTION("create a null object (explicitly)") - { - SECTION("parameter") - { - json j(nullptr); - CHECK(j.type() == json::value_t::null); - } - } - - SECTION("create an object (explicit)") - { - SECTION("empty object") - { - json::object_t o; - json j(o); - CHECK(j.type() == json::value_t::object); - } - - SECTION("filled object") - { - json::object_t o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; - json j(o); - CHECK(j.type() == json::value_t::object); - } - } - - SECTION("create an object (implicit)") - { - // reference object - json::object_t o_reference {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; - json j_reference(o_reference); - - SECTION("std::map") - { - std::map o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; - json j(o); - CHECK(j.type() == json::value_t::object); - CHECK(j == j_reference); - } - - SECTION("std::map") - { - std::map o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; - json j(o); - CHECK(j.type() == json::value_t::object); - CHECK(j == j_reference); - } - - SECTION("std::multimap") - { - std::multimap o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; - json j(o); - CHECK(j.type() == json::value_t::object); - CHECK(j == j_reference); - } - - SECTION("std::unordered_map") - { - std::unordered_map o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; - json j(o); - CHECK(j.type() == json::value_t::object); - CHECK(j == j_reference); - } - - SECTION("std::unordered_multimap") - { - std::unordered_multimap o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; - json j(o); - CHECK(j.type() == json::value_t::object); - CHECK(j == j_reference); - } - - SECTION("associative container literal") - { - json j({{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}); - CHECK(j.type() == json::value_t::object); - CHECK(j == j_reference); - } - } - - SECTION("create an array (explicit)") - { - SECTION("empty array") - { - json::array_t a; - json j(a); - CHECK(j.type() == json::value_t::array); - } - - SECTION("filled array") - { - json::array_t a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; - json j(a); - CHECK(j.type() == json::value_t::array); - } - } - - SECTION("create an array (implicit)") - { - // reference array - json::array_t a_reference {json(1), json(1u), json(2.2), json(false), json("string"), json()}; - json j_reference(a_reference); - - SECTION("std::list") - { - std::list a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; - json j(a); - CHECK(j.type() == json::value_t::array); - CHECK(j == j_reference); - } - - SECTION("std::forward_list") - { - std::forward_list a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; - json j(a); - CHECK(j.type() == json::value_t::array); - CHECK(j == j_reference); - } - - SECTION("std::array") - { - std::array a {{json(1), json(1u), json(2.2), json(false), json("string"), json()}}; - json j(a); - CHECK(j.type() == json::value_t::array); - CHECK(j == j_reference); - } - - SECTION("std::vector") - { - std::vector a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; - json j(a); - CHECK(j.type() == json::value_t::array); - CHECK(j == j_reference); - } - - SECTION("std::deque") - { - std::deque a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; - json j(a); - CHECK(j.type() == json::value_t::array); - CHECK(j == j_reference); - } - - SECTION("std::set") - { - std::set a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; - json j(a); - CHECK(j.type() == json::value_t::array); - // we cannot really check for equality here - } - - SECTION("std::unordered_set") - { - std::unordered_set a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; - json j(a); - CHECK(j.type() == json::value_t::array); - // we cannot really check for equality here - } - - SECTION("sequence container literal") - { - json j({json(1), json(1u), json(2.2), json(false), json("string"), json()}); - CHECK(j.type() == json::value_t::array); - CHECK(j == j_reference); - } - } - - SECTION("create a string (explicit)") - { - SECTION("empty string") - { - json::string_t s; - json j(s); - CHECK(j.type() == json::value_t::string); - } - - SECTION("filled string") - { - json::string_t s {"Hello world"}; - json j(s); - CHECK(j.type() == json::value_t::string); - } - } - - SECTION("create a string (implicit)") - { - // reference string - json::string_t s_reference {"Hello world"}; - json j_reference(s_reference); - - SECTION("std::string") - { - std::string s {"Hello world"}; - json j(s); - CHECK(j.type() == json::value_t::string); - CHECK(j == j_reference); - } - - SECTION("char[]") - { - char s[] {"Hello world"}; - json j(s); - CHECK(j.type() == json::value_t::string); - CHECK(j == j_reference); - } - - SECTION("const char*") - { - const char* s {"Hello world"}; - json j(s); - CHECK(j.type() == json::value_t::string); - CHECK(j == j_reference); - } - - SECTION("string literal") - { - json j("Hello world"); - CHECK(j.type() == json::value_t::string); - CHECK(j == j_reference); - } - } - - SECTION("create a boolean (explicit)") - { - SECTION("empty boolean") - { - json::boolean_t b{}; - json j(b); - CHECK(j.type() == json::value_t::boolean); - } - - SECTION("filled boolean (true)") - { - json j(true); - CHECK(j.type() == json::value_t::boolean); - } - - SECTION("filled boolean (false)") - { - json j(false); - CHECK(j.type() == json::value_t::boolean); - } - } - - SECTION("create an integer number (explicit)") - { - SECTION("uninitialized value") - { - json::number_integer_t n{}; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - } - - SECTION("initialized value") - { - json::number_integer_t n(42); - json j(n); - CHECK(j.type() == json::value_t::number_integer); - } - } - - SECTION("create an integer number (implicit)") - { - // reference objects - json::number_integer_t n_reference = 42; - json j_reference(n_reference); - json::number_unsigned_t n_unsigned_reference = 42; - json j_unsigned_reference(n_unsigned_reference); - - SECTION("short") - { - short n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("unsigned short") - { - unsigned short n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("int") - { - int n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("unsigned int") - { - unsigned int n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("long") - { - long n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("unsigned long") - { - unsigned long n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("long long") - { - long long n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("unsigned long long") - { - unsigned long long n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("int8_t") - { - int8_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int16_t") - { - int16_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int32_t") - { - int32_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int64_t") - { - int64_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int_fast8_t") - { - int_fast8_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int_fast16_t") - { - int_fast16_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int_fast32_t") - { - int_fast32_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int_fast64_t") - { - int_fast64_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int_least8_t") - { - int_least8_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int_least16_t") - { - int_least16_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int_least32_t") - { - int_least32_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("int_least64_t") - { - int_least64_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("uint8_t") - { - uint8_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint16_t") - { - uint16_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint32_t") - { - uint32_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint64_t") - { - uint64_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint_fast8_t") - { - uint_fast8_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint_fast16_t") - { - uint_fast16_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint_fast32_t") - { - uint_fast32_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint_fast64_t") - { - uint_fast64_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint_least8_t") - { - uint_least8_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint_least16_t") - { - uint_least16_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint_least32_t") - { - uint_least32_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("uint_least64_t") - { - uint_least64_t n = 42; - json j(n); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("integer literal without suffix") - { - json j(42); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("integer literal with u suffix") - { - json j(42u); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("integer literal with l suffix") - { - json j(42l); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("integer literal with ul suffix") - { - json j(42ul); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - - SECTION("integer literal with ll suffix") - { - json j(42ll); - CHECK(j.type() == json::value_t::number_integer); - CHECK(j == j_reference); - } - - SECTION("integer literal with ull suffix") - { - json j(42ull); - CHECK(j.type() == json::value_t::number_unsigned); - CHECK(j == j_unsigned_reference); - } - } - - SECTION("create a floating-point number (explicit)") - { - SECTION("uninitialized value") - { - json::number_float_t n{}; - json j(n); - CHECK(j.type() == json::value_t::number_float); - } - - SECTION("initialized value") - { - json::number_float_t n(42.23); - json j(n); - CHECK(j.type() == json::value_t::number_float); - } - } - - SECTION("create a floating-point number (implicit)") - { - // reference object - json::number_float_t n_reference = 42.23; - json j_reference(n_reference); - - SECTION("float") - { - float n = 42.23; - json j(n); - CHECK(j.type() == json::value_t::number_float); - CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); - } - - SECTION("double") - { - double n = 42.23; - json j(n); - CHECK(j.type() == json::value_t::number_float); - CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); - } - - SECTION("long double") - { - long double n = 42.23; - json j(n); - CHECK(j.type() == json::value_t::number_float); - CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); - } - - SECTION("floating-point literal without suffix") - { - json j(42.23); - CHECK(j.type() == json::value_t::number_float); - CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); - } - - SECTION("integer literal with f suffix") - { - json j(42.23f); - CHECK(j.type() == json::value_t::number_float); - CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); - } - - SECTION("integer literal with l suffix") - { - json j(42.23l); - CHECK(j.type() == json::value_t::number_float); - CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); - } - } - - SECTION("create a container (array or object) from an initializer list") - { - SECTION("empty initializer list") - { - SECTION("explicit") - { - std::initializer_list l; - json j(l); - CHECK(j.type() == json::value_t::object); - } - - SECTION("implicit") - { - json j {}; - CHECK(j.type() == json::value_t::null); - } - } - - SECTION("one element") - { - SECTION("array") - { - SECTION("explicit") - { - std::initializer_list l = {json(json::array_t())}; - json j(l); - CHECK(j.type() == json::value_t::array); - } - - SECTION("implicit") - { - json j {json::array_t()}; - CHECK(j.type() == json::value_t::array); - } - } - - SECTION("object") - { - SECTION("explicit") - { - std::initializer_list l = {json(json::object_t())}; - json j(l); - CHECK(j.type() == json::value_t::array); - } - - SECTION("implicit") - { - json j {json::object_t()}; - CHECK(j.type() == json::value_t::array); - } - } - - SECTION("string") - { - SECTION("explicit") - { - std::initializer_list l = {json("Hello world")}; - json j(l); - CHECK(j.type() == json::value_t::array); - } - - SECTION("implicit") - { - json j {"Hello world"}; - CHECK(j.type() == json::value_t::array); - } - } - - SECTION("boolean") - { - SECTION("explicit") - { - std::initializer_list l = {json(true)}; - json j(l); - CHECK(j.type() == json::value_t::array); - } - - SECTION("implicit") - { - json j {true}; - CHECK(j.type() == json::value_t::array); - } - } - - SECTION("number (integer)") - { - SECTION("explicit") - { - std::initializer_list l = {json(1)}; - json j(l); - CHECK(j.type() == json::value_t::array); - } - - SECTION("implicit") - { - json j {1}; - CHECK(j.type() == json::value_t::array); - } - } - - SECTION("number (unsigned)") - { - SECTION("explicit") - { - std::initializer_list l = {json(1u)}; - json j(l); - CHECK(j.type() == json::value_t::array); - } - - SECTION("implicit") - { - json j {1u}; - CHECK(j.type() == json::value_t::array); - } - } - - SECTION("number (floating-point)") - { - SECTION("explicit") - { - std::initializer_list l = {json(42.23)}; - json j(l); - CHECK(j.type() == json::value_t::array); - } - - SECTION("implicit") - { - json j {42.23}; - CHECK(j.type() == json::value_t::array); - } - } - } - - SECTION("more elements") - { - SECTION("explicit") - { - std::initializer_list l = {1, 1u, 42.23, true, nullptr, json::object_t(), json::array_t()}; - json j(l); - CHECK(j.type() == json::value_t::array); - } - - SECTION("implicit") - { - json j {1, 1u, 42.23, true, nullptr, json::object_t(), json::array_t()}; - CHECK(j.type() == json::value_t::array); - } - } - - SECTION("implicit type deduction") - { - SECTION("object") - { - json j { {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false} }; - CHECK(j.type() == json::value_t::object); - } - - SECTION("array") - { - json j { {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false} , 13 }; - CHECK(j.type() == json::value_t::array); - } - } - - SECTION("explicit type deduction") - { - SECTION("empty object") - { - json j = json::object(); - CHECK(j.type() == json::value_t::object); - } - - SECTION("object") - { - json j = json::object({ {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false} }); - CHECK(j.type() == json::value_t::object); - } - - SECTION("object with error") - { - CHECK_THROWS_AS(json::object({ {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false}, 13 }), - std::logic_error); - CHECK_THROWS_WITH(json::object({ {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false}, 13 }), - "cannot create object from initializer list"); - } - - SECTION("empty array") - { - json j = json::array(); - CHECK(j.type() == json::value_t::array); - } - - SECTION("array") - { - json j = json::array({ {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false} }); - CHECK(j.type() == json::value_t::array); - } - } - } - - SECTION("create an array of n copies of a given value") - { - json v = {1, "foo", 34.23, {1, 2, 3}, {{"A", 1}, {"B", 2u}}}; - json arr(3, v); - CHECK(arr.size() == 3); - for (auto& x : arr) - { - CHECK(x == v); - } - } - - SECTION("create a JSON container from an iterator range") - { - SECTION("object") - { - SECTION("json(begin(), end())") - { - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json j_new(jobject.begin(), jobject.end()); - CHECK(j_new == jobject); - } - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json j_new(jobject.cbegin(), jobject.cend()); - CHECK(j_new == jobject); - } - } - - SECTION("json(begin(), begin())") - { - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json j_new(jobject.begin(), jobject.begin()); - CHECK(j_new == json::object()); - } - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json j_new(jobject.cbegin(), jobject.cbegin()); - CHECK(j_new == json::object()); - } - } - - SECTION("construct from subrange") - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}}; - json j_new(jobject.find("b"), jobject.find("e")); - CHECK(j_new == json({{"b", 1}, {"c", 17u}, {"d", false}})); - } - - SECTION("incompatible iterators") - { - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}}; - json jobject2 = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - CHECK_THROWS_AS(json(jobject.begin(), jobject2.end()), std::domain_error); - CHECK_THROWS_AS(json(jobject2.begin(), jobject.end()), std::domain_error); - CHECK_THROWS_WITH(json(jobject.begin(), jobject2.end()), "iterators are not compatible"); - CHECK_THROWS_WITH(json(jobject2.begin(), jobject.end()), "iterators are not compatible"); - } - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}}; - json jobject2 = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - CHECK_THROWS_AS(json(jobject.cbegin(), jobject2.cend()), std::domain_error); - CHECK_THROWS_AS(json(jobject2.cbegin(), jobject.cend()), std::domain_error); - CHECK_THROWS_WITH(json(jobject.cbegin(), jobject2.cend()), "iterators are not compatible"); - CHECK_THROWS_WITH(json(jobject2.cbegin(), jobject.cend()), "iterators are not compatible"); - } - } - } - - SECTION("array") - { - SECTION("json(begin(), end())") - { - { - json jarray = {1, 2, 3, 4, 5}; - json j_new(jarray.begin(), jarray.end()); - CHECK(j_new == jarray); - } - { - json jarray = {1, 2, 3, 4, 5}; - json j_new(jarray.cbegin(), jarray.cend()); - CHECK(j_new == jarray); - } - } - - SECTION("json(begin(), begin())") - { - { - json jarray = {1, 2, 3, 4, 5}; - json j_new(jarray.begin(), jarray.begin()); - CHECK(j_new == json::array()); - } - { - json jarray = {1, 2, 3, 4, 5}; - json j_new(jarray.cbegin(), jarray.cbegin()); - CHECK(j_new == json::array()); - } - } - - SECTION("construct from subrange") - { - { - json jarray = {1, 2, 3, 4, 5}; - json j_new(jarray.begin() + 1, jarray.begin() + 3); - CHECK(j_new == json({2, 3})); - } - { - json jarray = {1, 2, 3, 4, 5}; - json j_new(jarray.cbegin() + 1, jarray.cbegin() + 3); - CHECK(j_new == json({2, 3})); - } - } - - SECTION("incompatible iterators") - { - { - json jarray = {1, 2, 3, 4}; - json jarray2 = {2, 3, 4, 5}; - CHECK_THROWS_AS(json(jarray.begin(), jarray2.end()), std::domain_error); - CHECK_THROWS_AS(json(jarray2.begin(), jarray.end()), std::domain_error); - CHECK_THROWS_WITH(json(jarray.begin(), jarray2.end()), "iterators are not compatible"); - CHECK_THROWS_WITH(json(jarray2.begin(), jarray.end()), "iterators are not compatible"); - } - { - json jarray = {1, 2, 3, 4}; - json jarray2 = {2, 3, 4, 5}; - CHECK_THROWS_AS(json(jarray.cbegin(), jarray2.cend()), std::domain_error); - CHECK_THROWS_AS(json(jarray2.cbegin(), jarray.cend()), std::domain_error); - CHECK_THROWS_WITH(json(jarray.cbegin(), jarray2.cend()), "iterators are not compatible"); - CHECK_THROWS_WITH(json(jarray2.cbegin(), jarray.cend()), "iterators are not compatible"); - } - } - } - - SECTION("other values") - { - SECTION("construct with two valid iterators") - { - SECTION("null") - { - { - json j; - CHECK_THROWS_AS(json(j.begin(), j.end()), std::domain_error); - CHECK_THROWS_WITH(json(j.begin(), j.end()), "cannot use construct with iterators from null"); - } - { - json j; - CHECK_THROWS_AS(json(j.cbegin(), j.cend()), std::domain_error); - CHECK_THROWS_WITH(json(j.cbegin(), j.cend()), "cannot use construct with iterators from null"); - } - } - - SECTION("string") - { - { - json j = "foo"; - json j_new(j.begin(), j.end()); - CHECK(j == j_new); - } - { - json j = "bar"; - json j_new(j.cbegin(), j.cend()); - CHECK(j == j_new); - } - } - - SECTION("number (boolean)") - { - { - json j = false; - json j_new(j.begin(), j.end()); - CHECK(j == j_new); - } - { - json j = true; - json j_new(j.cbegin(), j.cend()); - CHECK(j == j_new); - } - } - - SECTION("number (integer)") - { - { - json j = 17; - json j_new(j.begin(), j.end()); - CHECK(j == j_new); - } - { - json j = 17; - json j_new(j.cbegin(), j.cend()); - CHECK(j == j_new); - } - } - - SECTION("number (unsigned)") - { - { - json j = 17u; - json j_new(j.begin(), j.end()); - CHECK(j == j_new); - } - { - json j = 17u; - json j_new(j.cbegin(), j.cend()); - CHECK(j == j_new); - } - } - - SECTION("number (floating point)") - { - { - json j = 23.42; - json j_new(j.begin(), j.end()); - CHECK(j == j_new); - } - { - json j = 23.42; - json j_new(j.cbegin(), j.cend()); - CHECK(j == j_new); - } - } - } - - SECTION("construct with two invalid iterators") - { - SECTION("string") - { - { - json j = "foo"; - CHECK_THROWS_AS(json(j.end(), j.end()), std::out_of_range); - CHECK_THROWS_AS(json(j.begin(), j.begin()), std::out_of_range); - CHECK_THROWS_WITH(json(j.end(), j.end()), "iterators out of range"); - CHECK_THROWS_WITH(json(j.begin(), j.begin()), "iterators out of range"); - } - { - json j = "bar"; - CHECK_THROWS_AS(json(j.cend(), j.cend()), std::out_of_range); - CHECK_THROWS_AS(json(j.cbegin(), j.cbegin()), std::out_of_range); - CHECK_THROWS_WITH(json(j.cend(), j.cend()), "iterators out of range"); - CHECK_THROWS_WITH(json(j.cbegin(), j.cbegin()), "iterators out of range"); - } - } - - SECTION("number (boolean)") - { - { - json j = false; - CHECK_THROWS_AS(json(j.end(), j.end()), std::out_of_range); - CHECK_THROWS_AS(json(j.begin(), j.begin()), std::out_of_range); - CHECK_THROWS_WITH(json(j.end(), j.end()), "iterators out of range"); - CHECK_THROWS_WITH(json(j.begin(), j.begin()), "iterators out of range"); - } - { - json j = true; - CHECK_THROWS_AS(json(j.cend(), j.cend()), std::out_of_range); - CHECK_THROWS_AS(json(j.cbegin(), j.cbegin()), std::out_of_range); - CHECK_THROWS_WITH(json(j.cend(), j.cend()), "iterators out of range"); - CHECK_THROWS_WITH(json(j.cbegin(), j.cbegin()), "iterators out of range"); - } - } - - SECTION("number (integer)") - { - { - json j = 17; - CHECK_THROWS_AS(json(j.end(), j.end()), std::out_of_range); - CHECK_THROWS_AS(json(j.begin(), j.begin()), std::out_of_range); - CHECK_THROWS_WITH(json(j.end(), j.end()), "iterators out of range"); - CHECK_THROWS_WITH(json(j.begin(), j.begin()), "iterators out of range"); - } - { - json j = 17; - CHECK_THROWS_AS(json(j.cend(), j.cend()), std::out_of_range); - CHECK_THROWS_AS(json(j.cbegin(), j.cbegin()), std::out_of_range); - CHECK_THROWS_WITH(json(j.cend(), j.cend()), "iterators out of range"); - CHECK_THROWS_WITH(json(j.cbegin(), j.cbegin()), "iterators out of range"); - } - } - - SECTION("number (integer)") - { - { - json j = 17u; - CHECK_THROWS_AS(json(j.end(), j.end()), std::out_of_range); - CHECK_THROWS_AS(json(j.begin(), j.begin()), std::out_of_range); - CHECK_THROWS_WITH(json(j.end(), j.end()), "iterators out of range"); - CHECK_THROWS_WITH(json(j.begin(), j.begin()), "iterators out of range"); - } - { - json j = 17u; - CHECK_THROWS_AS(json(j.cend(), j.cend()), std::out_of_range); - CHECK_THROWS_AS(json(j.cbegin(), j.cbegin()), std::out_of_range); - CHECK_THROWS_WITH(json(j.cend(), j.cend()), "iterators out of range"); - CHECK_THROWS_WITH(json(j.cbegin(), j.cbegin()), "iterators out of range"); - } - } - - SECTION("number (floating point)") - { - { - json j = 23.42; - CHECK_THROWS_AS(json(j.end(), j.end()), std::out_of_range); - CHECK_THROWS_AS(json(j.begin(), j.begin()), std::out_of_range); - CHECK_THROWS_WITH(json(j.end(), j.end()), "iterators out of range"); - CHECK_THROWS_WITH(json(j.begin(), j.begin()), "iterators out of range"); - } - { - json j = 23.42; - CHECK_THROWS_AS(json(j.cend(), j.cend()), std::out_of_range); - CHECK_THROWS_AS(json(j.cbegin(), j.cbegin()), std::out_of_range); - CHECK_THROWS_WITH(json(j.cend(), j.cend()), "iterators out of range"); - CHECK_THROWS_WITH(json(j.cbegin(), j.cbegin()), "iterators out of range"); - } - } - } - } - } - - SECTION("create a JSON value from an input stream") - { - SECTION("sts::stringstream") - { - std::stringstream ss; - ss << "[\"foo\",1,2,3,false,{\"one\":1}]"; - json j(ss); - CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}})); - } - - SECTION("with callback function") - { - std::stringstream ss; - ss << "[\"foo\",1,2,3,false,{\"one\":1}]"; - json j(ss, [](int, json::parse_event_t, const json & val) - { - // filter all number(2) elements - if (val == json(2)) - { - return false; - } - else - { - return true; - } - }); - CHECK(j == json({"foo", 1, 3, false, {{"one", 1}}})); - } - - SECTION("std::ifstream") - { - std::ifstream f("test/data/json_tests/pass1.json"); - json j(f); - } - } -} - -TEST_CASE("other constructors and destructor") -{ - SECTION("copy constructor") - { - SECTION("object") - { - json j {{"foo", 1}, {"bar", false}}; - json k(j); - CHECK(j == k); - } - - SECTION("array") - { - json j {"foo", 1, 42.23, false}; - json k(j); - CHECK(j == k); - } - - SECTION("null") - { - json j(nullptr); - json k(j); - CHECK(j == k); - } - - SECTION("boolean") - { - json j(true); - json k(j); - CHECK(j == k); - } - - SECTION("string") - { - json j("Hello world"); - json k(j); - CHECK(j == k); - } - - SECTION("number (integer)") - { - json j(42); - json k(j); - CHECK(j == k); - } - - SECTION("number (unsigned)") - { - json j(42u); - json k(j); - CHECK(j == k); - } - - SECTION("number (floating-point)") - { - json j(42.23); - json k(j); - CHECK(j == k); - } - } - - SECTION("move constructor") - { - json j {{"foo", "bar"}, {"baz", {1, 2, 3, 4}}, {"a", 42u}, {"b", 42.23}, {"c", nullptr}}; - CHECK(j.type() == json::value_t::object); - json k(std::move(j)); - CHECK(k.type() == json::value_t::object); - CHECK(j.type() == json::value_t::null); - } - - SECTION("copy assignment") - { - SECTION("object") - { - json j {{"foo", 1}, {"bar", false}}; - json k; - k = j; - CHECK(j == k); - } - - SECTION("array") - { - json j {"foo", 1, 42.23, false}; - json k; - k = j; - CHECK(j == k); - } - - SECTION("null") - { - json j(nullptr); - json k; - k = j; - CHECK(j == k); - } - - SECTION("boolean") - { - json j(true); - json k; - k = j; - CHECK(j == k); - } - - SECTION("string") - { - json j("Hello world"); - json k; - k = j; - CHECK(j == k); - } - - SECTION("number (integer)") - { - json j(42); - json k; - k = j; - CHECK(j == k); - } - - SECTION("number (unsigned)") - { - json j(42u); - json k; - k = j; - CHECK(j == k); - } - - SECTION("number (floating-point)") - { - json j(42.23); - json k; - k = j; - CHECK(j == k); - } - } - - SECTION("destructor") - { - SECTION("object") - { - auto j = new json {{"foo", 1}, {"bar", false}}; - delete j; - } - - SECTION("array") - { - auto j = new json {"foo", 1, 1u, false, 23.42}; - delete j; - } - - SECTION("string") - { - auto j = new json("Hello world"); - delete j; - } - } -} - -TEST_CASE("object inspection") -{ - SECTION("convenience type checker") - { - SECTION("object") - { - json j {{"foo", 1}, {"bar", false}}; - CHECK(not j.is_null()); - CHECK(not j.is_boolean()); - CHECK(not j.is_number()); - CHECK(not j.is_number_integer()); - CHECK(not j.is_number_unsigned()); - CHECK(not j.is_number_float()); - CHECK(j.is_object()); - CHECK(not j.is_array()); - CHECK(not j.is_string()); - CHECK(not j.is_discarded()); - CHECK(not j.is_primitive()); - CHECK(j.is_structured()); - } - - SECTION("array") - { - json j {"foo", 1, 1u, 42.23, false}; - CHECK(not j.is_null()); - CHECK(not j.is_boolean()); - CHECK(not j.is_number()); - CHECK(not j.is_number_integer()); - CHECK(not j.is_number_unsigned()); - CHECK(not j.is_number_float()); - CHECK(not j.is_object()); - CHECK(j.is_array()); - CHECK(not j.is_string()); - CHECK(not j.is_discarded()); - CHECK(not j.is_primitive()); - CHECK(j.is_structured()); - } - - SECTION("null") - { - json j(nullptr); - CHECK(j.is_null()); - CHECK(not j.is_boolean()); - CHECK(not j.is_number()); - CHECK(not j.is_number_integer()); - CHECK(not j.is_number_unsigned()); - CHECK(not j.is_number_float()); - CHECK(not j.is_object()); - CHECK(not j.is_array()); - CHECK(not j.is_string()); - CHECK(not j.is_discarded()); - CHECK(j.is_primitive()); - CHECK(not j.is_structured()); - } - - SECTION("boolean") - { - json j(true); - CHECK(not j.is_null()); - CHECK(j.is_boolean()); - CHECK(not j.is_number()); - CHECK(not j.is_number_integer()); - CHECK(not j.is_number_unsigned()); - CHECK(not j.is_number_float()); - CHECK(not j.is_object()); - CHECK(not j.is_array()); - CHECK(not j.is_string()); - CHECK(not j.is_discarded()); - CHECK(j.is_primitive()); - CHECK(not j.is_structured()); - } - - SECTION("string") - { - json j("Hello world"); - CHECK(not j.is_null()); - CHECK(not j.is_boolean()); - CHECK(not j.is_number()); - CHECK(not j.is_number_integer()); - CHECK(not j.is_number_unsigned()); - CHECK(not j.is_number_float()); - CHECK(not j.is_object()); - CHECK(not j.is_array()); - CHECK(j.is_string()); - CHECK(not j.is_discarded()); - CHECK(j.is_primitive()); - CHECK(not j.is_structured()); - } - - SECTION("number (integer)") - { - json j(42); - CHECK(not j.is_null()); - CHECK(not j.is_boolean()); - CHECK(j.is_number()); - CHECK(j.is_number_integer()); - CHECK(not j.is_number_unsigned()); - CHECK(not j.is_number_float()); - CHECK(not j.is_object()); - CHECK(not j.is_array()); - CHECK(not j.is_string()); - CHECK(not j.is_discarded()); - CHECK(j.is_primitive()); - CHECK(not j.is_structured()); - } - - SECTION("number (unsigned)") - { - json j(42u); - CHECK(not j.is_null()); - CHECK(not j.is_boolean()); - CHECK(j.is_number()); - CHECK(j.is_number_integer()); - CHECK(j.is_number_unsigned()); - CHECK(not j.is_number_float()); - CHECK(not j.is_object()); - CHECK(not j.is_array()); - CHECK(not j.is_string()); - CHECK(not j.is_discarded()); - CHECK(j.is_primitive()); - CHECK(not j.is_structured()); - } - - SECTION("number (floating-point)") - { - json j(42.23); - CHECK(not j.is_null()); - CHECK(not j.is_boolean()); - CHECK(j.is_number()); - CHECK(not j.is_number_integer()); - CHECK(not j.is_number_unsigned()); - CHECK(j.is_number_float()); - CHECK(not j.is_object()); - CHECK(not j.is_array()); - CHECK(not j.is_string()); - CHECK(not j.is_discarded()); - CHECK(j.is_primitive()); - CHECK(not j.is_structured()); - } - - SECTION("discarded") - { - json j(json::value_t::discarded); - CHECK(not j.is_null()); - CHECK(not j.is_boolean()); - CHECK(not j.is_number()); - CHECK(not j.is_number_integer()); - CHECK(not j.is_number_unsigned()); - CHECK(not j.is_number_float()); - CHECK(not j.is_object()); - CHECK(not j.is_array()); - CHECK(not j.is_string()); - CHECK(j.is_discarded()); - CHECK(not j.is_primitive()); - CHECK(not j.is_structured()); - } - } - - SECTION("serialization") - { - json j {{"object", json::object()}, {"array", {1, 2, 3, 4}}, {"number", 42}, {"boolean", false}, {"null", nullptr}, {"string", "Hello world"} }; - - SECTION("no indent / indent=-1") - { - CHECK(j.dump() == - "{\"array\":[1,2,3,4],\"boolean\":false,\"null\":null,\"number\":42,\"object\":{},\"string\":\"Hello world\"}"); - - CHECK(j.dump() == j.dump(-1)); - } - - SECTION("indent=0") - { - CHECK(j.dump(0) == - "{\n\"array\": [\n1,\n2,\n3,\n4\n],\n\"boolean\": false,\n\"null\": null,\n\"number\": 42,\n\"object\": {},\n\"string\": \"Hello world\"\n}"); - } - - SECTION("indent=4") - { - CHECK(j.dump(4) == - "{\n \"array\": [\n 1,\n 2,\n 3,\n 4\n ],\n \"boolean\": false,\n \"null\": null,\n \"number\": 42,\n \"object\": {},\n \"string\": \"Hello world\"\n}"); - } - - SECTION("dump and floating-point numbers") - { - auto s = json(42.23).dump(); - CHECK(s.find("42.23") != std::string::npos); - } - - SECTION("dump and small floating-point numbers") - { - auto s = json(1.23456e-78).dump(); - CHECK(s.find("1.23456e-78") != std::string::npos); - } - - SECTION("dump and non-ASCII characters") - { - CHECK(json("ä").dump() == "\"ä\""); - CHECK(json("Ö").dump() == "\"Ö\""); - CHECK(json("❤️").dump() == "\"❤️\""); - } - - SECTION("serialization of discarded element") - { - json j_discarded(json::value_t::discarded); - CHECK(j_discarded.dump() == ""); - } - } - - SECTION("return the type of the object (explicit)") - { - SECTION("null") - { - json j = nullptr; - CHECK(j.type() == json::value_t::null); - } - - SECTION("object") - { - json j = {{"foo", "bar"}}; - CHECK(j.type() == json::value_t::object); - } - - SECTION("array") - { - json j = {1, 2, 3, 4}; - CHECK(j.type() == json::value_t::array); - } - - SECTION("boolean") - { - json j = true; - CHECK(j.type() == json::value_t::boolean); - } - - SECTION("string") - { - json j = "Hello world"; - CHECK(j.type() == json::value_t::string); - } - - SECTION("number (integer)") - { - json j = 23; - CHECK(j.type() == json::value_t::number_integer); - } - - SECTION("number (unsigned)") - { - json j = 23u; - CHECK(j.type() == json::value_t::number_unsigned); - } - - SECTION("number (floating-point)") - { - json j = 42.23; - CHECK(j.type() == json::value_t::number_float); - } - } - - SECTION("return the type of the object (implicit)") - { - SECTION("null") - { - json j = nullptr; - json::value_t t = j; - CHECK(t == j.type()); - } - - SECTION("object") - { - json j = {{"foo", "bar"}}; - json::value_t t = j; - CHECK(t == j.type()); - } - - SECTION("array") - { - json j = {1, 2, 3, 4}; - json::value_t t = j; - CHECK(t == j.type()); - } - - SECTION("boolean") - { - json j = true; - json::value_t t = j; - CHECK(t == j.type()); - } - - SECTION("string") - { - json j = "Hello world"; - json::value_t t = j; - CHECK(t == j.type()); - } - - SECTION("number (integer)") - { - json j = 23; - json::value_t t = j; - CHECK(t == j.type()); - } - - SECTION("number (unsigned)") - { - json j = 23u; - json::value_t t = j; - CHECK(t == j.type()); - } - - SECTION("number (floating-point)") - { - json j = 42.23; - json::value_t t = j; - CHECK(t == j.type()); - } - } -} - -TEST_CASE("value conversion") -{ - SECTION("get an object (explicit)") - { - json::object_t o_reference = {{"object", json::object()}, {"array", {1, 2, 3, 4}}, {"number", 42}, {"boolean", false}, {"null", nullptr}, {"string", "Hello world"} }; - json j(o_reference); - - SECTION("json::object_t") - { - json::object_t o = j.get(); - CHECK(json(o) == j); - } - - SECTION("std::map") - { - std::map o = j.get>(); - CHECK(json(o) == j); - } - - SECTION("std::multimap") - { - std::multimap o = j.get>(); - CHECK(json(o) == j); - } - - SECTION("std::unordered_map") - { - std::unordered_map o = j.get>(); - CHECK(json(o) == j); - } - - SECTION("std::unordered_multimap") - { - std::unordered_multimap o = - j.get>(); - CHECK(json(o) == j); - } - - SECTION("exception in case of a non-object type") - { - CHECK_THROWS_AS(json(json::value_t::null).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::array).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::string).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::boolean).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_integer).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_float).get(), std::logic_error); - - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "type must be object, but is null"); - CHECK_THROWS_WITH(json(json::value_t::array).get(), - "type must be object, but is array"); - CHECK_THROWS_WITH(json(json::value_t::string).get(), - "type must be object, but is string"); - CHECK_THROWS_WITH(json(json::value_t::boolean).get(), - "type must be object, but is boolean"); - CHECK_THROWS_WITH(json(json::value_t::number_integer).get(), - "type must be object, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_unsigned).get(), - "type must be object, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_float).get(), - "type must be object, but is number"); - } - } - - SECTION("get an object (implicit)") - { - json::object_t o_reference = {{"object", json::object()}, {"array", {1, 2, 3, 4}}, {"number", 42}, {"boolean", false}, {"null", nullptr}, {"string", "Hello world"} }; - json j(o_reference); - - SECTION("json::object_t") - { - json::object_t o = j; - CHECK(json(o) == j); - } - - SECTION("std::map") - { - std::map o = j; - CHECK(json(o) == j); - } - - SECTION("std::multimap") - { - std::multimap o = j; - CHECK(json(o) == j); - } - - SECTION("std::unordered_map") - { - std::unordered_map o = j; - CHECK(json(o) == j); - } - - SECTION("std::unordered_multimap") - { - std::unordered_multimap o = j; - CHECK(json(o) == j); - } - } - - SECTION("get an array (explicit)") - { - json::array_t a_reference {json(1), json(1u), json(2.2), json(false), json("string"), json()}; - json j(a_reference); - - SECTION("json::array_t") - { - json::array_t a = j.get(); - CHECK(json(a) == j); - } - - SECTION("std::list") - { - std::list a = j.get>(); - CHECK(json(a) == j); - } - - SECTION("std::forward_list") - { - std::forward_list a = j.get>(); - CHECK(json(a) == j); - } - - SECTION("std::vector") - { - std::vector a = j.get>(); - CHECK(json(a) == j); - } - - SECTION("std::deque") - { - std::deque a = j.get>(); - CHECK(json(a) == j); - } - - SECTION("exception in case of a non-array type") - { - CHECK_THROWS_AS(json(json::value_t::null).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::object).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::string).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::boolean).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_integer).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_float).get(), std::logic_error); - - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "type must be array, but is null"); - CHECK_THROWS_WITH(json(json::value_t::object).get(), - "type must be array, but is object"); - CHECK_THROWS_WITH(json(json::value_t::string).get(), - "type must be array, but is string"); - CHECK_THROWS_WITH(json(json::value_t::boolean).get(), - "type must be array, but is boolean"); - CHECK_THROWS_WITH(json(json::value_t::number_integer).get(), - "type must be array, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_unsigned).get(), - "type must be array, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_float).get(), - "type must be array, but is number"); - } - } - - SECTION("get an array (implicit)") - { - json::array_t a_reference {json(1), json(1u), json(2.2), json(false), json("string"), json()}; - json j(a_reference); - - SECTION("json::array_t") - { - json::array_t a = j; - CHECK(json(a) == j); - } - - SECTION("std::list") - { - std::list a = j; - CHECK(json(a) == j); - } - - SECTION("std::forward_list") - { - std::forward_list a = j; - CHECK(json(a) == j); - } - - SECTION("std::vector") - { - std::vector a = j; - CHECK(json(a) == j); - } - - SECTION("std::deque") - { - std::deque a = j; - CHECK(json(a) == j); - } - } - - SECTION("get a string (explicit)") - { - json::string_t s_reference {"Hello world"}; - json j(s_reference); - - SECTION("string_t") - { - json::string_t s = j.get(); - CHECK(json(s) == j); - } - - SECTION("std::string") - { - std::string s = j.get(); - CHECK(json(s) == j); - } - - SECTION("exception in case of a non-string type") - { - CHECK_THROWS_AS(json(json::value_t::null).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::object).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::array).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::boolean).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_integer).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_float).get(), std::logic_error); - - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "type must be string, but is null"); - CHECK_THROWS_WITH(json(json::value_t::object).get(), - "type must be string, but is object"); - CHECK_THROWS_WITH(json(json::value_t::array).get(), - "type must be string, but is array"); - CHECK_THROWS_WITH(json(json::value_t::boolean).get(), - "type must be string, but is boolean"); - CHECK_THROWS_WITH(json(json::value_t::number_integer).get(), - "type must be string, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_unsigned).get(), - "type must be string, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_float).get(), - "type must be string, but is number"); - } - } - - SECTION("get a string (implicit)") - { - json::string_t s_reference {"Hello world"}; - json j(s_reference); - - SECTION("string_t") - { - json::string_t s = j; - CHECK(json(s) == j); - } - - SECTION("std::string") - { - std::string s = j; - CHECK(json(s) == j); - } - } - - SECTION("get a boolean (explicit)") - { - json::boolean_t b_reference {true}; - json j(b_reference); - - SECTION("boolean_t") - { - json::boolean_t b = j.get(); - CHECK(json(b) == j); - } - - SECTION("bool") - { - bool b = j.get(); - CHECK(json(b) == j); - } - - SECTION("exception in case of a non-string type") - { - CHECK_THROWS_AS(json(json::value_t::null).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::object).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::array).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::string).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_integer).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::number_float).get(), std::logic_error); - - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "type must be boolean, but is null"); - CHECK_THROWS_WITH(json(json::value_t::object).get(), - "type must be boolean, but is object"); - CHECK_THROWS_WITH(json(json::value_t::array).get(), - "type must be boolean, but is array"); - CHECK_THROWS_WITH(json(json::value_t::string).get(), - "type must be boolean, but is string"); - CHECK_THROWS_WITH(json(json::value_t::number_integer).get(), - "type must be boolean, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_unsigned).get(), - "type must be boolean, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_float).get(), - "type must be boolean, but is number"); - } - } - - SECTION("get a boolean (implicit)") - { - json::boolean_t b_reference {true}; - json j(b_reference); - - SECTION("boolean_t") - { - json::boolean_t b = j; - CHECK(json(b) == j); - } - - SECTION("bool") - { - bool b = j; - CHECK(json(b) == j); - } - } - - SECTION("get an integer number (explicit)") - { - json::number_integer_t n_reference {42}; - json j(n_reference); - json::number_unsigned_t n_unsigned_reference {42u}; - json j_unsigned(n_unsigned_reference); - - SECTION("number_integer_t") - { - json::number_integer_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("number_unsigned_t") - { - json::number_unsigned_t n = j_unsigned.get(); - CHECK(json(n) == j_unsigned); - } - - SECTION("short") - { - short n = j.get(); - CHECK(json(n) == j); - } - - SECTION("unsigned short") - { - unsigned short n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int") - { - int n = j.get(); - CHECK(json(n) == j); - } - - SECTION("unsigned int") - { - unsigned int n = j.get(); - CHECK(json(n) == j); - } - - SECTION("long") - { - long n = j.get(); - CHECK(json(n) == j); - } - - SECTION("unsigned long") - { - unsigned long n = j.get(); - CHECK(json(n) == j); - } - - SECTION("long long") - { - long long n = j.get(); - CHECK(json(n) == j); - } - - SECTION("unsigned long long") - { - unsigned long long n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int8_t") - { - int8_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int16_t") - { - int16_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int32_t") - { - int32_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int64_t") - { - int64_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int8_fast_t") - { - int_fast8_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int16_fast_t") - { - int_fast16_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int32_fast_t") - { - int_fast32_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int64_fast_t") - { - int_fast64_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int8_least_t") - { - int_least8_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int16_least_t") - { - int_least16_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int32_least_t") - { - int_least32_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("int64_least_t") - { - int_least64_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint8_t") - { - uint8_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint16_t") - { - uint16_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint32_t") - { - uint32_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint64_t") - { - uint64_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint8_fast_t") - { - uint_fast8_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint16_fast_t") - { - uint_fast16_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint32_fast_t") - { - uint_fast32_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint64_fast_t") - { - uint_fast64_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint8_least_t") - { - uint_least8_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint16_least_t") - { - uint_least16_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint32_least_t") - { - uint_least32_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("uint64_least_t") - { - uint_least64_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("exception in case of a non-number type") - { - CHECK_THROWS_AS(json(json::value_t::null).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::object).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::array).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::string).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::boolean).get(), std::logic_error); - - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "type must be number, but is null"); - CHECK_THROWS_WITH(json(json::value_t::object).get(), - "type must be number, but is object"); - CHECK_THROWS_WITH(json(json::value_t::array).get(), - "type must be number, but is array"); - CHECK_THROWS_WITH(json(json::value_t::string).get(), - "type must be number, but is string"); - CHECK_THROWS_WITH(json(json::value_t::boolean).get(), - "type must be number, but is boolean"); - - CHECK_NOTHROW(json(json::value_t::number_float).get()); - CHECK_NOTHROW(json(json::value_t::number_float).get()); - } - } - - SECTION("get an integer number (implicit)") - { - json::number_integer_t n_reference {42}; - json j(n_reference); - json::number_unsigned_t n_unsigned_reference {42u}; - json j_unsigned(n_unsigned_reference); - - SECTION("number_integer_t") - { - json::number_integer_t n = j.get(); - CHECK(json(n) == j); - } - - SECTION("number_unsigned_t") - { - json::number_unsigned_t n = j_unsigned.get(); - CHECK(json(n) == j_unsigned); - } - - SECTION("short") - { - short n = j; - CHECK(json(n) == j); - } - - SECTION("unsigned short") - { - unsigned short n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("int") - { - int n = j; - CHECK(json(n) == j); - } - - SECTION("unsigned int") - { - unsigned int n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("long") - { - long n = j; - CHECK(json(n) == j); - } - - SECTION("unsigned long") - { - unsigned long n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("long long") - { - long long n = j; - CHECK(json(n) == j); - } - - SECTION("unsigned long long") - { - unsigned long long n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("int8_t") - { - int8_t n = j; - CHECK(json(n) == j); - } - - SECTION("int16_t") - { - int16_t n = j; - CHECK(json(n) == j); - } - - SECTION("int32_t") - { - int32_t n = j; - CHECK(json(n) == j); - } - - SECTION("int64_t") - { - int64_t n = j; - CHECK(json(n) == j); - } - - SECTION("int8_fast_t") - { - int_fast8_t n = j; - CHECK(json(n) == j); - } - - SECTION("int16_fast_t") - { - int_fast16_t n = j; - CHECK(json(n) == j); - } - - SECTION("int32_fast_t") - { - int_fast32_t n = j; - CHECK(json(n) == j); - } - - SECTION("int64_fast_t") - { - int_fast64_t n = j; - CHECK(json(n) == j); - } - - SECTION("int8_least_t") - { - int_least8_t n = j; - CHECK(json(n) == j); - } - - SECTION("int16_least_t") - { - int_least16_t n = j; - CHECK(json(n) == j); - } - - SECTION("int32_least_t") - { - int_least32_t n = j; - CHECK(json(n) == j); - } - - SECTION("int64_least_t") - { - int_least64_t n = j; - CHECK(json(n) == j); - } - - SECTION("uint8_t") - { - uint8_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint16_t") - { - uint16_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint32_t") - { - uint32_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint64_t") - { - uint64_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint8_fast_t") - { - uint_fast8_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint16_fast_t") - { - uint_fast16_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint32_fast_t") - { - uint_fast32_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint64_fast_t") - { - uint_fast64_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint8_least_t") - { - uint_least8_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint16_least_t") - { - uint_least16_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint32_least_t") - { - uint_least32_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - - SECTION("uint64_least_t") - { - uint_least64_t n = j_unsigned; - CHECK(json(n) == j_unsigned); - } - } - - SECTION("get a floating-point number (explicit)") - { - json::number_float_t n_reference {42.23}; - json j(n_reference); - - SECTION("number_float_t") - { - json::number_float_t n = j.get(); - CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float)); - } - - SECTION("float") - { - float n = j.get(); - CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float)); - } - - SECTION("double") - { - double n = j.get(); - CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float)); - } - - SECTION("exception in case of a non-string type") - { - CHECK_THROWS_AS(json(json::value_t::null).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::object).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::array).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::string).get(), std::logic_error); - CHECK_THROWS_AS(json(json::value_t::boolean).get(), std::logic_error); - - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "type must be number, but is null"); - CHECK_THROWS_WITH(json(json::value_t::object).get(), - "type must be number, but is object"); - CHECK_THROWS_WITH(json(json::value_t::array).get(), - "type must be number, but is array"); - CHECK_THROWS_WITH(json(json::value_t::string).get(), - "type must be number, but is string"); - CHECK_THROWS_WITH(json(json::value_t::boolean).get(), - "type must be number, but is boolean"); - - CHECK_NOTHROW(json(json::value_t::number_integer).get()); - CHECK_NOTHROW(json(json::value_t::number_unsigned).get()); - } - } - - SECTION("get a floating-point number (implicit)") - { - json::number_float_t n_reference {42.23}; - json j(n_reference); - - SECTION("number_float_t") - { - json::number_float_t n = j; - CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float)); - } - - SECTION("float") - { - float n = j; - CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float)); - } - - SECTION("double") - { - double n = j; - CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float)); - } - } - - SECTION("more involved conversions") - { - SECTION("object-like STL containers") - { - json j1 = {{"one", 1}, {"two", 2}, {"three", 3}}; - json j2 = {{"one", 1u}, {"two", 2u}, {"three", 3u}}; - json j3 = {{"one", 1.1}, {"two", 2.2}, {"three", 3.3}}; - json j4 = {{"one", true}, {"two", false}, {"three", true}}; - json j5 = {{"one", "eins"}, {"two", "zwei"}, {"three", "drei"}}; - - SECTION("std::map") - { - auto m1 = j1.get>(); - auto m2 = j2.get>(); - auto m3 = j3.get>(); - auto m4 = j4.get>(); - //auto m5 = j5.get>(); - } - - SECTION("std::unordered_map") - { - auto m1 = j1.get>(); - auto m2 = j2.get>(); - auto m3 = j3.get>(); - auto m4 = j4.get>(); - //auto m5 = j5.get>(); - //CHECK(m5["one"] == "eins"); - } - - SECTION("std::multimap") - { - auto m1 = j1.get>(); - auto m2 = j2.get>(); - auto m3 = j3.get>(); - auto m4 = j4.get>(); - //auto m5 = j5.get>(); - //CHECK(m5["one"] == "eins"); - } - - SECTION("std::unordered_multimap") - { - auto m1 = j1.get>(); - auto m2 = j2.get>(); - auto m3 = j3.get>(); - auto m4 = j4.get>(); - //auto m5 = j5.get>(); - //CHECK(m5["one"] == "eins"); - } - - SECTION("exception in case of a non-object type") - { - CHECK_THROWS_AS((json().get>()), std::logic_error); - CHECK_THROWS_WITH((json().get>()), "type must be object, but is null"); - } - } - - SECTION("array-like STL containers") - { - json j1 = {1, 2, 3, 4}; - json j2 = {1u, 2u, 3u, 4u}; - json j3 = {1.2, 2.3, 3.4, 4.5}; - json j4 = {true, false, true}; - json j5 = {"one", "two", "three"}; - - SECTION("std::list") - { - auto m1 = j1.get>(); - auto m2 = j2.get>(); - auto m3 = j3.get>(); - auto m4 = j4.get>(); - auto m5 = j5.get>(); - } - - //SECTION("std::forward_list") - //{ - // auto m1 = j1.get>(); - // auto m2 = j2.get>(); - // auto m3 = j3.get>(); - // auto m4 = j4.get>(); - // auto m5 = j5.get>(); - //} - - SECTION("std::vector") - { - auto m1 = j1.get>(); - auto m2 = j2.get>(); - auto m3 = j3.get>(); - auto m4 = j4.get>(); - auto m5 = j5.get>(); - } - - SECTION("std::deque") - { - auto m1 = j1.get>(); - auto m2 = j2.get>(); - auto m3 = j2.get>(); - auto m4 = j4.get>(); - auto m5 = j5.get>(); - } - - SECTION("std::set") - { - auto m1 = j1.get>(); - auto m2 = j2.get>(); - auto m3 = j3.get>(); - auto m4 = j4.get>(); - auto m5 = j5.get>(); - } - - SECTION("std::unordered_set") - { - auto m1 = j1.get>(); - auto m2 = j2.get>(); - auto m3 = j3.get>(); - auto m4 = j4.get>(); - auto m5 = j5.get>(); - } - - SECTION("exception in case of a non-object type") - { - CHECK_THROWS_AS((json().get>()), std::logic_error); - CHECK_THROWS_AS((json().get>()), std::logic_error); - CHECK_THROWS_AS((json().get>()), std::logic_error); - CHECK_THROWS_AS((json().get>()), std::logic_error); - - CHECK_THROWS_WITH((json().get>()), "type must be array, but is null"); - CHECK_THROWS_WITH((json().get>()), "type must be array, but is null"); - CHECK_THROWS_WITH((json().get>()), "type must be array, but is null"); - CHECK_THROWS_WITH((json().get>()), "type must be array, but is null"); - } - } - } -} - -TEST_CASE("pointer access") -{ - // create a JSON value with different types - json json_types = - { - {"boolean", true}, - { - "number", { - {"integer", 42}, - {"unsigned", 42u}, - {"floating-point", 17.23} - } - }, - {"string", "Hello, world!"}, - {"array", {1, 2, 3, 4, 5}}, - {"null", nullptr} - }; - - SECTION("pointer access to object_t") - { - using test_type = json::object_t; - json value = {{"one", 1}, {"two", 2}}; - - // check if pointers are returned correctly - test_type* p1 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p1 == value.get()); - - const test_type* p2 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p2 == value.get()); - - const test_type* const p3 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p3 == value.get()); - - // check if null pointers are returned correctly - CHECK(value.get_ptr() != nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - } - - SECTION("pointer access to const object_t") - { - using test_type = json::object_t; - const json value = {{"one", 1}, {"two", 2}}; - - // this should not compile - // test_type* p1 = value.get_ptr(); - - // check if pointers are returned correctly - const test_type* p2 = value.get_ptr(); - CHECK(*p2 == value.get()); - - const test_type* const p3 = value.get_ptr(); - CHECK(p2 == p3); - } - - SECTION("pointer access to array_t") - { - using test_type = json::array_t; - json value = {1, 2, 3, 4}; - - // check if pointers are returned correctly - test_type* p1 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p1 == value.get()); - - const test_type* p2 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p2 == value.get()); - - const test_type* const p3 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p3 == value.get()); - - // check if null pointers are returned correctly - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() != nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - } - - SECTION("pointer access to string_t") - { - using test_type = json::string_t; - json value = "hello"; - - // check if pointers are returned correctly - test_type* p1 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p1 == value.get()); - - const test_type* p2 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p2 == value.get()); - - const test_type* const p3 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p3 == value.get()); - - // check if null pointers are returned correctly - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() != nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - } - - SECTION("pointer access to boolean_t") - { - using test_type = json::boolean_t; - json value = false; - - // check if pointers are returned correctly - test_type* p1 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p1 == value.get()); - - const test_type* p2 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p2 == value.get()); - - const test_type* const p3 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p3 == value.get()); - - // check if null pointers are returned correctly - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() != nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - } - - SECTION("pointer access to number_integer_t") - { - using test_type = json::number_integer_t; - json value = 23; - - // check if pointers are returned correctly - test_type* p1 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p1 == value.get()); - - const test_type* p2 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p2 == value.get()); - - const test_type* const p3 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p3 == value.get()); - - // check if null pointers are returned correctly - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() != nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - } - - SECTION("pointer access to number_unsigned_t") - { - using test_type = json::number_unsigned_t; - json value = 23u; - - // check if pointers are returned correctly - test_type* p1 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p1 == value.get()); - - const test_type* p2 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p2 == value.get()); - - const test_type* const p3 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p3 == value.get()); - - // check if null pointers are returned correctly - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() != nullptr); - CHECK(value.get_ptr() != nullptr); - CHECK(value.get_ptr() == nullptr); - } - - SECTION("pointer access to number_float_t") - { - using test_type = json::number_float_t; - json value = 42.23; - - // check if pointers are returned correctly - test_type* p1 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p1 == Approx(value.get())); - - const test_type* p2 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p2 == Approx(value.get())); - - const test_type* const p3 = value.get_ptr(); - CHECK(p1 == value.get_ptr()); - CHECK(*p3 == Approx(value.get())); - - // check if null pointers are returned correctly - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() == nullptr); - CHECK(value.get_ptr() != nullptr); - } -} - -TEST_CASE("reference access") -{ - // create a JSON value with different types - json json_types = - { - {"boolean", true}, - { - "number", { - {"integer", 42}, - {"floating-point", 17.23} - } - }, - {"string", "Hello, world!"}, - {"array", {1, 2, 3, 4, 5}}, - {"null", nullptr} - }; - - SECTION("reference access to object_t") - { - using test_type = json::object_t; - json value = {{"one", 1}, {"two", 2}}; - - // check if references are returned correctly - test_type& p1 = value.get_ref(); - CHECK(&p1 == value.get_ptr()); - CHECK(p1 == value.get()); - - const test_type& p2 = value.get_ref(); - CHECK(&p2 == value.get_ptr()); - CHECK(p2 == value.get()); - - // check if mismatching references throw correctly - CHECK_NOTHROW(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - } - - SECTION("const reference access to const object_t") - { - using test_type = json::object_t; - const json value = {{"one", 1}, {"two", 2}}; - - // this should not compile - // test_type& p1 = value.get_ref(); - - // check if references are returned correctly - const test_type& p2 = value.get_ref(); - CHECK(&p2 == value.get_ptr()); - CHECK(p2 == value.get()); - } - - SECTION("reference access to array_t") - { - using test_type = json::array_t; - json value = {1, 2, 3, 4}; - - // check if references are returned correctly - test_type& p1 = value.get_ref(); - CHECK(&p1 == value.get_ptr()); - CHECK(p1 == value.get()); - - const test_type& p2 = value.get_ref(); - CHECK(&p2 == value.get_ptr()); - CHECK(p2 == value.get()); - - // check if mismatching references throw correctly - CHECK_THROWS(value.get_ref()); - CHECK_NOTHROW(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - } - - SECTION("reference access to string_t") - { - using test_type = json::string_t; - json value = "hello"; - - // check if references are returned correctly - test_type& p1 = value.get_ref(); - CHECK(&p1 == value.get_ptr()); - CHECK(p1 == value.get()); - - const test_type& p2 = value.get_ref(); - CHECK(&p2 == value.get_ptr()); - CHECK(p2 == value.get()); - - // check if mismatching references throw correctly - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_NOTHROW(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - } - - SECTION("reference access to boolean_t") - { - using test_type = json::boolean_t; - json value = false; - - // check if references are returned correctly - test_type& p1 = value.get_ref(); - CHECK(&p1 == value.get_ptr()); - CHECK(p1 == value.get()); - - const test_type& p2 = value.get_ref(); - CHECK(&p2 == value.get_ptr()); - CHECK(p2 == value.get()); - - // check if mismatching references throw correctly - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_NOTHROW(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - } - - SECTION("reference access to number_integer_t") - { - using test_type = json::number_integer_t; - json value = 23; - - // check if references are returned correctly - test_type& p1 = value.get_ref(); - CHECK(&p1 == value.get_ptr()); - CHECK(p1 == value.get()); - - const test_type& p2 = value.get_ref(); - CHECK(&p2 == value.get_ptr()); - CHECK(p2 == value.get()); - - // check if mismatching references throw correctly - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_NOTHROW(value.get_ref()); - CHECK_THROWS(value.get_ref()); - } - - SECTION("reference access to number_float_t") - { - using test_type = json::number_float_t; - json value = 42.23; - - // check if references are returned correctly - test_type& p1 = value.get_ref(); - CHECK(&p1 == value.get_ptr()); - CHECK(p1 == value.get()); - - const test_type& p2 = value.get_ref(); - CHECK(&p2 == value.get_ptr()); - CHECK(p2 == value.get()); - - // check if mismatching references throw correctly - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_THROWS(value.get_ref()); - CHECK_NOTHROW(value.get_ref()); - } -} - -TEST_CASE("element access") -{ - SECTION("array") - { - json j = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - const json j_const = j; - - SECTION("access specified element with bounds checking") - { - SECTION("access within bounds") - { - CHECK(j.at(0) == json(1)); - CHECK(j.at(1) == json(1u)); - CHECK(j.at(2) == json(true)); - CHECK(j.at(3) == json(nullptr)); - CHECK(j.at(4) == json("string")); - CHECK(j.at(5) == json(42.23)); - CHECK(j.at(6) == json(json::object())); - CHECK(j.at(7) == json({1, 2, 3})); - - CHECK(j_const.at(0) == json(1)); - CHECK(j_const.at(1) == json(1u)); - CHECK(j_const.at(2) == json(true)); - CHECK(j_const.at(3) == json(nullptr)); - CHECK(j_const.at(4) == json("string")); - CHECK(j_const.at(5) == json(42.23)); - CHECK(j_const.at(6) == json(json::object())); - CHECK(j_const.at(7) == json({1, 2, 3})); - } - - SECTION("access outside bounds") - { - CHECK_THROWS_AS(j.at(8), std::out_of_range); - CHECK_THROWS_AS(j_const.at(8), std::out_of_range); - - CHECK_THROWS_WITH(j.at(8), "array index 8 is out of range"); - CHECK_THROWS_WITH(j_const.at(8), "array index 8 is out of range"); - } - - SECTION("access on non-array type") - { - SECTION("null") - { - json j_nonarray(json::value_t::null); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error); - CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error); - - CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with null"); - CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with null"); - } - - SECTION("boolean") - { - json j_nonarray(json::value_t::boolean); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error); - CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error); - - CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with boolean"); - CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with boolean"); - } - - SECTION("string") - { - json j_nonarray(json::value_t::string); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error); - CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error); - - CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with string"); - CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with string"); - } - - SECTION("object") - { - json j_nonarray(json::value_t::object); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error); - CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error); - - CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with object"); - CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with object"); - } - - SECTION("number (integer)") - { - json j_nonarray(json::value_t::number_integer); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error); - CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error); - - CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with number"); - CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with number"); - } - - SECTION("number (unsigned)") - { - json j_nonarray(json::value_t::number_unsigned); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error); - CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error); - - CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with number"); - CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with number"); - } - - SECTION("number (floating-point)") - { - json j_nonarray(json::value_t::number_float); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error); - CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error); - - CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with number"); - CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with number"); - } - } - } - - SECTION("front and back") - { - CHECK(j.front() == json(1)); - CHECK(j_const.front() == json(1)); - CHECK(j.back() == json({1, 2, 3})); - CHECK(j_const.back() == json({1, 2, 3})); - } - - SECTION("access specified element") - { - SECTION("access within bounds") - { - CHECK(j[0] == json(1)); - CHECK(j[1] == json(1u)); - CHECK(j[2] == json(true)); - CHECK(j[3] == json(nullptr)); - CHECK(j[4] == json("string")); - CHECK(j[5] == json(42.23)); - CHECK(j[6] == json(json::object())); - CHECK(j[7] == json({1, 2, 3})); - - CHECK(j_const[0] == json(1)); - CHECK(j_const[1] == json(1u)); - CHECK(j_const[2] == json(true)); - CHECK(j_const[3] == json(nullptr)); - CHECK(j_const[4] == json("string")); - CHECK(j_const[5] == json(42.23)); - CHECK(j_const[6] == json(json::object())); - CHECK(j_const[7] == json({1, 2, 3})); - } - - SECTION("access on non-array type") - { - SECTION("null") - { - SECTION("standard tests") - { - json j_nonarray(json::value_t::null); - const json j_nonarray_const(j_nonarray); - CHECK_NOTHROW(j_nonarray[0]); - CHECK_THROWS_AS(j_nonarray_const[0], std::domain_error); - CHECK_THROWS_WITH(j_nonarray_const[0], "cannot use operator[] with null"); - } - - SECTION("implicit transformation to properly filled array") - { - json j_nonarray; - j_nonarray[3] = 42; - CHECK(j_nonarray == json({nullptr, nullptr, nullptr, 42})); - } - } - - SECTION("boolean") - { - json j_nonarray(json::value_t::boolean); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray[0], std::domain_error); - CHECK_THROWS_AS(j_nonarray_const[0], std::domain_error); - CHECK_THROWS_WITH(j_nonarray[0], "cannot use operator[] with boolean"); - CHECK_THROWS_WITH(j_nonarray_const[0], "cannot use operator[] with boolean"); - } - - SECTION("string") - { - json j_nonarray(json::value_t::string); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray[0], std::domain_error); - CHECK_THROWS_AS(j_nonarray_const[0], std::domain_error); - CHECK_THROWS_WITH(j_nonarray[0], "cannot use operator[] with string"); - CHECK_THROWS_WITH(j_nonarray_const[0], "cannot use operator[] with string"); - } - - SECTION("object") - { - json j_nonarray(json::value_t::object); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray[0], std::domain_error); - CHECK_THROWS_AS(j_nonarray_const[0], std::domain_error); - CHECK_THROWS_WITH(j_nonarray[0], "cannot use operator[] with object"); - CHECK_THROWS_WITH(j_nonarray_const[0], "cannot use operator[] with object"); - } - - SECTION("number (integer)") - { - json j_nonarray(json::value_t::number_integer); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray[0], std::domain_error); - CHECK_THROWS_AS(j_nonarray_const[0], std::domain_error); - CHECK_THROWS_WITH(j_nonarray[0], "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_nonarray_const[0], "cannot use operator[] with number"); - } - - SECTION("number (unsigned)") - { - json j_nonarray(json::value_t::number_unsigned); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray[0], std::domain_error); - CHECK_THROWS_AS(j_nonarray_const[0], std::domain_error); - CHECK_THROWS_WITH(j_nonarray[0], "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_nonarray_const[0], "cannot use operator[] with number"); - } - - SECTION("number (floating-point)") - { - json j_nonarray(json::value_t::number_float); - const json j_nonarray_const(j_nonarray); - CHECK_THROWS_AS(j_nonarray[0], std::domain_error); - CHECK_THROWS_AS(j_nonarray_const[0], std::domain_error); - CHECK_THROWS_WITH(j_nonarray[0], "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_nonarray_const[0], "cannot use operator[] with number"); - } - } - } - - SECTION("remove specified element") - { - SECTION("remove element by index") - { - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - jarray.erase(0); - CHECK(jarray == json({1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}})); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - jarray.erase(1); - CHECK(jarray == json({1, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}})); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - jarray.erase(2); - CHECK(jarray == json({1, 1u, nullptr, "string", 42.23, json::object(), {1, 2, 3}})); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - jarray.erase(3); - CHECK(jarray == json({1, 1u, true, "string", 42.23, json::object(), {1, 2, 3}})); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - jarray.erase(4); - CHECK(jarray == json({1, 1u, true, nullptr, 42.23, json::object(), {1, 2, 3}})); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - jarray.erase(5); - CHECK(jarray == json({1, 1u, true, nullptr, "string", json::object(), {1, 2, 3}})); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - jarray.erase(6); - CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, {1, 2, 3}})); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - jarray.erase(7); - CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, json::object()})); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - CHECK_THROWS_AS(jarray.erase(8), std::out_of_range); - CHECK_THROWS_WITH(jarray.erase(8), "array index 8 is out of range"); - } - } - - SECTION("remove element by iterator") - { - SECTION("erase(begin())") - { - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json::iterator it2 = jarray.erase(jarray.begin()); - CHECK(jarray == json({1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}})); - CHECK(*it2 == json(1u)); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json::const_iterator it2 = jarray.erase(jarray.cbegin()); - CHECK(jarray == json({1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}})); - CHECK(*it2 == json(1u)); - } - } - - SECTION("erase(begin(), end())") - { - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json::iterator it2 = jarray.erase(jarray.begin(), jarray.end()); - CHECK(jarray == json::array()); - CHECK(it2 == jarray.end()); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json::const_iterator it2 = jarray.erase(jarray.cbegin(), jarray.cend()); - CHECK(jarray == json::array()); - CHECK(it2 == jarray.cend()); - } - } - - SECTION("erase(begin(), begin())") - { - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json::iterator it2 = jarray.erase(jarray.begin(), jarray.begin()); - CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}})); - CHECK(*it2 == json(1)); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json::const_iterator it2 = jarray.erase(jarray.cbegin(), jarray.cbegin()); - CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}})); - CHECK(*it2 == json(1)); - } - } - - SECTION("erase at offset") - { - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json::iterator it = jarray.begin() + 4; - json::iterator it2 = jarray.erase(it); - CHECK(jarray == json({1, 1u, true, nullptr, 42.23, json::object(), {1, 2, 3}})); - CHECK(*it2 == json(42.23)); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json::const_iterator it = jarray.cbegin() + 4; - json::const_iterator it2 = jarray.erase(it); - CHECK(jarray == json({1, 1u, true, nullptr, 42.23, json::object(), {1, 2, 3}})); - CHECK(*it2 == json(42.23)); - } - } - - SECTION("erase subrange") - { - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json::iterator it2 = jarray.erase(jarray.begin() + 3, jarray.begin() + 6); - CHECK(jarray == json({1, 1u, true, json::object(), {1, 2, 3}})); - CHECK(*it2 == json::object()); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json::const_iterator it2 = jarray.erase(jarray.cbegin() + 3, jarray.cbegin() + 6); - CHECK(jarray == json({1, 1u, true, json::object(), {1, 2, 3}})); - CHECK(*it2 == json::object()); - } - } - - SECTION("different arrays") - { - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json jarray2 = {"foo", "bar"}; - CHECK_THROWS_AS(jarray.erase(jarray2.begin()), std::domain_error); - CHECK_THROWS_AS(jarray.erase(jarray.begin(), jarray2.end()), std::domain_error); - CHECK_THROWS_AS(jarray.erase(jarray2.begin(), jarray.end()), std::domain_error); - CHECK_THROWS_AS(jarray.erase(jarray2.begin(), jarray2.end()), std::domain_error); - - CHECK_THROWS_WITH(jarray.erase(jarray2.begin()), "iterator does not fit current value"); - CHECK_THROWS_WITH(jarray.erase(jarray.begin(), jarray2.end()), - "iterators do not fit current value"); - CHECK_THROWS_WITH(jarray.erase(jarray2.begin(), jarray.end()), - "iterators do not fit current value"); - CHECK_THROWS_WITH(jarray.erase(jarray2.begin(), jarray2.end()), - "iterators do not fit current value"); - } - { - json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; - json jarray2 = {"foo", "bar"}; - CHECK_THROWS_AS(jarray.erase(jarray2.cbegin()), std::domain_error); - CHECK_THROWS_AS(jarray.erase(jarray.cbegin(), jarray2.cend()), std::domain_error); - CHECK_THROWS_AS(jarray.erase(jarray2.cbegin(), jarray.cend()), std::domain_error); - CHECK_THROWS_AS(jarray.erase(jarray2.cbegin(), jarray2.cend()), std::domain_error); - - CHECK_THROWS_WITH(jarray.erase(jarray2.cbegin()), "iterator does not fit current value"); - CHECK_THROWS_WITH(jarray.erase(jarray.cbegin(), jarray2.cend()), - "iterators do not fit current value"); - CHECK_THROWS_WITH(jarray.erase(jarray2.cbegin(), jarray.cend()), - "iterators do not fit current value"); - CHECK_THROWS_WITH(jarray.erase(jarray2.cbegin(), jarray2.cend()), - "iterators do not fit current value"); - } - } - } - - SECTION("remove element by index in non-array type") - { - SECTION("null") - { - json j_nonobject(json::value_t::null); - CHECK_THROWS_AS(j_nonobject.erase(0), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase(0), "cannot use erase() with null"); - } - - SECTION("boolean") - { - json j_nonobject(json::value_t::boolean); - CHECK_THROWS_AS(j_nonobject.erase(0), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase(0), "cannot use erase() with boolean"); - } - - SECTION("string") - { - json j_nonobject(json::value_t::string); - CHECK_THROWS_AS(j_nonobject.erase(0), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase(0), "cannot use erase() with string"); - } - - SECTION("object") - { - json j_nonobject(json::value_t::object); - CHECK_THROWS_AS(j_nonobject.erase(0), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase(0), "cannot use erase() with object"); - } - - SECTION("number (integer)") - { - json j_nonobject(json::value_t::number_integer); - CHECK_THROWS_AS(j_nonobject.erase(0), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase(0), "cannot use erase() with number"); - } - - SECTION("number (unsigned)") - { - json j_nonobject(json::value_t::number_unsigned); - CHECK_THROWS_AS(j_nonobject.erase(0), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase(0), "cannot use erase() with number"); - } - - SECTION("number (floating-point)") - { - json j_nonobject(json::value_t::number_float); - CHECK_THROWS_AS(j_nonobject.erase(0), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase(0), "cannot use erase() with number"); - } - } - } - } - - SECTION("object") - { - json j = {{"integer", 1}, {"unsigned", 1u}, {"floating", 42.23}, {"null", nullptr}, {"string", "hello world"}, {"boolean", true}, {"object", json::object()}, {"array", {1, 2, 3}}}; - const json j_const = j; - - SECTION("access specified element with bounds checking") - { - SECTION("access within bounds") - { - CHECK(j.at("integer") == json(1)); - CHECK(j.at("unsigned") == json(1u)); - CHECK(j.at("boolean") == json(true)); - CHECK(j.at("null") == json(nullptr)); - CHECK(j.at("string") == json("hello world")); - CHECK(j.at("floating") == json(42.23)); - CHECK(j.at("object") == json(json::object())); - CHECK(j.at("array") == json({1, 2, 3})); - - CHECK(j_const.at("integer") == json(1)); - CHECK(j_const.at("unsigned") == json(1u)); - CHECK(j_const.at("boolean") == json(true)); - CHECK(j_const.at("null") == json(nullptr)); - CHECK(j_const.at("string") == json("hello world")); - CHECK(j_const.at("floating") == json(42.23)); - CHECK(j_const.at("object") == json(json::object())); - CHECK(j_const.at("array") == json({1, 2, 3})); - } - - SECTION("access outside bounds") - { - CHECK_THROWS_AS(j.at("foo"), std::out_of_range); - CHECK_THROWS_AS(j_const.at("foo"), std::out_of_range); - CHECK_THROWS_WITH(j.at("foo"), "key 'foo' not found"); - CHECK_THROWS_WITH(j_const.at("foo"), "key 'foo' not found"); - } - - SECTION("access on non-object type") - { - SECTION("null") - { - json j_nonobject(json::value_t::null); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with null"); - CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with null"); - } - - SECTION("boolean") - { - json j_nonobject(json::value_t::boolean); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with boolean"); - CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with boolean"); - } - - SECTION("string") - { - json j_nonobject(json::value_t::string); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with string"); - CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with string"); - } - - SECTION("array") - { - json j_nonobject(json::value_t::array); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with array"); - CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with array"); - } - - SECTION("number (integer)") - { - json j_nonobject(json::value_t::number_integer); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with number"); - CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with number"); - } - - SECTION("number (unsigned)") - { - json j_nonobject(json::value_t::number_unsigned); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with number"); - CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with number"); - } - - SECTION("number (floating-point)") - { - json j_nonobject(json::value_t::number_float); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with number"); - CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with number"); - } - } - } - - SECTION("access specified element with default value") - { - SECTION("access existing value") - { - CHECK(j.value("integer", 2) == 1); - CHECK(j.value("integer", 1.0) == Approx(1)); - CHECK(j.value("unsigned", 2) == 1u); - CHECK(j.value("unsigned", 1.0) == Approx(1u)); - CHECK(j.value("null", json(1)) == json()); - CHECK(j.value("boolean", false) == true); - CHECK(j.value("string", "bar") == "hello world"); - CHECK(j.value("string", std::string("bar")) == "hello world"); - CHECK(j.value("floating", 12.34) == Approx(42.23)); - CHECK(j.value("floating", 12) == 42); - CHECK(j.value("object", json({{"foo", "bar"}})) == json(json::object())); - CHECK(j.value("array", json({10, 100})) == json({1, 2, 3})); - - CHECK(j_const.value("integer", 2) == 1); - CHECK(j_const.value("integer", 1.0) == Approx(1)); - CHECK(j_const.value("unsigned", 2) == 1u); - CHECK(j_const.value("unsigned", 1.0) == Approx(1u)); - CHECK(j_const.value("boolean", false) == true); - CHECK(j_const.value("string", "bar") == "hello world"); - CHECK(j_const.value("string", std::string("bar")) == "hello world"); - CHECK(j_const.value("floating", 12.34) == Approx(42.23)); - CHECK(j_const.value("floating", 12) == 42); - CHECK(j_const.value("object", json({{"foo", "bar"}})) == json(json::object())); - CHECK(j_const.value("array", json({10, 100})) == json({1, 2, 3})); - } - - SECTION("access non-existing value") - { - CHECK(j.value("_", 2) == 2); - CHECK(j.value("_", 2u) == 2u); - CHECK(j.value("_", false) == false); - CHECK(j.value("_", "bar") == "bar"); - CHECK(j.value("_", 12.34) == Approx(12.34)); - CHECK(j.value("_", json({{"foo", "bar"}})) == json({{"foo", "bar"}})); - CHECK(j.value("_", json({10, 100})) == json({10, 100})); - - CHECK(j_const.value("_", 2) == 2); - CHECK(j_const.value("_", 2u) == 2u); - CHECK(j_const.value("_", false) == false); - CHECK(j_const.value("_", "bar") == "bar"); - CHECK(j_const.value("_", 12.34) == Approx(12.34)); - CHECK(j_const.value("_", json({{"foo", "bar"}})) == json({{"foo", "bar"}})); - CHECK(j_const.value("_", json({10, 100})) == json({10, 100})); - } - - SECTION("access on non-object type") - { - SECTION("null") - { - json j_nonobject(json::value_t::null); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.value("foo", 1), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.value("foo", 1), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.value("foo", 1), "cannot use value() with null"); - CHECK_THROWS_WITH(j_nonobject_const.value("foo", 1), "cannot use value() with null"); - } - - SECTION("boolean") - { - json j_nonobject(json::value_t::boolean); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.value("foo", 1), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.value("foo", 1), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.value("foo", 1), "cannot use value() with boolean"); - CHECK_THROWS_WITH(j_nonobject_const.value("foo", 1), "cannot use value() with boolean"); - } - - SECTION("string") - { - json j_nonobject(json::value_t::string); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.value("foo", 1), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.value("foo", 1), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.value("foo", 1), "cannot use value() with string"); - CHECK_THROWS_WITH(j_nonobject_const.value("foo", 1), "cannot use value() with string"); - } - - SECTION("array") - { - json j_nonobject(json::value_t::array); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.value("foo", 1), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.value("foo", 1), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.value("foo", 1), "cannot use value() with array"); - CHECK_THROWS_WITH(j_nonobject_const.value("foo", 1), "cannot use value() with array"); - } - - SECTION("number (integer)") - { - json j_nonobject(json::value_t::number_integer); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.value("foo", 1), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.value("foo", 1), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.value("foo", 1), "cannot use value() with number"); - CHECK_THROWS_WITH(j_nonobject_const.value("foo", 1), "cannot use value() with number"); - } - - SECTION("number (unsigned)") - { - json j_nonobject(json::value_t::number_unsigned); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.value("foo", 1), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.value("foo", 1), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.value("foo", 1), "cannot use value() with number"); - CHECK_THROWS_WITH(j_nonobject_const.value("foo", 1), "cannot use value() with number"); - } - - SECTION("number (floating-point)") - { - json j_nonobject(json::value_t::number_float); - const json j_nonobject_const(j_nonobject); - CHECK_THROWS_AS(j_nonobject.value("foo", 1), std::domain_error); - CHECK_THROWS_AS(j_nonobject_const.value("foo", 1), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.value("foo", 1), "cannot use value() with number"); - CHECK_THROWS_WITH(j_nonobject_const.value("foo", 1), "cannot use value() with number"); - } - } - } - - SECTION("front and back") - { - // "array" is the smallest key - CHECK(j.front() == json({1, 2, 3})); - CHECK(j_const.front() == json({1, 2, 3})); - // "unsigned" is the largest key - CHECK(j.back() == json(1u)); - CHECK(j_const.back() == json(1u)); - } - - SECTION("access specified element") - { - SECTION("access within bounds") - { - CHECK(j["integer"] == json(1)); - CHECK(j[json::object_t::key_type("integer")] == j["integer"]); - - CHECK(j["unsigned"] == json(1u)); - CHECK(j[json::object_t::key_type("unsigned")] == j["unsigned"]); - - CHECK(j["boolean"] == json(true)); - CHECK(j[json::object_t::key_type("boolean")] == j["boolean"]); - - CHECK(j["null"] == json(nullptr)); - CHECK(j[json::object_t::key_type("null")] == j["null"]); - - CHECK(j["string"] == json("hello world")); - CHECK(j[json::object_t::key_type("string")] == j["string"]); - - CHECK(j["floating"] == json(42.23)); - CHECK(j[json::object_t::key_type("floating")] == j["floating"]); - - CHECK(j["object"] == json(json::object())); - CHECK(j[json::object_t::key_type("object")] == j["object"]); - - CHECK(j["array"] == json({1, 2, 3})); - CHECK(j[json::object_t::key_type("array")] == j["array"]); - - CHECK(j_const["integer"] == json(1)); - CHECK(j_const[json::object_t::key_type("integer")] == j["integer"]); - - CHECK(j_const["boolean"] == json(true)); - CHECK(j_const[json::object_t::key_type("boolean")] == j["boolean"]); - - CHECK(j_const["null"] == json(nullptr)); - CHECK(j_const[json::object_t::key_type("null")] == j["null"]); - - CHECK(j_const["string"] == json("hello world")); - CHECK(j_const[json::object_t::key_type("string")] == j["string"]); - - CHECK(j_const["floating"] == json(42.23)); - CHECK(j_const[json::object_t::key_type("floating")] == j["floating"]); - - CHECK(j_const["object"] == json(json::object())); - CHECK(j_const[json::object_t::key_type("object")] == j["object"]); - - CHECK(j_const["array"] == json({1, 2, 3})); - CHECK(j_const[json::object_t::key_type("array")] == j["array"]); - } - - SECTION("access on non-object type") - { - SECTION("null") - { - json j_nonobject(json::value_t::null); - json j_nonobject2(json::value_t::null); - const json j_const_nonobject(j_nonobject); - CHECK_NOTHROW(j_nonobject["foo"]); - CHECK_NOTHROW(j_nonobject2[json::object_t::key_type("foo")]); - CHECK_THROWS_AS(j_const_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_WITH(j_const_nonobject["foo"], "cannot use operator[] with null"); - CHECK_THROWS_WITH(j_const_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with null"); - } - - SECTION("boolean") - { - json j_nonobject(json::value_t::boolean); - const json j_const_nonobject(j_nonobject); - CHECK_THROWS_AS(j_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_WITH(j_nonobject["foo"], "cannot use operator[] with boolean"); - CHECK_THROWS_WITH(j_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with boolean"); - CHECK_THROWS_WITH(j_const_nonobject["foo"], "cannot use operator[] with boolean"); - CHECK_THROWS_WITH(j_const_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with boolean"); - } - - SECTION("string") - { - json j_nonobject(json::value_t::string); - const json j_const_nonobject(j_nonobject); - CHECK_THROWS_AS(j_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_WITH(j_nonobject["foo"], "cannot use operator[] with string"); - CHECK_THROWS_WITH(j_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with string"); - CHECK_THROWS_WITH(j_const_nonobject["foo"], "cannot use operator[] with string"); - CHECK_THROWS_WITH(j_const_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with string"); - } - - SECTION("array") - { - json j_nonobject(json::value_t::array); - const json j_const_nonobject(j_nonobject); - CHECK_THROWS_AS(j_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_WITH(j_nonobject["foo"], "cannot use operator[] with array"); - CHECK_THROWS_WITH(j_nonobject[json::object_t::key_type("foo")], "cannot use operator[] with array"); - CHECK_THROWS_WITH(j_const_nonobject["foo"], "cannot use operator[] with array"); - CHECK_THROWS_WITH(j_const_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with array"); - } - - SECTION("number (integer)") - { - json j_nonobject(json::value_t::number_integer); - const json j_const_nonobject(j_nonobject); - CHECK_THROWS_AS(j_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_WITH(j_nonobject["foo"], "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_const_nonobject["foo"], "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_const_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with number"); - } - - SECTION("number (unsigned)") - { - json j_nonobject(json::value_t::number_unsigned); - const json j_const_nonobject(j_nonobject); - CHECK_THROWS_AS(j_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_WITH(j_nonobject["foo"], "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_const_nonobject["foo"], "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_const_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with number"); - } - - SECTION("number (floating-point)") - { - json j_nonobject(json::value_t::number_float); - const json j_const_nonobject(j_nonobject); - CHECK_THROWS_AS(j_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject["foo"], std::domain_error); - CHECK_THROWS_AS(j_const_nonobject[json::object_t::key_type("foo")], std::domain_error); - CHECK_THROWS_WITH(j_nonobject["foo"], "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_const_nonobject["foo"], "cannot use operator[] with number"); - CHECK_THROWS_WITH(j_const_nonobject[json::object_t::key_type("foo")], - "cannot use operator[] with number"); - } - } - } - - SECTION("remove specified element") - { - SECTION("remove element by key") - { - CHECK(j.find("integer") != j.end()); - CHECK(j.erase("integer") == 1); - CHECK(j.find("integer") == j.end()); - CHECK(j.erase("integer") == 0); - - CHECK(j.find("unsigned") != j.end()); - CHECK(j.erase("unsigned") == 1); - CHECK(j.find("unsigned") == j.end()); - CHECK(j.erase("unsigned") == 0); - - CHECK(j.find("boolean") != j.end()); - CHECK(j.erase("boolean") == 1); - CHECK(j.find("boolean") == j.end()); - CHECK(j.erase("boolean") == 0); - - CHECK(j.find("null") != j.end()); - CHECK(j.erase("null") == 1); - CHECK(j.find("null") == j.end()); - CHECK(j.erase("null") == 0); - - CHECK(j.find("string") != j.end()); - CHECK(j.erase("string") == 1); - CHECK(j.find("string") == j.end()); - CHECK(j.erase("string") == 0); - - CHECK(j.find("floating") != j.end()); - CHECK(j.erase("floating") == 1); - CHECK(j.find("floating") == j.end()); - CHECK(j.erase("floating") == 0); - - CHECK(j.find("object") != j.end()); - CHECK(j.erase("object") == 1); - CHECK(j.find("object") == j.end()); - CHECK(j.erase("object") == 0); - - CHECK(j.find("array") != j.end()); - CHECK(j.erase("array") == 1); - CHECK(j.find("array") == j.end()); - CHECK(j.erase("array") == 0); - } - - SECTION("remove element by iterator") - { - SECTION("erase(begin())") - { - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json::iterator it2 = jobject.erase(jobject.begin()); - CHECK(jobject == json({{"b", 1}, {"c", 17u}})); - CHECK(*it2 == json(1)); - } - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json::const_iterator it2 = jobject.erase(jobject.cbegin()); - CHECK(jobject == json({{"b", 1}, {"c", 17u}})); - CHECK(*it2 == json(1)); - } - } - - SECTION("erase(begin(), end())") - { - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json::iterator it2 = jobject.erase(jobject.begin(), jobject.end()); - CHECK(jobject == json::object()); - CHECK(it2 == jobject.end()); - } - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json::const_iterator it2 = jobject.erase(jobject.cbegin(), jobject.cend()); - CHECK(jobject == json::object()); - CHECK(it2 == jobject.cend()); - } - } - - SECTION("erase(begin(), begin())") - { - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json::iterator it2 = jobject.erase(jobject.begin(), jobject.begin()); - CHECK(jobject == json({{"a", "a"}, {"b", 1}, {"c", 17u}})); - CHECK(*it2 == json("a")); - } - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json::const_iterator it2 = jobject.erase(jobject.cbegin(), jobject.cbegin()); - CHECK(jobject == json({{"a", "a"}, {"b", 1}, {"c", 17u}})); - CHECK(*it2 == json("a")); - } - } - - SECTION("erase at offset") - { - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json::iterator it = jobject.find("b"); - json::iterator it2 = jobject.erase(it); - CHECK(jobject == json({{"a", "a"}, {"c", 17u}})); - CHECK(*it2 == json(17)); - } - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - json::const_iterator it = jobject.find("b"); - json::const_iterator it2 = jobject.erase(it); - CHECK(jobject == json({{"a", "a"}, {"c", 17u}})); - CHECK(*it2 == json(17)); - } - } - - SECTION("erase subrange") - { - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}}; - json::iterator it2 = jobject.erase(jobject.find("b"), jobject.find("e")); - CHECK(jobject == json({{"a", "a"}, {"e", true}})); - CHECK(*it2 == json(true)); - } - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}}; - json::const_iterator it2 = jobject.erase(jobject.find("b"), jobject.find("e")); - CHECK(jobject == json({{"a", "a"}, {"e", true}})); - CHECK(*it2 == json(true)); - } - } - - SECTION("different objects") - { - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}}; - json jobject2 = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - CHECK_THROWS_AS(jobject.erase(jobject2.begin()), std::domain_error); - CHECK_THROWS_AS(jobject.erase(jobject.begin(), jobject2.end()), std::domain_error); - CHECK_THROWS_AS(jobject.erase(jobject2.begin(), jobject.end()), std::domain_error); - CHECK_THROWS_AS(jobject.erase(jobject2.begin(), jobject2.end()), std::domain_error); - CHECK_THROWS_WITH(jobject.erase(jobject2.begin()), "iterator does not fit current value"); - CHECK_THROWS_WITH(jobject.erase(jobject.begin(), jobject2.end()), - "iterators do not fit current value"); - CHECK_THROWS_WITH(jobject.erase(jobject2.begin(), jobject.end()), - "iterators do not fit current value"); - CHECK_THROWS_WITH(jobject.erase(jobject2.begin(), jobject2.end()), - "iterators do not fit current value"); - } - { - json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}}; - json jobject2 = {{"a", "a"}, {"b", 1}, {"c", 17u}}; - CHECK_THROWS_AS(jobject.erase(jobject2.cbegin()), std::domain_error); - CHECK_THROWS_AS(jobject.erase(jobject.cbegin(), jobject2.cend()), std::domain_error); - CHECK_THROWS_AS(jobject.erase(jobject2.cbegin(), jobject.cend()), std::domain_error); - CHECK_THROWS_AS(jobject.erase(jobject2.cbegin(), jobject2.cend()), std::domain_error); - CHECK_THROWS_WITH(jobject.erase(jobject2.cbegin()), "iterator does not fit current value"); - CHECK_THROWS_WITH(jobject.erase(jobject.cbegin(), jobject2.cend()), - "iterators do not fit current value"); - CHECK_THROWS_WITH(jobject.erase(jobject2.cbegin(), jobject.cend()), - "iterators do not fit current value"); - CHECK_THROWS_WITH(jobject.erase(jobject2.cbegin(), jobject2.cend()), - "iterators do not fit current value"); - } - } - } - - SECTION("remove element by key in non-object type") - { - SECTION("null") - { - json j_nonobject(json::value_t::null); - CHECK_THROWS_AS(j_nonobject.erase("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase("foo"), "cannot use erase() with null"); - } - - SECTION("boolean") - { - json j_nonobject(json::value_t::boolean); - CHECK_THROWS_AS(j_nonobject.erase("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase("foo"), "cannot use erase() with boolean"); - } - - SECTION("string") - { - json j_nonobject(json::value_t::string); - CHECK_THROWS_AS(j_nonobject.erase("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase("foo"), "cannot use erase() with string"); - } - - SECTION("array") - { - json j_nonobject(json::value_t::array); - CHECK_THROWS_AS(j_nonobject.erase("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase("foo"), "cannot use erase() with array"); - } - - SECTION("number (integer)") - { - json j_nonobject(json::value_t::number_integer); - CHECK_THROWS_AS(j_nonobject.erase("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase("foo"), "cannot use erase() with number"); - } - - SECTION("number (floating-point)") - { - json j_nonobject(json::value_t::number_float); - CHECK_THROWS_AS(j_nonobject.erase("foo"), std::domain_error); - CHECK_THROWS_WITH(j_nonobject.erase("foo"), "cannot use erase() with number"); - } - } - } - - SECTION("find an element in an object") - { - SECTION("existing element") - { - for (auto key : - {"integer", "unsigned", "floating", "null", "string", "boolean", "object", "array" - }) - { - CHECK(j.find(key) != j.end()); - CHECK(*j.find(key) == j.at(key)); - CHECK(j_const.find(key) != j_const.end()); - CHECK(*j_const.find(key) == j_const.at(key)); - } - } - - SECTION("nonexisting element") - { - CHECK(j.find("foo") == j.end()); - CHECK(j_const.find("foo") == j_const.end()); - } - - SECTION("all types") - { - SECTION("null") - { - json j_nonarray(json::value_t::null); - const json j_nonarray_const(j_nonarray); - CHECK(j_nonarray.find("foo") == j_nonarray.end()); - CHECK(j_nonarray_const.find("foo") == j_nonarray_const.end()); - } - - SECTION("string") - { - json j_nonarray(json::value_t::string); - const json j_nonarray_const(j_nonarray); - CHECK(j_nonarray.find("foo") == j_nonarray.end()); - CHECK(j_nonarray_const.find("foo") == j_nonarray_const.end()); - } - - SECTION("object") - { - json j_nonarray(json::value_t::object); - const json j_nonarray_const(j_nonarray); - CHECK(j_nonarray.find("foo") == j_nonarray.end()); - CHECK(j_nonarray_const.find("foo") == j_nonarray_const.end()); - } - - SECTION("array") - { - json j_nonarray(json::value_t::array); - const json j_nonarray_const(j_nonarray); - CHECK(j_nonarray.find("foo") == j_nonarray.end()); - CHECK(j_nonarray_const.find("foo") == j_nonarray_const.end()); - } - - SECTION("boolean") - { - json j_nonarray(json::value_t::boolean); - const json j_nonarray_const(j_nonarray); - CHECK(j_nonarray.find("foo") == j_nonarray.end()); - CHECK(j_nonarray_const.find("foo") == j_nonarray_const.end()); - } - - SECTION("number (integer)") - { - json j_nonarray(json::value_t::number_integer); - const json j_nonarray_const(j_nonarray); - CHECK(j_nonarray.find("foo") == j_nonarray.end()); - CHECK(j_nonarray_const.find("foo") == j_nonarray_const.end()); - } - - SECTION("number (unsigned)") - { - json j_nonarray(json::value_t::number_unsigned); - const json j_nonarray_const(j_nonarray); - CHECK(j_nonarray.find("foo") == j_nonarray.end()); - CHECK(j_nonarray_const.find("foo") == j_nonarray_const.end()); - } - - SECTION("number (floating-point)") - { - json j_nonarray(json::value_t::number_float); - const json j_nonarray_const(j_nonarray); - CHECK(j_nonarray.find("foo") == j_nonarray.end()); - CHECK(j_nonarray_const.find("foo") == j_nonarray_const.end()); - } - } - } - - SECTION("count keys in an object") - { - SECTION("existing element") - { - for (auto key : - {"integer", "unsigned", "floating", "null", "string", "boolean", "object", "array" - }) - { - CHECK(j.count(key) == 1); - CHECK(j_const.count(key) == 1); - } - } - - SECTION("nonexisting element") - { - CHECK(j.count("foo") == 0); - CHECK(j_const.count("foo") == 0); - } - - SECTION("all types") - { - SECTION("null") - { - json j_nonobject(json::value_t::null); - const json j_nonobject_const(j_nonobject); - CHECK(j_nonobject.count("foo") == 0); - CHECK(j_nonobject_const.count("foo") == 0); - } - - SECTION("string") - { - json j_nonobject(json::value_t::string); - const json j_nonobject_const(j_nonobject); - CHECK(j_nonobject.count("foo") == 0); - CHECK(j_nonobject_const.count("foo") == 0); - } - - SECTION("object") - { - json j_nonobject(json::value_t::object); - const json j_nonobject_const(j_nonobject); - CHECK(j_nonobject.count("foo") == 0); - CHECK(j_nonobject_const.count("foo") == 0); - } - - SECTION("array") - { - json j_nonobject(json::value_t::array); - const json j_nonobject_const(j_nonobject); - CHECK(j_nonobject.count("foo") == 0); - CHECK(j_nonobject_const.count("foo") == 0); - } - - SECTION("boolean") - { - json j_nonobject(json::value_t::boolean); - const json j_nonobject_const(j_nonobject); - CHECK(j_nonobject.count("foo") == 0); - CHECK(j_nonobject_const.count("foo") == 0); - } - - SECTION("number (integer)") - { - json j_nonobject(json::value_t::number_integer); - const json j_nonobject_const(j_nonobject); - CHECK(j_nonobject.count("foo") == 0); - CHECK(j_nonobject_const.count("foo") == 0); - } - - SECTION("number (unsigned)") - { - json j_nonobject(json::value_t::number_unsigned); - const json j_nonobject_const(j_nonobject); - CHECK(j_nonobject.count("foo") == 0); - CHECK(j_nonobject_const.count("foo") == 0); - } - - SECTION("number (floating-point)") - { - json j_nonobject(json::value_t::number_float); - const json j_nonobject_const(j_nonobject); - CHECK(j_nonobject.count("foo") == 0); - CHECK(j_nonobject_const.count("foo") == 0); - } - } - } - } - - SECTION("other values") - { - SECTION("front and back") - { - SECTION("null") - { - { - json j; - CHECK_THROWS_AS(j.front(), std::out_of_range); - CHECK_THROWS_AS(j.back(), std::out_of_range); - CHECK_THROWS_WITH(j.front(), "cannot get value"); - CHECK_THROWS_WITH(j.back(), "cannot get value"); - } - { - const json j{}; - CHECK_THROWS_AS(j.front(), std::out_of_range); - CHECK_THROWS_AS(j.back(), std::out_of_range); - CHECK_THROWS_WITH(j.front(), "cannot get value"); - CHECK_THROWS_WITH(j.back(), "cannot get value"); - } - } - - SECTION("string") - { - { - json j = "foo"; - CHECK(j.front() == j); - CHECK(j.back() == j); - } - { - const json j = "bar"; - CHECK(j.front() == j); - CHECK(j.back() == j); - } - } - - SECTION("number (boolean)") - { - { - json j = false; - CHECK(j.front() == j); - CHECK(j.back() == j); - } - { - const json j = true; - CHECK(j.front() == j); - CHECK(j.back() == j); - } - } - - SECTION("number (integer)") - { - { - json j = 17; - CHECK(j.front() == j); - CHECK(j.back() == j); - } - { - const json j = 17; - CHECK(j.front() == j); - CHECK(j.back() == j); - } - } - - SECTION("number (unsigned)") - { - { - json j = 17u; - CHECK(j.front() == j); - CHECK(j.back() == j); - } - { - const json j = 17u; - CHECK(j.front() == j); - CHECK(j.back() == j); - } - } - - SECTION("number (floating point)") - { - { - json j = 23.42; - CHECK(j.front() == j); - CHECK(j.back() == j); - } - { - const json j = 23.42; - CHECK(j.front() == j); - CHECK(j.back() == j); - } - } - } - - SECTION("erase with one valid iterator") - { - SECTION("null") - { - { - json j; - CHECK_THROWS_AS(j.erase(j.begin()), std::domain_error); - CHECK_THROWS_WITH(j.erase(j.begin()), "cannot use erase() with null"); - } - { - json j; - CHECK_THROWS_AS(j.erase(j.cbegin()), std::domain_error); - CHECK_THROWS_WITH(j.erase(j.begin()), "cannot use erase() with null"); - } - } - - SECTION("string") - { - { - json j = "foo"; - json::iterator it = j.erase(j.begin()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - { - json j = "bar"; - json::const_iterator it = j.erase(j.cbegin()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - } - - SECTION("number (boolean)") - { - { - json j = false; - json::iterator it = j.erase(j.begin()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - { - json j = true; - json::const_iterator it = j.erase(j.cbegin()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - } - - SECTION("number (integer)") - { - { - json j = 17; - json::iterator it = j.erase(j.begin()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - { - json j = 17; - json::const_iterator it = j.erase(j.cbegin()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - } - - SECTION("number (unsigned)") - { - { - json j = 17u; - json::iterator it = j.erase(j.begin()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - { - json j = 17u; - json::const_iterator it = j.erase(j.cbegin()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - } - - SECTION("number (floating point)") - { - { - json j = 23.42; - json::iterator it = j.erase(j.begin()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - { - json j = 23.42; - json::const_iterator it = j.erase(j.cbegin()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - } - } - - SECTION("erase with one invalid iterator") - { - SECTION("string") - { - { - json j = "foo"; - CHECK_THROWS_AS(j.erase(j.end()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.end()), "iterator out of range"); - } - { - json j = "bar"; - CHECK_THROWS_AS(j.erase(j.cend()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.cend()), "iterator out of range"); - } - } - - SECTION("number (boolean)") - { - { - json j = false; - CHECK_THROWS_AS(j.erase(j.end()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.end()), "iterator out of range"); - } - { - json j = true; - CHECK_THROWS_AS(j.erase(j.cend()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.cend()), "iterator out of range"); - } - } - - SECTION("number (integer)") - { - { - json j = 17; - CHECK_THROWS_AS(j.erase(j.end()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.end()), "iterator out of range"); - } - { - json j = 17; - CHECK_THROWS_AS(j.erase(j.cend()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.cend()), "iterator out of range"); - } - } - - SECTION("number (unsigned)") - { - { - json j = 17u; - CHECK_THROWS_AS(j.erase(j.end()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.end()), "iterator out of range"); - } - { - json j = 17u; - CHECK_THROWS_AS(j.erase(j.cend()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.cend()), "iterator out of range"); - } - } - - SECTION("number (floating point)") - { - { - json j = 23.42; - CHECK_THROWS_AS(j.erase(j.end()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.end()), "iterator out of range"); - } - { - json j = 23.42; - CHECK_THROWS_AS(j.erase(j.cend()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.cend()), "iterator out of range"); - } - } - } - - SECTION("erase with two valid iterators") - { - SECTION("null") - { - { - json j; - CHECK_THROWS_AS(j.erase(j.begin(), j.end()), std::domain_error); - CHECK_THROWS_WITH(j.erase(j.begin(), j.end()), "cannot use erase() with null"); - } - { - json j; - CHECK_THROWS_AS(j.erase(j.cbegin(), j.cend()), std::domain_error); - CHECK_THROWS_WITH(j.erase(j.cbegin(), j.cend()), "cannot use erase() with null"); - } - } - - SECTION("string") - { - { - json j = "foo"; - json::iterator it = j.erase(j.begin(), j.end()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - { - json j = "bar"; - json::const_iterator it = j.erase(j.cbegin(), j.cend()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - } - - SECTION("number (boolean)") - { - { - json j = false; - json::iterator it = j.erase(j.begin(), j.end()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - { - json j = true; - json::const_iterator it = j.erase(j.cbegin(), j.cend()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - } - - SECTION("number (integer)") - { - { - json j = 17; - json::iterator it = j.erase(j.begin(), j.end()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - { - json j = 17; - json::const_iterator it = j.erase(j.cbegin(), j.cend()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - } - - SECTION("number (unsigned)") - { - { - json j = 17u; - json::iterator it = j.erase(j.begin(), j.end()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - { - json j = 17u; - json::const_iterator it = j.erase(j.cbegin(), j.cend()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - } - - SECTION("number (floating point)") - { - { - json j = 23.42; - json::iterator it = j.erase(j.begin(), j.end()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - { - json j = 23.42; - json::const_iterator it = j.erase(j.cbegin(), j.cend()); - CHECK(j.type() == json::value_t::null); - CHECK(it == j.end()); - } - } - } - - SECTION("erase with two invalid iterators") - { - SECTION("string") - { - { - json j = "foo"; - CHECK_THROWS_AS(j.erase(j.end(), j.end()), std::out_of_range); - CHECK_THROWS_AS(j.erase(j.begin(), j.begin()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.end(), j.end()), "iterators out of range"); - CHECK_THROWS_WITH(j.erase(j.begin(), j.begin()), "iterators out of range"); - } - { - json j = "bar"; - CHECK_THROWS_AS(j.erase(j.cend(), j.cend()), std::out_of_range); - CHECK_THROWS_AS(j.erase(j.cbegin(), j.cbegin()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.cend(), j.cend()), "iterators out of range"); - CHECK_THROWS_WITH(j.erase(j.cbegin(), j.cbegin()), "iterators out of range"); - } - } - - SECTION("number (boolean)") - { - { - json j = false; - CHECK_THROWS_AS(j.erase(j.end(), j.end()), std::out_of_range); - CHECK_THROWS_AS(j.erase(j.begin(), j.begin()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.end(), j.end()), "iterators out of range"); - CHECK_THROWS_WITH(j.erase(j.begin(), j.begin()), "iterators out of range"); - } - { - json j = true; - CHECK_THROWS_AS(j.erase(j.cend(), j.cend()), std::out_of_range); - CHECK_THROWS_AS(j.erase(j.cbegin(), j.cbegin()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.cend(), j.cend()), "iterators out of range"); - CHECK_THROWS_WITH(j.erase(j.cbegin(), j.cbegin()), "iterators out of range"); - } - } - - SECTION("number (integer)") - { - { - json j = 17; - CHECK_THROWS_AS(j.erase(j.end(), j.end()), std::out_of_range); - CHECK_THROWS_AS(j.erase(j.begin(), j.begin()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.end(), j.end()), "iterators out of range"); - CHECK_THROWS_WITH(j.erase(j.begin(), j.begin()), "iterators out of range"); - } - { - json j = 17; - CHECK_THROWS_AS(j.erase(j.cend(), j.cend()), std::out_of_range); - CHECK_THROWS_AS(j.erase(j.cbegin(), j.cbegin()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.cend(), j.cend()), "iterators out of range"); - CHECK_THROWS_WITH(j.erase(j.cbegin(), j.cbegin()), "iterators out of range"); - } - } - - SECTION("number (unsigned)") - { - { - json j = 17u; - CHECK_THROWS_AS(j.erase(j.end(), j.end()), std::out_of_range); - CHECK_THROWS_AS(j.erase(j.begin(), j.begin()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.end(), j.end()), "iterators out of range"); - CHECK_THROWS_WITH(j.erase(j.begin(), j.begin()), "iterators out of range"); - } - { - json j = 17u; - CHECK_THROWS_AS(j.erase(j.cend(), j.cend()), std::out_of_range); - CHECK_THROWS_AS(j.erase(j.cbegin(), j.cbegin()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.cend(), j.cend()), "iterators out of range"); - CHECK_THROWS_WITH(j.erase(j.cbegin(), j.cbegin()), "iterators out of range"); - } - } - - SECTION("number (floating point)") - { - { - json j = 23.42; - CHECK_THROWS_AS(j.erase(j.end(), j.end()), std::out_of_range); - CHECK_THROWS_AS(j.erase(j.begin(), j.begin()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.end(), j.end()), "iterators out of range"); - CHECK_THROWS_WITH(j.erase(j.begin(), j.begin()), "iterators out of range"); - } - { - json j = 23.42; - CHECK_THROWS_AS(j.erase(j.cend(), j.cend()), std::out_of_range); - CHECK_THROWS_AS(j.erase(j.cbegin(), j.cbegin()), std::out_of_range); - CHECK_THROWS_WITH(j.erase(j.cend(), j.cend()), "iterators out of range"); - CHECK_THROWS_WITH(j.erase(j.cbegin(), j.cbegin()), "iterators out of range"); - } - } - } - } -} - -TEST_CASE("iterators") -{ - SECTION("basic behavior") - { - SECTION("uninitialized") - { - json::iterator it; - CHECK(it.m_object == nullptr); - - json::const_iterator cit; - CHECK(cit.m_object == nullptr); - } - - SECTION("boolean") - { - json j = true; - json j_const(j); - - SECTION("json + begin/end") - { - json::iterator it = j.begin(); - CHECK(it != j.end()); - CHECK(*it == j); - - it++; - CHECK(it != j.begin()); - CHECK(it == j.end()); - - it--; - CHECK(it == j.begin()); - CHECK(it != j.end()); - CHECK(*it == j); - - ++it; - CHECK(it != j.begin()); - CHECK(it == j.end()); - - --it; - CHECK(it == j.begin()); - CHECK(it != j.end()); - CHECK(*it == j); - } - - SECTION("const json + begin/end") - { - json::const_iterator it = j_const.begin(); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.begin()); - CHECK(it == j_const.end()); - - it--; - CHECK(it == j_const.begin()); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.begin()); - CHECK(it == j_const.end()); - - --it; - CHECK(it == j_const.begin()); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - } - - SECTION("json + cbegin/cend") - { - json::const_iterator it = j.cbegin(); - CHECK(it != j.cend()); - CHECK(*it == j); - - it++; - CHECK(it != j.cbegin()); - CHECK(it == j.cend()); - - it--; - CHECK(it == j.cbegin()); - CHECK(it != j.cend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.cbegin()); - CHECK(it == j.cend()); - - --it; - CHECK(it == j.cbegin()); - CHECK(it != j.cend()); - CHECK(*it == j); - } - - SECTION("const json + cbegin/cend") - { - json::const_iterator it = j_const.cbegin(); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.cbegin()); - CHECK(it == j_const.cend()); - - it--; - CHECK(it == j_const.cbegin()); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.cbegin()); - CHECK(it == j_const.cend()); - - --it; - CHECK(it == j_const.cbegin()); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - } - - SECTION("json + rbegin/rend") - { - json::reverse_iterator it = j.rbegin(); - CHECK(it != j.rend()); - CHECK(*it == j); - - it++; - CHECK(it != j.rbegin()); - CHECK(it == j.rend()); - - it--; - CHECK(it == j.rbegin()); - CHECK(it != j.rend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.rbegin()); - CHECK(it == j.rend()); - - --it; - CHECK(it == j.rbegin()); - CHECK(it != j.rend()); - CHECK(*it == j); - } - - SECTION("json + crbegin/crend") - { - json::const_reverse_iterator it = j.crbegin(); - CHECK(it != j.crend()); - CHECK(*it == j); - - it++; - CHECK(it != j.crbegin()); - CHECK(it == j.crend()); - - it--; - CHECK(it == j.crbegin()); - CHECK(it != j.crend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.crbegin()); - CHECK(it == j.crend()); - - --it; - CHECK(it == j.crbegin()); - CHECK(it != j.crend()); - CHECK(*it == j); - } - - SECTION("const json + crbegin/crend") - { - json::const_reverse_iterator it = j_const.crbegin(); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.crbegin()); - CHECK(it == j_const.crend()); - - it--; - CHECK(it == j_const.crbegin()); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.crbegin()); - CHECK(it == j_const.crend()); - - --it; - CHECK(it == j_const.crbegin()); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - } - - SECTION("key/value") - { - auto it = j.begin(); - auto cit = j_const.cbegin(); - CHECK_THROWS_AS(it.key(), std::domain_error); - CHECK_THROWS_WITH(it.key(), "cannot use key() for non-object iterators"); - CHECK(it.value() == json(true)); - CHECK_THROWS_AS(cit.key(), std::domain_error); - CHECK_THROWS_WITH(cit.key(), "cannot use key() for non-object iterators"); - CHECK(cit.value() == json(true)); - - auto rit = j.rend(); - auto crit = j.crend(); - CHECK_THROWS_AS(rit.key(), std::domain_error); - CHECK_THROWS_AS(rit.value(), std::out_of_range); - CHECK_THROWS_AS(crit.key(), std::domain_error); - CHECK_THROWS_AS(crit.value(), std::out_of_range); - CHECK_THROWS_WITH(rit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(rit.value(), "cannot get value"); - CHECK_THROWS_WITH(crit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(crit.value(), "cannot get value"); - } - } - - SECTION("string") - { - json j = "hello world"; - json j_const(j); - - SECTION("json + begin/end") - { - json::iterator it = j.begin(); - CHECK(it != j.end()); - CHECK(*it == j); - - it++; - CHECK(it != j.begin()); - CHECK(it == j.end()); - - it--; - CHECK(it == j.begin()); - CHECK(it != j.end()); - CHECK(*it == j); - - ++it; - CHECK(it != j.begin()); - CHECK(it == j.end()); - - --it; - CHECK(it == j.begin()); - CHECK(it != j.end()); - CHECK(*it == j); - } - - SECTION("const json + begin/end") - { - json::const_iterator it = j_const.begin(); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.begin()); - CHECK(it == j_const.end()); - - it--; - CHECK(it == j_const.begin()); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.begin()); - CHECK(it == j_const.end()); - - --it; - CHECK(it == j_const.begin()); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - } - - SECTION("json + cbegin/cend") - { - json::const_iterator it = j.cbegin(); - CHECK(it != j.cend()); - CHECK(*it == j); - - it++; - CHECK(it != j.cbegin()); - CHECK(it == j.cend()); - - it--; - CHECK(it == j.cbegin()); - CHECK(it != j.cend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.cbegin()); - CHECK(it == j.cend()); - - --it; - CHECK(it == j.cbegin()); - CHECK(it != j.cend()); - CHECK(*it == j); - } - - SECTION("const json + cbegin/cend") - { - json::const_iterator it = j_const.cbegin(); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.cbegin()); - CHECK(it == j_const.cend()); - - it--; - CHECK(it == j_const.cbegin()); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.cbegin()); - CHECK(it == j_const.cend()); - - --it; - CHECK(it == j_const.cbegin()); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - } - - SECTION("json + rbegin/rend") - { - json::reverse_iterator it = j.rbegin(); - CHECK(it != j.rend()); - CHECK(*it == j); - - it++; - CHECK(it != j.rbegin()); - CHECK(it == j.rend()); - - it--; - CHECK(it == j.rbegin()); - CHECK(it != j.rend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.rbegin()); - CHECK(it == j.rend()); - - --it; - CHECK(it == j.rbegin()); - CHECK(it != j.rend()); - CHECK(*it == j); - } - - SECTION("json + crbegin/crend") - { - json::const_reverse_iterator it = j.crbegin(); - CHECK(it != j.crend()); - CHECK(*it == j); - - it++; - CHECK(it != j.crbegin()); - CHECK(it == j.crend()); - - it--; - CHECK(it == j.crbegin()); - CHECK(it != j.crend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.crbegin()); - CHECK(it == j.crend()); - - --it; - CHECK(it == j.crbegin()); - CHECK(it != j.crend()); - CHECK(*it == j); - } - - SECTION("const json + crbegin/crend") - { - json::const_reverse_iterator it = j_const.crbegin(); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.crbegin()); - CHECK(it == j_const.crend()); - - it--; - CHECK(it == j_const.crbegin()); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.crbegin()); - CHECK(it == j_const.crend()); - - --it; - CHECK(it == j_const.crbegin()); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - } - - SECTION("key/value") - { - auto it = j.begin(); - auto cit = j_const.cbegin(); - CHECK_THROWS_AS(it.key(), std::domain_error); - CHECK_THROWS_WITH(it.key(), "cannot use key() for non-object iterators"); - CHECK(it.value() == json("hello world")); - CHECK_THROWS_AS(cit.key(), std::domain_error); - CHECK_THROWS_WITH(cit.key(), "cannot use key() for non-object iterators"); - CHECK(cit.value() == json("hello world")); - - auto rit = j.rend(); - auto crit = j.crend(); - CHECK_THROWS_AS(rit.key(), std::domain_error); - CHECK_THROWS_AS(rit.value(), std::out_of_range); - CHECK_THROWS_AS(crit.key(), std::domain_error); - CHECK_THROWS_AS(crit.value(), std::out_of_range); - CHECK_THROWS_WITH(rit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(rit.value(), "cannot get value"); - CHECK_THROWS_WITH(crit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(crit.value(), "cannot get value"); - } - } - - SECTION("array") - { - json j = {1, 2, 3}; - json j_const(j); - - SECTION("json + begin/end") - { - json::iterator it_begin = j.begin(); - json::iterator it_end = j.end(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j[0]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[1]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[2]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("const json + begin/end") - { - json::const_iterator it_begin = j_const.begin(); - json::const_iterator it_end = j_const.end(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j_const[0]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j_const[1]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j_const[2]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("json + cbegin/cend") - { - json::const_iterator it_begin = j.cbegin(); - json::const_iterator it_end = j.cend(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j[0]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[1]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[2]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("const json + cbegin/cend") - { - json::const_iterator it_begin = j_const.cbegin(); - json::const_iterator it_end = j_const.cend(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j[0]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[1]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[2]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("json + rbegin/rend") - { - json::reverse_iterator it_begin = j.rbegin(); - json::reverse_iterator it_end = j.rend(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j[2]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[1]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[0]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("json + crbegin/crend") - { - json::const_reverse_iterator it_begin = j.crbegin(); - json::const_reverse_iterator it_end = j.crend(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j[2]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[1]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[0]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("const json + crbegin/crend") - { - json::const_reverse_iterator it_begin = j_const.crbegin(); - json::const_reverse_iterator it_end = j_const.crend(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j[2]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[1]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j[0]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("key/value") - { - auto it = j.begin(); - auto cit = j_const.cbegin(); - CHECK_THROWS_AS(it.key(), std::domain_error); - CHECK_THROWS_WITH(it.key(), "cannot use key() for non-object iterators"); - CHECK(it.value() == json(1)); - CHECK_THROWS_AS(cit.key(), std::domain_error); - CHECK_THROWS_WITH(cit.key(), "cannot use key() for non-object iterators"); - CHECK(cit.value() == json(1)); - } - } - - SECTION("object") - { - json j = {{"A", 1}, {"B", 2}, {"C", 3}}; - json j_const(j); - - SECTION("json + begin/end") - { - json::iterator it_begin = j.begin(); - json::iterator it_end = j.end(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j["A"]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j["B"]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j["C"]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("const json + begin/end") - { - json::const_iterator it_begin = j_const.begin(); - json::const_iterator it_end = j_const.end(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j_const["A"]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j_const["B"]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j_const["C"]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("json + cbegin/cend") - { - json::const_iterator it_begin = j.cbegin(); - json::const_iterator it_end = j.cend(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j["A"]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j["B"]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j["C"]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("const json + cbegin/cend") - { - json::const_iterator it_begin = j_const.cbegin(); - json::const_iterator it_end = j_const.cend(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j_const["A"]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j_const["B"]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j_const["C"]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("json + rbegin/rend") - { - json::reverse_iterator it_begin = j.rbegin(); - json::reverse_iterator it_end = j.rend(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j["C"]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j["B"]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j["A"]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("json + crbegin/crend") - { - json::const_reverse_iterator it_begin = j.crbegin(); - json::const_reverse_iterator it_end = j.crend(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j["C"]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j["B"]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j["A"]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("const json + crbegin/crend") - { - json::const_reverse_iterator it_begin = j_const.crbegin(); - json::const_reverse_iterator it_end = j_const.crend(); - - auto it = it_begin; - CHECK(it != it_end); - CHECK(*it == j["C"]); - - it++; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j["B"]); - - ++it; - CHECK(it != it_begin); - CHECK(it != it_end); - CHECK(*it == j["A"]); - - ++it; - CHECK(it != it_begin); - CHECK(it == it_end); - } - - SECTION("key/value") - { - auto it = j.begin(); - auto cit = j_const.cbegin(); - CHECK(it.key() == "A"); - CHECK(it.value() == json(1)); - CHECK(cit.key() == "A"); - CHECK(cit.value() == json(1)); - } - } - - SECTION("number (integer)") - { - json j = 23; - json j_const(j); - - SECTION("json + begin/end") - { - json::iterator it = j.begin(); - CHECK(it != j.end()); - CHECK(*it == j); - - it++; - CHECK(it != j.begin()); - CHECK(it == j.end()); - - it--; - CHECK(it == j.begin()); - CHECK(it != j.end()); - CHECK(*it == j); - - ++it; - CHECK(it != j.begin()); - CHECK(it == j.end()); - - --it; - CHECK(it == j.begin()); - CHECK(it != j.end()); - CHECK(*it == j); - } - - SECTION("const json + begin/end") - { - json::const_iterator it = j_const.begin(); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.begin()); - CHECK(it == j_const.end()); - - it--; - CHECK(it == j_const.begin()); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.begin()); - CHECK(it == j_const.end()); - - --it; - CHECK(it == j_const.begin()); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - } - - SECTION("json + cbegin/cend") - { - json::const_iterator it = j.cbegin(); - CHECK(it != j.cend()); - CHECK(*it == j); - - it++; - CHECK(it != j.cbegin()); - CHECK(it == j.cend()); - - it--; - CHECK(it == j.cbegin()); - CHECK(it != j.cend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.cbegin()); - CHECK(it == j.cend()); - - --it; - CHECK(it == j.cbegin()); - CHECK(it != j.cend()); - CHECK(*it == j); - } - - SECTION("const json + cbegin/cend") - { - json::const_iterator it = j_const.cbegin(); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.cbegin()); - CHECK(it == j_const.cend()); - - it--; - CHECK(it == j_const.cbegin()); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.cbegin()); - CHECK(it == j_const.cend()); - - --it; - CHECK(it == j_const.cbegin()); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - } - - SECTION("json + rbegin/rend") - { - json::reverse_iterator it = j.rbegin(); - CHECK(it != j.rend()); - CHECK(*it == j); - - it++; - CHECK(it != j.rbegin()); - CHECK(it == j.rend()); - - it--; - CHECK(it == j.rbegin()); - CHECK(it != j.rend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.rbegin()); - CHECK(it == j.rend()); - - --it; - CHECK(it == j.rbegin()); - CHECK(it != j.rend()); - CHECK(*it == j); - } - - SECTION("json + crbegin/crend") - { - json::const_reverse_iterator it = j.crbegin(); - CHECK(it != j.crend()); - CHECK(*it == j); - - it++; - CHECK(it != j.crbegin()); - CHECK(it == j.crend()); - - it--; - CHECK(it == j.crbegin()); - CHECK(it != j.crend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.crbegin()); - CHECK(it == j.crend()); - - --it; - CHECK(it == j.crbegin()); - CHECK(it != j.crend()); - CHECK(*it == j); - } - - SECTION("const json + crbegin/crend") - { - json::const_reverse_iterator it = j_const.crbegin(); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.crbegin()); - CHECK(it == j_const.crend()); - - it--; - CHECK(it == j_const.crbegin()); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.crbegin()); - CHECK(it == j_const.crend()); - - --it; - CHECK(it == j_const.crbegin()); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - } - - SECTION("key/value") - { - auto it = j.begin(); - auto cit = j_const.cbegin(); - CHECK_THROWS_AS(it.key(), std::domain_error); - CHECK_THROWS_WITH(it.key(), "cannot use key() for non-object iterators"); - CHECK(it.value() == json(23)); - CHECK_THROWS_AS(cit.key(), std::domain_error); - CHECK_THROWS_WITH(cit.key(), "cannot use key() for non-object iterators"); - CHECK(cit.value() == json(23)); - - auto rit = j.rend(); - auto crit = j.crend(); - CHECK_THROWS_AS(rit.key(), std::domain_error); - CHECK_THROWS_AS(rit.value(), std::out_of_range); - CHECK_THROWS_AS(crit.key(), std::domain_error); - CHECK_THROWS_AS(crit.value(), std::out_of_range); - CHECK_THROWS_WITH(rit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(rit.value(), "cannot get value"); - CHECK_THROWS_WITH(crit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(crit.value(), "cannot get value"); - } - } - - SECTION("number (unsigned)") - { - json j = 23u; - json j_const(j); - - SECTION("json + begin/end") - { - json::iterator it = j.begin(); - CHECK(it != j.end()); - CHECK(*it == j); - - it++; - CHECK(it != j.begin()); - CHECK(it == j.end()); - - it--; - CHECK(it == j.begin()); - CHECK(it != j.end()); - CHECK(*it == j); - - ++it; - CHECK(it != j.begin()); - CHECK(it == j.end()); - - --it; - CHECK(it == j.begin()); - CHECK(it != j.end()); - CHECK(*it == j); - } - - SECTION("const json + begin/end") - { - json::const_iterator it = j_const.begin(); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.begin()); - CHECK(it == j_const.end()); - - it--; - CHECK(it == j_const.begin()); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.begin()); - CHECK(it == j_const.end()); - - --it; - CHECK(it == j_const.begin()); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - } - - SECTION("json + cbegin/cend") - { - json::const_iterator it = j.cbegin(); - CHECK(it != j.cend()); - CHECK(*it == j); - - it++; - CHECK(it != j.cbegin()); - CHECK(it == j.cend()); - - it--; - CHECK(it == j.cbegin()); - CHECK(it != j.cend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.cbegin()); - CHECK(it == j.cend()); - - --it; - CHECK(it == j.cbegin()); - CHECK(it != j.cend()); - CHECK(*it == j); - } - - SECTION("const json + cbegin/cend") - { - json::const_iterator it = j_const.cbegin(); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.cbegin()); - CHECK(it == j_const.cend()); - - it--; - CHECK(it == j_const.cbegin()); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.cbegin()); - CHECK(it == j_const.cend()); - - --it; - CHECK(it == j_const.cbegin()); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - } - - SECTION("json + rbegin/rend") - { - json::reverse_iterator it = j.rbegin(); - CHECK(it != j.rend()); - CHECK(*it == j); - - it++; - CHECK(it != j.rbegin()); - CHECK(it == j.rend()); - - it--; - CHECK(it == j.rbegin()); - CHECK(it != j.rend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.rbegin()); - CHECK(it == j.rend()); - - --it; - CHECK(it == j.rbegin()); - CHECK(it != j.rend()); - CHECK(*it == j); - } - - SECTION("json + crbegin/crend") - { - json::const_reverse_iterator it = j.crbegin(); - CHECK(it != j.crend()); - CHECK(*it == j); - - it++; - CHECK(it != j.crbegin()); - CHECK(it == j.crend()); - - it--; - CHECK(it == j.crbegin()); - CHECK(it != j.crend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.crbegin()); - CHECK(it == j.crend()); - - --it; - CHECK(it == j.crbegin()); - CHECK(it != j.crend()); - CHECK(*it == j); - } - - SECTION("const json + crbegin/crend") - { - json::const_reverse_iterator it = j_const.crbegin(); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.crbegin()); - CHECK(it == j_const.crend()); - - it--; - CHECK(it == j_const.crbegin()); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.crbegin()); - CHECK(it == j_const.crend()); - - --it; - CHECK(it == j_const.crbegin()); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - } - - SECTION("key/value") - { - auto it = j.begin(); - auto cit = j_const.cbegin(); - CHECK_THROWS_AS(it.key(), std::domain_error); - CHECK_THROWS_WITH(it.key(), "cannot use key() for non-object iterators"); - CHECK(it.value() == json(23)); - CHECK_THROWS_AS(cit.key(), std::domain_error); - CHECK_THROWS_WITH(cit.key(), "cannot use key() for non-object iterators"); - CHECK(cit.value() == json(23)); - - auto rit = j.rend(); - auto crit = j.crend(); - CHECK_THROWS_AS(rit.key(), std::domain_error); - CHECK_THROWS_AS(rit.value(), std::out_of_range); - CHECK_THROWS_AS(crit.key(), std::domain_error); - CHECK_THROWS_AS(crit.value(), std::out_of_range); - CHECK_THROWS_WITH(rit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(rit.value(), "cannot get value"); - CHECK_THROWS_WITH(crit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(crit.value(), "cannot get value"); - } - } - - SECTION("number (float)") - { - json j = 23.42; - json j_const(j); - - SECTION("json + begin/end") - { - json::iterator it = j.begin(); - CHECK(it != j.end()); - CHECK(*it == j); - - it++; - CHECK(it != j.begin()); - CHECK(it == j.end()); - - it--; - CHECK(it == j.begin()); - CHECK(it != j.end()); - CHECK(*it == j); - - ++it; - CHECK(it != j.begin()); - CHECK(it == j.end()); - - --it; - CHECK(it == j.begin()); - CHECK(it != j.end()); - CHECK(*it == j); - } - - SECTION("const json + begin/end") - { - json::const_iterator it = j_const.begin(); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.begin()); - CHECK(it == j_const.end()); - - it--; - CHECK(it == j_const.begin()); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.begin()); - CHECK(it == j_const.end()); - - --it; - CHECK(it == j_const.begin()); - CHECK(it != j_const.end()); - CHECK(*it == j_const); - } - - SECTION("json + cbegin/cend") - { - json::const_iterator it = j.cbegin(); - CHECK(it != j.cend()); - CHECK(*it == j); - - it++; - CHECK(it != j.cbegin()); - CHECK(it == j.cend()); - - it--; - CHECK(it == j.cbegin()); - CHECK(it != j.cend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.cbegin()); - CHECK(it == j.cend()); - - --it; - CHECK(it == j.cbegin()); - CHECK(it != j.cend()); - CHECK(*it == j); - } - - SECTION("const json + cbegin/cend") - { - json::const_iterator it = j_const.cbegin(); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.cbegin()); - CHECK(it == j_const.cend()); - - it--; - CHECK(it == j_const.cbegin()); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.cbegin()); - CHECK(it == j_const.cend()); - - --it; - CHECK(it == j_const.cbegin()); - CHECK(it != j_const.cend()); - CHECK(*it == j_const); - } - - SECTION("json + rbegin/rend") - { - json::reverse_iterator it = j.rbegin(); - CHECK(it != j.rend()); - CHECK(*it == j); - - it++; - CHECK(it != j.rbegin()); - CHECK(it == j.rend()); - - it--; - CHECK(it == j.rbegin()); - CHECK(it != j.rend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.rbegin()); - CHECK(it == j.rend()); - - --it; - CHECK(it == j.rbegin()); - CHECK(it != j.rend()); - CHECK(*it == j); - } - - SECTION("json + crbegin/crend") - { - json::const_reverse_iterator it = j.crbegin(); - CHECK(it != j.crend()); - CHECK(*it == j); - - it++; - CHECK(it != j.crbegin()); - CHECK(it == j.crend()); - - it--; - CHECK(it == j.crbegin()); - CHECK(it != j.crend()); - CHECK(*it == j); - - ++it; - CHECK(it != j.crbegin()); - CHECK(it == j.crend()); - - --it; - CHECK(it == j.crbegin()); - CHECK(it != j.crend()); - CHECK(*it == j); - } - - SECTION("const json + crbegin/crend") - { - json::const_reverse_iterator it = j_const.crbegin(); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - - it++; - CHECK(it != j_const.crbegin()); - CHECK(it == j_const.crend()); - - it--; - CHECK(it == j_const.crbegin()); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - - ++it; - CHECK(it != j_const.crbegin()); - CHECK(it == j_const.crend()); - - --it; - CHECK(it == j_const.crbegin()); - CHECK(it != j_const.crend()); - CHECK(*it == j_const); - } - - SECTION("key/value") - { - auto it = j.begin(); - auto cit = j_const.cbegin(); - CHECK_THROWS_AS(it.key(), std::domain_error); - CHECK_THROWS_WITH(it.key(), "cannot use key() for non-object iterators"); - CHECK(it.value() == json(23.42)); - CHECK_THROWS_AS(cit.key(), std::domain_error); - CHECK_THROWS_WITH(cit.key(), "cannot use key() for non-object iterators"); - CHECK(cit.value() == json(23.42)); - - auto rit = j.rend(); - auto crit = j.crend(); - CHECK_THROWS_AS(rit.key(), std::domain_error); - CHECK_THROWS_AS(rit.value(), std::out_of_range); - CHECK_THROWS_AS(crit.key(), std::domain_error); - CHECK_THROWS_AS(crit.value(), std::out_of_range); - CHECK_THROWS_WITH(rit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(rit.value(), "cannot get value"); - CHECK_THROWS_WITH(crit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(crit.value(), "cannot get value"); - } - } - - SECTION("null") - { - json j = nullptr; - json j_const(j); - - SECTION("json + begin/end") - { - json::iterator it = j.begin(); - CHECK(it == j.end()); - } - - SECTION("const json + begin/end") - { - json::const_iterator it_begin = j_const.begin(); - json::const_iterator it_end = j_const.end(); - CHECK(it_begin == it_end); - } - - SECTION("json + cbegin/cend") - { - json::const_iterator it_begin = j.cbegin(); - json::const_iterator it_end = j.cend(); - CHECK(it_begin == it_end); - } - - SECTION("const json + cbegin/cend") - { - json::const_iterator it_begin = j_const.cbegin(); - json::const_iterator it_end = j_const.cend(); - CHECK(it_begin == it_end); - } - - SECTION("json + rbegin/rend") - { - json::reverse_iterator it = j.rbegin(); - CHECK(it == j.rend()); - } - - SECTION("json + crbegin/crend") - { - json::const_reverse_iterator it = j.crbegin(); - CHECK(it == j.crend()); - } - - SECTION("const json + crbegin/crend") - { - json::const_reverse_iterator it = j_const.crbegin(); - CHECK(it == j_const.crend()); - } - - SECTION("key/value") - { - auto it = j.begin(); - auto cit = j_const.cbegin(); - CHECK_THROWS_AS(it.key(), std::domain_error); - CHECK_THROWS_AS(it.value(), std::out_of_range); - CHECK_THROWS_AS(cit.key(), std::domain_error); - CHECK_THROWS_AS(cit.value(), std::out_of_range); - CHECK_THROWS_WITH(it.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(it.value(), "cannot get value"); - CHECK_THROWS_WITH(cit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(cit.value(), "cannot get value"); - - auto rit = j.rend(); - auto crit = j.crend(); - CHECK_THROWS_AS(rit.key(), std::domain_error); - CHECK_THROWS_AS(rit.value(), std::out_of_range); - CHECK_THROWS_AS(crit.key(), std::domain_error); - CHECK_THROWS_AS(crit.value(), std::out_of_range); - CHECK_THROWS_WITH(rit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(rit.value(), "cannot get value"); - CHECK_THROWS_WITH(crit.key(), "cannot use key() for non-object iterators"); - CHECK_THROWS_WITH(crit.value(), "cannot get value"); - } - } - } - - SECTION("iterator comparisons") - { - json j_values = {nullptr, true, 42, 42u, 23.23, {{"one", 1}, {"two", 2}}, {1, 2, 3, 4, 5}, "Hello, world"}; - - for (json& j : j_values) - { - auto it1 = j.begin(); - auto it2 = j.begin(); - auto it3 = j.begin(); - ++it2; - ++it3; - ++it3; - auto it1_c = j.cbegin(); - auto it2_c = j.cbegin(); - auto it3_c = j.cbegin(); - ++it2_c; - ++it3_c; - ++it3_c; - - // comparison: equal - { - CHECK(it1 == it1); - CHECK(not (it1 == it2)); - CHECK(not (it1 == it3)); - CHECK(not (it2 == it3)); - CHECK(it1_c == it1_c); - CHECK(not (it1_c == it2_c)); - CHECK(not (it1_c == it3_c)); - CHECK(not (it2_c == it3_c)); - } - - // comparison: not equal - { - // check definition - CHECK( (it1 != it1) == not(it1 == it1) ); - CHECK( (it1 != it2) == not(it1 == it2) ); - CHECK( (it1 != it3) == not(it1 == it3) ); - CHECK( (it2 != it3) == not(it2 == it3) ); - CHECK( (it1_c != it1_c) == not(it1_c == it1_c) ); - CHECK( (it1_c != it2_c) == not(it1_c == it2_c) ); - CHECK( (it1_c != it3_c) == not(it1_c == it3_c) ); - CHECK( (it2_c != it3_c) == not(it2_c == it3_c) ); - } - - // comparison: smaller - { - if (j.type() == json::value_t::object) - { - CHECK_THROWS_AS(it1 < it1, std::domain_error); - CHECK_THROWS_AS(it1 < it2, std::domain_error); - CHECK_THROWS_AS(it2 < it3, std::domain_error); - CHECK_THROWS_AS(it1 < it3, std::domain_error); - CHECK_THROWS_AS(it1_c < it1_c, std::domain_error); - CHECK_THROWS_AS(it1_c < it2_c, std::domain_error); - CHECK_THROWS_AS(it2_c < it3_c, std::domain_error); - CHECK_THROWS_AS(it1_c < it3_c, std::domain_error); - CHECK_THROWS_WITH(it1 < it1, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 < it2, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2 < it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 < it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c < it1_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c < it2_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2_c < it3_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c < it3_c, "cannot compare order of object iterators"); - } - else - { - CHECK(not (it1 < it1)); - CHECK(it1 < it2); - CHECK(it1 < it3); - CHECK(it2 < it3); - CHECK(not (it1_c < it1_c)); - CHECK(it1_c < it2_c); - CHECK(it1_c < it3_c); - CHECK(it2_c < it3_c); - } - } - - // comparison: less than or equal - { - if (j.type() == json::value_t::object) - { - CHECK_THROWS_AS(it1 <= it1, std::domain_error); - CHECK_THROWS_AS(it1 <= it2, std::domain_error); - CHECK_THROWS_AS(it2 <= it3, std::domain_error); - CHECK_THROWS_AS(it1 <= it3, std::domain_error); - CHECK_THROWS_AS(it1_c <= it1_c, std::domain_error); - CHECK_THROWS_AS(it1_c <= it2_c, std::domain_error); - CHECK_THROWS_AS(it2_c <= it3_c, std::domain_error); - CHECK_THROWS_AS(it1_c <= it3_c, std::domain_error); - CHECK_THROWS_WITH(it1 <= it1, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 <= it2, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2 <= it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 <= it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c <= it1_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c <= it2_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2_c <= it3_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c <= it3_c, "cannot compare order of object iterators"); - } - else - { - // check definition - CHECK( (it1 <= it1) == not(it1 < it1) ); - CHECK( (it1 <= it2) == not(it2 < it1) ); - CHECK( (it1 <= it3) == not(it3 < it1) ); - CHECK( (it2 <= it3) == not(it3 < it2) ); - CHECK( (it1_c <= it1_c) == not(it1_c < it1_c) ); - CHECK( (it1_c <= it2_c) == not(it2_c < it1_c) ); - CHECK( (it1_c <= it3_c) == not(it3_c < it1_c) ); - CHECK( (it2_c <= it3_c) == not(it3_c < it2_c) ); - } - } - - // comparison: greater than - { - if (j.type() == json::value_t::object) - { - CHECK_THROWS_AS(it1 > it1, std::domain_error); - CHECK_THROWS_AS(it1 > it2, std::domain_error); - CHECK_THROWS_AS(it2 > it3, std::domain_error); - CHECK_THROWS_AS(it1 > it3, std::domain_error); - CHECK_THROWS_AS(it1_c > it1_c, std::domain_error); - CHECK_THROWS_AS(it1_c > it2_c, std::domain_error); - CHECK_THROWS_AS(it2_c > it3_c, std::domain_error); - CHECK_THROWS_AS(it1_c > it3_c, std::domain_error); - CHECK_THROWS_WITH(it1 > it1, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 > it2, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2 > it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 > it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c > it1_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c > it2_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2_c > it3_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c > it3_c, "cannot compare order of object iterators"); - } - else - { - // check definition - CHECK( (it1 > it1) == (it1 < it1) ); - CHECK( (it1 > it2) == (it2 < it1) ); - CHECK( (it1 > it3) == (it3 < it1) ); - CHECK( (it2 > it3) == (it3 < it2) ); - CHECK( (it1_c > it1_c) == (it1_c < it1_c) ); - CHECK( (it1_c > it2_c) == (it2_c < it1_c) ); - CHECK( (it1_c > it3_c) == (it3_c < it1_c) ); - CHECK( (it2_c > it3_c) == (it3_c < it2_c) ); - } - } - - // comparison: greater than or equal - { - if (j.type() == json::value_t::object) - { - CHECK_THROWS_AS(it1 >= it1, std::domain_error); - CHECK_THROWS_AS(it1 >= it2, std::domain_error); - CHECK_THROWS_AS(it2 >= it3, std::domain_error); - CHECK_THROWS_AS(it1 >= it3, std::domain_error); - CHECK_THROWS_AS(it1_c >= it1_c, std::domain_error); - CHECK_THROWS_AS(it1_c >= it2_c, std::domain_error); - CHECK_THROWS_AS(it2_c >= it3_c, std::domain_error); - CHECK_THROWS_AS(it1_c >= it3_c, std::domain_error); - CHECK_THROWS_WITH(it1 >= it1, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 >= it2, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2 >= it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 >= it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c >= it1_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c >= it2_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2_c >= it3_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c >= it3_c, "cannot compare order of object iterators"); - } - else - { - // check definition - CHECK( (it1 >= it1) == not(it1 < it1) ); - CHECK( (it1 >= it2) == not(it1 < it2) ); - CHECK( (it1 >= it3) == not(it1 < it3) ); - CHECK( (it2 >= it3) == not(it2 < it3) ); - CHECK( (it1_c >= it1_c) == not(it1_c < it1_c) ); - CHECK( (it1_c >= it2_c) == not(it1_c < it2_c) ); - CHECK( (it1_c >= it3_c) == not(it1_c < it3_c) ); - CHECK( (it2_c >= it3_c) == not(it2_c < it3_c) ); - } - } - } - - // check exceptions if different objects are compared - for (auto j : j_values) - { - for (auto k : j_values) - { - if (j != k) - { - CHECK_THROWS_AS(j.begin() == k.begin(), std::domain_error); - CHECK_THROWS_AS(j.cbegin() == k.cbegin(), std::domain_error); - CHECK_THROWS_WITH(j.begin() == k.begin(), "cannot compare iterators of different containers"); - CHECK_THROWS_WITH(j.cbegin() == k.cbegin(), "cannot compare iterators of different containers"); - - CHECK_THROWS_AS(j.begin() < k.begin(), std::domain_error); - CHECK_THROWS_AS(j.cbegin() < k.cbegin(), std::domain_error); - CHECK_THROWS_WITH(j.begin() < k.begin(), "cannot compare iterators of different containers"); - CHECK_THROWS_WITH(j.cbegin() < k.cbegin(), "cannot compare iterators of different containers"); - } - } - } - } - - SECTION("iterator arithmetic") - { - json j_object = {{"one", 1}, {"two", 2}, {"three", 3}}; - json j_array = {1, 2, 3, 4, 5, 6}; - json j_null = nullptr; - json j_value = 42; - - SECTION("addition and subtraction") - { - SECTION("object") - { - { - auto it = j_object.begin(); - CHECK_THROWS_AS(it += 1, std::domain_error); - CHECK_THROWS_WITH(it += 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.cbegin(); - CHECK_THROWS_AS(it += 1, std::domain_error); - CHECK_THROWS_WITH(it += 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.begin(); - CHECK_THROWS_AS(it + 1, std::domain_error); - CHECK_THROWS_WITH(it + 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.cbegin(); - CHECK_THROWS_AS(it + 1, std::domain_error); - CHECK_THROWS_WITH(it + 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.begin(); - CHECK_THROWS_AS(it -= 1, std::domain_error); - CHECK_THROWS_WITH(it -= 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.cbegin(); - CHECK_THROWS_AS(it -= 1, std::domain_error); - CHECK_THROWS_WITH(it -= 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.begin(); - CHECK_THROWS_AS(it - 1, std::domain_error); - CHECK_THROWS_WITH(it - 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.cbegin(); - CHECK_THROWS_AS(it - 1, std::domain_error); - CHECK_THROWS_WITH(it - 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.begin(); - CHECK_THROWS_AS(it - it, std::domain_error); - CHECK_THROWS_WITH(it - it, "cannot use offsets with object iterators"); - } - { - auto it = j_object.cbegin(); - CHECK_THROWS_AS(it - it, std::domain_error); - CHECK_THROWS_WITH(it - it, "cannot use offsets with object iterators"); - } - } - - SECTION("array") - { - { - auto it = j_array.begin(); - it += 3; - CHECK((j_array.begin() + 3) == it); - CHECK((it - 3) == j_array.begin()); - CHECK((it - j_array.begin()) == 3); - CHECK(*it == json(4)); - it -= 2; - CHECK(*it == json(2)); - } - { - auto it = j_array.cbegin(); - it += 3; - CHECK((j_array.cbegin() + 3) == it); - CHECK((it - 3) == j_array.cbegin()); - CHECK((it - j_array.cbegin()) == 3); - CHECK(*it == json(4)); - it -= 2; - CHECK(*it == json(2)); - } - } - - SECTION("null") - { - { - auto it = j_null.begin(); - it += 3; - CHECK((j_null.begin() + 3) == it); - CHECK((it - 3) == j_null.begin()); - CHECK((it - j_null.begin()) == 3); - CHECK(it != j_null.end()); - it -= 3; - CHECK(it == j_null.end()); - } - { - auto it = j_null.cbegin(); - it += 3; - CHECK((j_null.cbegin() + 3) == it); - CHECK((it - 3) == j_null.cbegin()); - CHECK((it - j_null.cbegin()) == 3); - CHECK(it != j_null.cend()); - it -= 3; - CHECK(it == j_null.cend()); - } - } - - SECTION("value") - { - { - auto it = j_value.begin(); - it += 3; - CHECK((j_value.begin() + 3) == it); - CHECK((it - 3) == j_value.begin()); - CHECK((it - j_value.begin()) == 3); - CHECK(it != j_value.end()); - it -= 3; - CHECK(*it == json(42)); - } - { - auto it = j_value.cbegin(); - it += 3; - CHECK((j_value.cbegin() + 3) == it); - CHECK((it - 3) == j_value.cbegin()); - CHECK((it - j_value.cbegin()) == 3); - CHECK(it != j_value.cend()); - it -= 3; - CHECK(*it == json(42)); - } - } - } - - SECTION("subscript operator") - { - SECTION("object") - { - { - auto it = j_object.begin(); - CHECK_THROWS_AS(it[0], std::domain_error); - CHECK_THROWS_AS(it[1], std::domain_error); - CHECK_THROWS_WITH(it[0], "cannot use operator[] for object iterators"); - CHECK_THROWS_WITH(it[1], "cannot use operator[] for object iterators"); - } - { - auto it = j_object.cbegin(); - CHECK_THROWS_AS(it[0], std::domain_error); - CHECK_THROWS_AS(it[1], std::domain_error); - CHECK_THROWS_WITH(it[0], "cannot use operator[] for object iterators"); - CHECK_THROWS_WITH(it[1], "cannot use operator[] for object iterators"); - } - } - - SECTION("array") - { - { - auto it = j_array.begin(); - CHECK(it[0] == json(1)); - CHECK(it[1] == json(2)); - CHECK(it[2] == json(3)); - CHECK(it[3] == json(4)); - CHECK(it[4] == json(5)); - CHECK(it[5] == json(6)); - } - { - auto it = j_array.cbegin(); - CHECK(it[0] == json(1)); - CHECK(it[1] == json(2)); - CHECK(it[2] == json(3)); - CHECK(it[3] == json(4)); - CHECK(it[4] == json(5)); - CHECK(it[5] == json(6)); - } - } - - SECTION("null") - { - { - auto it = j_null.begin(); - CHECK_THROWS_AS(it[0], std::out_of_range); - CHECK_THROWS_AS(it[1], std::out_of_range); - CHECK_THROWS_WITH(it[0], "cannot get value"); - CHECK_THROWS_WITH(it[1], "cannot get value"); - } - { - auto it = j_null.cbegin(); - CHECK_THROWS_AS(it[0], std::out_of_range); - CHECK_THROWS_AS(it[1], std::out_of_range); - CHECK_THROWS_WITH(it[0], "cannot get value"); - CHECK_THROWS_WITH(it[1], "cannot get value"); - } - } - - SECTION("value") - { - { - auto it = j_value.begin(); - CHECK(it[0] == json(42)); - CHECK_THROWS_AS(it[1], std::out_of_range); - CHECK_THROWS_WITH(it[1], "cannot get value"); - } - { - auto it = j_value.cbegin(); - CHECK(it[0] == json(42)); - CHECK_THROWS_AS(it[1], std::out_of_range); - CHECK_THROWS_WITH(it[1], "cannot get value"); - } - } - } - } - - SECTION("reverse iterator comparisons") - { - json j_values = {nullptr, true, 42, 42u, 23.23, {{"one", 1}, {"two", 2}}, {1, 2, 3, 4, 5}, "Hello, world"}; - - for (json& j : j_values) - { - auto it1 = j.rbegin(); - auto it2 = j.rbegin(); - auto it3 = j.rbegin(); - ++it2; - ++it3; - ++it3; - auto it1_c = j.crbegin(); - auto it2_c = j.crbegin(); - auto it3_c = j.crbegin(); - ++it2_c; - ++it3_c; - ++it3_c; - - // comparison: equal - { - CHECK(it1 == it1); - CHECK(not (it1 == it2)); - CHECK(not (it1 == it3)); - CHECK(not (it2 == it3)); - CHECK(it1_c == it1_c); - CHECK(not (it1_c == it2_c)); - CHECK(not (it1_c == it3_c)); - CHECK(not (it2_c == it3_c)); - } - - // comparison: not equal - { - // check definition - CHECK( (it1 != it1) == not(it1 == it1) ); - CHECK( (it1 != it2) == not(it1 == it2) ); - CHECK( (it1 != it3) == not(it1 == it3) ); - CHECK( (it2 != it3) == not(it2 == it3) ); - CHECK( (it1_c != it1_c) == not(it1_c == it1_c) ); - CHECK( (it1_c != it2_c) == not(it1_c == it2_c) ); - CHECK( (it1_c != it3_c) == not(it1_c == it3_c) ); - CHECK( (it2_c != it3_c) == not(it2_c == it3_c) ); - } - - // comparison: smaller - { - if (j.type() == json::value_t::object) - { - CHECK_THROWS_AS(it1 < it1, std::domain_error); - CHECK_THROWS_AS(it1 < it2, std::domain_error); - CHECK_THROWS_AS(it2 < it3, std::domain_error); - CHECK_THROWS_AS(it1 < it3, std::domain_error); - CHECK_THROWS_AS(it1_c < it1_c, std::domain_error); - CHECK_THROWS_AS(it1_c < it2_c, std::domain_error); - CHECK_THROWS_AS(it2_c < it3_c, std::domain_error); - CHECK_THROWS_AS(it1_c < it3_c, std::domain_error); - CHECK_THROWS_WITH(it1 < it1, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 < it2, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2 < it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 < it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c < it1_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c < it2_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2_c < it3_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c < it3_c, "cannot compare order of object iterators"); - } - else - { - CHECK(not (it1 < it1)); - CHECK(it1 < it2); - CHECK(it1 < it3); - CHECK(it2 < it3); - CHECK(not (it1_c < it1_c)); - CHECK(it1_c < it2_c); - CHECK(it1_c < it3_c); - CHECK(it2_c < it3_c); - } - } - - // comparison: less than or equal - { - if (j.type() == json::value_t::object) - { - CHECK_THROWS_AS(it1 <= it1, std::domain_error); - CHECK_THROWS_AS(it1 <= it2, std::domain_error); - CHECK_THROWS_AS(it2 <= it3, std::domain_error); - CHECK_THROWS_AS(it1 <= it3, std::domain_error); - CHECK_THROWS_AS(it1_c <= it1_c, std::domain_error); - CHECK_THROWS_AS(it1_c <= it2_c, std::domain_error); - CHECK_THROWS_AS(it2_c <= it3_c, std::domain_error); - CHECK_THROWS_AS(it1_c <= it3_c, std::domain_error); - CHECK_THROWS_WITH(it1 <= it1, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 <= it2, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2 <= it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 <= it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c <= it1_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c <= it2_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2_c <= it3_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c <= it3_c, "cannot compare order of object iterators"); - } - else - { - // check definition - CHECK( (it1 <= it1) == not(it1 < it1) ); - CHECK( (it1 <= it2) == not(it2 < it1) ); - CHECK( (it1 <= it3) == not(it3 < it1) ); - CHECK( (it2 <= it3) == not(it3 < it2) ); - CHECK( (it1_c <= it1_c) == not(it1_c < it1_c) ); - CHECK( (it1_c <= it2_c) == not(it2_c < it1_c) ); - CHECK( (it1_c <= it3_c) == not(it3_c < it1_c) ); - CHECK( (it2_c <= it3_c) == not(it3_c < it2_c) ); - } - } - - // comparison: greater than - { - if (j.type() == json::value_t::object) - { - CHECK_THROWS_AS(it1 > it1, std::domain_error); - CHECK_THROWS_AS(it1 > it2, std::domain_error); - CHECK_THROWS_AS(it2 > it3, std::domain_error); - CHECK_THROWS_AS(it1 > it3, std::domain_error); - CHECK_THROWS_AS(it1_c > it1_c, std::domain_error); - CHECK_THROWS_AS(it1_c > it2_c, std::domain_error); - CHECK_THROWS_AS(it2_c > it3_c, std::domain_error); - CHECK_THROWS_AS(it1_c > it3_c, std::domain_error); - CHECK_THROWS_WITH(it1 > it1, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 > it2, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2 > it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 > it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c > it1_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c > it2_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2_c > it3_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c > it3_c, "cannot compare order of object iterators"); - } - else - { - // check definition - CHECK( (it1 > it1) == (it1 < it1) ); - CHECK( (it1 > it2) == (it2 < it1) ); - CHECK( (it1 > it3) == (it3 < it1) ); - CHECK( (it2 > it3) == (it3 < it2) ); - CHECK( (it1_c > it1_c) == (it1_c < it1_c) ); - CHECK( (it1_c > it2_c) == (it2_c < it1_c) ); - CHECK( (it1_c > it3_c) == (it3_c < it1_c) ); - CHECK( (it2_c > it3_c) == (it3_c < it2_c) ); - } - } - - // comparison: greater than or equal - { - if (j.type() == json::value_t::object) - { - CHECK_THROWS_AS(it1 >= it1, std::domain_error); - CHECK_THROWS_AS(it1 >= it2, std::domain_error); - CHECK_THROWS_AS(it2 >= it3, std::domain_error); - CHECK_THROWS_AS(it1 >= it3, std::domain_error); - CHECK_THROWS_AS(it1_c >= it1_c, std::domain_error); - CHECK_THROWS_AS(it1_c >= it2_c, std::domain_error); - CHECK_THROWS_AS(it2_c >= it3_c, std::domain_error); - CHECK_THROWS_AS(it1_c >= it3_c, std::domain_error); - CHECK_THROWS_WITH(it1 >= it1, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 >= it2, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2 >= it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1 >= it3, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c >= it1_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c >= it2_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it2_c >= it3_c, "cannot compare order of object iterators"); - CHECK_THROWS_WITH(it1_c >= it3_c, "cannot compare order of object iterators"); - } - else - { - // check definition - CHECK( (it1 >= it1) == not(it1 < it1) ); - CHECK( (it1 >= it2) == not(it1 < it2) ); - CHECK( (it1 >= it3) == not(it1 < it3) ); - CHECK( (it2 >= it3) == not(it2 < it3) ); - CHECK( (it1_c >= it1_c) == not(it1_c < it1_c) ); - CHECK( (it1_c >= it2_c) == not(it1_c < it2_c) ); - CHECK( (it1_c >= it3_c) == not(it1_c < it3_c) ); - CHECK( (it2_c >= it3_c) == not(it2_c < it3_c) ); - } - } - } - - // check exceptions if different objects are compared - for (auto j : j_values) - { - for (auto k : j_values) - { - if (j != k) - { - CHECK_THROWS_AS(j.rbegin() == k.rbegin(), std::domain_error); - CHECK_THROWS_AS(j.crbegin() == k.crbegin(), std::domain_error); - CHECK_THROWS_WITH(j.rbegin() == k.rbegin(), "cannot compare iterators of different containers"); - CHECK_THROWS_WITH(j.crbegin() == k.crbegin(), "cannot compare iterators of different containers"); - - CHECK_THROWS_AS(j.rbegin() < k.rbegin(), std::domain_error); - CHECK_THROWS_AS(j.crbegin() < k.crbegin(), std::domain_error); - CHECK_THROWS_WITH(j.rbegin() < k.rbegin(), "cannot compare iterators of different containers"); - CHECK_THROWS_WITH(j.crbegin() < k.crbegin(), "cannot compare iterators of different containers"); - } - } - } - } - - SECTION("reverse iterator arithmetic") - { - json j_object = {{"one", 1}, {"two", 2}, {"three", 3}}; - json j_array = {1, 2, 3, 4, 5, 6}; - json j_null = nullptr; - json j_value = 42; - - SECTION("addition and subtraction") - { - SECTION("object") - { - { - auto it = j_object.rbegin(); - CHECK_THROWS_AS(it += 1, std::domain_error); - CHECK_THROWS_WITH(it += 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.crbegin(); - CHECK_THROWS_AS(it += 1, std::domain_error); - CHECK_THROWS_WITH(it += 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.rbegin(); - CHECK_THROWS_AS(it + 1, std::domain_error); - CHECK_THROWS_WITH(it + 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.crbegin(); - CHECK_THROWS_AS(it + 1, std::domain_error); - CHECK_THROWS_WITH(it + 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.rbegin(); - CHECK_THROWS_AS(it -= 1, std::domain_error); - CHECK_THROWS_WITH(it -= 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.crbegin(); - CHECK_THROWS_AS(it -= 1, std::domain_error); - CHECK_THROWS_WITH(it -= 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.rbegin(); - CHECK_THROWS_AS(it - 1, std::domain_error); - CHECK_THROWS_WITH(it - 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.crbegin(); - CHECK_THROWS_AS(it - 1, std::domain_error); - CHECK_THROWS_WITH(it - 1, "cannot use offsets with object iterators"); - } - { - auto it = j_object.rbegin(); - CHECK_THROWS_AS(it - it, std::domain_error); - CHECK_THROWS_WITH(it - it, "cannot use offsets with object iterators"); - } - { - auto it = j_object.crbegin(); - CHECK_THROWS_AS(it - it, std::domain_error); - CHECK_THROWS_WITH(it - it, "cannot use offsets with object iterators"); - } - } - - SECTION("array") - { - { - auto it = j_array.rbegin(); - it += 3; - CHECK((j_array.rbegin() + 3) == it); - CHECK((it - 3) == j_array.rbegin()); - CHECK((j_array.rbegin() - it) == 3); - CHECK(*it == json(3)); - it -= 2; - CHECK(*it == json(5)); - } - { - auto it = j_array.crbegin(); - it += 3; - CHECK((j_array.crbegin() + 3) == it); - CHECK((it - 3) == j_array.crbegin()); - CHECK((j_array.crbegin() - it) == 3); - CHECK(*it == json(3)); - it -= 2; - CHECK(*it == json(5)); - } - } - - SECTION("null") - { - { - auto it = j_null.rbegin(); - it += 3; - CHECK((j_null.rbegin() + 3) == it); - CHECK((it - 3) == j_null.rbegin()); - CHECK((j_null.rbegin() - it) == 3); - CHECK(it != j_null.rend()); - it -= 3; - CHECK(it == j_null.rend()); - } - { - auto it = j_null.crbegin(); - it += 3; - CHECK((j_null.crbegin() + 3) == it); - CHECK((it - 3) == j_null.crbegin()); - CHECK((j_null.crbegin() - it) == 3); - CHECK(it != j_null.crend()); - it -= 3; - CHECK(it == j_null.crend()); - } - } - - SECTION("value") - { - { - auto it = j_value.rbegin(); - it += 3; - CHECK((j_value.rbegin() + 3) == it); - CHECK((it - 3) == j_value.rbegin()); - CHECK((j_value.rbegin() - it) == 3); - CHECK(it != j_value.rend()); - it -= 3; - CHECK(*it == json(42)); - } - { - auto it = j_value.crbegin(); - it += 3; - CHECK((j_value.crbegin() + 3) == it); - CHECK((it - 3) == j_value.crbegin()); - CHECK((j_value.crbegin() - it) == 3); - CHECK(it != j_value.crend()); - it -= 3; - CHECK(*it == json(42)); - } - } - } - - SECTION("subscript operator") - { - SECTION("object") - { - { - auto it = j_object.rbegin(); - CHECK_THROWS_AS(it[0], std::domain_error); - CHECK_THROWS_AS(it[1], std::domain_error); - CHECK_THROWS_WITH(it[0], "cannot use offsets with object iterators"); - CHECK_THROWS_WITH(it[1], "cannot use offsets with object iterators"); - } - { - auto it = j_object.crbegin(); - CHECK_THROWS_AS(it[0], std::domain_error); - CHECK_THROWS_AS(it[1], std::domain_error); - CHECK_THROWS_WITH(it[0], "cannot use offsets with object iterators"); - CHECK_THROWS_WITH(it[1], "cannot use offsets with object iterators"); - } - } - - SECTION("array") - { - { - auto it = j_array.rbegin(); - CHECK(it[0] == json(6)); - CHECK(it[1] == json(5)); - CHECK(it[2] == json(4)); - CHECK(it[3] == json(3)); - CHECK(it[4] == json(2)); - CHECK(it[5] == json(1)); - } - { - auto it = j_array.crbegin(); - CHECK(it[0] == json(6)); - CHECK(it[1] == json(5)); - CHECK(it[2] == json(4)); - CHECK(it[3] == json(3)); - CHECK(it[4] == json(2)); - CHECK(it[5] == json(1)); - } - } - - SECTION("null") - { - { - auto it = j_null.rbegin(); - CHECK_THROWS_AS(it[0], std::out_of_range); - CHECK_THROWS_AS(it[1], std::out_of_range); - CHECK_THROWS_WITH(it[0], "cannot get value"); - CHECK_THROWS_WITH(it[1], "cannot get value"); - } - { - auto it = j_null.crbegin(); - CHECK_THROWS_AS(it[0], std::out_of_range); - CHECK_THROWS_AS(it[1], std::out_of_range); - CHECK_THROWS_WITH(it[0], "cannot get value"); - CHECK_THROWS_WITH(it[1], "cannot get value"); - } - } - - SECTION("value") - { - { - auto it = j_value.rbegin(); - CHECK(it[0] == json(42)); - CHECK_THROWS_AS(it[1], std::out_of_range); - CHECK_THROWS_WITH(it[1], "cannot get value"); - } - { - auto it = j_value.crbegin(); - CHECK(it[0] == json(42)); - CHECK_THROWS_AS(it[1], std::out_of_range); - CHECK_THROWS_WITH(it[1], "cannot get value"); - } - } - } - } -} - -TEST_CASE("capacity") -{ - SECTION("empty()") - { - SECTION("boolean") - { - json j = true; - json j_const(j); - - SECTION("result of empty") - { - CHECK(j.empty() == false); - CHECK(j_const.empty() == false); - } - - SECTION("definition of empty") - { - CHECK(j.begin() != j.end()); - CHECK(j_const.begin() != j_const.end()); - } - } - - SECTION("string") - { - json j = "hello world"; - json j_const(j); - - SECTION("result of empty") - { - CHECK(j.empty() == false); - CHECK(j_const.empty() == false); - } - - SECTION("definition of empty") - { - CHECK(j.begin() != j.end()); - CHECK(j_const.begin() != j_const.end()); - } - } - - SECTION("array") - { - SECTION("empty array") - { - json j = json::array(); - json j_const(j); - - SECTION("result of empty") - { - CHECK(j.empty() == true); - CHECK(j_const.empty() == true); - } - - SECTION("definition of empty") - { - CHECK(j.begin() == j.end()); - CHECK(j_const.begin() == j_const.end()); - } - } - - SECTION("filled array") - { - json j = {1, 2, 3}; - json j_const(j); - - SECTION("result of empty") - { - CHECK(j.empty() == false); - CHECK(j_const.empty() == false); - } - - SECTION("definition of empty") - { - CHECK(j.begin() != j.end()); - CHECK(j_const.begin() != j_const.end()); - } - } - } - - SECTION("object") - { - SECTION("empty object") - { - json j = json::object(); - json j_const(j); - - SECTION("result of empty") - { - CHECK(j.empty() == true); - CHECK(j_const.empty() == true); - } - - SECTION("definition of empty") - { - CHECK(j.begin() == j.end()); - CHECK(j_const.begin() == j_const.end()); - } - } - - SECTION("filled object") - { - json j = {{"one", 1}, {"two", 2}, {"three", 3}}; - json j_const(j); - - SECTION("result of empty") - { - CHECK(j.empty() == false); - CHECK(j_const.empty() == false); - } - - SECTION("definition of empty") - { - CHECK(j.begin() != j.end()); - CHECK(j_const.begin() != j_const.end()); - } - } - } - - SECTION("number (integer)") - { - json j = 23; - json j_const(j); - - SECTION("result of empty") - { - CHECK(j.empty() == false); - CHECK(j_const.empty() == false); - } - - SECTION("definition of empty") - { - CHECK(j.begin() != j.end()); - CHECK(j_const.begin() != j_const.end()); - } - } - - SECTION("number (unsigned)") - { - json j = 23u; - json j_const(j); - - SECTION("result of empty") - { - CHECK(j.empty() == false); - CHECK(j_const.empty() == false); - } - - SECTION("definition of empty") - { - CHECK(j.begin() != j.end()); - CHECK(j_const.begin() != j_const.end()); - } - } - - SECTION("number (float)") - { - json j = 23.42; - json j_const(j); - - SECTION("result of empty") - { - CHECK(j.empty() == false); - CHECK(j_const.empty() == false); - } - - SECTION("definition of empty") - { - CHECK(j.begin() != j.end()); - CHECK(j_const.begin() != j_const.end()); - } - } - - SECTION("null") - { - json j = nullptr; - json j_const(j); - - SECTION("result of empty") - { - CHECK(j.empty() == true); - CHECK(j_const.empty() == true); - } - - SECTION("definition of empty") - { - CHECK(j.begin() == j.end()); - CHECK(j_const.begin() == j_const.end()); - } - } - } - - SECTION("size()") - { - SECTION("boolean") - { - json j = true; - json j_const(j); - - SECTION("result of size") - { - CHECK(j.size() == 1); - CHECK(j_const.size() == 1); - } - - SECTION("definition of size") - { - CHECK(std::distance(j.begin(), j.end()) == j.size()); - CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size()); - CHECK(std::distance(j.rbegin(), j.rend()) == j.size()); - CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size()); - } - } - - SECTION("string") - { - json j = "hello world"; - json j_const(j); - - SECTION("result of size") - { - CHECK(j.size() == 1); - CHECK(j_const.size() == 1); - } - - SECTION("definition of size") - { - CHECK(std::distance(j.begin(), j.end()) == j.size()); - CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size()); - CHECK(std::distance(j.rbegin(), j.rend()) == j.size()); - CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size()); - } - } - - SECTION("array") - { - SECTION("empty array") - { - json j = json::array(); - json j_const(j); - - SECTION("result of size") - { - CHECK(j.size() == 0); - CHECK(j_const.size() == 0); - } - - SECTION("definition of size") - { - CHECK(std::distance(j.begin(), j.end()) == j.size()); - CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size()); - CHECK(std::distance(j.rbegin(), j.rend()) == j.size()); - CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size()); - } - } - - SECTION("filled array") - { - json j = {1, 2, 3}; - json j_const(j); - - SECTION("result of size") - { - CHECK(j.size() == 3); - CHECK(j_const.size() == 3); - } - - SECTION("definition of size") - { - CHECK(std::distance(j.begin(), j.end()) == j.size()); - CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size()); - CHECK(std::distance(j.rbegin(), j.rend()) == j.size()); - CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size()); - } - } - } - - SECTION("object") - { - SECTION("empty object") - { - json j = json::object(); - json j_const(j); - - SECTION("result of size") - { - CHECK(j.size() == 0); - CHECK(j_const.size() == 0); - } - - SECTION("definition of size") - { - CHECK(std::distance(j.begin(), j.end()) == j.size()); - CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size()); - CHECK(std::distance(j.rbegin(), j.rend()) == j.size()); - CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size()); - } - } - - SECTION("filled object") - { - json j = {{"one", 1}, {"two", 2}, {"three", 3}}; - json j_const(j); - - SECTION("result of size") - { - CHECK(j.size() == 3); - CHECK(j_const.size() == 3); - } - - SECTION("definition of size") - { - CHECK(std::distance(j.begin(), j.end()) == j.size()); - CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size()); - CHECK(std::distance(j.rbegin(), j.rend()) == j.size()); - CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size()); - } - } - } - - SECTION("number (integer)") - { - json j = 23; - json j_const(j); - - SECTION("result of size") - { - CHECK(j.size() == 1); - CHECK(j_const.size() == 1); - } - - SECTION("definition of size") - { - CHECK(std::distance(j.begin(), j.end()) == j.size()); - CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size()); - CHECK(std::distance(j.rbegin(), j.rend()) == j.size()); - CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size()); - } - } - - SECTION("number (unsigned)") - { - json j = 23u; - json j_const(j); - - SECTION("result of size") - { - CHECK(j.size() == 1); - CHECK(j_const.size() == 1); - } - - SECTION("definition of size") - { - CHECK(std::distance(j.begin(), j.end()) == j.size()); - CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size()); - CHECK(std::distance(j.rbegin(), j.rend()) == j.size()); - CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size()); - } - } - - SECTION("number (float)") - { - json j = 23.42; - json j_const(j); - - SECTION("result of size") - { - CHECK(j.size() == 1); - CHECK(j_const.size() == 1); - } - - SECTION("definition of size") - { - CHECK(std::distance(j.begin(), j.end()) == j.size()); - CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size()); - CHECK(std::distance(j.rbegin(), j.rend()) == j.size()); - CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size()); - } - } - - SECTION("null") - { - json j = nullptr; - json j_const(j); - - SECTION("result of size") - { - CHECK(j.size() == 0); - CHECK(j_const.size() == 0); - } - - SECTION("definition of size") - { - CHECK(std::distance(j.begin(), j.end()) == j.size()); - CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size()); - CHECK(std::distance(j.rbegin(), j.rend()) == j.size()); - CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size()); - } - } - } - - SECTION("max_size()") - { - SECTION("boolean") - { - json j = true; - json j_const(j); - - SECTION("result of max_size") - { - CHECK(j.max_size() == 1); - CHECK(j_const.max_size() == 1); - } - } - - SECTION("string") - { - json j = "hello world"; - json j_const(j); - - SECTION("result of max_size") - { - CHECK(j.max_size() == 1); - CHECK(j_const.max_size() == 1); - } - } - - SECTION("array") - { - SECTION("empty array") - { - json j = json::array(); - json j_const(j); - - SECTION("result of max_size") - { - CHECK(j.max_size() >= j.size()); - CHECK(j_const.max_size() >= j_const.size()); - } - } - - SECTION("filled array") - { - json j = {1, 2, 3}; - json j_const(j); - - SECTION("result of max_size") - { - CHECK(j.max_size() >= j.size()); - CHECK(j_const.max_size() >= j_const.size()); - } - } - } - - SECTION("object") - { - SECTION("empty object") - { - json j = json::object(); - json j_const(j); - - SECTION("result of max_size") - { - CHECK(j.max_size() >= j.size()); - CHECK(j_const.max_size() >= j_const.size()); - } - } - - SECTION("filled object") - { - json j = {{"one", 1}, {"two", 2}, {"three", 3}}; - json j_const(j); - - SECTION("result of max_size") - { - CHECK(j.max_size() >= j.size()); - CHECK(j_const.max_size() >= j_const.size()); - } - } - } - - SECTION("number (integer)") - { - json j = 23; - json j_const(j); - - SECTION("result of max_size") - { - CHECK(j.max_size() == 1); - CHECK(j_const.max_size() == 1); - } - } - - SECTION("number (unsigned)") - { - json j = 23u; - json j_const(j); - - SECTION("result of max_size") - { - CHECK(j.max_size() == 1); - CHECK(j_const.max_size() == 1); - } - } - - SECTION("number (float)") - { - json j = 23.42; - json j_const(j); - - SECTION("result of max_size") - { - CHECK(j.max_size() == 1); - CHECK(j_const.max_size() == 1); - } - } - - SECTION("null") - { - json j = nullptr; - json j_const(j); - - SECTION("result of max_size") - { - CHECK(j.max_size() == 0); - CHECK(j_const.max_size() == 0); - } - } - } -} - -TEST_CASE("modifiers") -{ - SECTION("clear()") - { - SECTION("boolean") - { - json j = true; - - j.clear(); - CHECK(j == json(json::value_t::boolean)); - } - - SECTION("string") - { - json j = "hello world"; - - j.clear(); - CHECK(j == json(json::value_t::string)); - } - - SECTION("array") - { - SECTION("empty array") - { - json j = json::array(); - - j.clear(); - CHECK(j.empty()); - CHECK(j == json(json::value_t::array)); - } - - SECTION("filled array") - { - json j = {1, 2, 3}; - - j.clear(); - CHECK(j.empty()); - CHECK(j == json(json::value_t::array)); - } - } - - SECTION("object") - { - SECTION("empty object") - { - json j = json::object(); - - j.clear(); - CHECK(j.empty()); - CHECK(j == json(json::value_t::object)); - } - - SECTION("filled object") - { - json j = {{"one", 1}, {"two", 2}, {"three", 3}}; - - j.clear(); - CHECK(j.empty()); - CHECK(j == json(json::value_t::object)); - } - } - - SECTION("number (integer)") - { - json j = 23; - - j.clear(); - CHECK(j == json(json::value_t::number_integer)); - } - - SECTION("number (unsigned)") - { - json j = 23u; - - j.clear(); - CHECK(j == json(json::value_t::number_integer)); - } - - SECTION("number (float)") - { - json j = 23.42; - - j.clear(); - CHECK(j == json(json::value_t::number_float)); - } - - SECTION("null") - { - json j = nullptr; - - j.clear(); - CHECK(j == json(json::value_t::null)); - } - } - - SECTION("push_back()") - { - SECTION("to array") - { - SECTION("json&&") - { - SECTION("null") - { - json j; - j.push_back(1); - j.push_back(2); - CHECK(j.type() == json::value_t::array); - CHECK(j == json({1, 2})); - } - - SECTION("array") - { - json j = {1, 2, 3}; - j.push_back("Hello"); - CHECK(j.type() == json::value_t::array); - CHECK(j == json({1, 2, 3, "Hello"})); - } - - SECTION("other type") - { - json j = 1; - CHECK_THROWS_AS(j.push_back("Hello"), std::domain_error); - CHECK_THROWS_WITH(j.push_back("Hello"), "cannot use push_back() with number"); - } - } - - SECTION("const json&") - { - SECTION("null") - { - json j; - json k(1); - j.push_back(k); - j.push_back(k); - CHECK(j.type() == json::value_t::array); - CHECK(j == json({1, 1})); - } - - SECTION("array") - { - json j = {1, 2, 3}; - json k("Hello"); - j.push_back(k); - CHECK(j.type() == json::value_t::array); - CHECK(j == json({1, 2, 3, "Hello"})); - } - - SECTION("other type") - { - json j = 1; - json k("Hello"); - CHECK_THROWS_AS(j.push_back(k), std::domain_error); - CHECK_THROWS_WITH(j.push_back(k), "cannot use push_back() with number"); - } - } - } - - SECTION("to object") - { - SECTION("null") - { - json j; - j.push_back(json::object_t::value_type({"one", 1})); - j.push_back(json::object_t::value_type({"two", 2})); - CHECK(j.type() == json::value_t::object); - CHECK(j.size() == 2); - CHECK(j["one"] == json(1)); - CHECK(j["two"] == json(2)); - } - - SECTION("object") - { - json j(json::value_t::object); - j.push_back(json::object_t::value_type({"one", 1})); - j.push_back(json::object_t::value_type({"two", 2})); - CHECK(j.size() == 2); - CHECK(j["one"] == json(1)); - CHECK(j["two"] == json(2)); - } - - SECTION("other type") - { - json j = 1; - json k("Hello"); - CHECK_THROWS_AS(j.push_back(json::object_t::value_type({"one", 1})), std::domain_error); - CHECK_THROWS_WITH(j.push_back(json::object_t::value_type({"one", 1})), - "cannot use push_back() with number"); - } - } - - SECTION("with initializer_list") - { - SECTION("null") - { - json j; - j.push_back({"foo", "bar"}); - CHECK(j == json::array({{"foo", "bar"}})); - - json k; - k.push_back({1, 2, 3}); - CHECK(k == json::array({{1, 2, 3}})); - } - - SECTION("array") - { - json j = {1, 2, 3}; - j.push_back({"foo", "bar"}); - CHECK(j == json({1, 2, 3, {"foo", "bar"}})); - - json k = {1, 2, 3}; - k.push_back({1, 2, 3}); - CHECK(k == json({1, 2, 3, {1, 2, 3}})); - } - - SECTION("object") - { - json j = {{"key1", 1}}; - j.push_back({"key2", "bar"}); - CHECK(j == json({{"key1", 1}, {"key2", "bar"}})); - - json k = {{"key1", 1}}; - CHECK_THROWS_AS(k.push_back({1, 2, 3, 4}), std::domain_error); - CHECK_THROWS_WITH(k.push_back({1, 2, 3, 4}), "cannot use push_back() with object"); - } - } - } - - SECTION("operator+=") - { - SECTION("to array") - { - SECTION("json&&") - { - SECTION("null") - { - json j; - j += 1; - j += 2; - CHECK(j.type() == json::value_t::array); - CHECK(j == json({1, 2})); - } - - SECTION("array") - { - json j = {1, 2, 3}; - j += "Hello"; - CHECK(j.type() == json::value_t::array); - CHECK(j == json({1, 2, 3, "Hello"})); - } - - SECTION("other type") - { - json j = 1; - CHECK_THROWS_AS(j += "Hello", std::domain_error); - CHECK_THROWS_WITH(j += "Hello", "cannot use push_back() with number"); - } - } - - SECTION("const json&") - { - SECTION("null") - { - json j; - json k(1); - j += k; - j += k; - CHECK(j.type() == json::value_t::array); - CHECK(j == json({1, 1})); - } - - SECTION("array") - { - json j = {1, 2, 3}; - json k("Hello"); - j += k; - CHECK(j.type() == json::value_t::array); - CHECK(j == json({1, 2, 3, "Hello"})); - } - - SECTION("other type") - { - json j = 1; - json k("Hello"); - CHECK_THROWS_AS(j += k, std::domain_error); - CHECK_THROWS_WITH(j += k, "cannot use push_back() with number"); - } - } - } - - SECTION("to object") - { - SECTION("null") - { - json j; - j += json::object_t::value_type({"one", 1}); - j += json::object_t::value_type({"two", 2}); - CHECK(j.type() == json::value_t::object); - CHECK(j.size() == 2); - CHECK(j["one"] == json(1)); - CHECK(j["two"] == json(2)); - } - - SECTION("object") - { - json j(json::value_t::object); - j += json::object_t::value_type({"one", 1}); - j += json::object_t::value_type({"two", 2}); - CHECK(j.size() == 2); - CHECK(j["one"] == json(1)); - CHECK(j["two"] == json(2)); - } - - SECTION("other type") - { - json j = 1; - json k("Hello"); - CHECK_THROWS_AS(j += json::object_t::value_type({"one", 1}), std::domain_error); - CHECK_THROWS_WITH(j += json::object_t::value_type({"one", 1}), - "cannot use push_back() with number"); - } - } - - SECTION("with initializer_list") - { - SECTION("null") - { - json j; - j += {"foo", "bar"}; - CHECK(j == json::array({{"foo", "bar"}})); - - json k; - k += {1, 2, 3}; - CHECK(k == json::array({{1, 2, 3}})); - } - - SECTION("array") - { - json j = {1, 2, 3}; - j += {"foo", "bar"}; - CHECK(j == json({1, 2, 3, {"foo", "bar"}})); - - json k = {1, 2, 3}; - k += {1, 2, 3}; - CHECK(k == json({1, 2, 3, {1, 2, 3}})); - } - - SECTION("object") - { - json j = {{"key1", 1}}; - j += {"key2", "bar"}; - CHECK(j == json({{"key1", 1}, {"key2", "bar"}})); - - json k = {{"key1", 1}}; - CHECK_THROWS_AS((k += {1, 2, 3, 4}), std::domain_error); - CHECK_THROWS_WITH((k += {1, 2, 3, 4}), "cannot use push_back() with object"); - } - } - } - - SECTION("insert") - { - json j_array = {1, 2, 3, 4}; - json j_value = 5; - - SECTION("value at position") - { - SECTION("insert before begin()") - { - auto it = j_array.insert(j_array.begin(), j_value); - CHECK(j_array.size() == 5); - CHECK(*it == j_value); - CHECK(j_array.begin() == it); - CHECK(j_array == json({5, 1, 2, 3, 4})); - } - - SECTION("insert in the middle") - { - auto it = j_array.insert(j_array.begin() + 2, j_value); - CHECK(j_array.size() == 5); - CHECK(*it == j_value); - CHECK((it - j_array.begin()) == 2); - CHECK(j_array == json({1, 2, 5, 3, 4})); - } - - SECTION("insert before end()") - { - auto it = j_array.insert(j_array.end(), j_value); - CHECK(j_array.size() == 5); - CHECK(*it == j_value); - CHECK((j_array.end() - it) == 1); - CHECK(j_array == json({1, 2, 3, 4, 5})); - } - } - - SECTION("rvalue at position") - { - SECTION("insert before begin()") - { - auto it = j_array.insert(j_array.begin(), 5); - CHECK(j_array.size() == 5); - CHECK(*it == j_value); - CHECK(j_array.begin() == it); - CHECK(j_array == json({5, 1, 2, 3, 4})); - } - - SECTION("insert in the middle") - { - auto it = j_array.insert(j_array.begin() + 2, 5); - CHECK(j_array.size() == 5); - CHECK(*it == j_value); - CHECK((it - j_array.begin()) == 2); - CHECK(j_array == json({1, 2, 5, 3, 4})); - } - - SECTION("insert before end()") - { - auto it = j_array.insert(j_array.end(), 5); - CHECK(j_array.size() == 5); - CHECK(*it == j_value); - CHECK((j_array.end() - it) == 1); - CHECK(j_array == json({1, 2, 3, 4, 5})); - } - } - - SECTION("copies at position") - { - SECTION("insert before begin()") - { - auto it = j_array.insert(j_array.begin(), 3, 5); - CHECK(j_array.size() == 7); - CHECK(*it == j_value); - CHECK(j_array.begin() == it); - CHECK(j_array == json({5, 5, 5, 1, 2, 3, 4})); - } - - SECTION("insert in the middle") - { - auto it = j_array.insert(j_array.begin() + 2, 3, 5); - CHECK(j_array.size() == 7); - CHECK(*it == j_value); - CHECK((it - j_array.begin()) == 2); - CHECK(j_array == json({1, 2, 5, 5, 5, 3, 4})); - } - - SECTION("insert before end()") - { - auto it = j_array.insert(j_array.end(), 3, 5); - CHECK(j_array.size() == 7); - CHECK(*it == j_value); - CHECK((j_array.end() - it) == 3); - CHECK(j_array == json({1, 2, 3, 4, 5, 5, 5})); - } - - SECTION("insert nothing (count = 0)") - { - auto pos = j_array.end(); - auto it = j_array.insert(j_array.end(), 0, 5); - CHECK(j_array.size() == 4); - CHECK(it == pos); - CHECK(j_array == json({1, 2, 3, 4})); - } - } - - SECTION("range") - { - json j_other_array = {"first", "second"}; - - SECTION("proper usage") - { - auto it = j_array.insert(j_array.end(), j_other_array.begin(), j_other_array.end()); - CHECK(j_array.size() == 6); - CHECK(*it == *j_other_array.begin()); - CHECK((j_array.end() - it) == 2); - CHECK(j_array == json({1, 2, 3, 4, "first", "second"})); - } - - SECTION("empty range") - { - auto it = j_array.insert(j_array.end(), j_other_array.begin(), j_other_array.begin()); - CHECK(j_array.size() == 4); - CHECK(it == j_array.end()); - CHECK(j_array == json({1, 2, 3, 4})); - } - - SECTION("invalid iterators") - { - json j_other_array2 = {"first", "second"}; - - CHECK_THROWS_AS(j_array.insert(j_array.end(), j_array.begin(), j_array.end()), std::domain_error); - CHECK_THROWS_AS(j_array.insert(j_array.end(), j_other_array.begin(), j_other_array2.end()), - std::domain_error); - - CHECK_THROWS_WITH(j_array.insert(j_array.end(), j_array.begin(), j_array.end()), - "passed iterators may not belong to container"); - CHECK_THROWS_WITH(j_array.insert(j_array.end(), j_other_array.begin(), j_other_array2.end()), - "iterators do not fit"); - } - } - - SECTION("initializer list at position") - { - SECTION("insert before begin()") - { - auto it = j_array.insert(j_array.begin(), {7, 8, 9}); - CHECK(j_array.size() == 7); - CHECK(*it == json(7)); - CHECK(j_array.begin() == it); - CHECK(j_array == json({7, 8, 9, 1, 2, 3, 4})); - } - - SECTION("insert in the middle") - { - auto it = j_array.insert(j_array.begin() + 2, {7, 8, 9}); - CHECK(j_array.size() == 7); - CHECK(*it == json(7)); - CHECK((it - j_array.begin()) == 2); - CHECK(j_array == json({1, 2, 7, 8, 9, 3, 4})); - } - - SECTION("insert before end()") - { - auto it = j_array.insert(j_array.end(), {7, 8, 9}); - CHECK(j_array.size() == 7); - CHECK(*it == json(7)); - CHECK((j_array.end() - it) == 3); - CHECK(j_array == json({1, 2, 3, 4, 7, 8, 9})); - } - } - - SECTION("invalid iterator") - { - // pass iterator to a different array - json j_another_array = {1, 2}; - json j_yet_another_array = {"first", "second"}; - CHECK_THROWS_AS(j_array.insert(j_another_array.end(), 10), std::domain_error); - CHECK_THROWS_AS(j_array.insert(j_another_array.end(), j_value), std::domain_error); - CHECK_THROWS_AS(j_array.insert(j_another_array.end(), 10, 11), std::domain_error); - CHECK_THROWS_AS(j_array.insert(j_another_array.end(), j_yet_another_array.begin(), - j_yet_another_array.end()), std::domain_error); - CHECK_THROWS_AS(j_array.insert(j_another_array.end(), {1, 2, 3, 4}), std::domain_error); - - CHECK_THROWS_WITH(j_array.insert(j_another_array.end(), 10), "iterator does not fit current value"); - CHECK_THROWS_WITH(j_array.insert(j_another_array.end(), j_value), - "iterator does not fit current value"); - CHECK_THROWS_WITH(j_array.insert(j_another_array.end(), 10, 11), - "iterator does not fit current value"); - CHECK_THROWS_WITH(j_array.insert(j_another_array.end(), j_yet_another_array.begin(), - j_yet_another_array.end()), "iterator does not fit current value"); - CHECK_THROWS_WITH(j_array.insert(j_another_array.end(), {1, 2, 3, 4}), - "iterator does not fit current value"); - } - - SECTION("non-array type") - { - // call insert on a non-array type - json j_nonarray = 3; - json j_yet_another_array = {"first", "second"}; - CHECK_THROWS_AS(j_nonarray.insert(j_nonarray.end(), 10), std::domain_error); - CHECK_THROWS_AS(j_nonarray.insert(j_nonarray.end(), j_value), std::domain_error); - CHECK_THROWS_AS(j_nonarray.insert(j_nonarray.end(), 10, 11), std::domain_error); - CHECK_THROWS_AS(j_nonarray.insert(j_nonarray.end(), j_yet_another_array.begin(), - j_yet_another_array.end()), std::domain_error); - CHECK_THROWS_AS(j_nonarray.insert(j_nonarray.end(), {1, 2, 3, 4}), std::domain_error); - - CHECK_THROWS_WITH(j_nonarray.insert(j_nonarray.end(), 10), "cannot use insert() with number"); - CHECK_THROWS_WITH(j_nonarray.insert(j_nonarray.end(), j_value), "cannot use insert() with number"); - CHECK_THROWS_WITH(j_nonarray.insert(j_nonarray.end(), 10, 11), "cannot use insert() with number"); - CHECK_THROWS_WITH(j_nonarray.insert(j_nonarray.end(), j_yet_another_array.begin(), - j_yet_another_array.end()), "cannot use insert() with number"); - CHECK_THROWS_WITH(j_nonarray.insert(j_nonarray.end(), {1, 2, 3, 4}), - "cannot use insert() with number"); - } - } - - SECTION("swap()") - { - SECTION("json") - { - SECTION("member swap") - { - json j("hello world"); - json k(42.23); - - j.swap(k); - - CHECK(j == json(42.23)); - CHECK(k == json("hello world")); - } - - SECTION("nonmember swap") - { - json j("hello world"); - json k(42.23); - - std::swap(j, k); - - CHECK(j == json(42.23)); - CHECK(k == json("hello world")); - } - } - - SECTION("array_t") - { - SECTION("array_t type") - { - json j = {1, 2, 3, 4}; - json::array_t a = {"foo", "bar", "baz"}; - - j.swap(a); - - CHECK(j == json({"foo", "bar", "baz"})); - - j.swap(a); - - CHECK(j == json({1, 2, 3, 4})); - } - - SECTION("non-array_t type") - { - json j = 17; - json::array_t a = {"foo", "bar", "baz"}; - - CHECK_THROWS_AS(j.swap(a), std::domain_error); - CHECK_THROWS_WITH(j.swap(a), "cannot use swap() with number"); - } - } - - SECTION("object_t") - { - SECTION("object_t type") - { - json j = {{"one", 1}, {"two", 2}}; - json::object_t o = {{"cow", "Kuh"}, {"chicken", "Huhn"}}; - - j.swap(o); - - CHECK(j == json({{"cow", "Kuh"}, {"chicken", "Huhn"}})); - - j.swap(o); - - CHECK(j == json({{"one", 1}, {"two", 2}})); - } - - SECTION("non-object_t type") - { - json j = 17; - json::object_t o = {{"cow", "Kuh"}, {"chicken", "Huhn"}}; - - CHECK_THROWS_AS(j.swap(o), std::domain_error); - CHECK_THROWS_WITH(j.swap(o), "cannot use swap() with number"); - } - } - - SECTION("string_t") - { - SECTION("string_t type") - { - json j = "Hello world"; - json::string_t s = "Hallo Welt"; - - j.swap(s); - - CHECK(j == json("Hallo Welt")); - - j.swap(s); - - CHECK(j == json("Hello world")); - } - - SECTION("non-string_t type") - { - json j = 17; - json::string_t s = "Hallo Welt"; - - CHECK_THROWS_AS(j.swap(s), std::domain_error); - CHECK_THROWS_WITH(j.swap(s), "cannot use swap() with number"); - } - } - } -} - -TEST_CASE("lexicographical comparison operators") -{ - SECTION("types") - { - std::vector j_types = - { - json::value_t::null, - json::value_t::boolean, - json::value_t::number_integer, - json::value_t::number_unsigned, - json::value_t::number_float, - json::value_t::object, - json::value_t::array, - json::value_t::string - }; - - SECTION("comparison: less") - { - std::vector> expected = - { - {false, true, true, true, true, true, true, true}, - {false, false, true, true, true, true, true, true}, - {false, false, false, false, false, true, true, true}, - {false, false, false, false, false, true, true, true}, - {false, false, false, false, false, true, true, true}, - {false, false, false, false, false, false, true, true}, - {false, false, false, false, false, false, false, true}, - {false, false, false, false, false, false, false, false} - }; - - for (size_t i = 0; i < j_types.size(); ++i) - { - for (size_t j = 0; j < j_types.size(); ++j) - { - CAPTURE(i); - CAPTURE(j); - // check precomputed values - CHECK(operator<(j_types[i], j_types[j]) == expected[i][j]); - } - } - } - } - - SECTION("values") - { - json j_values = - { - nullptr, nullptr, - 17, 42, - 8u, 13u, - 3.14159, 23.42, - "foo", "bar", - true, false, - {1, 2, 3}, {"one", "two", "three"}, - {{"first", 1}, {"second", 2}}, {{"a", "A"}, {"b", {"B"}}} - }; - - SECTION("comparison: equal") - { - std::vector> expected = - { - {true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, - {true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, - {false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false}, - {false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false}, - {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true} - }; - - for (size_t i = 0; i < j_values.size(); ++i) - { - for (size_t j = 0; j < j_values.size(); ++j) - { - CAPTURE(i); - CAPTURE(j); - // check precomputed values - CHECK( (j_values[i] == j_values[j]) == expected[i][j] ); - } - } - - // comparison with discarded elements - json j_discarded(json::value_t::discarded); - for (size_t i = 0; i < j_values.size(); ++i) - { - CHECK( (j_values[i] == j_discarded) == false); - CHECK( (j_discarded == j_values[i]) == false); - CHECK( (j_discarded == j_discarded) == false); - } - - // compare with null pointer - json j_null; - CHECK(j_null == nullptr); - CHECK(nullptr == j_null); - } - - SECTION("comparison: not equal") - { - for (size_t i = 0; i < j_values.size(); ++i) - { - for (size_t j = 0; j < j_values.size(); ++j) - { - CAPTURE(i); - CAPTURE(j); - // check definition - CHECK( (j_values[i] != j_values[j]) == not(j_values[i] == j_values[j]) ); - } - } - - // compare with null pointer - json j_null; - CHECK( (j_null != nullptr) == false); - CHECK( (nullptr != j_null) == false); - CHECK( (j_null != nullptr) == not(j_null == nullptr)); - CHECK( (nullptr != j_null) == not(nullptr == j_null)); - } - - SECTION("comparison: less") - { - std::vector> expected = - { - {false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true}, - {false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true}, - {false, false, false, true, false, false, false, true, true, true, false, false, true, true, true, true}, - {false, false, false, false, false, false, false, false, true, true, false, false, true, true, true, true}, - {false, false, true, true, false, true, false, true, true, true, false, false, true, true, true, true}, - {false, false, true, true, false, false, false, true, true, true, false, false, true, true, true, true}, - {false, false, true, true, true, true, false, true, true, true, false, false, true, true, true, true}, - {false, false, false, true, false, false, false, false, true, true, false, false, true, true, true, true}, - {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false}, - {false, false, true, true, true, true, true, true, true, true, false, false, true, true, true, true}, - {false, false, true, true, true, true, true, true, true, true, true, false, true, true, true, true}, - {false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, false}, - {false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, true, true, false, false, true, true, false, false}, - {false, false, false, false, false, false, false, false, true, true, false, false, true, true, true, false} - }; - - for (size_t i = 0; i < j_values.size(); ++i) - { - for (size_t j = 0; j < j_values.size(); ++j) - { - CAPTURE(i); - CAPTURE(j); - // check precomputed values - CHECK( (j_values[i] < j_values[j]) == expected[i][j] ); - } - } - - // comparison with discarded elements - json j_discarded(json::value_t::discarded); - for (size_t i = 0; i < j_values.size(); ++i) - { - CAPTURE(i); - CHECK( (j_values[i] < j_discarded) == false); - CHECK( (j_discarded < j_values[i]) == false); - CHECK( (j_discarded < j_discarded) == false); - } - } - - SECTION("comparison: less than or equal equal") - { - for (size_t i = 0; i < j_values.size(); ++i) - { - for (size_t j = 0; j < j_values.size(); ++j) - { - CAPTURE(i); - CAPTURE(j); - // check definition - CHECK( (j_values[i] <= j_values[j]) == not(j_values[j] < j_values[i]) ); - } - } - } - - SECTION("comparison: greater than") - { - for (size_t i = 0; i < j_values.size(); ++i) - { - for (size_t j = 0; j < j_values.size(); ++j) - { - CAPTURE(i); - CAPTURE(j); - // check definition - CHECK( (j_values[i] > j_values[j]) == (j_values[j] < j_values[i]) ); - } - } - } - - SECTION("comparison: greater than or equal") - { - for (size_t i = 0; i < j_values.size(); ++i) - { - for (size_t j = 0; j < j_values.size(); ++j) - { - CAPTURE(i); - CAPTURE(j); - // check definition - CHECK( (j_values[i] >= j_values[j]) == not(j_values[i] < j_values[j]) ); - } - } - } - } -} - -TEST_CASE("serialization") -{ - SECTION("operator<<") - { - SECTION("no given width") - { - std::stringstream ss; - json j = {"foo", 1, 2, 3, false, {{"one", 1}}}; - ss << j; - CHECK(ss.str() == "[\"foo\",1,2,3,false,{\"one\":1}]"); - } - - SECTION("given width") - { - std::stringstream ss; - json j = {"foo", 1, 2, 3, false, {{"one", 1}}}; - ss << std::setw(4) << j; - CHECK(ss.str() == - "[\n \"foo\",\n 1,\n 2,\n 3,\n false,\n {\n \"one\": 1\n }\n]"); - } - } - - SECTION("operator>>") - { - SECTION("no given width") - { - std::stringstream ss; - json j = {"foo", 1, 2, 3, false, {{"one", 1}}}; - j >> ss; - CHECK(ss.str() == "[\"foo\",1,2,3,false,{\"one\":1}]"); - } - - SECTION("given width") - { - std::stringstream ss; - json j = {"foo", 1, 2, 3, false, {{"one", 1}}}; - ss.width(4); - j >> ss; - CHECK(ss.str() == - "[\n \"foo\",\n 1,\n 2,\n 3,\n false,\n {\n \"one\": 1\n }\n]"); - } - } -} - -TEST_CASE("deserialization") -{ - SECTION("stream") - { - std::stringstream ss; - ss << "[\"foo\",1,2,3,false,{\"one\":1}]"; - json j = json::parse(ss); - CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}})); - } - - SECTION("string") - { - auto s = "[\"foo\",1,2,3,false,{\"one\":1}]"; - json j = json::parse(s); - CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}})); - } - - SECTION("operator<<") - { - std::stringstream ss; - ss << "[\"foo\",1,2,3,false,{\"one\":1}]"; - json j; - j << ss; - CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}})); - } - - SECTION("operator>>") - { - std::stringstream ss; - ss << "[\"foo\",1,2,3,false,{\"one\":1}]"; - json j; - ss >> j; - CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}})); - } - - SECTION("user-defined string literal") - { - CHECK("[\"foo\",1,2,3,false,{\"one\":1}]"_json == json({"foo", 1, 2, 3, false, {{"one", 1}}})); - } -} - -TEST_CASE("iterator class") -{ - SECTION("construction") - { - SECTION("constructor") - { - SECTION("null") - { - json j(json::value_t::null); - json::iterator it(&j); - } - - SECTION("object") - { - json j(json::value_t::object); - json::iterator it(&j); - } - - SECTION("array") - { - json j(json::value_t::array); - json::iterator it(&j); - } - } - - SECTION("copy assignment") - { - json j(json::value_t::null); - json::iterator it(&j); - json::iterator it2(&j); - it2 = it; - } - } - - SECTION("initialization") - { - SECTION("set_begin") - { - SECTION("null") - { - json j(json::value_t::null); - json::iterator it(&j); - it.set_begin(); - CHECK(it == j.begin()); - } - - SECTION("object") - { - json j(json::value_t::object); - json::iterator it(&j); - it.set_begin(); - CHECK(it == j.begin()); - } - - SECTION("array") - { - json j(json::value_t::array); - json::iterator it(&j); - it.set_begin(); - CHECK(it == j.begin()); - } - } - - SECTION("set_end") - { - SECTION("null") - { - json j(json::value_t::null); - json::iterator it(&j); - it.set_end(); - CHECK(it == j.end()); - } - - SECTION("object") - { - json j(json::value_t::object); - json::iterator it(&j); - it.set_end(); - CHECK(it == j.end()); - } - - SECTION("array") - { - json j(json::value_t::array); - json::iterator it(&j); - it.set_end(); - CHECK(it == j.end()); - } - } - } - - SECTION("element access") - { - SECTION("operator*") - { - SECTION("null") - { - json j(json::value_t::null); - json::iterator it = j.begin(); - CHECK_THROWS_AS(*it, std::out_of_range); - CHECK_THROWS_WITH(*it, "cannot get value"); - } - - SECTION("number") - { - json j(17); - json::iterator it = j.begin(); - CHECK(*it == json(17)); - it = j.end(); - CHECK_THROWS_AS(*it, std::out_of_range); - CHECK_THROWS_WITH(*it, "cannot get value"); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::iterator it = j.begin(); - CHECK(*it == json("bar")); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::iterator it = j.begin(); - CHECK(*it == json(1)); - } - } - - SECTION("operator->") - { - SECTION("null") - { - json j(json::value_t::null); - json::iterator it = j.begin(); - CHECK_THROWS_AS(it->type_name(), std::out_of_range); - CHECK_THROWS_WITH(it->type_name(), "cannot get value"); - } - - SECTION("number") - { - json j(17); - json::iterator it = j.begin(); - CHECK(it->type_name() == "number"); - it = j.end(); - CHECK_THROWS_AS(it->type_name(), std::out_of_range); - CHECK_THROWS_WITH(it->type_name(), "cannot get value"); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::iterator it = j.begin(); - CHECK(it->type_name() == "string"); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::iterator it = j.begin(); - CHECK(it->type_name() == "number"); - } - } - } - - SECTION("increment/decrement") - { - SECTION("post-increment") - { - SECTION("null") - { - json j(json::value_t::null); - json::iterator it = j.begin(); - CHECK(it.m_it.primitive_iterator == 1); - it++; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("number") - { - json j(17); - json::iterator it = j.begin(); - CHECK(it.m_it.primitive_iterator == 0); - it++; - CHECK(it.m_it.primitive_iterator == 1); - it++; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::iterator it = j.begin(); - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin()); - it++; - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end()); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::iterator it = j.begin(); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin()); - it++; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it++; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it++; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it++; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end()); - } - } - - SECTION("pre-increment") - { - SECTION("null") - { - json j(json::value_t::null); - json::iterator it = j.begin(); - CHECK(it.m_it.primitive_iterator == 1); - ++it; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("number") - { - json j(17); - json::iterator it = j.begin(); - CHECK(it.m_it.primitive_iterator == 0); - ++it; - CHECK(it.m_it.primitive_iterator == 1); - ++it; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::iterator it = j.begin(); - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin()); - ++it; - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end()); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::iterator it = j.begin(); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin()); - ++it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - ++it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - ++it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - ++it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end()); - } - } - - SECTION("post-decrement") - { - SECTION("null") - { - json j(json::value_t::null); - json::iterator it = j.end(); - CHECK(it.m_it.primitive_iterator == 1); - } - - SECTION("number") - { - json j(17); - json::iterator it = j.end(); - CHECK(it.m_it.primitive_iterator == 1); - it--; - CHECK(it.m_it.primitive_iterator == 0); - it--; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::iterator it = j.end(); - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end()); - it--; - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin()); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::iterator it = j.end(); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end()); - it--; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it--; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it--; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it--; - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - } - } - - SECTION("pre-decrement") - { - SECTION("null") - { - json j(json::value_t::null); - json::iterator it = j.end(); - CHECK(it.m_it.primitive_iterator == 1); - } - - SECTION("number") - { - json j(17); - json::iterator it = j.end(); - CHECK(it.m_it.primitive_iterator == 1); - --it; - CHECK(it.m_it.primitive_iterator == 0); - --it; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::iterator it = j.end(); - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end()); - --it; - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin()); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::iterator it = j.end(); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end()); - --it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - --it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - --it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - --it; - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - } - } - } -} - -TEST_CASE("const_iterator class") -{ - SECTION("construction") - { - SECTION("constructor") - { - SECTION("null") - { - json j(json::value_t::null); - json::const_iterator it(&j); - } - - SECTION("object") - { - json j(json::value_t::object); - json::const_iterator it(&j); - } - - SECTION("array") - { - json j(json::value_t::array); - json::const_iterator it(&j); - } - } - - SECTION("copy assignment") - { - json j(json::value_t::null); - json::const_iterator it(&j); - json::const_iterator it2(&j); - it2 = it; - } - } - - SECTION("initialization") - { - SECTION("set_begin") - { - SECTION("null") - { - json j(json::value_t::null); - json::const_iterator it(&j); - it.set_begin(); - CHECK(it == j.cbegin()); - } - - SECTION("object") - { - json j(json::value_t::object); - json::const_iterator it(&j); - it.set_begin(); - CHECK(it == j.cbegin()); - } - - SECTION("array") - { - json j(json::value_t::array); - json::const_iterator it(&j); - it.set_begin(); - CHECK(it == j.cbegin()); - } - } - - SECTION("set_end") - { - SECTION("null") - { - json j(json::value_t::null); - json::const_iterator it(&j); - it.set_end(); - CHECK(it == j.cend()); - } - - SECTION("object") - { - json j(json::value_t::object); - json::const_iterator it(&j); - it.set_end(); - CHECK(it == j.cend()); - } - - SECTION("array") - { - json j(json::value_t::array); - json::const_iterator it(&j); - it.set_end(); - CHECK(it == j.cend()); - } - } - } - - SECTION("element access") - { - SECTION("operator*") - { - SECTION("null") - { - json j(json::value_t::null); - json::const_iterator it = j.cbegin(); - CHECK_THROWS_AS(*it, std::out_of_range); - CHECK_THROWS_WITH(*it, "cannot get value"); - } - - SECTION("number") - { - json j(17); - json::const_iterator it = j.cbegin(); - CHECK(*it == json(17)); - it = j.cend(); - CHECK_THROWS_AS(*it, std::out_of_range); - CHECK_THROWS_WITH(*it, "cannot get value"); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::const_iterator it = j.cbegin(); - CHECK(*it == json("bar")); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::const_iterator it = j.cbegin(); - CHECK(*it == json(1)); - } - } - - SECTION("operator->") - { - SECTION("null") - { - json j(json::value_t::null); - json::const_iterator it = j.cbegin(); - CHECK_THROWS_AS(it->type_name(), std::out_of_range); - CHECK_THROWS_WITH(it->type_name(), "cannot get value"); - } - - SECTION("number") - { - json j(17); - json::const_iterator it = j.cbegin(); - CHECK(it->type_name() == "number"); - it = j.cend(); - CHECK_THROWS_AS(it->type_name(), std::out_of_range); - CHECK_THROWS_WITH(it->type_name(), "cannot get value"); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::const_iterator it = j.cbegin(); - CHECK(it->type_name() == "string"); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::const_iterator it = j.cbegin(); - CHECK(it->type_name() == "number"); - } - } - } - - SECTION("increment/decrement") - { - SECTION("post-increment") - { - SECTION("null") - { - json j(json::value_t::null); - json::const_iterator it = j.cbegin(); - CHECK(it.m_it.primitive_iterator == 1); - it++; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("number") - { - json j(17); - json::const_iterator it = j.cbegin(); - CHECK(it.m_it.primitive_iterator == 0); - it++; - CHECK(it.m_it.primitive_iterator == 1); - it++; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::const_iterator it = j.cbegin(); - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin()); - it++; - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end()); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::const_iterator it = j.cbegin(); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin()); - it++; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it++; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it++; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it++; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end()); - } - } - - SECTION("pre-increment") - { - SECTION("null") - { - json j(json::value_t::null); - json::const_iterator it = j.cbegin(); - CHECK(it.m_it.primitive_iterator == 1); - ++it; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("number") - { - json j(17); - json::const_iterator it = j.cbegin(); - CHECK(it.m_it.primitive_iterator == 0); - ++it; - CHECK(it.m_it.primitive_iterator == 1); - ++it; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::const_iterator it = j.cbegin(); - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin()); - ++it; - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end()); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::const_iterator it = j.cbegin(); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin()); - ++it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - ++it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - ++it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - ++it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end()); - } - } - - SECTION("post-decrement") - { - SECTION("null") - { - json j(json::value_t::null); - json::const_iterator it = j.cend(); - CHECK(it.m_it.primitive_iterator == 1); - } - - SECTION("number") - { - json j(17); - json::const_iterator it = j.cend(); - CHECK(it.m_it.primitive_iterator == 1); - it--; - CHECK(it.m_it.primitive_iterator == 0); - it--; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::const_iterator it = j.cend(); - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end()); - it--; - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin()); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::const_iterator it = j.cend(); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end()); - it--; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it--; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it--; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - it--; - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - } - } - - SECTION("pre-decrement") - { - SECTION("null") - { - json j(json::value_t::null); - json::const_iterator it = j.cend(); - CHECK(it.m_it.primitive_iterator == 1); - } - - SECTION("number") - { - json j(17); - json::const_iterator it = j.cend(); - CHECK(it.m_it.primitive_iterator == 1); - --it; - CHECK(it.m_it.primitive_iterator == 0); - --it; - CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1)); - } - - SECTION("object") - { - json j({{"foo", "bar"}}); - json::const_iterator it = j.cend(); - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end()); - --it; - CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin()); - } - - SECTION("array") - { - json j({1, 2, 3, 4}); - json::const_iterator it = j.cend(); - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end()); - --it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - --it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - --it; - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - --it; - CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin()); - CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end()); - } - } - } -} - -TEST_CASE("convenience functions") -{ - SECTION("type name as string") - { - CHECK(json(json::value_t::null).type_name() == "null"); - CHECK(json(json::value_t::object).type_name() == "object"); - CHECK(json(json::value_t::array).type_name() == "array"); - CHECK(json(json::value_t::number_integer).type_name() == "number"); - CHECK(json(json::value_t::number_float).type_name() == "number"); - CHECK(json(json::value_t::boolean).type_name() == "boolean"); - CHECK(json(json::value_t::string).type_name() == "string"); - CHECK(json(json::value_t::discarded).type_name() == "discarded"); - } - - SECTION("string escape") - { - CHECK(json::escape_string("\"") == "\\\""); - CHECK(json::escape_string("\\") == "\\\\"); - CHECK(json::escape_string("\b") == "\\b"); - CHECK(json::escape_string("\f") == "\\f"); - CHECK(json::escape_string("\n") == "\\n"); - CHECK(json::escape_string("\r") == "\\r"); - CHECK(json::escape_string("\t") == "\\t"); - - CHECK(json::escape_string("\x01") == "\\u0001"); - CHECK(json::escape_string("\x02") == "\\u0002"); - CHECK(json::escape_string("\x03") == "\\u0003"); - CHECK(json::escape_string("\x04") == "\\u0004"); - CHECK(json::escape_string("\x05") == "\\u0005"); - CHECK(json::escape_string("\x06") == "\\u0006"); - CHECK(json::escape_string("\x07") == "\\u0007"); - CHECK(json::escape_string("\x08") == "\\b"); - CHECK(json::escape_string("\x09") == "\\t"); - CHECK(json::escape_string("\x0a") == "\\n"); - CHECK(json::escape_string("\x0b") == "\\u000b"); - CHECK(json::escape_string("\x0c") == "\\f"); - CHECK(json::escape_string("\x0d") == "\\r"); - CHECK(json::escape_string("\x0e") == "\\u000e"); - CHECK(json::escape_string("\x0f") == "\\u000f"); - CHECK(json::escape_string("\x10") == "\\u0010"); - CHECK(json::escape_string("\x11") == "\\u0011"); - CHECK(json::escape_string("\x12") == "\\u0012"); - CHECK(json::escape_string("\x13") == "\\u0013"); - CHECK(json::escape_string("\x14") == "\\u0014"); - CHECK(json::escape_string("\x15") == "\\u0015"); - CHECK(json::escape_string("\x16") == "\\u0016"); - CHECK(json::escape_string("\x17") == "\\u0017"); - CHECK(json::escape_string("\x18") == "\\u0018"); - CHECK(json::escape_string("\x19") == "\\u0019"); - CHECK(json::escape_string("\x1a") == "\\u001a"); - CHECK(json::escape_string("\x1b") == "\\u001b"); - CHECK(json::escape_string("\x1c") == "\\u001c"); - CHECK(json::escape_string("\x1d") == "\\u001d"); - CHECK(json::escape_string("\x1e") == "\\u001e"); - CHECK(json::escape_string("\x1f") == "\\u001f"); - } -} - -TEST_CASE("lexer class") -{ - SECTION("scan") - { - SECTION("structural characters") - { - CHECK(json::lexer("[").scan() == json::lexer::token_type::begin_array); - CHECK(json::lexer("]").scan() == json::lexer::token_type::end_array); - CHECK(json::lexer("{").scan() == json::lexer::token_type::begin_object); - CHECK(json::lexer("}").scan() == json::lexer::token_type::end_object); - CHECK(json::lexer(",").scan() == json::lexer::token_type::value_separator); - CHECK(json::lexer(":").scan() == json::lexer::token_type::name_separator); - } - - SECTION("literal names") - { - CHECK(json::lexer("null").scan() == json::lexer::token_type::literal_null); - CHECK(json::lexer("true").scan() == json::lexer::token_type::literal_true); - CHECK(json::lexer("false").scan() == json::lexer::token_type::literal_false); - } - - SECTION("numbers") - { - CHECK(json::lexer("0").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("1").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("2").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("3").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("4").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("5").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("6").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("7").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("8").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("9").scan() == json::lexer::token_type::value_number); - } - - SECTION("whitespace") - { - // result is end_of_input, because not token is following - CHECK(json::lexer(" ").scan() == json::lexer::token_type::end_of_input); - CHECK(json::lexer("\t").scan() == json::lexer::token_type::end_of_input); - CHECK(json::lexer("\n").scan() == json::lexer::token_type::end_of_input); - CHECK(json::lexer("\r").scan() == json::lexer::token_type::end_of_input); - CHECK(json::lexer(" \t\n\r\n\t ").scan() == json::lexer::token_type::end_of_input); - } - } - - SECTION("token_type_name") - { - CHECK(json::lexer::token_type_name(json::lexer::token_type::uninitialized) == ""); - CHECK(json::lexer::token_type_name(json::lexer::token_type::literal_true) == "true literal"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::literal_false) == "false literal"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::literal_null) == "null literal"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::value_string) == "string literal"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::value_number) == "number literal"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::begin_array) == "'['"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::begin_object) == "'{'"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::end_array) == "']'"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::end_object) == "'}'"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::name_separator) == "':'"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::value_separator) == "','"); - CHECK(json::lexer::token_type_name(json::lexer::token_type::parse_error) == ""); - CHECK(json::lexer::token_type_name(json::lexer::token_type::end_of_input) == "end of input"); - } - - SECTION("parse errors on first character") - { - for (int c = 1; c < 128; ++c) - { - auto s = std::string(1, c); - - switch (c) - { - // single characters that are valid tokens - case ('['): - case (']'): - case ('{'): - case ('}'): - case (','): - case (':'): - case ('0'): - case ('1'): - case ('2'): - case ('3'): - case ('4'): - case ('5'): - case ('6'): - case ('7'): - case ('8'): - case ('9'): - { - CHECK(json::lexer(s.c_str()).scan() != json::lexer::token_type::parse_error); - break; - } - - // whitespace - case (' '): - case ('\t'): - case ('\n'): - case ('\r'): - { - CHECK(json::lexer(s.c_str()).scan() == json::lexer::token_type::end_of_input); - break; - } - - // anything else is not expected - default: - { - CHECK(json::lexer(s.c_str()).scan() == json::lexer::token_type::parse_error); - break; - } - } - } - } - - SECTION("to_unicode") - { - CHECK(json::lexer::to_unicode(0x1F4A9) == "💩"); - CHECK_THROWS_AS(json::lexer::to_unicode(0x200000), std::out_of_range); - CHECK_THROWS_WITH(json::lexer::to_unicode(0x200000), "code points above 0x10FFFF are invalid"); - } -} - -TEST_CASE("parser class") -{ - SECTION("parse") - { - SECTION("null") - { - CHECK(json::parser("null").parse() == json(nullptr)); - } - - SECTION("true") - { - CHECK(json::parser("true").parse() == json(true)); - } - - SECTION("false") - { - CHECK(json::parser("false").parse() == json(false)); - } - - SECTION("array") - { - SECTION("empty array") - { - CHECK(json::parser("[]").parse() == json(json::value_t::array)); - CHECK(json::parser("[ ]").parse() == json(json::value_t::array)); - } - - SECTION("nonempty array") - { - CHECK(json::parser("[true, false, null]").parse() == json({true, false, nullptr})); - } - } - - SECTION("object") - { - SECTION("empty object") - { - CHECK(json::parser("{}").parse() == json(json::value_t::object)); - CHECK(json::parser("{ }").parse() == json(json::value_t::object)); - } - - SECTION("nonempty object") - { - CHECK(json::parser("{\"\": true, \"one\": 1, \"two\": null}").parse() == json({{"", true}, {"one", 1}, {"two", nullptr}})); - } - } - - SECTION("string") - { - // empty string - CHECK(json::parser("\"\"").parse() == json(json::value_t::string)); - - SECTION("errors") - { - // error: tab in string - CHECK_THROWS_AS(json::parser("\"\t\"").parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser("\"\t\"").parse(), "parse error - unexpected '\"'"); - // error: newline in string - CHECK_THROWS_AS(json::parser("\"\n\"").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("\"\r\"").parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser("\"\n\"").parse(), "parse error - unexpected '\"'"); - CHECK_THROWS_WITH(json::parser("\"\r\"").parse(), "parse error - unexpected '\"'"); - // error: backspace in string - CHECK_THROWS_AS(json::parser("\"\b\"").parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser("\"\b\"").parse(), "parse error - unexpected '\"'"); - // improve code coverage - CHECK_THROWS_AS(json::parser("\uFF01").parse(), std::invalid_argument); - } - - SECTION("escaped") - { - // quotation mark "\"" - auto r1 = R"("\"")"_json; - CHECK(json::parser("\"\\\"\"").parse() == r1); - // reverse solidus "\\" - auto r2 = R"("\\")"_json; - CHECK(json::parser("\"\\\\\"").parse() == r2); - // solidus - CHECK(json::parser("\"\\/\"").parse() == R"("/")"_json); - // backspace - CHECK(json::parser("\"\\b\"").parse() == json("\b")); - // formfeed - CHECK(json::parser("\"\\f\"").parse() == json("\f")); - // newline - CHECK(json::parser("\"\\n\"").parse() == json("\n")); - // carriage return - CHECK(json::parser("\"\\r\"").parse() == json("\r")); - // horizontal tab - CHECK(json::parser("\"\\t\"").parse() == json("\t")); - - CHECK(json::parser("\"\\u0001\"").parse().get() == "\x01"); - CHECK(json::parser("\"\\u000a\"").parse().get() == "\n"); - CHECK(json::parser("\"\\u00b0\"").parse().get() == "°"); - CHECK(json::parser("\"\\u0c00\"").parse().get() == "ఀ"); - CHECK(json::parser("\"\\ud000\"").parse().get() == "퀀"); - CHECK(json::parser("\"\\u000E\"").parse().get() == "\x0E"); - CHECK(json::parser("\"\\u00F0\"").parse().get() == "ð"); - CHECK(json::parser("\"\\u0100\"").parse().get() == "Ā"); - CHECK(json::parser("\"\\u2000\"").parse().get() == " "); - CHECK(json::parser("\"\\uFFFF\"").parse().get() == "￿"); - CHECK(json::parser("\"\\u20AC\"").parse().get() == "€"); - CHECK(json::parser("\"€\"").parse().get() == "€"); - CHECK(json::parser("\"🎈\"").parse().get() == "🎈"); - - CHECK(json::parse("\"\\ud80c\\udc60\"").get() == u8"\U00013060"); - CHECK(json::parse("\"\\ud83c\\udf1e\"").get() == "🌞"); - } - } - - SECTION("number") - { - SECTION("integers") - { - SECTION("without exponent") - { - CHECK(json::parser("-128").parse() == json(-128)); - CHECK(json::parser("-0").parse() == json(-0)); - CHECK(json::parser("0").parse() == json(0)); - CHECK(json::parser("128").parse() == json(128)); - } - - SECTION("with exponent") - { - CHECK(json::parser("0e1").parse() == json(0e1)); - CHECK(json::parser("0E1").parse() == json(0e1)); - - CHECK(json::parser("10000E-4").parse() == json(10000e-4)); - CHECK(json::parser("10000E-3").parse() == json(10000e-3)); - CHECK(json::parser("10000E-2").parse() == json(10000e-2)); - CHECK(json::parser("10000E-1").parse() == json(10000e-1)); - CHECK(json::parser("10000E0").parse() == json(10000e0)); - CHECK(json::parser("10000E1").parse() == json(10000e1)); - CHECK(json::parser("10000E2").parse() == json(10000e2)); - CHECK(json::parser("10000E3").parse() == json(10000e3)); - CHECK(json::parser("10000E4").parse() == json(10000e4)); - - CHECK(json::parser("10000e-4").parse() == json(10000e-4)); - CHECK(json::parser("10000e-3").parse() == json(10000e-3)); - CHECK(json::parser("10000e-2").parse() == json(10000e-2)); - CHECK(json::parser("10000e-1").parse() == json(10000e-1)); - CHECK(json::parser("10000e0").parse() == json(10000e0)); - CHECK(json::parser("10000e1").parse() == json(10000e1)); - CHECK(json::parser("10000e2").parse() == json(10000e2)); - CHECK(json::parser("10000e3").parse() == json(10000e3)); - CHECK(json::parser("10000e4").parse() == json(10000e4)); - - CHECK(json::parser("-0e1").parse() == json(-0e1)); - CHECK(json::parser("-0E1").parse() == json(-0e1)); - CHECK(json::parser("-0E123").parse() == json(-0e123)); - } - - SECTION("edge cases") - { - // From RFC7159, Section 6: - // Note that when such software is used, numbers that are - // integers and are in the range [-(2**53)+1, (2**53)-1] - // are interoperable in the sense that implementations will - // agree exactly on their numeric values. - - // -(2**53)+1 - CHECK(json::parser("-9007199254740991").parse().get() == -9007199254740991); - // (2**53)-1 - CHECK(json::parser("9007199254740991").parse().get() == 9007199254740991); - } - - SECTION("over the edge cases") // issue #178 - Integer conversion to unsigned (incorrect handling of 64 bit integers) - { - // While RFC7159, Section 6 specifies a preference for support - // for ranges in range of IEEE 754-2008 binary64 (double precision) - // this does not accommodate 64 bit integers without loss of accuracy. - // As 64 bit integers are now widely used in software, it is desirable - // to expand support to to the full 64 bit (signed and unsigned) range - // i.e. -(2**63) -> (2**64)-1. - - // -(2**63) ** Note: compilers see negative literals as negated positive numbers (hence the -1)) - CHECK(json::parser("-9223372036854775808").parse().get() == -9223372036854775807 - 1); - // (2**63)-1 - CHECK(json::parser("9223372036854775807").parse().get() == 9223372036854775807); - // (2**64)-1 - CHECK(json::parser("18446744073709551615").parse().get() == 18446744073709551615u); - } - } - - SECTION("floating-point") - { - SECTION("without exponent") - { - CHECK(json::parser("-128.5").parse() == json(-128.5)); - CHECK(json::parser("0.999").parse() == json(0.999)); - CHECK(json::parser("128.5").parse() == json(128.5)); - CHECK(json::parser("-0.0").parse() == json(-0.0)); - } - - SECTION("with exponent") - { - CHECK(json::parser("-128.5E3").parse() == json(-128.5E3)); - CHECK(json::parser("-128.5E-3").parse() == json(-128.5E-3)); - CHECK(json::parser("-0.0e1").parse() == json(-0.0e1)); - CHECK(json::parser("-0.0E1").parse() == json(-0.0e1)); - } - } - - SECTION("invalid numbers") - { - CHECK_THROWS_AS(json::parser("01").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("--1").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("1.").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("1E").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("1E-").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("1.E1").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-1E").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-0E#").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-0E-#").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-0#").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-0.0:").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-0.0Z").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-0E123:").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-0e0-:").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-0e-:").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-0f").parse(), std::invalid_argument); - - // numbers must not begin with "+" - CHECK_THROWS_AS(json::parser("+1").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("+0").parse(), std::invalid_argument); - - CHECK_THROWS_WITH(json::parser("01").parse(), - "parse error - unexpected number literal; expected end of input"); - CHECK_THROWS_WITH(json::parser("--1").parse(), "parse error - unexpected '-'"); - CHECK_THROWS_WITH(json::parser("1.").parse(), - "parse error - unexpected '.'; expected end of input"); - CHECK_THROWS_WITH(json::parser("1E").parse(), - "parse error - unexpected 'E'; expected end of input"); - CHECK_THROWS_WITH(json::parser("1E-").parse(), - "parse error - unexpected 'E'; expected end of input"); - CHECK_THROWS_WITH(json::parser("1.E1").parse(), - "parse error - unexpected '.'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-1E").parse(), - "parse error - unexpected 'E'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-0E#").parse(), - "parse error - unexpected 'E'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-0E-#").parse(), - "parse error - unexpected 'E'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-0#").parse(), - "parse error - unexpected '#'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-0.0:").parse(), - "parse error - unexpected ':'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-0.0Z").parse(), - "parse error - unexpected 'Z'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-0E123:").parse(), - "parse error - unexpected ':'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-0e0-:").parse(), - "parse error - unexpected '-'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-0e-:").parse(), - "parse error - unexpected 'e'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-0f").parse(), - "parse error - unexpected 'f'; expected end of input"); - } - } - } - - SECTION("parse errors") - { - // unexpected end of number - CHECK_THROWS_AS(json::parser("0.").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("--").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-0.").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-.").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("-:").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("0.:").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("e.").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("1e.").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("1e/").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("1e:").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("1E.").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("1E/").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("1E:").parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser("0.").parse(), - "parse error - unexpected '.'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-").parse(), "parse error - unexpected '-'"); - CHECK_THROWS_WITH(json::parser("--").parse(), - "parse error - unexpected '-'"); - CHECK_THROWS_WITH(json::parser("-0.").parse(), - "parse error - unexpected '.'; expected end of input"); - CHECK_THROWS_WITH(json::parser("-.").parse(), - "parse error - unexpected '-'"); - CHECK_THROWS_WITH(json::parser("-:").parse(), - "parse error - unexpected '-'"); - CHECK_THROWS_WITH(json::parser("0.:").parse(), - "parse error - unexpected '.'; expected end of input"); - CHECK_THROWS_WITH(json::parser("e.").parse(), - "parse error - unexpected 'e'"); - CHECK_THROWS_WITH(json::parser("1e.").parse(), - "parse error - unexpected 'e'; expected end of input"); - CHECK_THROWS_WITH(json::parser("1e/").parse(), - "parse error - unexpected 'e'; expected end of input"); - CHECK_THROWS_WITH(json::parser("1e:").parse(), - "parse error - unexpected 'e'; expected end of input"); - CHECK_THROWS_WITH(json::parser("1E.").parse(), - "parse error - unexpected 'E'; expected end of input"); - CHECK_THROWS_WITH(json::parser("1E/").parse(), - "parse error - unexpected 'E'; expected end of input"); - CHECK_THROWS_WITH(json::parser("1E:").parse(), - "parse error - unexpected 'E'; expected end of input"); - - // unexpected end of null - CHECK_THROWS_AS(json::parser("n").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("nu").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("nul").parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser("n").parse(), "parse error - unexpected 'n'"); - CHECK_THROWS_WITH(json::parser("nu").parse(), - "parse error - unexpected 'n'"); - CHECK_THROWS_WITH(json::parser("nul").parse(), - "parse error - unexpected 'n'"); - - // unexpected end of true - CHECK_THROWS_AS(json::parser("t").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("tr").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("tru").parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser("t").parse(), "parse error - unexpected 't'"); - CHECK_THROWS_WITH(json::parser("tr").parse(), - "parse error - unexpected 't'"); - CHECK_THROWS_WITH(json::parser("tru").parse(), - "parse error - unexpected 't'"); - - // unexpected end of false - CHECK_THROWS_AS(json::parser("f").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("fa").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("fal").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("fals").parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser("f").parse(), "parse error - unexpected 'f'"); - CHECK_THROWS_WITH(json::parser("fa").parse(), - "parse error - unexpected 'f'"); - CHECK_THROWS_WITH(json::parser("fal").parse(), - "parse error - unexpected 'f'"); - CHECK_THROWS_WITH(json::parser("fals").parse(), - "parse error - unexpected 'f'"); - - // missing/unexpected end of array - CHECK_THROWS_AS(json::parser("[").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("[1").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("[1,").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("[1,]").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("]").parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser("[").parse(), - "parse error - unexpected end of input"); - CHECK_THROWS_WITH(json::parser("[1").parse(), - "parse error - unexpected end of input; expected ']'"); - CHECK_THROWS_WITH(json::parser("[1,").parse(), - "parse error - unexpected end of input"); - CHECK_THROWS_WITH(json::parser("[1,]").parse(), - "parse error - unexpected ']'"); - CHECK_THROWS_WITH(json::parser("]").parse(), "parse error - unexpected ']'"); - - // missing/unexpected end of object - CHECK_THROWS_AS(json::parser("{").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("{\"foo\"").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("{\"foo\":").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("{\"foo\":}").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("{\"foo\":1,}").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("}").parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser("{").parse(), - "parse error - unexpected end of input; expected string literal"); - CHECK_THROWS_WITH(json::parser("{\"foo\"").parse(), - "parse error - unexpected end of input; expected ':'"); - CHECK_THROWS_WITH(json::parser("{\"foo\":").parse(), - "parse error - unexpected end of input"); - CHECK_THROWS_WITH(json::parser("{\"foo\":}").parse(), - "parse error - unexpected '}'"); - CHECK_THROWS_WITH(json::parser("{\"foo\":1,}").parse(), - "parse error - unexpected '}'; expected string literal"); - CHECK_THROWS_WITH(json::parser("}").parse(), "parse error - unexpected '}'"); - - // missing/unexpected end of string - CHECK_THROWS_AS(json::parser("\"").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("\"\\\"").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("\"\\u\"").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("\"\\u0\"").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("\"\\u01\"").parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser("\"\\u012\"").parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser("\"").parse(), - "parse error - unexpected '\"'"); - CHECK_THROWS_WITH(json::parser("\"\\\"").parse(), - "parse error - unexpected '\"'"); - CHECK_THROWS_WITH(json::parser("\"\\u\"").parse(), - "parse error - unexpected '\"'"); - CHECK_THROWS_WITH(json::parser("\"\\u0\"").parse(), - "parse error - unexpected '\"'"); - CHECK_THROWS_WITH(json::parser("\"\\u01\"").parse(), - "parse error - unexpected '\"'"); - CHECK_THROWS_WITH(json::parser("\"\\u012\"").parse(), - "parse error - unexpected '\"'"); - - // invalid escapes - for (int c = 1; c < 128; ++c) - { - auto s = std::string("\"\\") + std::string(1, c) + "\""; - - switch (c) - { - // valid escapes - case ('"'): - case ('\\'): - case ('/'): - case ('b'): - case ('f'): - case ('n'): - case ('r'): - case ('t'): - { - CHECK_NOTHROW(json::parser(s).parse()); - break; - } - - // \u must be followed with four numbers, so we skip it here - case ('u'): - { - break; - } - - // any other combination of backslash and character is invalid - default: - { - CHECK_THROWS_AS(json::parser(s).parse(), std::invalid_argument); - CHECK_THROWS_WITH(json::parser(s).parse(), "parse error - unexpected '\"'"); - break; - } - } - } - - // invalid \uxxxx escapes - { - // check whether character is a valid hex character - const auto valid = [](int c) - { - switch (c) - { - case ('0'): - case ('1'): - case ('2'): - case ('3'): - case ('4'): - case ('5'): - case ('6'): - case ('7'): - case ('8'): - case ('9'): - case ('a'): - case ('b'): - case ('c'): - case ('d'): - case ('e'): - case ('f'): - case ('A'): - case ('B'): - case ('C'): - case ('D'): - case ('E'): - case ('F'): - { - return true; - } - - default: - { - return false; - } - } - }; - - for (int c = 1; c < 128; ++c) - { - std::string s = "\"\\u"; - - // create a string with the iterated character at each position - auto s1 = s + "000" + std::string(1, c) + "\""; - auto s2 = s + "00" + std::string(1, c) + "0\""; - auto s3 = s + "0" + std::string(1, c) + "00\""; - auto s4 = s + std::string(1, c) + "000\""; - - if (valid(c)) - { - CHECK_NOTHROW(json::parser(s1).parse()); - CHECK_NOTHROW(json::parser(s2).parse()); - CHECK_NOTHROW(json::parser(s3).parse()); - CHECK_NOTHROW(json::parser(s4).parse()); - } - else - { - CHECK_THROWS_AS(json::parser(s1).parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser(s2).parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser(s3).parse(), std::invalid_argument); - CHECK_THROWS_AS(json::parser(s4).parse(), std::invalid_argument); - - CHECK_THROWS_WITH(json::parser(s1).parse(), "parse error - unexpected '\"'"); - CHECK_THROWS_WITH(json::parser(s2).parse(), "parse error - unexpected '\"'"); - CHECK_THROWS_WITH(json::parser(s3).parse(), "parse error - unexpected '\"'"); - CHECK_THROWS_WITH(json::parser(s4).parse(), "parse error - unexpected '\"'"); - } - } - } - - // missing part of a surrogate pair - CHECK_THROWS_AS(json::parse("\"\\uD80C\""), std::invalid_argument); - CHECK_THROWS_WITH(json::parse("\"\\uD80C\""), "missing low surrogate"); - // invalid surrogate pair - CHECK_THROWS_AS(json::parse("\"\\uD80C\\uD80C\""), std::invalid_argument); - CHECK_THROWS_AS(json::parse("\"\\uD80C\\u0000\""), std::invalid_argument); - CHECK_THROWS_AS(json::parse("\"\\uD80C\\uFFFF\""), std::invalid_argument); - CHECK_THROWS_WITH(json::parse("\"\\uD80C\\uD80C\""), - "missing or wrong low surrogate"); - CHECK_THROWS_WITH(json::parse("\"\\uD80C\\u0000\""), - "missing or wrong low surrogate"); - CHECK_THROWS_WITH(json::parse("\"\\uD80C\\uFFFF\""), - "missing or wrong low surrogate"); - } - - SECTION("callback function") - { - auto s_object = R"( - { - "foo": 2, - "bar": { - "baz": 1 - } - } - )"; - - auto s_array = R"( - [1,2,[3,4,5],4,5] - )"; - - SECTION("filter nothing") - { - json j_object = json::parse(s_object, [](int, json::parse_event_t, const json&) - { - return true; - }); - - CHECK (j_object == json({{"foo", 2}, {"bar", {{"baz", 1}}}})); - - json j_array = json::parse(s_array, [](int, json::parse_event_t, const json&) - { - return true; - }); - - CHECK (j_array == json({1, 2, {3, 4, 5}, 4, 5})); - } - - SECTION("filter everything") - { - json j_object = json::parse(s_object, [](int, json::parse_event_t, const json&) - { - return false; - }); - - // the top-level object will be discarded, leaving a null - CHECK (j_object.is_null()); - - json j_array = json::parse(s_array, [](int, json::parse_event_t, const json&) - { - return false; - }); - - // the top-level array will be discarded, leaving a null - CHECK (j_array.is_null()); - } - - SECTION("filter specific element") - { - json j_object = json::parse(s_object, [](int, json::parse_event_t, const json & j) - { - // filter all number(2) elements - if (j == json(2)) - { - return false; - } - else - { - return true; - } - }); - - CHECK (j_object == json({{"bar", {{"baz", 1}}}})); - - json j_array = json::parse(s_array, [](int, json::parse_event_t, const json & j) - { - if (j == json(2)) - { - return false; - } - else - { - return true; - } - }); - - CHECK (j_array == json({1, {3, 4, 5}, 4, 5})); - } - - SECTION("filter specific events") - { - SECTION("first closing event") - { - { - json j_object = json::parse(s_object, [](int, json::parse_event_t e, const json&) - { - static bool first = true; - if (e == json::parse_event_t::object_end and first) - { - first = false; - return false; - } - else - { - return true; - } - }); - - // the first completed object will be discarded - CHECK (j_object == json({{"foo", 2}})); - } - - { - json j_array = json::parse(s_array, [](int, json::parse_event_t e, const json&) - { - static bool first = true; - if (e == json::parse_event_t::array_end and first) - { - first = false; - return false; - } - else - { - return true; - } - }); - - // the first completed array will be discarded - CHECK (j_array == json({1, 2, 4, 5})); - } - } - } - - SECTION("special cases") - { - // the following test cases cover the situation in which an empty - // object and array is discarded only after the closing character - // has been read - - json j_empty_object = json::parse("{}", [](int, json::parse_event_t e, const json&) - { - if (e == json::parse_event_t::object_end) - { - return false; - } - else - { - return true; - } - }); - CHECK(j_empty_object == json()); - - json j_empty_array = json::parse("[]", [](int, json::parse_event_t e, const json&) - { - if (e == json::parse_event_t::array_end) - { - return false; - } - else - { - return true; - } - }); - CHECK(j_empty_array == json()); - } - } -} - -TEST_CASE("README", "[hide]") -{ - { - // create an empty structure (null) - json j; - - // add a number that is stored as double (note the implicit conversion of j to an object) - j["pi"] = 3.141; - - // add a Boolean that is stored as bool - j["happy"] = true; - - // add a string that is stored as std::string - j["name"] = "Niels"; - - // add another null object by passing nullptr - j["nothing"] = nullptr; - - // add an object inside the object - j["answer"]["everything"] = 42; - - // add an array that is stored as std::vector (using an initializer list) - j["list"] = { 1, 0, 2 }; - - // add another object (using an initializer list of pairs) - j["object"] = { {"currency", "USD"}, {"value", 42.99} }; - - // instead, you could also write (which looks very similar to the JSON above) - json j2 = - { - {"pi", 3.141}, - {"happy", true}, - {"name", "Niels"}, - {"nothing", nullptr}, - { - "answer", { - {"everything", 42} - } - }, - {"list", {1, 0, 2}}, - { - "object", { - {"currency", "USD"}, - {"value", 42.99} - } - } - }; - } - - { - // ways to express the empty array [] - json empty_array_implicit = {{}}; - json empty_array_explicit = json::array(); - - // a way to express the empty object {} - json empty_object_explicit = json::object(); - - // a way to express an _array_ of key/value pairs [["currency", "USD"], ["value", 42.99]] - json array_not_object = { json::array({"currency", "USD"}), json::array({"value", 42.99}) }; - } - - { - // create object from string literal - json j = "{ \"happy\": true, \"pi\": 3.141 }"_json; - - // or even nicer (thanks http://isocpp.org/blog/2015/01/json-for-modern-cpp) - auto j2 = R"( - { - "happy": true, - "pi": 3.141 - } - )"_json; - - // or explicitly - auto j3 = json::parse("{ \"happy\": true, \"pi\": 3.141 }"); - - // explicit conversion to string - std::string s = j.dump(); // {\"happy\":true,\"pi\":3.141} - - // serialization with pretty printing - // pass in the amount of spaces to indent - std::cout << j.dump(4) << std::endl; - // { - // "happy": true, - // "pi": 3.141 - // } - - std::cout << std::setw(2) << j << std::endl; - } - - { - // create an array using push_back - json j; - j.push_back("foo"); - j.push_back(1); - j.push_back(true); - - // iterate the array - for (json::iterator it = j.begin(); it != j.end(); ++it) - { - std::cout << *it << '\n'; - } - - // range-based for - for (auto element : j) - { - std::cout << element << '\n'; - } - - // getter/setter - const std::string tmp = j[0]; - j[1] = 42; - bool foo = j.at(2); - - // other stuff - j.size(); // 3 entries - j.empty(); // false - j.type(); // json::value_t::array - j.clear(); // the array is empty again - - // comparison - j == "[\"foo\", 1, true]"_json; // true - - // create an object - json o; - o["foo"] = 23; - o["bar"] = false; - o["baz"] = 3.141; - - // find an entry - if (o.find("foo") != o.end()) - { - // there is an entry with key "foo" - } - } - - { - std::vector c_vector {1, 2, 3, 4}; - json j_vec(c_vector); - // [1, 2, 3, 4] - - std::deque c_deque {1.2f, 2.3f, 3.4f, 5.6f}; - json j_deque(c_deque); - // [1.2, 2.3, 3.4, 5.6] - - std::list c_list {true, true, false, true}; - json j_list(c_list); - // [true, true, false, true] - - std::forward_list c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543}; - json j_flist(c_flist); - // [12345678909876, 23456789098765, 34567890987654, 45678909876543] - - std::array c_array {{1, 2, 3, 4}}; - json j_array(c_array); - // [1, 2, 3, 4] - - std::set c_set {"one", "two", "three", "four", "one"}; - json j_set(c_set); // only one entry for "one" is used - // ["four", "one", "three", "two"] - - std::unordered_set c_uset {"one", "two", "three", "four", "one"}; - json j_uset(c_uset); // only one entry for "one" is used - // maybe ["two", "three", "four", "one"] - - std::multiset c_mset {"one", "two", "one", "four"}; - json j_mset(c_mset); // only one entry for "one" is used - // maybe ["one", "two", "four"] - - std::unordered_multiset c_umset {"one", "two", "one", "four"}; - json j_umset(c_umset); // both entries for "one" are used - // maybe ["one", "two", "one", "four"] - } - - { - std::map c_map { {"one", 1}, {"two", 2}, {"three", 3} }; - json j_map(c_map); - // {"one": 1, "two": 2, "three": 3} - - std::unordered_map c_umap { {"one", 1.2f}, {"two", 2.3f}, {"three", 3.4f} }; - json j_umap(c_umap); - // {"one": 1.2, "two": 2.3, "three": 3.4} - - std::multimap c_mmap { {"one", true}, {"two", true}, {"three", false}, {"three", true} }; - json j_mmap(c_mmap); // only one entry for key "three" is used - // maybe {"one": true, "two": true, "three": true} - - std::unordered_multimap c_ummap { {"one", true}, {"two", true}, {"three", false}, {"three", true} }; - json j_ummap(c_ummap); // only one entry for key "three" is used - // maybe {"one": true, "two": true, "three": true} - } - - { - /// strings - std::string s1 = "Hello, world!"; - json js = s1; - std::string s2 = js; - - // Booleans - bool b1 = true; - json jb = b1; - bool b2 = jb; - - // numbers - int i = 42; - json jn = i; - double f = jn; - - // etc. - - std::string vs = js.get(); - bool vb = jb.get(); - int vi = jn.get(); - - // etc. - } -} - -TEST_CASE("algorithms") -{ - json j_array = {13, 29, 3, {{"one", 1}, {"two", 2}}, true, false, {1, 2, 3}, "foo", "baz"}; - json j_object = {{"one", 1}, {"two", 2}}; - - SECTION("non-modifying sequence operations") - { - SECTION("std::all_of") - { - CHECK(std::all_of(j_array.begin(), j_array.end(), [](const json & value) - { - return value.size() > 0; - })); - CHECK(std::all_of(j_object.begin(), j_object.end(), [](const json & value) - { - return value.type() == json::value_t::number_integer; - })); - } - - SECTION("std::any_of") - { - CHECK(std::any_of(j_array.begin(), j_array.end(), [](const json & value) - { - return value.is_string() and value.get() == "foo"; - })); - CHECK(std::any_of(j_object.begin(), j_object.end(), [](const json & value) - { - return value.get() > 1; - })); - } - - SECTION("std::none_of") - { - CHECK(std::none_of(j_array.begin(), j_array.end(), [](const json & value) - { - return value.size() == 0; - })); - CHECK(std::none_of(j_object.begin(), j_object.end(), [](const json & value) - { - return value.get() <= 0; - })); - } - - SECTION("std::for_each") - { - SECTION("reading") - { - int sum = 0; - - std::for_each(j_array.cbegin(), j_array.cend(), [&sum](const json & value) - { - if (value.is_number()) - { - sum += static_cast(value); - } - }); - - CHECK(sum == 45); - } - - SECTION("writing") - { - auto add17 = [](json & value) - { - if (value.is_array()) - { - value.push_back(17); - } - }; - - std::for_each(j_array.begin(), j_array.end(), add17); - - CHECK(j_array[6] == json({1, 2, 3, 17})); - } - } - - SECTION("std::count") - { - CHECK(std::count(j_array.begin(), j_array.end(), json(true)) == 1); - } - - SECTION("std::count_if") - { - CHECK(std::count_if(j_array.begin(), j_array.end(), [](const json & value) - { - return (value.is_number()); - }) == 3); - CHECK(std::count_if(j_array.begin(), j_array.end(), [](const json&) - { - return true; - }) == 9); - } - - SECTION("std::mismatch") - { - json j_array2 = {13, 29, 3, {{"one", 1}, {"two", 2}, {"three", 3}}, true, false, {1, 2, 3}, "foo", "baz"}; - auto res = std::mismatch(j_array.begin(), j_array.end(), j_array2.begin()); - CHECK(*res.first == json({{"one", 1}, {"two", 2}})); - CHECK(*res.second == json({{"one", 1}, {"two", 2}, {"three", 3}})); - } - - SECTION("std::equal") - { - SECTION("using operator==") - { - CHECK(std::equal(j_array.begin(), j_array.end(), j_array.begin())); - CHECK(std::equal(j_object.begin(), j_object.end(), j_object.begin())); - CHECK(not std::equal(j_array.begin(), j_array.end(), j_object.begin())); - } - - SECTION("using user-defined comparison") - { - // compare objects only by size of its elements - json j_array2 = {13, 29, 3, {"Hello", "World"}, true, false, {{"one", 1}, {"two", 2}, {"three", 3}}, "foo", "baz"}; - CHECK(not std::equal(j_array.begin(), j_array.end(), j_array2.begin())); - CHECK(std::equal(j_array.begin(), j_array.end(), j_array2.begin(), - [](const json & a, const json & b) - { - return (a.size() == b.size()); - })); - } - } - - SECTION("std::find") - { - auto it = std::find(j_array.begin(), j_array.end(), json(false)); - CHECK(std::distance(j_array.begin(), it) == 5); - } - - SECTION("std::find_if") - { - auto it = std::find_if(j_array.begin(), j_array.end(), - [](const json & value) - { - return value.is_boolean(); - }); - CHECK(std::distance(j_array.begin(), it) == 4); - } - - SECTION("std::find_if_not") - { - auto it = std::find_if_not(j_array.begin(), j_array.end(), - [](const json & value) - { - return value.is_number(); - }); - CHECK(std::distance(j_array.begin(), it) == 3); - } - - SECTION("std::adjacent_find") - { - CHECK(std::adjacent_find(j_array.begin(), j_array.end()) == j_array.end()); - CHECK(std::adjacent_find(j_array.begin(), j_array.end(), - [](const json & v1, const json & v2) - { - return v1.type() == v2.type(); - }) == j_array.begin()); - } - } - - SECTION("modifying sequence operations") - { - SECTION("std::reverse") - { - std::reverse(j_array.begin(), j_array.end()); - CHECK(j_array == json({"baz", "foo", {1, 2, 3}, false, true, {{"one", 1}, {"two", 2}}, 3, 29, 13})); - } - - SECTION("std::rotate") - { - std::rotate(j_array.begin(), j_array.begin() + 1, j_array.end()); - CHECK(j_array == json({29, 3, {{"one", 1}, {"two", 2}}, true, false, {1, 2, 3}, "foo", "baz", 13})); - } - - SECTION("std::partition") - { - auto it = std::partition(j_array.begin(), j_array.end(), [](const json & v) - { - return v.is_string(); - }); - CHECK(std::distance(j_array.begin(), it) == 2); - CHECK(not it[2].is_string()); - } - } - - SECTION("sorting operations") - { - SECTION("std::sort") - { - SECTION("with standard comparison") - { - json j = {13, 29, 3, {{"one", 1}, {"two", 2}}, true, false, {1, 2, 3}, "foo", "baz", nullptr}; - std::sort(j.begin(), j.end()); - CHECK(j == json({nullptr, false, true, 3, 13, 29, {{"one", 1}, {"two", 2}}, {1, 2, 3}, "baz", "foo"})); - } - - SECTION("with user-defined comparison") - { - json j = {3, {{"one", 1}, {"two", 2}}, {1, 2, 3}, nullptr}; - std::sort(j.begin(), j.end(), [](const json & a, const json & b) - { - return a.size() < b.size(); - }); - CHECK(j == json({nullptr, 3, {{"one", 1}, {"two", 2}}, {1, 2, 3}})); - } - - SECTION("sorting an object") - { - json j({{"one", 1}, {"two", 2}}); - CHECK_THROWS_AS(std::sort(j.begin(), j.end()), std::domain_error); - CHECK_THROWS_WITH(std::sort(j.begin(), j.end()), "cannot use offsets with object iterators"); - } - } - - SECTION("std::partial_sort") - { - json j = {13, 29, 3, {{"one", 1}, {"two", 2}}, true, false, {1, 2, 3}, "foo", "baz", nullptr}; - std::partial_sort(j.begin(), j.begin() + 4, j.end()); - CHECK(j == json({nullptr, false, true, 3, {{"one", 1}, {"two", 2}}, 29, {1, 2, 3}, "foo", "baz", 13})); - } - } - - SECTION("set operations") - { - SECTION("std::merge") - { - { - json j1 = {2, 4, 6, 8}; - json j2 = {1, 2, 3, 5, 7}; - json j3; - - std::merge(j1.begin(), j1.end(), j2.begin(), j2.end(), std::back_inserter(j3)); - CHECK(j3 == json({1, 2, 2, 3, 4, 5, 6, 7, 8})); - } - } - - SECTION("std::set_difference") - { - json j1 = {1, 2, 3, 4, 5, 6, 7, 8}; - json j2 = {1, 2, 3, 5, 7}; - json j3; - - std::set_difference(j1.begin(), j1.end(), j2.begin(), j2.end(), std::back_inserter(j3)); - CHECK(j3 == json({4, 6, 8})); - } - - SECTION("std::set_intersection") - { - json j1 = {1, 2, 3, 4, 5, 6, 7, 8}; - json j2 = {1, 2, 3, 5, 7}; - json j3; - - std::set_intersection(j1.begin(), j1.end(), j2.begin(), j2.end(), std::back_inserter(j3)); - CHECK(j3 == json({1, 2, 3, 5, 7})); - } - - SECTION("std::set_union") - { - json j1 = {2, 4, 6, 8}; - json j2 = {1, 2, 3, 5, 7}; - json j3; - - std::set_union(j1.begin(), j1.end(), j2.begin(), j2.end(), std::back_inserter(j3)); - CHECK(j3 == json({1, 2, 3, 4, 5, 6, 7, 8})); - } - - SECTION("std::set_symmetric_difference") - { - json j1 = {2, 4, 6, 8}; - json j2 = {1, 2, 3, 5, 7}; - json j3; - - std::set_symmetric_difference(j1.begin(), j1.end(), j2.begin(), j2.end(), std::back_inserter(j3)); - CHECK(j3 == json({1, 3, 4, 5, 6, 7, 8})); - } - } - - SECTION("heap operations") - { - std::make_heap(j_array.begin(), j_array.end()); - CHECK(std::is_heap(j_array.begin(), j_array.end())); - std::sort_heap(j_array.begin(), j_array.end()); - CHECK(j_array == json({false, true, 3, 13, 29, {{"one", 1}, {"two", 2}}, {1, 2, 3}, "baz", "foo"})); - } -} - -TEST_CASE("concepts") -{ - SECTION("container requirements for json") - { - // X: container class: json - // T: type of objects: json - // a, b: values of type X: json - - // TABLE 96 - Container Requirements - - // X::value_type must return T - CHECK((std::is_same::value)); - - // X::reference must return lvalue of T - CHECK((std::is_same::value)); - - // X::const_reference must return const lvalue of T - CHECK((std::is_same::value)); - - // X::iterator must return iterator whose value_type is T - CHECK((std::is_same::value)); - // X::iterator must meet the forward iterator requirements - CHECK((std::is_base_of::iterator_category>::value)); - // X::iterator must be convertible to X::const_iterator - CHECK((std::is_convertible::value)); - - // X::const_iterator must return iterator whose value_type is T - CHECK((std::is_same::value)); - // X::const_iterator must meet the forward iterator requirements - CHECK((std::is_base_of::iterator_category>::value)); - - // X::difference_type must return a signed integer - CHECK((std::is_signed::value)); - // X::difference_type must be identical to X::iterator::difference_type - CHECK((std::is_same::value)); - // X::difference_type must be identical to X::const_iterator::difference_type - CHECK((std::is_same::value)); - - // X::size_type must return an unsigned integer - CHECK((std::is_unsigned::value)); - // X::size_type can represent any non-negative value of X::difference_type - CHECK(std::numeric_limits::max() <= - std::numeric_limits::max()); - - // the expression "X u" has the post-condition "u.empty()" - { - json u; - CHECK(u.empty()); - } - - // the expression "X()" has the post-condition "X().empty()" - CHECK(json().empty()); - } - - SECTION("class json") - { - SECTION("DefaultConstructible") - { - CHECK(std::is_nothrow_default_constructible::value); - } - - SECTION("MoveConstructible") - { - CHECK(std::is_nothrow_move_constructible::value); - } - - SECTION("CopyConstructible") - { - CHECK(std::is_copy_constructible::value); - } - - SECTION("MoveAssignable") - { - CHECK(std::is_nothrow_move_assignable::value); - } - - SECTION("CopyAssignable") - { - CHECK(std::is_copy_assignable::value); - } - - SECTION("Destructible") - { - CHECK(std::is_nothrow_destructible::value); - } - - SECTION("StandardLayoutType") - { - CHECK(std::is_standard_layout::value); - } - } - - SECTION("class iterator") - { - SECTION("CopyConstructible") - { - CHECK(std::is_nothrow_copy_constructible::value); - CHECK(std::is_nothrow_copy_constructible::value); - } - - SECTION("CopyAssignable") - { - // STL iterators used by json::iterator don't pass this test in Debug mode -#if !defined(_MSC_VER) || (_ITERATOR_DEBUG_LEVEL == 0) - CHECK(std::is_nothrow_copy_assignable::value); - CHECK(std::is_nothrow_copy_assignable::value); -#endif - } - - SECTION("Destructible") - { - CHECK(std::is_nothrow_destructible::value); - CHECK(std::is_nothrow_destructible::value); - } - - SECTION("Swappable") - { - { - json j {1, 2, 3}; - json::iterator it1 = j.begin(); - json::iterator it2 = j.end(); - std::swap(it1, it2); - CHECK(it1 == j.end()); - CHECK(it2 == j.begin()); - } - { - json j {1, 2, 3}; - json::const_iterator it1 = j.cbegin(); - json::const_iterator it2 = j.cend(); - std::swap(it1, it2); - CHECK(it1 == j.end()); - CHECK(it2 == j.begin()); - } - } - } -} - -TEST_CASE("iterator_wrapper") -{ - SECTION("object") - { - SECTION("value") - { - json j = {{"A", 1}, {"B", 2}}; - int counter = 1; - - for (auto i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "A"); - CHECK(i.value() == json(1)); - break; - } - - case 2: - { - CHECK(i.key() == "B"); - CHECK(i.value() == json(2)); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - - SECTION("reference") - { - json j = {{"A", 1}, {"B", 2}}; - int counter = 1; - - for (auto& i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "A"); - CHECK(i.value() == json(1)); - - // change the value - i.value() = json(11); - CHECK(i.value() == json(11)); - break; - } - - case 2: - { - CHECK(i.key() == "B"); - CHECK(i.value() == json(2)); - - // change the value - i.value() = json(22); - CHECK(i.value() == json(22)); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - - // check if values where changed - CHECK(j == json({{"A", 11}, {"B", 22}})); - } - - SECTION("const value") - { - json j = {{"A", 1}, {"B", 2}}; - int counter = 1; - - for (const auto i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "A"); - CHECK(i.value() == json(1)); - break; - } - - case 2: - { - CHECK(i.key() == "B"); - CHECK(i.value() == json(2)); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - - SECTION("const reference") - { - json j = {{"A", 1}, {"B", 2}}; - int counter = 1; - - for (const auto& i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "A"); - CHECK(i.value() == json(1)); - break; - } - - case 2: - { - CHECK(i.key() == "B"); - CHECK(i.value() == json(2)); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - } - - SECTION("const object") - { - SECTION("value") - { - const json j = {{"A", 1}, {"B", 2}}; - int counter = 1; - - for (auto i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "A"); - CHECK(i.value() == json(1)); - break; - } - - case 2: - { - CHECK(i.key() == "B"); - CHECK(i.value() == json(2)); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - - SECTION("reference") - { - const json j = {{"A", 1}, {"B", 2}}; - int counter = 1; - - for (auto& i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "A"); - CHECK(i.value() == json(1)); - break; - } - - case 2: - { - CHECK(i.key() == "B"); - CHECK(i.value() == json(2)); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - - SECTION("const value") - { - const json j = {{"A", 1}, {"B", 2}}; - int counter = 1; - - for (const auto i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "A"); - CHECK(i.value() == json(1)); - break; - } - - case 2: - { - CHECK(i.key() == "B"); - CHECK(i.value() == json(2)); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - - SECTION("const reference") - { - const json j = {{"A", 1}, {"B", 2}}; - int counter = 1; - - for (const auto& i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "A"); - CHECK(i.value() == json(1)); - break; - } - - case 2: - { - CHECK(i.key() == "B"); - CHECK(i.value() == json(2)); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - } - - SECTION("array") - { - SECTION("value") - { - json j = {"A", "B"}; - int counter = 1; - - for (auto i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "0"); - CHECK(i.value() == "A"); - break; - } - - case 2: - { - CHECK(i.key() == "1"); - CHECK(i.value() == "B"); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - - SECTION("reference") - { - json j = {"A", "B"}; - int counter = 1; - - for (auto& i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "0"); - CHECK(i.value() == "A"); - - // change the value - i.value() = "AA"; - CHECK(i.value() == "AA"); - break; - } - - case 2: - { - CHECK(i.key() == "1"); - CHECK(i.value() == "B"); - - // change the value - i.value() = "BB"; - CHECK(i.value() == "BB"); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - - // check if values where changed - CHECK(j == json({"AA", "BB"})); - } - - SECTION("const value") - { - json j = {"A", "B"}; - int counter = 1; - - for (const auto i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "0"); - CHECK(i.value() == "A"); - break; - } - - case 2: - { - CHECK(i.key() == "1"); - CHECK(i.value() == "B"); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - - SECTION("const reference") - { - json j = {"A", "B"}; - int counter = 1; - - for (const auto& i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "0"); - CHECK(i.value() == "A"); - break; - } - - case 2: - { - CHECK(i.key() == "1"); - CHECK(i.value() == "B"); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - } - - SECTION("const array") - { - SECTION("value") - { - const json j = {"A", "B"}; - int counter = 1; - - for (auto i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "0"); - CHECK(i.value() == "A"); - break; - } - - case 2: - { - CHECK(i.key() == "1"); - CHECK(i.value() == "B"); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - - SECTION("reference") - { - const json j = {"A", "B"}; - int counter = 1; - - for (auto& i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "0"); - CHECK(i.value() == "A"); - break; - } - - case 2: - { - CHECK(i.key() == "1"); - CHECK(i.value() == "B"); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - - SECTION("const value") - { - const json j = {"A", "B"}; - int counter = 1; - - for (const auto i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "0"); - CHECK(i.value() == "A"); - break; - } - - case 2: - { - CHECK(i.key() == "1"); - CHECK(i.value() == "B"); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - - SECTION("const reference") - { - const json j = {"A", "B"}; - int counter = 1; - - for (const auto& i : json::iterator_wrapper(j)) - { - switch (counter++) - { - case 1: - { - CHECK(i.key() == "0"); - CHECK(i.value() == "A"); - break; - } - - case 2: - { - CHECK(i.key() == "1"); - CHECK(i.value() == "B"); - break; - } - - default: - { - break; - } - } - } - - CHECK(counter == 3); - } - } - - SECTION("primitive") - { - SECTION("value") - { - json j = 1; - int counter = 1; - - for (auto i : json::iterator_wrapper(j)) - { - ++counter; - CHECK(i.key() == ""); - CHECK(i.value() == json(1)); - } - - CHECK(counter == 2); - } - - SECTION("reference") - { - json j = 1; - int counter = 1; - - for (auto& i : json::iterator_wrapper(j)) - { - ++counter; - CHECK(i.key() == ""); - CHECK(i.value() == json(1)); - - // change value - i.value() = json(2); - } - - CHECK(counter == 2); - - // check if value has changed - CHECK(j == json(2)); - } - - SECTION("const value") - { - json j = 1; - int counter = 1; - - for (const auto i : json::iterator_wrapper(j)) - { - ++counter; - CHECK(i.key() == ""); - CHECK(i.value() == json(1)); - } - - CHECK(counter == 2); - } - - SECTION("const reference") - { - json j = 1; - int counter = 1; - - for (const auto& i : json::iterator_wrapper(j)) - { - ++counter; - CHECK(i.key() == ""); - CHECK(i.value() == json(1)); - } - - CHECK(counter == 2); - } - } - - SECTION("const primitive") - { - SECTION("value") - { - const json j = 1; - int counter = 1; - - for (auto i : json::iterator_wrapper(j)) - { - ++counter; - CHECK(i.key() == ""); - CHECK(i.value() == json(1)); - } - - CHECK(counter == 2); - } - - SECTION("reference") - { - const json j = 1; - int counter = 1; - - for (auto& i : json::iterator_wrapper(j)) - { - ++counter; - CHECK(i.key() == ""); - CHECK(i.value() == json(1)); - } - - CHECK(counter == 2); - } - - SECTION("const value") - { - const json j = 1; - int counter = 1; - - for (const auto i : json::iterator_wrapper(j)) - { - ++counter; - CHECK(i.key() == ""); - CHECK(i.value() == json(1)); - } - - CHECK(counter == 2); - } - - SECTION("const reference") - { - const json j = 1; - int counter = 1; - - for (const auto& i : json::iterator_wrapper(j)) - { - ++counter; - CHECK(i.key() == ""); - CHECK(i.value() == json(1)); - } - - CHECK(counter == 2); - } - } -} - -TEST_CASE("compliance tests from json.org") -{ - // test cases are from http://json.org/JSON_checker/ - - SECTION("expected failures") - { - for (auto filename : - { - //"test/data/json_tests/fail1.json", - "test/data/json_tests/fail2.json", - "test/data/json_tests/fail3.json", - "test/data/json_tests/fail4.json", - "test/data/json_tests/fail5.json", - "test/data/json_tests/fail6.json", - "test/data/json_tests/fail7.json", - "test/data/json_tests/fail8.json", - "test/data/json_tests/fail9.json", - "test/data/json_tests/fail10.json", - "test/data/json_tests/fail11.json", - "test/data/json_tests/fail12.json", - "test/data/json_tests/fail13.json", - "test/data/json_tests/fail14.json", - "test/data/json_tests/fail15.json", - "test/data/json_tests/fail16.json", - "test/data/json_tests/fail17.json", - //"test/data/json_tests/fail18.json", - "test/data/json_tests/fail19.json", - "test/data/json_tests/fail20.json", - "test/data/json_tests/fail21.json", - "test/data/json_tests/fail22.json", - "test/data/json_tests/fail23.json", - "test/data/json_tests/fail24.json", - "test/data/json_tests/fail25.json", - "test/data/json_tests/fail26.json", - "test/data/json_tests/fail27.json", - "test/data/json_tests/fail28.json", - "test/data/json_tests/fail29.json", - "test/data/json_tests/fail30.json", - "test/data/json_tests/fail31.json", - "test/data/json_tests/fail32.json", - "test/data/json_tests/fail33.json" - }) - { - CAPTURE(filename); - json j; - std::ifstream f(filename); - CHECK_THROWS_AS(j << f, std::invalid_argument); - } - } - - SECTION("expected passes") - { - for (auto filename : - { - "test/data/json_tests/pass1.json", - "test/data/json_tests/pass2.json", - "test/data/json_tests/pass3.json" - }) - { - CAPTURE(filename); - json j; - std::ifstream f(filename); - CHECK_NOTHROW(j << f); - } - } -} - -TEST_CASE("compliance tests from nativejson-benchmark") -{ - // test cases from https://github.com/miloyip/nativejson-benchmark/blob/master/src/main.cpp - - SECTION("doubles") - { - auto TEST_DOUBLE = [](const std::string & json_string, const double expected) - { - CAPTURE(json_string); - CAPTURE(expected); - CHECK(json::parse(json_string)[0].get() == Approx(expected)); - }; - - TEST_DOUBLE("[0.0]", 0.0); - TEST_DOUBLE("[-0.0]", -0.0); - TEST_DOUBLE("[1.0]", 1.0); - TEST_DOUBLE("[-1.0]", -1.0); - TEST_DOUBLE("[1.5]", 1.5); - TEST_DOUBLE("[-1.5]", -1.5); - TEST_DOUBLE("[3.1416]", 3.1416); - TEST_DOUBLE("[1E10]", 1E10); - TEST_DOUBLE("[1e10]", 1e10); - TEST_DOUBLE("[1E+10]", 1E+10); - TEST_DOUBLE("[1E-10]", 1E-10); - TEST_DOUBLE("[-1E10]", -1E10); - TEST_DOUBLE("[-1e10]", -1e10); - TEST_DOUBLE("[-1E+10]", -1E+10); - TEST_DOUBLE("[-1E-10]", -1E-10); - TEST_DOUBLE("[1.234E+10]", 1.234E+10); - TEST_DOUBLE("[1.234E-10]", 1.234E-10); - TEST_DOUBLE("[1.79769e+308]", 1.79769e+308); - TEST_DOUBLE("[2.22507e-308]", 2.22507e-308); - TEST_DOUBLE("[-1.79769e+308]", -1.79769e+308); - TEST_DOUBLE("[-2.22507e-308]", -2.22507e-308); - TEST_DOUBLE("[4.9406564584124654e-324]", 4.9406564584124654e-324); // minimum denormal - TEST_DOUBLE("[2.2250738585072009e-308]", 2.2250738585072009e-308); // Max subnormal double - TEST_DOUBLE("[2.2250738585072014e-308]", 2.2250738585072014e-308); // Min normal positive double - TEST_DOUBLE("[1.7976931348623157e+308]", 1.7976931348623157e+308); // Max double - TEST_DOUBLE("[1e-10000]", 0.0); // must underflow - TEST_DOUBLE("[18446744073709551616]", - 18446744073709551616.0); // 2^64 (max of uint64_t + 1, force to use double) - TEST_DOUBLE("[-9223372036854775809]", - -9223372036854775809.0); // -2^63 - 1(min of int64_t + 1, force to use double) - TEST_DOUBLE("[0.9868011474609375]", - 0.9868011474609375); // https://github.com/miloyip/rapidjson/issues/120 - TEST_DOUBLE("[123e34]", 123e34); // Fast Path Cases In Disguise - TEST_DOUBLE("[45913141877270640000.0]", 45913141877270640000.0); - TEST_DOUBLE("[2.2250738585072011e-308]", - 2.2250738585072011e-308); - //TEST_DOUBLE("[1e-00011111111111]", 0.0); - //TEST_DOUBLE("[-1e-00011111111111]", -0.0); - TEST_DOUBLE("[1e-214748363]", 0.0); - TEST_DOUBLE("[1e-214748364]", 0.0); - //TEST_DOUBLE("[1e-21474836311]", 0.0); - TEST_DOUBLE("[0.017976931348623157e+310]", 1.7976931348623157e+308); // Max double in another form - - // Since - // abs((2^-1022 - 2^-1074) - 2.2250738585072012e-308) = 3.109754131239141401123495768877590405345064751974375599... ¡Á 10^-324 - // abs((2^-1022) - 2.2250738585072012e-308) = 1.830902327173324040642192159804623318305533274168872044... ¡Á 10 ^ -324 - // So 2.2250738585072012e-308 should round to 2^-1022 = 2.2250738585072014e-308 - TEST_DOUBLE("[2.2250738585072012e-308]", - 2.2250738585072014e-308); - - // More closer to normal/subnormal boundary - // boundary = 2^-1022 - 2^-1075 = 2.225073858507201136057409796709131975934819546351645648... ¡Á 10^-308 - TEST_DOUBLE("[2.22507385850720113605740979670913197593481954635164564e-308]", - 2.2250738585072009e-308); - TEST_DOUBLE("[2.22507385850720113605740979670913197593481954635164565e-308]", - 2.2250738585072014e-308); - - // 1.0 is in (1.0 - 2^-54, 1.0 + 2^-53) - // 1.0 - 2^-54 = 0.999999999999999944488848768742172978818416595458984375 - TEST_DOUBLE("[0.999999999999999944488848768742172978818416595458984375]", 1.0); // round to even - TEST_DOUBLE("[0.999999999999999944488848768742172978818416595458984374]", - 0.99999999999999989); // previous double - TEST_DOUBLE("[0.999999999999999944488848768742172978818416595458984376]", 1.0); // next double - // 1.0 + 2^-53 = 1.00000000000000011102230246251565404236316680908203125 - TEST_DOUBLE("[1.00000000000000011102230246251565404236316680908203125]", 1.0); // round to even - TEST_DOUBLE("[1.00000000000000011102230246251565404236316680908203124]", 1.0); // previous double - TEST_DOUBLE("[1.00000000000000011102230246251565404236316680908203126]", - 1.00000000000000022); // next double - - // Numbers from https://github.com/floitsch/double-conversion/blob/master/test/cctest/test-strtod.cc - - TEST_DOUBLE("[72057594037927928.0]", 72057594037927928.0); - TEST_DOUBLE("[72057594037927936.0]", 72057594037927936.0); - TEST_DOUBLE("[72057594037927932.0]", 72057594037927936.0); - TEST_DOUBLE("[7205759403792793199999e-5]", 72057594037927928.0); - TEST_DOUBLE("[7205759403792793200001e-5]", 72057594037927936.0); - - TEST_DOUBLE("[9223372036854774784.0]", 9223372036854774784.0); - TEST_DOUBLE("[9223372036854775808.0]", 9223372036854775808.0); - TEST_DOUBLE("[9223372036854775296.0]", 9223372036854775808.0); - TEST_DOUBLE("[922337203685477529599999e-5]", 9223372036854774784.0); - TEST_DOUBLE("[922337203685477529600001e-5]", 9223372036854775808.0); - - TEST_DOUBLE("[10141204801825834086073718800384]", 10141204801825834086073718800384.0); - TEST_DOUBLE("[10141204801825835211973625643008]", 10141204801825835211973625643008.0); - TEST_DOUBLE("[10141204801825834649023672221696]", 10141204801825835211973625643008.0); - TEST_DOUBLE("[1014120480182583464902367222169599999e-5]", 10141204801825834086073718800384.0); - TEST_DOUBLE("[1014120480182583464902367222169600001e-5]", 10141204801825835211973625643008.0); - - TEST_DOUBLE("[5708990770823838890407843763683279797179383808]", - 5708990770823838890407843763683279797179383808.0); - TEST_DOUBLE("[5708990770823839524233143877797980545530986496]", - 5708990770823839524233143877797980545530986496.0); - TEST_DOUBLE("[5708990770823839207320493820740630171355185152]", - 5708990770823839524233143877797980545530986496.0); - TEST_DOUBLE("[5708990770823839207320493820740630171355185151999e-3]", - 5708990770823838890407843763683279797179383808.0); - TEST_DOUBLE("[5708990770823839207320493820740630171355185152001e-3]", - 5708990770823839524233143877797980545530986496.0); - - { - char n1e308[312]; // '1' followed by 308 '0' - n1e308[0] = '['; - n1e308[1] = '1'; - for (int j = 2; j < 310; j++) - { - n1e308[j] = '0'; - } - n1e308[310] = ']'; - n1e308[311] = '\0'; - TEST_DOUBLE(n1e308, 1E308); - } - - // Cover trimming - TEST_DOUBLE( - "[2.22507385850720113605740979670913197593481954635164564802342610972482222202107694551652952390813508" - "7914149158913039621106870086438694594645527657207407820621743379988141063267329253552286881372149012" - "9811224514518898490572223072852551331557550159143974763979834118019993239625482890171070818506906306" - "6665599493827577257201576306269066333264756530000924588831643303777979186961204949739037782970490505" - "1080609940730262937128958950003583799967207254304360284078895771796150945516748243471030702609144621" - "5722898802581825451803257070188608721131280795122334262883686223215037756666225039825343359745688844" - "2390026549819838548794829220689472168983109969836584681402285424333066033985088644580400103493397042" - "7567186443383770486037861622771738545623065874679014086723327636718751234567890123456789012345678901" - "e-308]", - 2.2250738585072014e-308); - } - - SECTION("strings") - { - auto TEST_STRING = [](const std::string & json_string, const std::string & expected) - { - CAPTURE(json_string); - CAPTURE(expected); - CHECK(json::parse(json_string)[0].get() == expected); - }; - - TEST_STRING("[\"\"]", ""); - TEST_STRING("[\"Hello\"]", "Hello"); - TEST_STRING("[\"Hello\\nWorld\"]", "Hello\nWorld"); - //TEST_STRING("[\"Hello\\u0000World\"]", "Hello\0World"); - TEST_STRING("[\"\\\"\\\\/\\b\\f\\n\\r\\t\"]", "\"\\/\b\f\n\r\t"); - TEST_STRING("[\"\\u0024\"]", "\x24"); // Dollar sign U+0024 - TEST_STRING("[\"\\u00A2\"]", "\xC2\xA2"); // Cents sign U+00A2 - TEST_STRING("[\"\\u20AC\"]", "\xE2\x82\xAC"); // Euro sign U+20AC - TEST_STRING("[\"\\uD834\\uDD1E\"]", "\xF0\x9D\x84\x9E"); // G clef sign U+1D11E - } - - SECTION("roundtrip") - { - // test cases are from https://github.com/miloyip/nativejson-benchmark/tree/master/test/data/roundtrip - - for (auto filename : - { - "test/data/json_roundtrip/roundtrip01.json", - "test/data/json_roundtrip/roundtrip02.json", - "test/data/json_roundtrip/roundtrip03.json", - "test/data/json_roundtrip/roundtrip04.json", - "test/data/json_roundtrip/roundtrip05.json", - "test/data/json_roundtrip/roundtrip06.json", - "test/data/json_roundtrip/roundtrip07.json", - "test/data/json_roundtrip/roundtrip08.json", - "test/data/json_roundtrip/roundtrip09.json", - "test/data/json_roundtrip/roundtrip10.json", - "test/data/json_roundtrip/roundtrip11.json", - "test/data/json_roundtrip/roundtrip12.json", - "test/data/json_roundtrip/roundtrip13.json", - "test/data/json_roundtrip/roundtrip14.json", - "test/data/json_roundtrip/roundtrip15.json", - "test/data/json_roundtrip/roundtrip16.json", - "test/data/json_roundtrip/roundtrip17.json", - "test/data/json_roundtrip/roundtrip18.json", - "test/data/json_roundtrip/roundtrip19.json", - "test/data/json_roundtrip/roundtrip20.json", - "test/data/json_roundtrip/roundtrip21.json", - "test/data/json_roundtrip/roundtrip22.json", - "test/data/json_roundtrip/roundtrip23.json", - "test/data/json_roundtrip/roundtrip24.json", - "test/data/json_roundtrip/roundtrip25.json", - "test/data/json_roundtrip/roundtrip26.json", - "test/data/json_roundtrip/roundtrip27.json", - "test/data/json_roundtrip/roundtrip28.json", - "test/data/json_roundtrip/roundtrip29.json", - "test/data/json_roundtrip/roundtrip30.json", - "test/data/json_roundtrip/roundtrip31.json", - "test/data/json_roundtrip/roundtrip32.json" - }) - { - CAPTURE(filename); - std::ifstream f(filename); - std::string json_string( (std::istreambuf_iterator(f) ), - (std::istreambuf_iterator()) ); - - json j = json::parse(json_string); - CHECK(j.dump() == json_string); - } - } -} - -TEST_CASE("test suite from json-test-suite") -{ - SECTION("read all sample.json") - { - // read a file with all unicode characters stored as single-character - // strings in a JSON array - std::ifstream f("test/data/json_testsuite/sample.json"); - json j; - CHECK_NOTHROW(j << f); - - // the array has 3 elements - CHECK(j.size() == 3); - } -} - -TEST_CASE("json.org examples") -{ - // here, we list all JSON values from http://json.org/example - - SECTION("1.json") - { - std::ifstream f("test/data/json.org/1.json"); - json j; - CHECK_NOTHROW(j << f); - } - - SECTION("2.json") - { - std::ifstream f("test/data/json.org/2.json"); - json j; - CHECK_NOTHROW(j << f); - } - - SECTION("3.json") - { - std::ifstream f("test/data/json.org/3.json"); - json j; - CHECK_NOTHROW(j << f); - } - - SECTION("4.json") - { - std::ifstream f("test/data/json.org/4.json"); - json j; - CHECK_NOTHROW(j << f); - } - - SECTION("5.json") - { - std::ifstream f("test/data/json.org/5.json"); - json j; - CHECK_NOTHROW(j << f); - } -} - -TEST_CASE("RFC 7159 examples") -{ - // here, we list all JSON values from the RFC 7159 document - - SECTION("7. Strings") - { - CHECK(json::parse("\"\\u005C\"") == json("\\")); - CHECK(json::parse("\"\\uD834\\uDD1E\"") == json("𝄞")); - CHECK(json::parse("\"𝄞\"") == json("𝄞")); - } - - SECTION("8.3 String Comparison") - { - CHECK(json::parse("\"a\\b\"") == json::parse("\"a\u005Cb\"")); - } - - SECTION("13 Examples") - { - { - CHECK_NOTHROW(json(R"( - { - "Image": { - "Width": 800, - "Height": 600, - "Title": "View from 15th Floor", - "Thumbnail": { - "Url": "http://www.example.com/image/481989943", - "Height": 125, - "Width": 100 - }, - "Animated" : false, - "IDs": [116, 943, 234, 38793] - } - } - )")); - } - - { - CHECK_NOTHROW(json(R"( - [ - { - "precision": "zip", - "Latitude": 37.7668, - "Longitude": -122.3959, - "Address": "", - "City": "SAN FRANCISCO", - "State": "CA", - "Zip": "94107", - "Country": "US" - }, - { - "precision": "zip", - "Latitude": 37.371991, - "Longitude": -122.026020, - "Address": "", - "City": "SUNNYVALE", - "State": "CA", - "Zip": "94085", - "Country": "US" - } - ])")); - } - - CHECK(json::parse("\"Hello world!\"") == json("Hello world!")); - CHECK(json::parse("42") == json(42)); - CHECK(json::parse("true") == json(true)); - } -} - -TEST_CASE("Unicode", "[hide]") -{ - SECTION("full enumeration of Unicode codepoints") - { - // create a string from a codepoint - auto codepoint_to_unicode = [](std::size_t cp) - { - char* buffer = new char[10]; - sprintf(buffer, "\\u%04lx", cp); - std::string result(buffer); - delete[] buffer; - return result; - }; - - // generate all codepoints - for (std::size_t cp = 0; cp <= 0x10FFFFu; ++cp) - { - // The Unicode standard permanently reserves these code point - // values for UTF-16 encoding of the high and low surrogates, and - // they will never be assigned a character, so there should be no - // reason to encode them. The official Unicode standard says that - // no UTF forms, including UTF-16, can encode these code points. - if (cp >= 0xD800u and cp <= 0xDFFFu) - { - continue; - } - - std::string res; - - if (cp < 0x10000u) - { - // codepoint can be represented with 16 bit - res += codepoint_to_unicode(cp); - } - else - { - // codepoint can be represented with a pair - res += codepoint_to_unicode(0xd800u + (((cp - 0x10000u) >> 10) & 0x3ffu)); - res += codepoint_to_unicode(0xdc00u + ((cp - 0x10000u) & 0x3ffu)); - } - - try - { - json j1, j2; - CHECK_NOTHROW(j1 = json::parse("\"" + res + "\"")); - CHECK_NOTHROW(j2 = json::parse(j1.dump())); - CHECK(j1 == j2); - } - catch (std::invalid_argument) - { - // we ignore parsing errors - } - } - } - - SECTION("read all unicode characters") - { - // read a file with all unicode characters stored as single-character - // strings in a JSON array - std::ifstream f("test/data/json_nlohmann_tests/all_unicode.json"); - json j; - CHECK_NOTHROW(j << f); - - // the array has 1112064 + 1 elemnts (a terminating "null" value) - CHECK(j.size() == 1112065); - - SECTION("check JSON Pointers") - { - for (auto s : j) - { - // skip non-string JSON values - if (not s.is_string()) - { - continue; - } - - std::string ptr = s; - - // tilde must be followed by 0 or 1 - if (ptr == "~") - { - ptr += "0"; - } - - // JSON Pointers must begin with "/" - ptr = "/" + ptr; - - CHECK_NOTHROW(json::json_pointer("/" + ptr)); - - // check escape/unescape roundtrip - auto escaped = json::json_pointer::escape(ptr); - json::json_pointer::unescape(escaped); - CHECK(escaped == ptr); - } - } - } - - SECTION("ignore byte-order-mark") - { - // read a file with a UTF-8 BOM - std::ifstream f("test/data/json_nlohmann_tests/bom.json"); - json j; - CHECK_NOTHROW(j << f); - } - - SECTION("error for incomplete/wrong BOM") - { - CHECK_THROWS_AS(json::parse("\xef\xbb"), std::invalid_argument); - CHECK_THROWS_AS(json::parse("\xef\xbb\xbb"), std::invalid_argument); - } -} - -TEST_CASE("JSON pointers") -{ - SECTION("errors") - { - CHECK_THROWS_AS(json::json_pointer("foo"), std::domain_error); - CHECK_THROWS_WITH(json::json_pointer("foo"), "JSON pointer must be empty or begin with '/'"); - - CHECK_THROWS_AS(json::json_pointer("/~~"), std::domain_error); - CHECK_THROWS_WITH(json::json_pointer("/~~"), "escape error: '~' must be followed with '0' or '1'"); - - CHECK_THROWS_AS(json::json_pointer("/~"), std::domain_error); - CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); - - json::json_pointer p; - CHECK_THROWS_AS(p.top(), std::domain_error); - CHECK_THROWS_WITH(p.top(), "JSON pointer has no parent"); - CHECK_THROWS_AS(p.pop_back(), std::domain_error); - CHECK_THROWS_WITH(p.pop_back(), "JSON pointer has no parent"); - } - - SECTION("examples from RFC 6901") - { - SECTION("nonconst access") - { - json j = R"( - { - "foo": ["bar", "baz"], - "": 0, - "a/b": 1, - "c%d": 2, - "e^f": 3, - "g|h": 4, - "i\\j": 5, - "k\"l": 6, - " ": 7, - "m~n": 8 - } - )"_json; - - // the whole document - CHECK(j[json::json_pointer()] == j); - CHECK(j[json::json_pointer("")] == j); - - // array access - CHECK(j[json::json_pointer("/foo")] == j["foo"]); - CHECK(j[json::json_pointer("/foo/0")] == j["foo"][0]); - CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); - CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); - - // checked array access - CHECK(j.at(json::json_pointer("/foo/0")) == j["foo"][0]); - CHECK(j.at(json::json_pointer("/foo/1")) == j["foo"][1]); - - // empty string access - CHECK(j[json::json_pointer("/")] == j[""]); - - // other cases - CHECK(j[json::json_pointer("/ ")] == j[" "]); - CHECK(j[json::json_pointer("/c%d")] == j["c%d"]); - CHECK(j[json::json_pointer("/e^f")] == j["e^f"]); - CHECK(j[json::json_pointer("/g|h")] == j["g|h"]); - CHECK(j[json::json_pointer("/i\\j")] == j["i\\j"]); - CHECK(j[json::json_pointer("/k\"l")] == j["k\"l"]); - - // checked access - CHECK(j.at(json::json_pointer("/ ")) == j[" "]); - CHECK(j.at(json::json_pointer("/c%d")) == j["c%d"]); - CHECK(j.at(json::json_pointer("/e^f")) == j["e^f"]); - CHECK(j.at(json::json_pointer("/g|h")) == j["g|h"]); - CHECK(j.at(json::json_pointer("/i\\j")) == j["i\\j"]); - CHECK(j.at(json::json_pointer("/k\"l")) == j["k\"l"]); - - // escaped access - CHECK(j[json::json_pointer("/a~1b")] == j["a/b"]); - CHECK(j[json::json_pointer("/m~0n")] == j["m~n"]); - - // unescaped access - CHECK_THROWS_AS(j[json::json_pointer("/a/b")], std::out_of_range); - CHECK_THROWS_WITH(j[json::json_pointer("/a/b")], "unresolved reference token 'b'"); - // "/a/b" works for JSON {"a": {"b": 42}} - CHECK(json({{"a", {{"b", 42}}}})[json::json_pointer("/a/b")] == json(42)); - - // unresolved access - json j_primitive = 1; - CHECK_THROWS_AS(j_primitive["/foo"_json_pointer], std::out_of_range); - CHECK_THROWS_WITH(j_primitive["/foo"_json_pointer], "unresolved reference token 'foo'"); - CHECK_THROWS_AS(j_primitive.at("/foo"_json_pointer), std::out_of_range); - CHECK_THROWS_WITH(j_primitive.at("/foo"_json_pointer), "unresolved reference token 'foo'"); - } - - SECTION("const access") - { - const json j = R"( - { - "foo": ["bar", "baz"], - "": 0, - "a/b": 1, - "c%d": 2, - "e^f": 3, - "g|h": 4, - "i\\j": 5, - "k\"l": 6, - " ": 7, - "m~n": 8 - } - )"_json; - - // the whole document - CHECK(j[json::json_pointer()] == j); - CHECK(j[json::json_pointer("")] == j); - - // array access - CHECK(j[json::json_pointer("/foo")] == j["foo"]); - CHECK(j[json::json_pointer("/foo/0")] == j["foo"][0]); - CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); - CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); - - // checked array access - CHECK(j.at(json::json_pointer("/foo/0")) == j["foo"][0]); - CHECK(j.at(json::json_pointer("/foo/1")) == j["foo"][1]); - - // empty string access - CHECK(j[json::json_pointer("/")] == j[""]); - - // other cases - CHECK(j[json::json_pointer("/ ")] == j[" "]); - CHECK(j[json::json_pointer("/c%d")] == j["c%d"]); - CHECK(j[json::json_pointer("/e^f")] == j["e^f"]); - CHECK(j[json::json_pointer("/g|h")] == j["g|h"]); - CHECK(j[json::json_pointer("/i\\j")] == j["i\\j"]); - CHECK(j[json::json_pointer("/k\"l")] == j["k\"l"]); - - // checked access - CHECK(j.at(json::json_pointer("/ ")) == j[" "]); - CHECK(j.at(json::json_pointer("/c%d")) == j["c%d"]); - CHECK(j.at(json::json_pointer("/e^f")) == j["e^f"]); - CHECK(j.at(json::json_pointer("/g|h")) == j["g|h"]); - CHECK(j.at(json::json_pointer("/i\\j")) == j["i\\j"]); - CHECK(j.at(json::json_pointer("/k\"l")) == j["k\"l"]); - - // escaped access - CHECK(j[json::json_pointer("/a~1b")] == j["a/b"]); - CHECK(j[json::json_pointer("/m~0n")] == j["m~n"]); - - // unescaped access - CHECK_THROWS_AS(j.at(json::json_pointer("/a/b")), std::out_of_range); - CHECK_THROWS_WITH(j.at(json::json_pointer("/a/b")), "key 'a' not found"); - - // unresolved access - const json j_primitive = 1; - CHECK_THROWS_AS(j_primitive["/foo"_json_pointer], std::out_of_range); - CHECK_THROWS_WITH(j_primitive["/foo"_json_pointer], "unresolved reference token 'foo'"); - CHECK_THROWS_AS(j_primitive.at("/foo"_json_pointer), std::out_of_range); - CHECK_THROWS_WITH(j_primitive.at("/foo"_json_pointer), "unresolved reference token 'foo'"); - } - - SECTION("user-defined string literal") - { - json j = R"( - { - "foo": ["bar", "baz"], - "": 0, - "a/b": 1, - "c%d": 2, - "e^f": 3, - "g|h": 4, - "i\\j": 5, - "k\"l": 6, - " ": 7, - "m~n": 8 - } - )"_json; - - // the whole document - CHECK(j[""_json_pointer] == j); - - // array access - CHECK(j["/foo"_json_pointer] == j["foo"]); - CHECK(j["/foo/0"_json_pointer] == j["foo"][0]); - CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); - } - } - - SECTION("array access") - { - SECTION("nonconst access") - { - json j = {1, 2, 3}; - const json j_const = j; - - // check reading access - CHECK(j["/0"_json_pointer] == j[0]); - CHECK(j["/1"_json_pointer] == j[1]); - CHECK(j["/2"_json_pointer] == j[2]); - - // assign to existing index - j["/1"_json_pointer] = 13; - CHECK(j[1] == json(13)); - - // assign to nonexisting index - j["/3"_json_pointer] = 33; - CHECK(j[3] == json(33)); - - // assign to nonexisting index (with gap) - j["/5"_json_pointer] = 55; - CHECK(j == json({1, 13, 3, 33, nullptr, 55})); - - // error with leading 0 - CHECK_THROWS_AS(j["/01"_json_pointer], std::domain_error); - CHECK_THROWS_WITH(j["/01"_json_pointer], "array index must not begin with '0'"); - CHECK_THROWS_AS(j_const["/01"_json_pointer], std::domain_error); - CHECK_THROWS_WITH(j_const["/01"_json_pointer], "array index must not begin with '0'"); - CHECK_THROWS_AS(j.at("/01"_json_pointer), std::domain_error); - CHECK_THROWS_WITH(j.at("/01"_json_pointer), "array index must not begin with '0'"); - CHECK_THROWS_AS(j_const.at("/01"_json_pointer), std::domain_error); - CHECK_THROWS_WITH(j_const.at("/01"_json_pointer), "array index must not begin with '0'"); - - // error with incorrect numbers - CHECK_THROWS_AS(j["/one"_json_pointer] = 1, std::invalid_argument); - - // assign to "-" - j["/-"_json_pointer] = 99; - CHECK(j == json({1, 13, 3, 33, nullptr, 55, 99})); - - // error when using "-" in const object - CHECK_THROWS_AS(j_const["/-"_json_pointer], std::out_of_range); - CHECK_THROWS_WITH(j_const["/-"_json_pointer], "array index '-' (3) is out of range"); - - // error when using "-" with at - CHECK_THROWS_AS(j.at("/-"_json_pointer), std::out_of_range); - CHECK_THROWS_WITH(j.at("/-"_json_pointer), "array index '-' (7) is out of range"); - CHECK_THROWS_AS(j_const.at("/-"_json_pointer), std::out_of_range); - CHECK_THROWS_WITH(j_const.at("/-"_json_pointer), "array index '-' (3) is out of range"); - } - - SECTION("const access") - { - const json j = {1, 2, 3}; - - // check reading access - CHECK(j["/0"_json_pointer] == j[0]); - CHECK(j["/1"_json_pointer] == j[1]); - CHECK(j["/2"_json_pointer] == j[2]); - - // assign to nonexisting index - CHECK_THROWS_AS(j.at("/3"_json_pointer), std::out_of_range); - CHECK_THROWS_WITH(j.at("/3"_json_pointer), "array index 3 is out of range"); - - // assign to nonexisting index (with gap) - CHECK_THROWS_AS(j.at("/5"_json_pointer), std::out_of_range); - CHECK_THROWS_WITH(j.at("/5"_json_pointer), "array index 5 is out of range"); - - // assign to "-" - CHECK_THROWS_AS(j["/-"_json_pointer], std::out_of_range); - CHECK_THROWS_WITH(j["/-"_json_pointer], "array index '-' (3) is out of range"); - CHECK_THROWS_AS(j.at("/-"_json_pointer), std::out_of_range); - CHECK_THROWS_WITH(j.at("/-"_json_pointer), "array index '-' (3) is out of range"); - } - - } - - SECTION("flatten") - { - json j = - { - {"pi", 3.141}, - {"happy", true}, - {"name", "Niels"}, - {"nothing", nullptr}, - { - "answer", { - {"everything", 42} - } - }, - {"list", {1, 0, 2}}, - { - "object", { - {"currency", "USD"}, - {"value", 42.99}, - {"", "empty string"}, - {"/", "slash"}, - {"~", "tilde"}, - {"~1", "tilde1"} - } - } - }; - - json j_flatten = - { - {"/pi", 3.141}, - {"/happy", true}, - {"/name", "Niels"}, - {"/nothing", nullptr}, - {"/answer/everything", 42}, - {"/list/0", 1}, - {"/list/1", 0}, - {"/list/2", 2}, - {"/object/currency", "USD"}, - {"/object/value", 42.99}, - {"/object/", "empty string"}, - {"/object/~1", "slash"}, - {"/object/~0", "tilde"}, - {"/object/~01", "tilde1"} - }; - - // check if flattened result is as expected - CHECK(j.flatten() == j_flatten); - - // check if unflattened result is as expected - CHECK(j_flatten.unflatten() == j); - - // error for nonobjects - CHECK_THROWS_AS(json(1).unflatten(), std::domain_error); - CHECK_THROWS_WITH(json(1).unflatten(), "only objects can be unflattened"); - - // error for nonprimitve values - CHECK_THROWS_AS(json({{"/1", {1, 2, 3}}}).unflatten(), std::domain_error); - CHECK_THROWS_WITH(json({{"/1", {1, 2, 3}}}).unflatten(), "values in object must be primitive"); - - // error for conflicting values - json j_error = {{"", 42}, {"/foo", 17}}; - CHECK_THROWS_AS(j_error.unflatten(), std::domain_error); - CHECK_THROWS_WITH(j_error.unflatten(), "invalid value to unflatten"); - - // explicit roundtrip check - CHECK(j.flatten().unflatten() == j); - - // roundtrip for primitive values - json j_null; - CHECK(j_null.flatten().unflatten() == j_null); - json j_number = 42; - CHECK(j_number.flatten().unflatten() == j_number); - json j_boolean = false; - CHECK(j_boolean.flatten().unflatten() == j_boolean); - json j_string = "foo"; - CHECK(j_string.flatten().unflatten() == j_string); - - // roundtrip for empty structured values (will be unflattened to null) - json j_array(json::value_t::array); - CHECK(j_array.flatten().unflatten() == json()); - json j_object(json::value_t::object); - CHECK(j_object.flatten().unflatten() == json()); - } - - SECTION("string representation") - { - for (auto ptr : - {"", "/foo", "/foo/0", "/", "/a~1b", "/c%d", "/e^f", "/g|h", "/i\\j", "/k\"l", "/ ", "/m~0n" - }) - { - CHECK(json::json_pointer(ptr).to_string() == ptr); - } - } -} - -TEST_CASE("JSON patch") -{ - SECTION("examples from RFC 6902") - { - SECTION("4. Operations") - { - // the ordering of members in JSON objects is not significant: - json op1 = R"({ "op": "add", "path": "/a/b/c", "value": "foo" })"_json; - json op2 = R"({ "path": "/a/b/c", "op": "add", "value": "foo" })"_json; - json op3 = R"({ "value": "foo", "path": "/a/b/c", "op": "add" })"_json; - - // check if the operation objects are equivalent - CHECK(op1 == op2); - CHECK(op1 == op3); - } - - SECTION("4.1 add") - { - json patch = R"([{ "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] }])"_json; - - // However, the object itself or an array containing it does need - // to exist, and it remains an error for that not to be the case. - // For example, an "add" with a target location of "/a/b" starting - // with this document - json doc1 = R"({ "a": { "foo": 1 } })"_json; - - // is not an error, because "a" exists, and "b" will be added to - // its value. - CHECK_NOTHROW(doc1.patch(patch)); - CHECK(doc1.patch(patch) == R"( - { - "a": { - "foo": 1, - "b": { - "c": [ "foo", "bar" ] - } - } - } - )"_json); - - // It is an error in this document: - json doc2 = R"({ "q": { "bar": 2 } })"_json; - - // because "a" does not exist. - CHECK_THROWS_AS(doc2.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(doc2.patch(patch), "key 'a' not found"); - } - - SECTION("4.2 remove") - { - // If removing an element from an array, any elements above the - // specified index are shifted one position to the left. - json doc = {1, 2, 3, 4}; - json patch = {{{"op", "remove"}, {"path", "/1"}}}; - CHECK(doc.patch(patch) == json({1, 3, 4})); - } - - SECTION("A.1. Adding an Object Member") - { - // An example target JSON document: - json doc = R"( - { "foo": "bar"} - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/baz", "value": "qux" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("A.2. Adding an Array Element") - { - // An example target JSON document: - json doc = R"( - { "foo": [ "bar", "baz" ] } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/foo/1", "value": "qux" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { "foo": [ "bar", "qux", "baz" ] } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("A.3. Removing an Object Member") - { - // An example target JSON document: - json doc = R"( - { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "remove", "path": "/baz" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { "foo": "bar" } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("A.4. Removing an Array Element") - { - // An example target JSON document: - json doc = R"( - { "foo": [ "bar", "qux", "baz" ] } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "remove", "path": "/foo/1" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { "foo": [ "bar", "baz" ] } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("A.5. Replacing a Value") - { - // An example target JSON document: - json doc = R"( - { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "replace", "path": "/baz", "value": "boo" } - ] - )"_json; - - json expected = R"( - { - "baz": "boo", - "foo": "bar" - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("A.6. Moving a Value") - { - // An example target JSON document: - json doc = R"( - { - "foo": { - "bar": "baz", - "waldo": "fred" - }, - "qux": { - "corge": "grault" - } - } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { - "foo": { - "bar": "baz" - }, - "qux": { - "corge": "grault", - "thud": "fred" - } - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("A.7. Moving a Value") - { - // An example target JSON document: - json doc = R"( - { "foo": [ "all", "grass", "cows", "eat" ] } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "move", "from": "/foo/1", "path": "/foo/3" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { "foo": [ "all", "cows", "eat", "grass" ] } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("A.8. Testing a Value: Success") - { - // An example target JSON document: - json doc = R"( - { - "baz": "qux", - "foo": [ "a", 2, "c" ] - } - )"_json; - - // A JSON Patch document that will result in successful evaluation: - json patch = R"( - [ - { "op": "test", "path": "/baz", "value": "qux" }, - { "op": "test", "path": "/foo/1", "value": 2 } - ] - )"_json; - - // check if evaluation does not throw - CHECK_NOTHROW(doc.patch(patch)); - // check if patched document is unchanged - CHECK(doc.patch(patch) == doc); - } - - SECTION("A.9. Testing a Value: Error") - { - // An example target JSON document: - json doc = R"( - { "baz": "qux" } - )"_json; - - // A JSON Patch document that will result in an error condition: - json patch = R"( - [ - { "op": "test", "path": "/baz", "value": "bar" } - ] - )"_json; - - // check that evaluation throws - CHECK_THROWS_AS(doc.patch(patch), std::domain_error); - CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); - } - - SECTION("A.10. Adding a Nested Member Object") - { - // An example target JSON document: - json doc = R"( - { "foo": "bar" } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/child", "value": { "grandchild": { } } } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { - "foo": "bar", - "child": { - "grandchild": { - } - } - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("A.11. Ignoring Unrecognized Elements") - { - // An example target JSON document: - json doc = R"( - { "foo": "bar" } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 } - ] - )"_json; - - json expected = R"( - { - "foo": "bar", - "baz": "qux" - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("A.12. Adding to a Nonexistent Target") - { - // An example target JSON document: - json doc = R"( - { "foo": "bar" } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/baz/bat", "value": "qux" } - ] - )"_json; - - // This JSON Patch document, applied to the target JSON document - // above, would result in an error (therefore, it would not be - // applied), because the "add" operation's target location that - // references neither the root of the document, nor a member of - // an existing object, nor a member of an existing array. - - CHECK_THROWS_AS(doc.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(doc.patch(patch), "key 'baz' not found"); - } - - // A.13. Invalid JSON Patch Document - // not applicable - - SECTION("A.14. Escape Ordering") - { - // An example target JSON document: - json doc = R"( - { - "/": 9, - "~1": 10 - } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - {"op": "test", "path": "/~01", "value": 10} - ] - )"_json; - - json expected = R"( - { - "/": 9, - "~1": 10 - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("A.15. Comparing Strings and Numbers") - { - // An example target JSON document: - json doc = R"( - { - "/": 9, - "~1": 10 - } - )"_json; - - // A JSON Patch document that will result in an error condition: - json patch = R"( - [ - {"op": "test", "path": "/~01", "value": "10"} - ] - )"_json; - - // check that evaluation throws - CHECK_THROWS_AS(doc.patch(patch), std::domain_error); - CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); - } - - SECTION("A.16. Adding an Array Value") - { - // An example target JSON document: - json doc = R"( - { "foo": ["bar"] } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/foo/-", "value": ["abc", "def"] } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { "foo": ["bar", ["abc", "def"]] } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - } - - SECTION("own examples") - { - SECTION("add") - { - SECTION("add to the root element") - { - // If the path is the root of the target document - the - // specified value becomes the entire content of the target - // document. - - // An example target JSON document: - json doc = 17; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "", "value": [1,2,3] } - ] - )"_json; - - // The resulting JSON document: - json expected = {1, 2, 3}; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("add to end of the array") - { - // The specified index MUST NOT be greater than the number of - // elements in the array. The example below uses and index of - // exactly the number of elements in the array which is legal. - - // An example target JSON document: - json doc = {0, 1, 2}; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/3", "value": 3 } - ] - )"_json; - - // The resulting JSON document: - json expected = {0, 1, 2, 3}; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - } - - SECTION("copy") - { - // An example target JSON document: - json doc = R"( - { - "foo": { - "bar": "baz", - "waldo": "fred" - }, - "qux": { - "corge": "grault" - } - } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "copy", "from": "/foo/waldo", "path": "/qux/thud" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { - "foo": { - "bar": "baz", - "waldo": "fred" - }, - "qux": { - "corge": "grault", - "thud": "fred" - } - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == expected); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, expected)) == expected); - } - - SECTION("replace") - { - json j = "string"; - json patch = {{{"op", "replace"}, {"path", ""}, {"value", 1}}}; - CHECK(j.patch(patch) == json(1)); - } - - SECTION("documentation GIF") - { - { - // a JSON patch - json p1 = R"( - [{"op": "add", "path": "/GB", "value": "London"}] - )"_json; - - // a JSON value - json source = R"( - {"D": "Berlin", "F": "Paris"} - )"_json; - - // apply the patch - json target = source.patch(p1); - // target = { "D": "Berlin", "F": "Paris", "GB": "London" } - CHECK(target == R"({ "D": "Berlin", "F": "Paris", "GB": "London" })"_json); - - // create a diff from two JSONs - json p2 = json::diff(target, source); - // p2 = [{"op": "delete", "path": "/GB"}] - CHECK(p2 == R"([{"op":"remove","path":"/GB"}])"_json); - } - { - // a JSON value - json j = {"good", "bad", "ugly"}; - - // a JSON pointer - auto ptr = json::json_pointer("/2"); - - // use to access elements - j[ptr] = {{"it", "cattivo"}}; - CHECK(j == R"(["good","bad",{"it":"cattivo"}])"_json); - - // use user-defined string literal - j["/2/en"_json_pointer] = "ugly"; - CHECK(j == R"(["good","bad",{"en":"ugly","it":"cattivo"}])"_json); - - json flat = j.flatten(); - CHECK(flat == R"({"/0":"good","/1":"bad","/2/en":"ugly","/2/it":"cattivo"})"_json); - } - } - } - - SECTION("errors") - { - SECTION("unknown operation") - { - SECTION("not an array") - { - json j; - json patch = {{"op", "add"}, {"path", ""}, {"value", 1}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "JSON patch must be an array of objects"); - } - - SECTION("not an array of objects") - { - json j; - json patch = {"op", "add", "path", "", "value", 1}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "JSON patch must be an array of objects"); - } - - SECTION("missing 'op'") - { - json j; - json patch = {{{"foo", "bar"}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation must have member 'op'"); - } - - SECTION("non-string 'op'") - { - json j; - json patch = {{{"op", 1}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation must have string member 'op'"); - } - - SECTION("invalid operation") - { - json j; - json patch = {{{"op", "foo"}, {"path", ""}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation value 'foo' is invalid"); - } - } - - SECTION("add") - { - SECTION("missing 'path'") - { - json j; - json patch = {{{"op", "add"}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'add' must have member 'path'"); - } - - SECTION("non-string 'path'") - { - json j; - json patch = {{{"op", "add"}, {"path", 1}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'add' must have string member 'path'"); - } - - SECTION("missing 'value'") - { - json j; - json patch = {{{"op", "add"}, {"path", ""}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'add' must have member 'value'"); - } - - SECTION("invalid array index") - { - json j = {1, 2}; - json patch = {{{"op", "add"}, {"path", "/4"}, {"value", 4}}}; - CHECK_THROWS_AS(j.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(j.patch(patch), "array index 4 is out of range"); - } - } - - SECTION("remove") - { - SECTION("missing 'path'") - { - json j; - json patch = {{{"op", "remove"}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'remove' must have member 'path'"); - } - - SECTION("non-string 'path'") - { - json j; - json patch = {{{"op", "remove"}, {"path", 1}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'remove' must have string member 'path'"); - } - - SECTION("nonexisting target location (array)") - { - json j = {1, 2, 3}; - json patch = {{{"op", "remove"}, {"path", "/17"}}}; - CHECK_THROWS_AS(j.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(j.patch(patch), "array index 17 is out of range"); - } - - SECTION("nonexisting target location (object)") - { - json j = {{"foo", 1}, {"bar", 2}}; - json patch = {{{"op", "remove"}, {"path", "/baz"}}}; - CHECK_THROWS_AS(j.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); - } - - SECTION("root element as target location") - { - json j = "string"; - json patch = {{{"op", "remove"}, {"path", ""}}}; - CHECK_THROWS_AS(j.patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.patch(patch), "JSON pointer has no parent"); - } - } - - SECTION("replace") - { - SECTION("missing 'path'") - { - json j; - json patch = {{{"op", "replace"}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'replace' must have member 'path'"); - } - - SECTION("non-string 'path'") - { - json j; - json patch = {{{"op", "replace"}, {"path", 1}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'replace' must have string member 'path'"); - } - - SECTION("missing 'value'") - { - json j; - json patch = {{{"op", "replace"}, {"path", ""}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'replace' must have member 'value'"); - } - - SECTION("nonexisting target location (array)") - { - json j = {1, 2, 3}; - json patch = {{{"op", "replace"}, {"path", "/17"}, {"value", 19}}}; - CHECK_THROWS_AS(j.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(j.patch(patch), "array index 17 is out of range"); - } - - SECTION("nonexisting target location (object)") - { - json j = {{"foo", 1}, {"bar", 2}}; - json patch = {{{"op", "replace"}, {"path", "/baz"}, {"value", 3}}}; - CHECK_THROWS_AS(j.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); - } - } - - SECTION("move") - { - SECTION("missing 'path'") - { - json j; - json patch = {{{"op", "move"}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have member 'path'"); - } - - SECTION("non-string 'path'") - { - json j; - json patch = {{{"op", "move"}, {"path", 1}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have string member 'path'"); - } - - SECTION("missing 'from'") - { - json j; - json patch = {{{"op", "move"}, {"path", ""}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have member 'from'"); - } - - SECTION("non-string 'from'") - { - json j; - json patch = {{{"op", "move"}, {"path", ""}, {"from", 1}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have string member 'from'"); - } - - SECTION("nonexisting from location (array)") - { - json j = {1, 2, 3}; - json patch = {{{"op", "move"}, {"path", "/0"}, {"from", "/5"}}}; - CHECK_THROWS_AS(j.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(j.patch(patch), "array index 5 is out of range"); - } - - SECTION("nonexisting from location (object)") - { - json j = {{"foo", 1}, {"bar", 2}}; - json patch = {{{"op", "move"}, {"path", "/baz"}, {"from", "/baz"}}}; - CHECK_THROWS_AS(j.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); - } - } - - SECTION("copy") - { - SECTION("missing 'path'") - { - json j; - json patch = {{{"op", "copy"}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have member 'path'"); - } - - SECTION("non-string 'path'") - { - json j; - json patch = {{{"op", "copy"}, {"path", 1}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have string member 'path'"); - } - - SECTION("missing 'from'") - { - json j; - json patch = {{{"op", "copy"}, {"path", ""}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have member 'from'"); - } - - SECTION("non-string 'from'") - { - json j; - json patch = {{{"op", "copy"}, {"path", ""}, {"from", 1}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have string member 'from'"); - } - - SECTION("nonexisting from location (array)") - { - json j = {1, 2, 3}; - json patch = {{{"op", "copy"}, {"path", "/0"}, {"from", "/5"}}}; - CHECK_THROWS_AS(j.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(j.patch(patch), "array index 5 is out of range"); - } - - SECTION("nonexisting from location (object)") - { - json j = {{"foo", 1}, {"bar", 2}}; - json patch = {{{"op", "copy"}, {"path", "/fob"}, {"from", "/baz"}}}; - CHECK_THROWS_AS(j.patch(patch), std::out_of_range); - CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); - } - } - - SECTION("test") - { - SECTION("missing 'path'") - { - json j; - json patch = {{{"op", "test"}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'test' must have member 'path'"); - } - - SECTION("non-string 'path'") - { - json j; - json patch = {{{"op", "test"}, {"path", 1}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'test' must have string member 'path'"); - } - - SECTION("missing 'value'") - { - json j; - json patch = {{{"op", "test"}, {"path", ""}}}; - CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); - CHECK_THROWS_WITH(j.patch(patch), "operation 'test' must have member 'value'"); - } - } - } - - SECTION("Examples from jsonpatch.com") - { - SECTION("Simple Example") - { - // The original document - json doc = R"( - { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // The patch - json patch = R"( - [ - { "op": "replace", "path": "/baz", "value": "boo" }, - { "op": "add", "path": "/hello", "value": ["world"] }, - { "op": "remove", "path": "/foo"} - ] - )"_json; - - // The result - json result = R"( - { - "baz": "boo", - "hello": ["world"] - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == result); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, result)) == result); - } - - SECTION("Operations") - { - // The original document - json doc = R"( - { - "biscuits": [ - {"name":"Digestive"}, - {"name": "Choco Liebniz"} - ] - } - )"_json; - - SECTION("add") - { - // The patch - json patch = R"( - [ - {"op": "add", "path": "/biscuits/1", "value": {"name": "Ginger Nut"}} - ] - )"_json; - - // The result - json result = R"( - { - "biscuits": [ - {"name": "Digestive"}, - {"name": "Ginger Nut"}, - {"name": "Choco Liebniz"} - ] - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == result); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, result)) == result); - } - - SECTION("remove") - { - // The patch - json patch = R"( - [ - {"op": "remove", "path": "/biscuits"} - ] - )"_json; - - // The result - json result = R"( - {} - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == result); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, result)) == result); - } - - SECTION("replace") - { - // The patch - json patch = R"( - [ - {"op": "replace", "path": "/biscuits/0/name", "value": "Chocolate Digestive"} - ] - )"_json; - - // The result - json result = R"( - { - "biscuits": [ - {"name": "Chocolate Digestive"}, - {"name": "Choco Liebniz"} - ] - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == result); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, result)) == result); - } - - SECTION("copy") - { - // The patch - json patch = R"( - [ - {"op": "copy", "from": "/biscuits/0", "path": "/best_biscuit"} - ] - )"_json; - - // The result - json result = R"( - { - "biscuits": [ - {"name": "Digestive"}, - {"name": "Choco Liebniz"} - ], - "best_biscuit": { - "name": "Digestive" - } - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == result); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, result)) == result); - } - - SECTION("move") - { - // The patch - json patch = R"( - [ - {"op": "move", "from": "/biscuits", "path": "/cookies"} - ] - )"_json; - - // The result - json result = R"( - { - "cookies": [ - {"name": "Digestive"}, - {"name": "Choco Liebniz"} - ] - } - )"_json; - - // check if patched value is as expected - CHECK(doc.patch(patch) == result); - - // check roundtrip - CHECK(doc.patch(json::diff(doc, result)) == result); - } - - SECTION("test") - { - // The patch - json patch = R"( - [ - {"op": "test", "path": "/best_biscuit/name", "value": "Choco Liebniz"} - ] - )"_json; - - // the test will fail - CHECK_THROWS_AS(doc.patch(patch), std::domain_error); - CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); - } - } - } - - SECTION("Examples from bruth.github.io/jsonpatch-js") - { - SECTION("add") - { - CHECK(R"( {} )"_json.patch( - R"( [{"op": "add", "path": "/foo", "value": "bar"}] )"_json - ) == R"( {"foo": "bar"} )"_json); - - CHECK(R"( {"foo": [1, 3]} )"_json.patch( - R"( [{"op": "add", "path": "/foo", "value": "bar"}] )"_json - ) == R"( {"foo": "bar"} )"_json); - - CHECK(R"( {"foo": [{}]} )"_json.patch( - R"( [{"op": "add", "path": "/foo/0/bar", "value": "baz"}] )"_json - ) == R"( {"foo": [{"bar": "baz"}]} )"_json); - } - - SECTION("remove") - { - CHECK(R"( {"foo": "bar"} )"_json.patch( - R"( [{"op": "remove", "path": "/foo"}] )"_json - ) == R"( {} )"_json); - - CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( - R"( [{"op": "remove", "path": "/foo/1"}] )"_json - ) == R"( {"foo": [1, 3]} )"_json); - - CHECK(R"( {"foo": [{"bar": "baz"}]} )"_json.patch( - R"( [{"op": "remove", "path": "/foo/0/bar"}] )"_json - ) == R"( {"foo": [{}]} )"_json); - } - - SECTION("replace") - { - CHECK(R"( {"foo": "bar"} )"_json.patch( - R"( [{"op": "replace", "path": "/foo", "value": 1}] )"_json - ) == R"( {"foo": 1} )"_json); - - CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( - R"( [{"op": "replace", "path": "/foo/1", "value": 4}] )"_json - ) == R"( {"foo": [1, 4, 3]} )"_json); - - CHECK(R"( {"foo": [{"bar": "baz"}]} )"_json.patch( - R"( [{"op": "replace", "path": "/foo/0/bar", "value": 1}] )"_json - ) == R"( {"foo": [{"bar": 1}]} )"_json); - } - - SECTION("move") - { - CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( - R"( [{"op": "move", "from": "/foo", "path": "/bar"}] )"_json - ) == R"( {"bar": [1, 2, 3]} )"_json); - } - - SECTION("copy") - { - CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( - R"( [{"op": "copy", "from": "/foo/1", "path": "/bar"}] )"_json - ) == R"( {"foo": [1, 2, 3], "bar": 2} )"_json); - } - - SECTION("copy") - { - CHECK_NOTHROW(R"( {"foo": "bar"} )"_json.patch( - R"( [{"op": "test", "path": "/foo", "value": "bar"}] )"_json)); - } - } -} - -TEST_CASE("regression tests") -{ - SECTION("issue #60 - Double quotation mark is not parsed correctly") - { - SECTION("escape_dobulequote") - { - auto s = "[\"\\\"foo\\\"\"]"; - json j = json::parse(s); - auto expected = R"(["\"foo\""])"_json; - CHECK(j == expected); - } - } - - SECTION("issue #70 - Handle infinity and NaN cases") - { - SECTION("NAN value") - { - CHECK(json(NAN) == json()); - CHECK(json(json::number_float_t(NAN)) == json()); - } - - SECTION("infinity") - { - CHECK(json(INFINITY) == json()); - CHECK(json(json::number_float_t(INFINITY)) == json()); - } - } - - SECTION("pull request #71 - handle enum type") - { - enum { t = 0 }; - json j = json::array(); - j.push_back(t); - - j.push_back(json::object( - { - {"game_type", t} - })); - } - - SECTION("issue #76 - dump() / parse() not idempotent") - { - // create JSON object - json fields; - fields["one"] = std::string("one"); - fields["two"] = std::string("two three"); - fields["three"] = std::string("three \"four\""); - - // create another JSON object by deserializing the serialization - std::string payload = fields.dump(); - json parsed_fields = json::parse(payload); - - // check individual fields to match both objects - CHECK(parsed_fields["one"] == fields["one"]); - CHECK(parsed_fields["two"] == fields["two"]); - CHECK(parsed_fields["three"] == fields["three"]); - - // check individual fields to match original input - CHECK(parsed_fields["one"] == std::string("one")); - CHECK(parsed_fields["two"] == std::string("two three")); - CHECK(parsed_fields["three"] == std::string("three \"four\"")); - - // check equality of the objects - CHECK(parsed_fields == fields); - - // check equality of the serialized objects - CHECK(fields.dump() == parsed_fields.dump()); - - // check everything in one line - CHECK(fields == json::parse(fields.dump())); - } - - SECTION("issue #82 - lexer::get_number return NAN") - { - const auto content = R"( - { - "Test":"Test1", - "Number":100, - "Foo":42.42 - })"; - - std::stringstream ss; - ss << content; - json j; - ss >> j; - - std::string test = j["Test"]; - CHECK(test == "Test1"); - int number = j["Number"]; - CHECK(number == 100); - float foo = j["Foo"]; - CHECK(foo == Approx(42.42)); - } - - SECTION("issue #89 - nonstandard integer type") - { - // create JSON class with nonstandard integer number type - using custom_json = - nlohmann::basic_json; - custom_json j; - j["int_1"] = 1; - // we need to cast to int to compile with Catch - the value is int32_t - CHECK(static_cast(j["int_1"]) == 1); - - // tests for correct handling of non-standard integers that overflow the type selected by the user - - // unsigned integer object creation - expected to wrap and still be stored as an integer - j = 4294967296U; // 2^32 - CHECK(static_cast(j.type()) == static_cast(custom_json::value_t::number_unsigned)); - CHECK(j.get() == 0); // Wrap - - // unsigned integer parsing - expected to overflow and be stored as a float - j = custom_json::parse("4294967296"); // 2^32 - CHECK(static_cast(j.type()) == static_cast(custom_json::value_t::number_float)); - CHECK(j.get() == 4294967296.0f); - - // integer object creation - expected to wrap and still be stored as an integer - j = -2147483649LL; // -2^31-1 - CHECK(static_cast(j.type()) == static_cast(custom_json::value_t::number_integer)); - CHECK(j.get() == 2147483647); // Wrap - - // integer parsing - expected to overflow and be stored as a float with rounding - j = custom_json::parse("-2147483649"); // -2^31 - CHECK(static_cast(j.type()) == static_cast(custom_json::value_t::number_float)); - CHECK(j.get() == -2147483650.0f); - } - - SECTION("issue #93 reverse_iterator operator inheritance problem") - { - { - json a = {1, 2, 3}; - json::reverse_iterator rit = a.rbegin(); - ++rit; - CHECK(*rit == json(2)); - CHECK(rit.value() == json(2)); - } - { - json a = {1, 2, 3}; - json::reverse_iterator rit = ++a.rbegin(); - } - { - json a = {1, 2, 3}; - json::reverse_iterator rit = a.rbegin(); - ++rit; - json b = {0, 0, 0}; - std::transform(rit, a.rend(), b.rbegin(), [](json el) - { - return el; - }); - CHECK(b == json({0, 1, 2})); - } - { - json a = {1, 2, 3}; - json b = {0, 0, 0}; - std::transform(++a.rbegin(), a.rend(), b.rbegin(), [](json el) - { - return el; - }); - CHECK(b == json({0, 1, 2})); - } - } - - SECTION("issue #100 - failed to iterator json object with reverse_iterator") - { - json config = - { - { "111", 111 }, - { "112", 112 }, - { "113", 113 } - }; - - std::stringstream ss; - - for (auto it = config.begin(); it != config.end(); ++it) - { - ss << it.key() << ": " << it.value() << '\n'; - } - - for (auto it = config.rbegin(); it != config.rend(); ++it) - { - ss << it.key() << ": " << it.value() << '\n'; - } - - CHECK(ss.str() == "111: 111\n112: 112\n113: 113\n113: 113\n112: 112\n111: 111\n"); - } - - SECTION("issue #101 - binary string causes numbers to be dumped as hex") - { - int64_t number = 10; - std::string bytes{"\x00" "asdf\n", 6}; - json j; - j["int64"] = number; - j["binary string"] = bytes; - // make sure the number is really printed as decimal "10" and not as - // hexadecimal "a" - CHECK(j.dump() == "{\"binary string\":\"\\u0000asdf\\n\",\"int64\":10}"); - } - - SECTION("issue #111 - subsequent unicode chars") - { - std::string bytes{0x7, 0x7}; - json j; - j["string"] = bytes; - CHECK(j["string"] == "\u0007\u0007"); - } - - SECTION("issue #144 - implicit assignment to std::string fails") - { - json o = {{"name", "value"}}; - - std::string s1 = o["name"]; - CHECK(s1 == "value"); - - std::string s2; - s2 = o["name"]; - - CHECK(s2 == "value"); - } - - SECTION("issue #146 - character following a surrogate pair is skipped") - { - CHECK(json::parse("\"\\ud80c\\udc60abc\"").get() == u8"\U00013060abc"); - } - - SECTION("issue #171 - Cannot index by key of type static constexpr const char*") - { - json j; - - // Non-const access with key as "char []" - char array_key[] = "Key1"; - CHECK_NOTHROW(j[array_key] = 1); - CHECK(j[array_key] == json(1)); - - // Non-const access with key as "const char[]" - const char const_array_key[] = "Key2"; - CHECK_NOTHROW(j[const_array_key] = 2); - CHECK(j[const_array_key] == json(2)); - - // Non-const access with key as "char *" - char _ptr_key[] = "Key3"; - char* ptr_key = &_ptr_key[0]; - CHECK_NOTHROW(j[ptr_key] = 3); - CHECK(j[ptr_key] == json(3)); - - // Non-const access with key as "const char *" - const char* const_ptr_key = "Key4"; - CHECK_NOTHROW(j[const_ptr_key] = 4); - CHECK(j[const_ptr_key] == json(4)); - - // Non-const access with key as "static constexpr const char *" - static constexpr const char* constexpr_ptr_key = "Key5"; - CHECK_NOTHROW(j[constexpr_ptr_key] = 5); - CHECK(j[constexpr_ptr_key] == json(5)); - - const json j_const = j; - - // Const access with key as "char []" - CHECK(j_const[array_key] == json(1)); - - // Const access with key as "const char[]" - CHECK(j_const[const_array_key] == json(2)); - - // Const access with key as "char *" - CHECK(j_const[ptr_key] == json(3)); - - // Const access with key as "const char *" - CHECK(j_const[const_ptr_key] == json(4)); - - // Const access with key as "static constexpr const char *" - CHECK(j_const[constexpr_ptr_key] == json(5)); - } - - SECTION("issue #186 miloyip/nativejson-benchmark: floating-point parsing") - { - json j; - - j = json::parse("-0.0"); - CHECK(j.get() == -0.0); - - j = json::parse("2.22507385850720113605740979670913197593481954635164564e-308"); - CHECK(j.get() == 2.2250738585072009e-308); - - j = json::parse("0.999999999999999944488848768742172978818416595458984374"); - CHECK(j.get() == 0.99999999999999989); - - j = json::parse("1.00000000000000011102230246251565404236316680908203126"); - CHECK(j.get() == 1.00000000000000022); - - j = json::parse("7205759403792793199999e-5"); - CHECK(j.get() == 72057594037927928.0); - - j = json::parse("922337203685477529599999e-5"); - CHECK(j.get() == 9223372036854774784.0); - - j = json::parse("1014120480182583464902367222169599999e-5"); - CHECK(j.get() == 10141204801825834086073718800384.0); - - j = json::parse("5708990770823839207320493820740630171355185151999e-3"); - CHECK(j.get() == 5708990770823838890407843763683279797179383808.0); - - // create JSON class with nonstandard float number type - - // float - nlohmann::basic_json j_float = - 1.23e25f; - CHECK(j_float.get() == 1.23e25f); - - // double - nlohmann::basic_json j_double = - 1.23e35f; - CHECK(j_double.get() == 1.23e35f); - - // long double - nlohmann::basic_json - j_long_double = 1.23e45L; - CHECK(j_long_double.get() == 1.23e45L); - } - - SECTION("issue #228 - double values are serialized with commas as decimal points") - { - json j1a = 23.42; - json j1b = json::parse("23.42"); - - json j2a = 2342e-2; - //issue #230 - //json j2b = json::parse("2342e-2"); - - json j3a = 10E3; - json j3b = json::parse("10E3"); - json j3c = json::parse("10e3"); - - // class to create a locale that would use a comma for decimals - class CommaDecimalSeparator : public std::numpunct - { - protected: - char do_decimal_point() const - { - return ','; - } - }; - - // change locale to mess with decimal points - std::locale::global(std::locale(std::locale(), new CommaDecimalSeparator)); - - CHECK(j1a.dump() == "23.42"); - CHECK(j1b.dump() == "23.42"); - - CHECK(j2a.dump() == "23.42"); - //issue #230 - //CHECK(j2b.dump() == "23.42"); - - CHECK(j3a.dump() == "10000"); - CHECK(j3b.dump() == "1E04"); - CHECK(j3c.dump() == "1e04"); - } - - SECTION("issue #233 - Can't use basic_json::iterator as a base iterator for std::move_iterator") - { - json source = {"a", "b", "c"}; - json expected = {"a", "b"}; - json dest; - - std::copy_n(std::make_move_iterator(source.begin()), 2, std::back_inserter(dest)); - - CHECK(dest == expected); - } - - SECTION("issue ##235 - ambiguous overload for 'push_back' and 'operator+='") - { - json data = {{"key", "value"}}; - data.push_back({"key2", "value2"}); - data += {"key3", "value3"}; - - CHECK(data == json({{"key", "value"}, {"key2", "value2"}, {"key3", "value3"}})); - } -} - -// special test case to check if memory is leaked if constructor throws - -template -struct my_allocator : std::allocator -{ - template - void construct(T*, Args&& ...) - { - throw std::bad_alloc(); - } -}; - -TEST_CASE("bad_alloc") -{ - SECTION("bad_alloc") - { - // create JSON type using the throwing allocator - using my_json = nlohmann::basic_json; - - // creating an object should throw - CHECK_THROWS_AS(my_json j(my_json::value_t::object), std::bad_alloc); - } -} diff --git a/resources/cmake/find_modules/FindHwloc.cmake b/resources/cmake/find_modules/FindHwloc.cmake index d1b5b488e..1db759375 100644 --- a/resources/cmake/find_modules/FindHwloc.cmake +++ b/resources/cmake/find_modules/FindHwloc.cmake @@ -1,179 +1,55 @@ -# FindHwloc -# ---------- +# Try to find hwloc libraries and headers. # -# Try to find Portable Hardware Locality (hwloc) libraries. -# http://www.open-mpi.org/software/hwloc +# Usage of this module: # -# You may declare HWLOC_ROOT environment variable to tell where -# your hwloc library is installed. +# find_package(hwloc) # -# Once done this will define:: +# Variables defined by this module: # -# Hwloc_FOUND - True if hwloc was found -# Hwloc_INCLUDE_DIRS - include directories for hwloc -# Hwloc_LIBRARIES - link against these libraries to use hwloc -# Hwloc_VERSION - version -# Hwloc_CFLAGS - include directories as compiler flags -# Hwloc_LDLFAGS - link paths and libs as compiler flags -# - -#============================================================================= -# Copyright 2014 Mikael Lepistö -# -# Distributed under the OSI-approved BSD License (the "License"); -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= - -if(WIN32) - find_path(Hwloc_INCLUDE_DIR - NAMES - hwloc.h - PATHS - ENV "PROGRAMFILES(X86)" - ENV HWLOC_ROOT - PATH_SUFFIXES - include - ) - - find_library(Hwloc_LIBRARY - NAMES - libhwloc.lib - PATHS - ENV "PROGRAMFILES(X86)" - ENV HWLOC_ROOT - PATH_SUFFIXES - lib - ) - - # - # Check if the found library can be used to linking - # - SET (_TEST_SOURCE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/linktest.c") - FILE (WRITE "${_TEST_SOURCE}" - " - #include - int main() - { - hwloc_topology_t topology; - int nbcores; - hwloc_topology_init(&topology); - hwloc_topology_load(topology); - nbcores = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_CORE); - hwloc_topology_destroy(topology); - return 0; - } - " - ) - - TRY_COMPILE(_LINK_SUCCESS ${CMAKE_BINARY_DIR} "${_TEST_SOURCE}" - CMAKE_FLAGS - "-DINCLUDE_DIRECTORIES:STRING=${Hwloc_INCLUDE_DIR}" - CMAKE_FLAGS - "-DLINK_LIBRARIES:STRING=${Hwloc_LIBRARY}" - ) - - IF(NOT _LINK_SUCCESS) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - message(STATUS "You are building 64bit target.") - ELSE() - message(STATUS "You are building 32bit code. If you like to build x64 use e.g. -G 'Visual Studio 12 Win64' generator." ) - ENDIF() - message(FATAL_ERROR "Library found, but linking test program failed.") - ENDIF() - - # - # Resolve version if some compiled binary found... - # - find_program(HWLOC_INFO_EXECUTABLE - NAMES - hwloc-info - PATHS - ENV HWLOC_ROOT - PATH_SUFFIXES - bin - ) - - if(HWLOC_INFO_EXECUTABLE) - execute_process( - COMMAND ${HWLOC_INFO_EXECUTABLE} "--version" - OUTPUT_VARIABLE HWLOC_VERSION_LINE - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - string(REGEX MATCH "([0-9]+.[0-9]+)$" - Hwloc_VERSION "${HWLOC_VERSION_LINE}") - unset(HWLOC_VERSION_LINE) - endif() - - # - # All good - # - - set(Hwloc_LIBRARIES ${Hwloc_LIBRARY}) - set(Hwloc_INCLUDE_DIRS ${Hwloc_INCLUDE_DIR}) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args( - Hwloc - FOUND_VAR Hwloc_FOUND - REQUIRED_VARS Hwloc_LIBRARY Hwloc_INCLUDE_DIR - VERSION_VAR Hwloc_VERSION) - - mark_as_advanced( - Hwloc_INCLUDE_DIR - Hwloc_LIBRARY) - - foreach(arg ${Hwloc_INCLUDE_DIRS}) - set(Hwloc_CFLAGS "${Hwloc_CFLAGS} /I${arg}") - endforeach() +# HWLOC_FOUND System has hwloc libraries and headers +# HWLOC_LIBRARIES The hwloc library +# HWLOC_INCLUDE_DIRS The location of HWLOC headers - set(Hwloc_LDFLAGS "${Hwloc_LIBRARY}") +find_path( + HWLOC_PREFIX + NAMES include/hwloc.h +) -else() +if (NOT HWLOC_PREFIX AND NOT $ENV{HWLOC_BASE} STREQUAL "") + set(HWLOC_PREFIX $ENV{HWLOC_BASE}) +endif() - # Find with pkgconfig - find_package(PkgConfig) +message(STATUS "Searching for hwloc library in path " ${HWLOC_PREFIX}) - if(HWLOC_ROOT) - set(ENV{PKG_CONFIG_PATH} "${HWLOC_ROOT}/lib/pkgconfig") - else() - foreach(PREFIX ${CMAKE_PREFIX_PATH}) - set(PKG_CONFIG_PATH "${PKG_CONFIG_PATH}:${PREFIX}/lib/pkgconfig") - endforeach() - set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:$ENV{PKG_CONFIG_PATH}") - endif() +find_library( + HWLOC_LIBRARIES + NAMES hwloc + HINTS ${HWLOC_PREFIX}/lib +) - if(hwloc_FIND_REQUIRED) - set(_hwloc_OPTS "REQUIRED") - elseif(hwloc_FIND_QUIETLY) - set(_hwloc_OPTS "QUIET") - else() - set(_hwloc_output 1) - endif() +find_path( + HWLOC_INCLUDE_DIRS + NAMES hwloc.h + HINTS ${HWLOC_PREFIX}/include +) - if(hwloc_FIND_VERSION) - if(hwloc_FIND_VERSION_EXACT) - pkg_check_modules(Hwloc ${_hwloc_OPTS} hwloc=${hwloc_FIND_VERSION}) - else() - pkg_check_modules(Hwloc ${_hwloc_OPTS} hwloc>=${hwloc_FIND_VERSION}) - endif() - else() - pkg_check_modules(Hwloc ${_hwloc_OPTS} hwloc) - endif() +include(FindPackageHandleStandardArgs) - if(Hwloc_FOUND) - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(Hwloc DEFAULT_MSG Hwloc_LIBRARIES) +find_package_handle_standard_args( + HWLOC DEFAULT_MSG + HWLOC_LIBRARIES + HWLOC_INCLUDE_DIRS +) - if(NOT ${Hwloc_VERSION} VERSION_LESS 1.7.0) - set(Hwloc_GL_FOUND 1) - endif() +mark_as_advanced( + HWLOC_LIBRARIES + HWLOC_INCLUDE_DIRS +) - if(_hwloc_output) - message(STATUS - "Found hwloc ${Hwloc_VERSION} in ${Hwloc_INCLUDE_DIRS}:${Hwloc_LIBRARIES}") - endif() +if (HWLOC_FOUND) + if (NOT $ENV{HWLOC_LIB} STREQUAL "") +# set(HWLOC_LIBRARIES "$ENV{HWLOC_LIB}") endif() -endif() + message(STATUS "hwloc includes: " ${HWLOC_INCLUDE_DIRS}) + message(STATUS "hwloc libraries: " ${HWLOC_LIBRARIES}) +endif() \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a600bc920..d891cbbf5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,6 +10,8 @@ file(GLOB_RECURSE STORM_SOURCES_WITHOUT_MAIN ${PROJECT_SOURCE_DIR}/src/*/*.cpp) file(GLOB_RECURSE STORM_SOURCES_CLI ${PROJECT_SOURCE_DIR}/src/cli/*.cpp) file(GLOB_RECURSE STORM_MAIN_FILE ${PROJECT_SOURCE_DIR}/src/storm.cpp) file(GLOB_RECURSE STORM_DFT_MAIN_FILE ${PROJECT_SOURCE_DIR}/src/storm-dyftee.cpp) +file(GLOB_RECURSE STORM_PGCL_MAIN_FILE ${PROJECT_SOURCE_DIR}/src/storm-pgcl.cpp) +file(GLOB_RECURSE STORM_GSPN_MAIN_FILE ${PROJECT_SOURCE_DIR}/src/storm-gspn.cpp) # Additional include files like the storm-config.h file(GLOB_RECURSE STORM_BUILD_HEADERS ${PROJECT_BINARY_DIR}/include/*.h) @@ -20,6 +22,8 @@ set(STORM_LIB_HEADERS ${STORM_HEADERS}) list(REMOVE_ITEM STORM_LIB_HEADERS ${STORM_HEADERS_CLI}) set(STORM_MAIN_SOURCES ${STORM_SOURCES_CLI} ${STORM_MAIN_FILE}) set(STORM_DFT_MAIN_SOURCES ${STORM_SOURCES_CLI} ${STORM_DFT_MAIN_FILE}) +set(STORM_PGCL_MAIN_SOURCES ${STORM_SOURCES_CLI} ${STORM_PGCL_MAIN_FILE}) +set(STORM_GSPN_MAIN_SOURCES ${STORM_SOURCES_CLI} ${STORM_GSPN_MAIN_FILE}) set(STORM_MAIN_HEADERS ${STORM_HEADERS_CLI}) file(GLOB_RECURSE ALL_FILES ${PROJECT_SOURCE_DIR}/src/*.h ${PROJECT_SOURCE_DIR}/src/*.cpp) @@ -37,7 +41,7 @@ endif(ADDITIONAL_LINK_DIRS) ############################################################################### ## # -## Executable Creation # +## Executable Creation # ## # ## All link_directories() calls MUST be made before this point # ## # @@ -52,6 +56,14 @@ add_executable(storm-dft-main ${STORM_DFT_MAIN_SOURCES} ${STORM_MAIN_HEADERS}) target_link_libraries(storm-dft-main storm) # Adding headers for xcode set_target_properties(storm-dft-main PROPERTIES OUTPUT_NAME "storm-dft") +add_executable(storm-pgcl-main ${STORM_PGCL_MAIN_SOURCES} ${STORM_MAIN_HEADERS}) +target_link_libraries(storm-pgcl-main storm) +set_target_properties(storm-pgcl-main PROPERTIES OUTPUT_NAME "storm-pgcl") + +add_executable(storm-gspn-main ${STORM_GSPN_MAIN_SOURCES} ${STORM_MAIN_HEADERS}) +target_link_libraries(storm-gspn-main storm) # Adding headers for xcode +set_target_properties(storm-gspn-main PROPERTIES OUTPUT_NAME "storm-gspn") + target_link_libraries(storm ${STORM_LINK_LIBRARIES}) diff --git a/src/adapters/AddExpressionAdapter.cpp b/src/adapters/AddExpressionAdapter.cpp index 2f0dc7190..f8a8f200e 100644 --- a/src/adapters/AddExpressionAdapter.cpp +++ b/src/adapters/AddExpressionAdapter.cpp @@ -19,37 +19,37 @@ namespace storm { template storm::dd::Add AddExpressionAdapter::translateExpression(storm::expressions::Expression const& expression) { if (expression.hasBooleanType()) { - return boost::any_cast>(expression.accept(*this)).template toAdd(); + return boost::any_cast>(expression.accept(*this, boost::none)).template toAdd(); } else { - return boost::any_cast>(expression.accept(*this)); + return boost::any_cast>(expression.accept(*this, boost::none)); } } template storm::dd::Bdd AddExpressionAdapter::translateBooleanExpression(storm::expressions::Expression const& expression) { STORM_LOG_THROW(expression.hasBooleanType(), storm::exceptions::InvalidArgumentException, "Expected expression of boolean type."); - return boost::any_cast>(expression.accept(*this)); + return boost::any_cast>(expression.accept(*this, boost::none)); } template - boost::any AddExpressionAdapter::visit(storm::expressions::IfThenElseExpression const& expression) { + boost::any AddExpressionAdapter::visit(storm::expressions::IfThenElseExpression const& expression, boost::any const& data) { if (expression.hasBooleanType()) { - storm::dd::Bdd elseDd = boost::any_cast>(expression.getElseExpression()->accept(*this)); - storm::dd::Bdd thenDd = boost::any_cast>(expression.getThenExpression()->accept(*this)); - storm::dd::Bdd conditionDd = boost::any_cast>(expression.getCondition()->accept(*this)); + storm::dd::Bdd elseDd = boost::any_cast>(expression.getElseExpression()->accept(*this, data)); + storm::dd::Bdd thenDd = boost::any_cast>(expression.getThenExpression()->accept(*this, data)); + storm::dd::Bdd conditionDd = boost::any_cast>(expression.getCondition()->accept(*this, data)); return conditionDd.ite(thenDd, elseDd); } else { - storm::dd::Add elseDd = boost::any_cast>(expression.getElseExpression()->accept(*this)); - storm::dd::Add thenDd = boost::any_cast>(expression.getThenExpression()->accept(*this)); - storm::dd::Bdd conditionDd = boost::any_cast>(expression.getCondition()->accept(*this)); + storm::dd::Add elseDd = boost::any_cast>(expression.getElseExpression()->accept(*this, data)); + storm::dd::Add thenDd = boost::any_cast>(expression.getThenExpression()->accept(*this, data)); + storm::dd::Bdd conditionDd = boost::any_cast>(expression.getCondition()->accept(*this, data)); return conditionDd.ite(thenDd, elseDd); } } template - boost::any AddExpressionAdapter::visit(storm::expressions::BinaryBooleanFunctionExpression const& expression) { - storm::dd::Bdd leftResult = boost::any_cast>(expression.getFirstOperand()->accept(*this)); - storm::dd::Bdd rightResult = boost::any_cast>(expression.getSecondOperand()->accept(*this)); + boost::any AddExpressionAdapter::visit(storm::expressions::BinaryBooleanFunctionExpression const& expression, boost::any const& data) { + storm::dd::Bdd leftResult = boost::any_cast>(expression.getFirstOperand()->accept(*this, data)); + storm::dd::Bdd rightResult = boost::any_cast>(expression.getSecondOperand()->accept(*this, data)); storm::dd::Bdd result; switch (expression.getOperatorType()) { @@ -74,9 +74,9 @@ namespace storm { } template - boost::any AddExpressionAdapter::visit(storm::expressions::BinaryNumericalFunctionExpression const& expression) { - storm::dd::Add leftResult = boost::any_cast>(expression.getFirstOperand()->accept(*this)); - storm::dd::Add rightResult = boost::any_cast>(expression.getSecondOperand()->accept(*this)); + boost::any AddExpressionAdapter::visit(storm::expressions::BinaryNumericalFunctionExpression const& expression, boost::any const& data) { + storm::dd::Add leftResult = boost::any_cast>(expression.getFirstOperand()->accept(*this, data)); + storm::dd::Add rightResult = boost::any_cast>(expression.getSecondOperand()->accept(*this, data)); storm::dd::Add result; switch (expression.getOperatorType()) { @@ -109,9 +109,9 @@ namespace storm { } template - boost::any AddExpressionAdapter::visit(storm::expressions::BinaryRelationExpression const& expression) { - storm::dd::Add leftResult = boost::any_cast>(expression.getFirstOperand()->accept(*this)); - storm::dd::Add rightResult = boost::any_cast>(expression.getSecondOperand()->accept(*this)); + boost::any AddExpressionAdapter::visit(storm::expressions::BinaryRelationExpression const& expression, boost::any const& data) { + storm::dd::Add leftResult = boost::any_cast>(expression.getFirstOperand()->accept(*this, data)); + storm::dd::Add rightResult = boost::any_cast>(expression.getSecondOperand()->accept(*this, data)); storm::dd::Bdd result; switch (expression.getRelationType()) { @@ -139,7 +139,7 @@ namespace storm { } template - boost::any AddExpressionAdapter::visit(storm::expressions::VariableExpression const& expression) { + boost::any AddExpressionAdapter::visit(storm::expressions::VariableExpression const& expression, boost::any const& data) { auto const& variablePair = variableMapping->find(expression.getVariable()); STORM_LOG_THROW(variablePair != variableMapping->end(), storm::exceptions::InvalidArgumentException, "Cannot translate the given expression, because it contains the variable '" << expression.getVariableName() << "' for which no DD counterpart is known."); if (expression.hasBooleanType()) { @@ -150,8 +150,8 @@ namespace storm { } template - boost::any AddExpressionAdapter::visit(storm::expressions::UnaryBooleanFunctionExpression const& expression) { - storm::dd::Bdd result = boost::any_cast>(expression.getOperand()->accept(*this)); + boost::any AddExpressionAdapter::visit(storm::expressions::UnaryBooleanFunctionExpression const& expression, boost::any const& data) { + storm::dd::Bdd result = boost::any_cast>(expression.getOperand()->accept(*this, data)); switch (expression.getOperatorType()) { case storm::expressions::UnaryBooleanFunctionExpression::OperatorType::Not: @@ -163,8 +163,8 @@ namespace storm { } template - boost::any AddExpressionAdapter::visit(storm::expressions::UnaryNumericalFunctionExpression const& expression) { - storm::dd::Add result = boost::any_cast>(expression.getOperand()->accept(*this)); + boost::any AddExpressionAdapter::visit(storm::expressions::UnaryNumericalFunctionExpression const& expression, boost::any const& data) { + storm::dd::Add result = boost::any_cast>(expression.getOperand()->accept(*this, data)); switch (expression.getOperatorType()) { case storm::expressions::UnaryNumericalFunctionExpression::OperatorType::Minus: @@ -184,17 +184,17 @@ namespace storm { } template - boost::any AddExpressionAdapter::visit(storm::expressions::BooleanLiteralExpression const& expression) { + boost::any AddExpressionAdapter::visit(storm::expressions::BooleanLiteralExpression const& expression, boost::any const& data) { return expression.getValue() ? ddManager->getBddOne() : ddManager->getBddZero(); } template - boost::any AddExpressionAdapter::visit(storm::expressions::IntegerLiteralExpression const& expression) { + boost::any AddExpressionAdapter::visit(storm::expressions::IntegerLiteralExpression const& expression, boost::any const& data) { return ddManager->getConstant(static_cast(expression.getValue())); } template - boost::any AddExpressionAdapter::visit(storm::expressions::RationalLiteralExpression const& expression) { + boost::any AddExpressionAdapter::visit(storm::expressions::RationalLiteralExpression const& expression, boost::any const& data) { return ddManager->getConstant(static_cast(expression.getValueAsDouble())); } diff --git a/src/adapters/AddExpressionAdapter.h b/src/adapters/AddExpressionAdapter.h index dfb13a315..cac29156f 100644 --- a/src/adapters/AddExpressionAdapter.h +++ b/src/adapters/AddExpressionAdapter.h @@ -22,16 +22,16 @@ namespace storm { storm::dd::Add translateExpression(storm::expressions::Expression const& expression); storm::dd::Bdd translateBooleanExpression(storm::expressions::Expression const& expression); - virtual boost::any visit(storm::expressions::IfThenElseExpression const& expression) override; - virtual boost::any visit(storm::expressions::BinaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(storm::expressions::BinaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(storm::expressions::BinaryRelationExpression const& expression) override; - virtual boost::any visit(storm::expressions::VariableExpression const& expression) override; - virtual boost::any visit(storm::expressions::UnaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(storm::expressions::UnaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(storm::expressions::BooleanLiteralExpression const& expression) override; - virtual boost::any visit(storm::expressions::IntegerLiteralExpression const& expression) override; - virtual boost::any visit(storm::expressions::RationalLiteralExpression const& expression) override; + virtual boost::any visit(storm::expressions::IfThenElseExpression const& expression, boost::any const& data) override; + virtual boost::any visit(storm::expressions::BinaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(storm::expressions::BinaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(storm::expressions::BinaryRelationExpression const& expression, boost::any const& data) override; + virtual boost::any visit(storm::expressions::VariableExpression const& expression, boost::any const& data) override; + virtual boost::any visit(storm::expressions::UnaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(storm::expressions::UnaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(storm::expressions::BooleanLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(storm::expressions::IntegerLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(storm::expressions::RationalLiteralExpression const& expression, boost::any const& data) override; private: // The manager responsible for the DDs built by this adapter. diff --git a/src/adapters/CarlAdapter.h b/src/adapters/CarlAdapter.h index b5a91248d..d5cc0ce5c 100644 --- a/src/adapters/CarlAdapter.h +++ b/src/adapters/CarlAdapter.h @@ -6,6 +6,10 @@ #include +#ifdef STORM_HAVE_CLN +#include +#endif + #ifdef STORM_HAVE_CARL #include @@ -44,19 +48,25 @@ namespace carl { } +inline size_t hash_value(mpq_class const& q) { + std::hash h; + return h(q); +} + + +#if defined STORM_HAVE_CLN && defined STORM_USE_CLN_NUMBERS namespace cln { inline size_t hash_value(cl_RA const& n) { std::hash h; return h(n); } } +#endif + + +#include "NumberAdapter.h" namespace storm { -#if defined STORM_HAVE_CLN && defined USE_CLN_NUMBERS - typedef cln::cl_RA RationalNumber; -#else - typedef mpq_class RationalNumber; -#endif typedef carl::Variable RationalFunctionVariable; typedef carl::MultivariatePolynomial RawPolynomial; typedef carl::FactorizedPolynomial Polynomial; diff --git a/src/adapters/DereferenceIteratorAdapter.h b/src/adapters/DereferenceIteratorAdapter.h new file mode 100644 index 000000000..9a6e2b4fc --- /dev/null +++ b/src/adapters/DereferenceIteratorAdapter.h @@ -0,0 +1,54 @@ +#pragma once + +#include + +#include + +namespace storm { + namespace adapters { + + template + struct Dereferencer { + decltype((*std::declval())) operator()(T const& t) const { + return *t; + } + }; + + template + class DereferenceIteratorAdapter { + public: + typedef typename ContainerType::value_type value_type; + typedef typename std::conditional::value, typename ContainerType::const_iterator, typename ContainerType::iterator>::type input_iterator; + typedef typename boost::transform_iterator, input_iterator> iterator; + + DereferenceIteratorAdapter(input_iterator it, input_iterator ite) : it(it), ite(ite) { + // Intentionally left empty. + } + + iterator begin() const { + return boost::make_transform_iterator(it, Dereferencer()); + } + + iterator end() const { + return boost::make_transform_iterator(ite, Dereferencer()); + } + + static iterator make_iterator(input_iterator it) { + return boost::make_transform_iterator(it, Dereferencer()); + } + + bool empty() const { + return it == ite; + } + + std::size_t size() const { + return std::distance(it, ite); + } + + private: + input_iterator it; + input_iterator ite; + }; + + } +} diff --git a/src/adapters/MathsatExpressionAdapter.h b/src/adapters/MathsatExpressionAdapter.h index 77b39cc68..8fad6a8af 100644 --- a/src/adapters/MathsatExpressionAdapter.h +++ b/src/adapters/MathsatExpressionAdapter.h @@ -57,7 +57,7 @@ namespace storm { * @return An equivalent term for MathSAT. */ msat_term translateExpression(storm::expressions::Expression const& expression) { - msat_term result = boost::any_cast(expression.getBaseExpression().accept(*this)); + msat_term result = boost::any_cast(expression.getBaseExpression().accept(*this, boost::none)); STORM_LOG_THROW(!MSAT_ERROR_TERM(result), storm::exceptions::ExpressionEvaluationException, "Could not translate expression to MathSAT's format."); return result; } @@ -90,9 +90,9 @@ namespace storm { return declarationVariablePair->second; } - virtual boost::any visit(expressions::BinaryBooleanFunctionExpression const& expression) override { - msat_term leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this)); - msat_term rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this)); + virtual boost::any visit(storm::expressions::BinaryBooleanFunctionExpression const& expression, boost::any const& data) override { + msat_term leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this, data)); + msat_term rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this, data)); switch (expression.getOperatorType()) { case storm::expressions::BinaryBooleanFunctionExpression::OperatorType::And: @@ -108,9 +108,9 @@ namespace storm { } } - virtual boost::any visit(expressions::BinaryNumericalFunctionExpression const& expression) override { - msat_term leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this)); - msat_term rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this)); + virtual boost::any visit(storm::expressions::BinaryNumericalFunctionExpression const& expression, boost::any const& data) override { + msat_term leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this, data)); + msat_term rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this, data)); switch (expression.getOperatorType()) { case storm::expressions::BinaryNumericalFunctionExpression::OperatorType::Plus: @@ -130,9 +130,9 @@ namespace storm { } } - virtual boost::any visit(expressions::BinaryRelationExpression const& expression) override { - msat_term leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this)); - msat_term rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this)); + virtual boost::any visit(storm::expressions::BinaryRelationExpression const& expression, boost::any const& data) override { + msat_term leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this, data)); + msat_term rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this, data)); switch (expression.getRelationType()) { case storm::expressions::BinaryRelationExpression::RelationType::Equal: @@ -160,27 +160,27 @@ namespace storm { } } - virtual boost::any visit(storm::expressions::IfThenElseExpression const& expression) override { - msat_term conditionResult = boost::any_cast(expression.getCondition()->accept(*this)); - msat_term thenResult = boost::any_cast(expression.getThenExpression()->accept(*this)); - msat_term elseResult = boost::any_cast(expression.getElseExpression()->accept(*this)); + virtual boost::any visit(storm::expressions::IfThenElseExpression const& expression, boost::any const& data) override { + msat_term conditionResult = boost::any_cast(expression.getCondition()->accept(*this, data)); + msat_term thenResult = boost::any_cast(expression.getThenExpression()->accept(*this, data)); + msat_term elseResult = boost::any_cast(expression.getElseExpression()->accept(*this, data)); return msat_make_term_ite(env, conditionResult, thenResult, elseResult); } - virtual boost::any visit(expressions::BooleanLiteralExpression const& expression) override { + virtual boost::any visit(storm::expressions::BooleanLiteralExpression const& expression, boost::any const& data) override { return expression.getValue() ? msat_make_true(env) : msat_make_false(env); } - virtual boost::any visit(expressions::RationalLiteralExpression const& expression) override { + virtual boost::any visit(storm::expressions::RationalLiteralExpression const& expression, boost::any const& data) override { return msat_make_number(env, std::to_string(expression.getValueAsDouble()).c_str()); } - virtual boost::any visit(expressions::IntegerLiteralExpression const& expression) override { + virtual boost::any visit(storm::expressions::IntegerLiteralExpression const& expression, boost::any const& data) override { return msat_make_number(env, std::to_string(static_cast(expression.getValue())).c_str()); } - virtual boost::any visit(expressions::UnaryBooleanFunctionExpression const& expression) override { - msat_term childResult = boost::any_cast(expression.getOperand()->accept(*this)); + virtual boost::any visit(storm::expressions::UnaryBooleanFunctionExpression const& expression, boost::any const& data) override { + msat_term childResult = boost::any_cast(expression.getOperand()->accept(*this, data)); switch (expression.getOperatorType()) { case storm::expressions::UnaryBooleanFunctionExpression::OperatorType::Not: @@ -191,8 +191,8 @@ namespace storm { } } - virtual boost::any visit(expressions::UnaryNumericalFunctionExpression const& expression) override { - msat_term childResult = boost::any_cast(expression.getOperand()->accept(*this)); + virtual boost::any visit(storm::expressions::UnaryNumericalFunctionExpression const& expression, boost::any const& data) override { + msat_term childResult = boost::any_cast(expression.getOperand()->accept(*this, data)); switch (expression.getOperatorType()) { case storm::expressions::UnaryNumericalFunctionExpression::OperatorType::Minus: @@ -209,7 +209,7 @@ namespace storm { } } - virtual boost::any visit(expressions::VariableExpression const& expression) override { + virtual boost::any visit(storm::expressions::VariableExpression const& expression, boost::any const& data) override { return translateExpression(expression.getVariable()); } diff --git a/src/adapters/NumberAdapter.h b/src/adapters/NumberAdapter.h new file mode 100644 index 000000000..73d567353 --- /dev/null +++ b/src/adapters/NumberAdapter.h @@ -0,0 +1,17 @@ +#pragma once + +#include "storm-config.h" + +#include + +#ifdef STORM_HAVE_CARL + +#include +namespace storm { +#if defined STORM_HAVE_CLN && defined USE_CLN_NUMBERS + typedef cln::cl_RA RationalNumber; +#else + typedef mpq_class RationalNumber; +#endif +} +#endif \ No newline at end of file diff --git a/src/adapters/XercesAdapter.h b/src/adapters/XercesAdapter.h new file mode 100644 index 000000000..9e0523af1 --- /dev/null +++ b/src/adapters/XercesAdapter.h @@ -0,0 +1,44 @@ +#pragma once + +#include "storm-config.h" +#ifdef USE_XERCES +#include +#include + + +#include +#include +#include + + + +namespace storm { + namespace adapters { + inline std::string XMLtoString(const XMLCh *xmlString) { + char* tmp = xercesc::XMLString::transcode(xmlString); + auto result = std::string(tmp); + delete tmp; + return result; + } + + inline std::string getName(xercesc::DOMNode const* node) { + switch (node->getNodeType()) { + case xercesc::DOMNode::NodeType::ELEMENT_NODE: { + auto elementNode = (xercesc::DOMElement *) node; + return XMLtoString(elementNode->getTagName()); + } + case xercesc::DOMNode::NodeType::TEXT_NODE: { + return XMLtoString(node->getNodeValue()); + } + case xercesc::DOMNode::NodeType::ATTRIBUTE_NODE: { + return XMLtoString(node->getNodeName()); + } + default: { + assert(false); + return ""; + } + } + } + } +} +#endif \ No newline at end of file diff --git a/src/adapters/Z3ExpressionAdapter.cpp b/src/adapters/Z3ExpressionAdapter.cpp index a80355422..8258f42f5 100644 --- a/src/adapters/Z3ExpressionAdapter.cpp +++ b/src/adapters/Z3ExpressionAdapter.cpp @@ -16,7 +16,7 @@ namespace storm { z3::expr Z3ExpressionAdapter::translateExpression(storm::expressions::Expression const& expression) { STORM_LOG_ASSERT(expression.getManager() == this->manager, "Invalid expression for solver."); - z3::expr result = boost::any_cast(expression.getBaseExpression().accept(*this)); + z3::expr result = boost::any_cast(expression.getBaseExpression().accept(*this, boost::none)); for (z3::expr const& assertion : additionalAssertions) { result = result && assertion; @@ -139,9 +139,9 @@ namespace storm { } } - boost::any Z3ExpressionAdapter::visit(storm::expressions::BinaryBooleanFunctionExpression const& expression) { - z3::expr leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this)); - z3::expr rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this)); + boost::any Z3ExpressionAdapter::visit(storm::expressions::BinaryBooleanFunctionExpression const& expression, boost::any const& data) { + z3::expr leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this, data)); + z3::expr rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this, data)); switch(expression.getOperatorType()) { case storm::expressions::BinaryBooleanFunctionExpression::OperatorType::And: @@ -160,9 +160,9 @@ namespace storm { } - boost::any Z3ExpressionAdapter::visit(storm::expressions::BinaryNumericalFunctionExpression const& expression) { - z3::expr leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this)); - z3::expr rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this)); + boost::any Z3ExpressionAdapter::visit(storm::expressions::BinaryNumericalFunctionExpression const& expression, boost::any const& data) { + z3::expr leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this, data)); + z3::expr rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this, data)); switch(expression.getOperatorType()) { case storm::expressions::BinaryNumericalFunctionExpression::OperatorType::Plus: @@ -184,9 +184,9 @@ namespace storm { } } - boost::any Z3ExpressionAdapter::visit(storm::expressions::BinaryRelationExpression const& expression) { - z3::expr leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this)); - z3::expr rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this)); + boost::any Z3ExpressionAdapter::visit(storm::expressions::BinaryRelationExpression const& expression, boost::any const& data) { + z3::expr leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this, data)); + z3::expr rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this, data)); switch(expression.getRelationType()) { case storm::expressions::BinaryRelationExpression::RelationType::Equal: @@ -206,22 +206,22 @@ namespace storm { } } - boost::any Z3ExpressionAdapter::visit(storm::expressions::BooleanLiteralExpression const& expression) { + boost::any Z3ExpressionAdapter::visit(storm::expressions::BooleanLiteralExpression const& expression, boost::any const& data) { return context.bool_val(expression.getValue()); } - boost::any Z3ExpressionAdapter::visit(storm::expressions::RationalLiteralExpression const& expression) { + boost::any Z3ExpressionAdapter::visit(storm::expressions::RationalLiteralExpression const& expression, boost::any const& data) { std::stringstream fractionStream; fractionStream << expression.getValue(); return context.real_val(fractionStream.str().c_str()); } - boost::any Z3ExpressionAdapter::visit(storm::expressions::IntegerLiteralExpression const& expression) { + boost::any Z3ExpressionAdapter::visit(storm::expressions::IntegerLiteralExpression const& expression, boost::any const& data) { return context.int_val(static_cast(expression.getValue())); } - boost::any Z3ExpressionAdapter::visit(storm::expressions::UnaryBooleanFunctionExpression const& expression) { - z3::expr childResult = boost::any_cast(expression.getOperand()->accept(*this)); + boost::any Z3ExpressionAdapter::visit(storm::expressions::UnaryBooleanFunctionExpression const& expression, boost::any const& data) { + z3::expr childResult = boost::any_cast(expression.getOperand()->accept(*this, data)); switch (expression.getOperatorType()) { case storm::expressions::UnaryBooleanFunctionExpression::OperatorType::Not: @@ -231,8 +231,8 @@ namespace storm { } } - boost::any Z3ExpressionAdapter::visit(storm::expressions::UnaryNumericalFunctionExpression const& expression) { - z3::expr childResult = boost::any_cast(expression.getOperand()->accept(*this)); + boost::any Z3ExpressionAdapter::visit(storm::expressions::UnaryNumericalFunctionExpression const& expression, boost::any const& data) { + z3::expr childResult = boost::any_cast(expression.getOperand()->accept(*this, data)); switch(expression.getOperatorType()) { case storm::expressions::UnaryNumericalFunctionExpression::OperatorType::Minus: @@ -253,14 +253,14 @@ namespace storm { } } - boost::any Z3ExpressionAdapter::visit(storm::expressions::IfThenElseExpression const& expression) { - z3::expr conditionResult = boost::any_cast(expression.getCondition()->accept(*this)); - z3::expr thenResult = boost::any_cast(expression.getThenExpression()->accept(*this)); - z3::expr elseResult = boost::any_cast(expression.getElseExpression()->accept(*this)); + boost::any Z3ExpressionAdapter::visit(storm::expressions::IfThenElseExpression const& expression, boost::any const& data) { + z3::expr conditionResult = boost::any_cast(expression.getCondition()->accept(*this, data)); + z3::expr thenResult = boost::any_cast(expression.getThenExpression()->accept(*this, data)); + z3::expr elseResult = boost::any_cast(expression.getElseExpression()->accept(*this, data)); return z3::expr(context, Z3_mk_ite(context, conditionResult, thenResult, elseResult)); } - boost::any Z3ExpressionAdapter::visit(storm::expressions::VariableExpression const& expression) { + boost::any Z3ExpressionAdapter::visit(storm::expressions::VariableExpression const& expression, boost::any const& data) { return this->translateExpression(expression.getVariable()); } diff --git a/src/adapters/Z3ExpressionAdapter.h b/src/adapters/Z3ExpressionAdapter.h index 2735f5713..70cfac18b 100644 --- a/src/adapters/Z3ExpressionAdapter.h +++ b/src/adapters/Z3ExpressionAdapter.h @@ -55,25 +55,25 @@ namespace storm { */ storm::expressions::Variable const& getVariable(z3::func_decl z3Declaration); - virtual boost::any visit(storm::expressions::BinaryBooleanFunctionExpression const& expression) override; + virtual boost::any visit(storm::expressions::BinaryBooleanFunctionExpression const& expression, boost::any const& data) override; - virtual boost::any visit(storm::expressions::BinaryNumericalFunctionExpression const& expression) override; + virtual boost::any visit(storm::expressions::BinaryNumericalFunctionExpression const& expression, boost::any const& data) override; - virtual boost::any visit(storm::expressions::BinaryRelationExpression const& expression) override; + virtual boost::any visit(storm::expressions::BinaryRelationExpression const& expression, boost::any const& data) override; - virtual boost::any visit(storm::expressions::BooleanLiteralExpression const& expression) override; + virtual boost::any visit(storm::expressions::BooleanLiteralExpression const& expression, boost::any const& data) override; - virtual boost::any visit(storm::expressions::RationalLiteralExpression const& expression) override; + virtual boost::any visit(storm::expressions::RationalLiteralExpression const& expression, boost::any const& data) override; - virtual boost::any visit(storm::expressions::IntegerLiteralExpression const& expression) override; + virtual boost::any visit(storm::expressions::IntegerLiteralExpression const& expression, boost::any const& data) override; - virtual boost::any visit(storm::expressions::UnaryBooleanFunctionExpression const& expression) override; + virtual boost::any visit(storm::expressions::UnaryBooleanFunctionExpression const& expression, boost::any const& data) override; - virtual boost::any visit(storm::expressions::UnaryNumericalFunctionExpression const& expression) override; + virtual boost::any visit(storm::expressions::UnaryNumericalFunctionExpression const& expression, boost::any const& data) override; - virtual boost::any visit(storm::expressions::IfThenElseExpression const& expression) override; + virtual boost::any visit(storm::expressions::IfThenElseExpression const& expression, boost::any const& data) override; - virtual boost::any visit(storm::expressions::VariableExpression const& expression) override; + virtual boost::any visit(storm::expressions::VariableExpression const& expression, boost::any const& data) override; private: /*! diff --git a/src/builder/DdJaniModelBuilder.cpp b/src/builder/DdJaniModelBuilder.cpp index 9397ed925..1b759cfc5 100644 --- a/src/builder/DdJaniModelBuilder.cpp +++ b/src/builder/DdJaniModelBuilder.cpp @@ -7,14 +7,16 @@ #include "src/logic/Formulas.h" #include "src/storage/jani/Model.h" -#include "src/storage/jani/RenameComposition.h" #include "src/storage/jani/AutomatonComposition.h" #include "src/storage/jani/ParallelComposition.h" +#include "src/storage/jani/CompositionInformationVisitor.h" #include "src/storage/dd/Add.h" #include "src/storage/dd/Bdd.h" #include "src/adapters/AddExpressionAdapter.h" +#include "src/storage/expressions/ExpressionManager.h" + #include "src/models/symbolic/Dtmc.h" #include "src/models/symbolic/Ctmc.h" #include "src/models/symbolic/Mdp.h" @@ -28,14 +30,16 @@ #include "src/utility/dd.h" #include "src/utility/math.h" #include "src/exceptions/WrongFormatException.h" +#include "src/exceptions/InvalidSettingsException.h" #include "src/exceptions/InvalidArgumentException.h" #include "src/exceptions/InvalidStateException.h" +#include "src/exceptions/NotSupportedException.h" namespace storm { namespace builder { template - DdJaniModelBuilder::Options::Options() : buildAllRewardModels(true), rewardModelsToBuild(), constantDefinitions(), terminalStates(), negatedTerminalStates() { + DdJaniModelBuilder::Options::Options(bool buildAllLabels, bool buildAllRewardModels) : buildAllLabels(buildAllLabels), buildAllRewardModels(buildAllRewardModels), rewardModelsToBuild(), constantDefinitions(), terminalStates(), negatedTerminalStates() { // Intentionally left empty. } @@ -46,7 +50,7 @@ namespace storm { } template - DdJaniModelBuilder::Options::Options(std::vector> const& formulas) : buildAllRewardModels(false), rewardModelsToBuild(), constantDefinitions(), terminalStates(), negatedTerminalStates() { + DdJaniModelBuilder::Options::Options(std::vector> const& formulas) : buildAllLabels(false), buildAllRewardModels(false), rewardModelsToBuild(), constantDefinitions(), terminalStates(), negatedTerminalStates() { if (formulas.empty()) { this->buildAllRewardModels = true; } else { @@ -74,6 +78,12 @@ namespace storm { std::set referencedRewardModels = formula.getReferencedRewardModels(); rewardModelsToBuild.insert(referencedRewardModels.begin(), referencedRewardModels.end()); } + + // Extract all the labels used in the formula. + std::vector> atomicLabelFormulas = formula.getAtomicLabelFormulas(); + for (auto const& formula : atomicLabelFormulas) { + addLabel(formula->getLabel()); + } } template @@ -103,21 +113,26 @@ namespace storm { } template - DdJaniModelBuilder::DdJaniModelBuilder(storm::jani::Model const& model, Options const& options) : model(model), options(options) { - if (this->model->hasUndefinedConstants()) { - std::vector> undefinedConstants = this->model->getUndefinedConstants(); - std::vector strings; - for (auto const& constant : undefinedConstants) { - std::stringstream stream; - stream << constant.get().getName() << " (" << constant.get().getType() << ")"; - strings.push_back(stream.str()); - } - STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Program still contains these undefined constants: " << boost::join(strings, ", ") << "."); - } - - this->model = this->model->substituteConstants(); + std::set const& DdJaniModelBuilder::Options::getRewardModelNames() const { + return rewardModelsToBuild; } + template + bool DdJaniModelBuilder::Options::isBuildAllRewardModelsSet() const { + return buildAllRewardModels; + } + + template + bool DdJaniModelBuilder::Options::isBuildAllLabelsSet() const { + return buildAllLabels; + } + + template + void DdJaniModelBuilder::Options::addLabel(std::string const& labelName) { + STORM_LOG_THROW(!buildAllLabels, storm::exceptions::InvalidSettingsException, "Cannot add label, because all labels are built anyway."); + labelNames.insert(labelName); + } + template struct CompositionVariables { CompositionVariables() : manager(std::make_shared>()), @@ -143,8 +158,9 @@ namespace storm { // All pairs of row/column meta variables. std::vector> rowColumnMetaVariablePairs; - // A mapping from automata to the meta variable encoding their location. - std::map> automatonToLocationVariableMap; + // A mapping from automata to the meta variables encoding their location. + std::map automatonToLocationVariableMap; + std::map> automatonToLocationDdVariableMap; // A mapping from action indices to the meta variables used to encode these actions. std::map actionVariablesMap; @@ -152,6 +168,10 @@ namespace storm { // The meta variables used to encode the remaining nondeterminism. std::vector localNondeterminismVariables; + // The meta variable used to distinguish Markovian from probabilistic choices in Markov automata. + storm::expressions::Variable markovNondeterminismVariable; + storm::dd::Bdd markovMarker; + // The meta variables used to encode the actions and nondeterminism. std::set allNondeterminismVariables; @@ -178,20 +198,25 @@ namespace storm { template class CompositionVariableCreator : public storm::jani::CompositionVisitor { public: - CompositionVariableCreator(storm::jani::Model const& model) : model(model) { + CompositionVariableCreator(storm::jani::Model const& model, storm::jani::CompositionInformation const& actionInformation) : model(model), automata(), actionInformation(actionInformation) { // Intentionally left empty. } CompositionVariables create() { - // First, check whether every automaton appears exactly once in the system composition. + // First, check whether every automaton appears exactly once in the system composition. Simultaneously, + // we determine the set of non-silent actions used by the composition. automata.clear(); this->model.getSystemComposition().accept(*this, boost::none); STORM_LOG_THROW(automata.size() == this->model.getNumberOfAutomata(), storm::exceptions::InvalidArgumentException, "Cannot build symbolic model from JANI model whose system composition refers to a subset of automata."); - // Then, check that the model does not contain unbounded integer variables. - STORM_LOG_THROW(!this->model.getGlobalVariables().containsUnboundedIntegerVariables(), storm::exceptions::InvalidArgumentException, "Cannot build symbolic model from JANI model that contains global unbounded integer variables."); + STORM_LOG_THROW(!this->model.hasTransientEdgeDestinationAssignments(), storm::exceptions::InvalidArgumentException, "The symbolic JANI model builder currently does not support transient edge destination assignments."); + + // Then, check that the model does not contain non-transient unbounded integer or non-transient real variables. + STORM_LOG_THROW(!this->model.getGlobalVariables().containsNonTransientUnboundedIntegerVariables(), storm::exceptions::InvalidArgumentException, "Cannot build symbolic model from JANI model that contains non-transient global unbounded integer variables."); + STORM_LOG_THROW(!this->model.getGlobalVariables().containsNonTransientRealVariables(), storm::exceptions::InvalidArgumentException, "Cannot build symbolic model from JANI model that contains global non-transient real variables."); for (auto const& automaton : this->model.getAutomata()) { - STORM_LOG_THROW(!automaton.getVariables().containsUnboundedIntegerVariables(), storm::exceptions::InvalidArgumentException, "Cannot build symbolic model from JANI model that contains unbounded integer variables in automaton '" << automaton.getName() << "'."); + STORM_LOG_THROW(!automaton.getVariables().containsNonTransientUnboundedIntegerVariables(), storm::exceptions::InvalidArgumentException, "Cannot build symbolic model from JANI model that contains non-transient unbounded integer variables in automaton '" << automaton.getName() << "'."); + STORM_LOG_THROW(!automaton.getVariables().containsNonTransientRealVariables(), storm::exceptions::InvalidArgumentException, "Cannot build symbolic model from JANI model that contains non-transient real variables in automaton '" << automaton.getName() << "'."); } // Based on this assumption, we create the variables. @@ -204,15 +229,11 @@ namespace storm { automata.insert(it, composition.getAutomatonName()); return boost::none; } - - boost::any visit(storm::jani::RenameComposition const& composition, boost::any const& data) override { - composition.getSubcomposition().accept(*this, boost::none); - return boost::none; - } - + boost::any visit(storm::jani::ParallelComposition const& composition, boost::any const& data) override { - composition.getLeftSubcomposition().accept(*this, boost::none); - composition.getRightSubcomposition().accept(*this, boost::none); + for (auto const& subcomposition : composition.getSubcompositions()) { + subcomposition->accept(*this, boost::none); + } return boost::none; } @@ -220,14 +241,12 @@ namespace storm { CompositionVariables createVariables() { CompositionVariables result; - for (auto const& action : this->model.getActions()) { - if (this->model.getActionIndex(action.getName()) != this->model.getSilentActionIndex()) { - std::pair variablePair = result.manager->addMetaVariable(action.getName()); - result.actionVariablesMap[this->model.getActionIndex(action.getName())] = variablePair.first; - result.allNondeterminismVariables.insert(variablePair.first); - } + for (auto const& nonSilentActionIndex : actionInformation.getNonSilentActionIndices()) { + std::pair variablePair = result.manager->addMetaVariable(actionInformation.getActionName(nonSilentActionIndex)); + result.actionVariablesMap[nonSilentActionIndex] = variablePair.first; + result.allNondeterminismVariables.insert(variablePair.first); } - + // FIXME: check how many nondeterminism variables we should actually allocate. uint64_t numberOfNondeterminismVariables = this->model.getNumberOfAutomata(); for (auto const& automaton : this->model.getAutomata()) { @@ -239,10 +258,22 @@ namespace storm { result.allNondeterminismVariables.insert(variablePair.first); } + if (this->model.getModelType() == storm::jani::ModelType::MA) { + result.markovNondeterminismVariable = result.manager->addMetaVariable("markov").first; + result.markovMarker = result.manager->getEncoding(result.markovNondeterminismVariable, 1); + result.allNondeterminismVariables.insert(result.markovNondeterminismVariable); + } + for (auto const& automaton : this->model.getAutomata()) { // Start by creating a meta variable for the location of the automaton. + storm::expressions::Variable locationExpressionVariable = model.getManager().declareFreshIntegerVariable(false, "loc"); + result.automatonToLocationVariableMap[automaton.getName()] = locationExpressionVariable; std::pair variablePair = result.manager->addMetaVariable("l_" + automaton.getName(), 0, automaton.getNumberOfLocations() - 1); - result.automatonToLocationVariableMap[automaton.getName()] = variablePair; + result.automatonToLocationDdVariableMap[automaton.getName()] = variablePair; + result.rowColumnMetaVariablePairs.push_back(variablePair); + + result.variableToRowMetaVariableMap->emplace(locationExpressionVariable, variablePair.first); + result.variableToColumnMetaVariableMap->emplace(locationExpressionVariable, variablePair.second); // Add the location variable to the row/column variables. result.rowMetaVariables.insert(variablePair.first); @@ -256,6 +287,11 @@ namespace storm { // Create global variables. storm::dd::Bdd globalVariableRanges = result.manager->getBddOne(); for (auto const& variable : this->model.getGlobalVariables()) { + // Only create the variable if it's non-transient. + if (variable.isTransient()) { + continue; + } + createVariable(variable, result); globalVariableRanges &= result.manager->getRange(result.variableToRowMetaVariableMap->at(variable.getExpressionVariable())); } @@ -267,13 +303,18 @@ namespace storm { storm::dd::Bdd range = result.manager->getBddOne(); // Add the identity and ranges of the location variables to the ones of the automaton. - std::pair const& locationVariables = result.automatonToLocationVariableMap[automaton.getName()]; + std::pair const& locationVariables = result.automatonToLocationDdVariableMap[automaton.getName()]; storm::dd::Add variableIdentity = result.manager->template getIdentity(locationVariables.first).equals(result.manager->template getIdentity(locationVariables.second)).template toAdd() * result.manager->getRange(locationVariables.first).template toAdd() * result.manager->getRange(locationVariables.second).template toAdd(); identity &= variableIdentity.toBdd(); range &= result.manager->getRange(locationVariables.first); // Then create variables for the variables of the automaton. for (auto const& variable : automaton.getVariables()) { + // Only create the variable if it's non-transient. + if (variable.isTransient()) { + continue; + } + createVariable(variable, result); identity &= result.variableToIdentityMap.at(variable.getExpressionVariable()).toBdd(); range &= result.manager->getRange(result.variableToRowMetaVariableMap->at(variable.getExpressionVariable())); @@ -299,9 +340,9 @@ namespace storm { void createVariable(storm::jani::BoundedIntegerVariable const& variable, CompositionVariables& result) { int_fast64_t low = variable.getLowerBound().evaluateAsInt(); int_fast64_t high = variable.getUpperBound().evaluateAsInt(); - std::pair variablePair = result.manager->addMetaVariable(variable.getName(), low, high); + std::pair variablePair = result.manager->addMetaVariable(variable.getExpressionVariable().getName(), low, high); - STORM_LOG_TRACE("Created meta variables for global integer variable: " << variablePair.first.getName() << "] and " << variablePair.second.getName() << "."); + STORM_LOG_TRACE("Created meta variables for global integer variable: " << variablePair.first.getName() << " and " << variablePair.second.getName() << "."); result.rowMetaVariables.insert(variablePair.first); result.variableToRowMetaVariableMap->emplace(variable.getExpressionVariable(), variablePair.first); @@ -319,7 +360,7 @@ namespace storm { } void createVariable(storm::jani::BooleanVariable const& variable, CompositionVariables& result) { - std::pair variablePair = result.manager->addMetaVariable(variable.getName()); + std::pair variablePair = result.manager->addMetaVariable(variable.getExpressionVariable().getName()); STORM_LOG_TRACE("Created meta variables for global boolean variable: " << variablePair.first.getName() << " and " << variablePair.second.getName() << "."); @@ -341,15 +382,18 @@ namespace storm { storm::jani::Model const& model; std::set automata; + storm::jani::CompositionInformation actionInformation; }; template struct ComposerResult { - ComposerResult(storm::dd::Add const& transitions, storm::dd::Bdd const& illegalFragment, uint64_t numberOfNondeterminismVariables = 0) : transitions(transitions), illegalFragment(illegalFragment), numberOfNondeterminismVariables(numberOfNondeterminismVariables) { + ComposerResult(storm::dd::Add const& transitions, std::map> const& transientLocationAssignments, std::map> const& transientEdgeAssignments, storm::dd::Bdd const& illegalFragment, uint64_t numberOfNondeterminismVariables = 0) : transitions(transitions), transientLocationAssignments(transientLocationAssignments), transientEdgeAssignments(transientEdgeAssignments), illegalFragment(illegalFragment), numberOfNondeterminismVariables(numberOfNondeterminismVariables) { // Intentionally left empty. } storm::dd::Add transitions; + std::map> transientLocationAssignments; + std::map> transientEdgeAssignments; storm::dd::Bdd illegalFragment; uint64_t numberOfNondeterminismVariables; }; @@ -358,7 +402,7 @@ namespace storm { template class SystemComposer : public storm::jani::CompositionVisitor { public: - SystemComposer(storm::jani::Model const& model, CompositionVariables const& variables) : model(model), variables(variables) { + SystemComposer(storm::jani::Model const& model, CompositionVariables const& variables, std::vector const& transientVariables) : model(model), variables(variables), transientVariables(transientVariables) { // Intentionally left empty. } @@ -370,6 +414,9 @@ namespace storm { // The variable to use when building an automaton. CompositionVariables const& variables; + + // The transient variables to consider during system composition. + std::vector transientVariables; }; // This structure represents an edge destination. @@ -391,7 +438,7 @@ namespace storm { // Iterate over all assignments (boolean and integer) and build the DD for it. std::set assignedVariables; - for (auto const& assignment : destination.getAssignments()) { + for (auto const& assignment : destination.getOrderedAssignments().getNonTransientAssignments()) { // Record the variable as being written. STORM_LOG_TRACE("Assigning to variable " << variables.variableToRowMetaVariableMap->at(assignment.getExpressionVariable()).getName()); assignedVariables.insert(assignment.getExpressionVariable()); @@ -437,7 +484,7 @@ namespace storm { } } - transitions *= variables.manager->getEncoding(variables.automatonToLocationVariableMap.at(automaton.getName()).second, destination.getLocationIndex()).template toAdd(); + transitions *= variables.manager->getEncoding(variables.automatonToLocationDdVariableMap.at(automaton.getName()).second, destination.getLocationIndex()).template toAdd(); return EdgeDestinationDd(transitions, assignedGlobalVariables); } @@ -473,444 +520,26 @@ namespace storm { result.setValue(metaVariableNameToValueMap, 1); return result; } - + template - class SeparateEdgesSystemComposer : public SystemComposer { + class CombinedEdgesSystemComposer : public SystemComposer { public: // This structure represents an edge. struct EdgeDd { - EdgeDd(storm::dd::Add const& guard = storm::dd::Add(), storm::dd::Add const& transitions = storm::dd::Add(), std::set const& writtenGlobalVariables = {}, std::set const& globalVariablesWrittenMultipleTimes = {}) : guard(guard), transitions(transitions), writtenGlobalVariables(writtenGlobalVariables), globalVariablesWrittenMultipleTimes(globalVariablesWrittenMultipleTimes) { - // Intentionally left empty. - } - - EdgeDd(EdgeDd const& other) : guard(other.guard), transitions(other.transitions), writtenGlobalVariables(other.writtenGlobalVariables), globalVariablesWrittenMultipleTimes(other.globalVariablesWrittenMultipleTimes) { - // Intentionally left empty. - } - - EdgeDd& operator=(EdgeDd const& other) { - if (this != &other) { - globalVariablesWrittenMultipleTimes = other.globalVariablesWrittenMultipleTimes; - writtenGlobalVariables = other.writtenGlobalVariables; - guard = other.guard; - transitions = other.transitions; - } - return *this; - } - - storm::dd::Add guard; - storm::dd::Add transitions; - std::set writtenGlobalVariables; - std::set globalVariablesWrittenMultipleTimes; - }; - - // This structure represents a subcomponent of a composition. - struct AutomatonDd { - AutomatonDd(storm::dd::Add const& identity) : identity(identity) { - // Intentionally left empty. - } - - std::map> actionIndexToEdges; - storm::dd::Add identity; - }; - - SeparateEdgesSystemComposer(storm::jani::Model const& model, CompositionVariables const& variables) : SystemComposer(model, variables) { - // Intentionally left empty. - } - - ComposerResult compose() override { - AutomatonDd globalAutomaton = boost::any_cast(this->model.getSystemComposition().accept(*this, boost::none)); - return buildSystemFromAutomaton(globalAutomaton); - } - - boost::any visit(storm::jani::AutomatonComposition const& composition, boost::any const& data) override { - return buildAutomatonDd(composition.getAutomatonName()); - } - - boost::any visit(storm::jani::RenameComposition const& composition, boost::any const& data) override { - AutomatonDd subautomaton = boost::any_cast(composition.getSubcomposition().accept(*this, boost::none)); - - // Build a mapping from indices to indices for the renaming. - std::map renamingIndexToIndex; - for (auto const& entry : composition.getRenaming()) { - if (this->model.getActionIndex(entry.first) != this->model.getSilentActionIndex()) { - // Distinguish the cases where we hide the action or properly rename it. - if (entry.second) { - renamingIndexToIndex.emplace(this->model.getActionIndex(entry.first), this->model.getActionIndex(entry.second.get())); - } else { - renamingIndexToIndex.emplace(this->model.getActionIndex(entry.first), this->model.getSilentActionIndex()); - } - } else { - STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Renaming composition must not rename the silent action."); - } - } - - // Finally, apply the renaming. - AutomatonDd result(subautomaton.identity); - for (auto const& actionEdges : subautomaton.actionIndexToEdges) { - auto it = renamingIndexToIndex.find(actionEdges.first); - if (it != renamingIndexToIndex.end()) { - // If we are to rename the action, do so. - result.actionIndexToEdges[it->second].insert(result.actionIndexToEdges[it->second].end(), actionEdges.second.begin(), actionEdges.second.end()); - } else { - // Otherwise copy over the edges. - result.actionIndexToEdges[it->first].insert(result.actionIndexToEdges[it->first].begin(), actionEdges.second.begin(), actionEdges.second.end()); - } - } - return result; - } - - boost::any visit(storm::jani::ParallelComposition const& composition, boost::any const& data) override { - AutomatonDd leftSubautomaton = boost::any_cast(composition.getLeftSubcomposition().accept(*this, boost::none)); - AutomatonDd rightSubautomaton = boost::any_cast(composition.getRightSubcomposition().accept(*this, boost::none)); - - // Build the set of synchronizing action indices. - std::set synchronizingActionIndices; - for (auto const& entry : composition.getSynchronizationAlphabet()) { - if (this->model.getActionIndex(entry) != this->model.getSilentActionIndex()) { - synchronizingActionIndices.insert(this->model.getActionIndex(entry)); - } else { - STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Parallel composition must not synchronize over silent action."); - } - } - - // Perform the composition. - - // First, consider all actions in the left subcomposition. - AutomatonDd result(leftSubautomaton.identity * rightSubautomaton.identity); - uint64_t index = 0; - for (auto const& actionEdges : leftSubautomaton.actionIndexToEdges) { - // If we need to synchronize over this action, do so now. - if (synchronizingActionIndices.find(actionEdges.first) != synchronizingActionIndices.end()) { - auto rightIt = rightSubautomaton.actionIndexToEdges.find(actionEdges.first); - if (rightIt != rightSubautomaton.actionIndexToEdges.end()) { - for (auto const& edge1 : actionEdges.second) { - for (auto const& edge2 : rightIt->second) { - EdgeDd edgeDd = composeEdgesInParallel(edge1, edge2); - if (!edgeDd.guard.isZero()) { - result.actionIndexToEdges[actionEdges.first].push_back(edgeDd); - } - index++; - } - } - } - } else { - // Extend all edges by the missing identity (unsynchronizing) and copy them over. - for (auto const& edge : actionEdges.second) { - result.actionIndexToEdges[actionEdges.first].push_back(extendEdgeWithIdentity(edge, rightSubautomaton.identity)); - } - } - } - - // Then, consider all actions in the right subcomposition. All synchronizing actions can be ignored, because - // we would have dealt with them earlier if there was a suitable synchronization partner. Since there is none, - // such transitions can not be taken and we can drop them. - for (auto const& actionEdges : rightSubautomaton.actionIndexToEdges) { - if (synchronizingActionIndices.find(actionEdges.first) == synchronizingActionIndices.end()) { - for (auto const& edge : actionEdges.second) { - result.actionIndexToEdges[actionEdges.first].push_back(extendEdgeWithIdentity(edge, leftSubautomaton.identity)); - } - } - } - - return result; - } - - private: - storm::dd::Add combineEdgesBySummation(std::vector const& edges, CompositionVariables const& variables) { - storm::dd::Add result = variables.manager->template getAddZero(); - for (auto const& edge : edges) { - // Simply add all actions, but make sure to include the missing global variable identities. - result += edge.transitions * computeMissingGlobalVariableIdentities(edge, variables); - } - return result; - } - - std::pair> combineEdgesByNondeterministicChoice(std::vector& edges) { - // Complete all edges by adding the missing global variable identities. - for (auto& edge : edges) { - edge.transitions *= computeMissingGlobalVariableIdentities(edge, this->variables); - } - - // Sum all guards, so we can read off the maximal number of nondeterministic choices in any given state. - storm::dd::Add sumOfGuards = this->variables.manager->template getAddZero(); - for (auto const& edge : edges) { - sumOfGuards += edge.guard; - } - uint_fast64_t maxChoices = static_cast(sumOfGuards.getMax()); - STORM_LOG_TRACE("Found " << maxChoices << " local choices."); - - // Depending on the maximal number of nondeterminstic choices, we need to use some variables to encode the nondeterminism. - if (maxChoices == 0) { - return std::make_pair(0, this->variables.manager->template getAddZero()); - } else if (maxChoices == 1) { - return std::make_pair(0, combineEdgesBySummation(edges, this->variables)); - } else { - // Calculate number of required variables to encode the nondeterminism. - uint_fast64_t numberOfBinaryVariables = static_cast(std::ceil(storm::utility::math::log2(maxChoices))); - - storm::dd::Add allEdges = this->variables.manager->template getAddZero(); - - storm::dd::Bdd equalsNumberOfChoicesDd; - std::vector> choiceDds(maxChoices, this->variables.manager->template getAddZero()); - std::vector> remainingDds(maxChoices, this->variables.manager->getBddZero()); - - for (uint_fast64_t currentChoices = 1; currentChoices <= maxChoices; ++currentChoices) { - // Determine the set of states with exactly currentChoices choices. - equalsNumberOfChoicesDd = sumOfGuards.equals(this->variables.manager->getConstant(static_cast(currentChoices))); - - // If there is no such state, continue with the next possible number of choices. - if (equalsNumberOfChoicesDd.isZero()) { - continue; - } - - // Reset the previously used intermediate storage. - for (uint_fast64_t j = 0; j < currentChoices; ++j) { - choiceDds[j] = this->variables.manager->template getAddZero(); - remainingDds[j] = equalsNumberOfChoicesDd; - } - - for (std::size_t j = 0; j < edges.size(); ++j) { - // Check if edge guard overlaps with equalsNumberOfChoicesDd. That is, there are states with exactly currentChoices - // choices such that one outgoing choice is given by the j-th edge. - storm::dd::Bdd guardChoicesIntersection = edges[j].guard.toBdd() && equalsNumberOfChoicesDd; - - // If there is no such state, continue with the next command. - if (guardChoicesIntersection.isZero()) { - continue; - } - - // Split the currentChoices nondeterministic choices. - for (uint_fast64_t k = 0; k < currentChoices; ++k) { - // Calculate the overlapping part of command guard and the remaining DD. - storm::dd::Bdd remainingGuardChoicesIntersection = guardChoicesIntersection && remainingDds[k]; - - // Check if we can add some overlapping parts to the current index. - if (!remainingGuardChoicesIntersection.isZero()) { - // Remove overlapping parts from the remaining DD. - remainingDds[k] = remainingDds[k] && !remainingGuardChoicesIntersection; - - // Combine the overlapping part of the guard with command updates and add it to the resulting DD. - choiceDds[k] += remainingGuardChoicesIntersection.template toAdd() * edges[j].transitions; - } - - // Remove overlapping parts from the command guard DD - guardChoicesIntersection = guardChoicesIntersection && !remainingGuardChoicesIntersection; - - // If the guard DD has become equivalent to false, we can stop here. - if (guardChoicesIntersection.isZero()) { - break; - } - } - } - - // Add the meta variables that encode the nondeterminisim to the different choices. - for (uint_fast64_t j = 0; j < currentChoices; ++j) { - allEdges += encodeIndex(j, 0, numberOfBinaryVariables, this->variables) * choiceDds[j]; - } - - // Delete currentChoices out of overlapping DD - sumOfGuards = sumOfGuards * (!equalsNumberOfChoicesDd).template toAdd(); - } + EdgeDd(bool isMarkovian, storm::dd::Add const& guard, storm::dd::Add const& transitions, std::map> const& transientEdgeAssignments, std::set const& writtenGlobalVariables) : isMarkovian(isMarkovian), guard(guard), transitions(transitions), transientEdgeAssignments(transientEdgeAssignments), variableToWritingFragment() { - return std::make_pair(numberOfBinaryVariables, allEdges); - } - } - - storm::dd::Bdd computeIllegalFragmentFromEdges(std::map> const& actionIndexToEdges) { - // Create the illegal fragment. For this, we need to find the edges that write global variables multiple times. - storm::dd::Bdd illegalFragment = this->variables.manager->getBddZero(); - for (auto const& action : actionIndexToEdges) { - for (auto const& edge : action.second) { - if (!edge.globalVariablesWrittenMultipleTimes.empty()) { - for (auto const& variable : edge.globalVariablesWrittenMultipleTimes) { - STORM_LOG_WARN("The global variable '" << variable.getName() << "' is written along multiple synchronizing edges. If such a transition is contained in the reachable state space, an error is raised."); - illegalFragment |= edge.guard.toBdd(); - } - } + // Convert the set of written variables to a mapping from variable to the writing fragments. + for (auto const& variable : writtenGlobalVariables) { + variableToWritingFragment[variable] = guard.toBdd(); } } - return illegalFragment; - } - - ComposerResult buildSystemFromAutomaton(AutomatonDd& automatonDd) { - // If the model is an MDP, we need to encode the nondeterminism using additional variables. - if (this->model.getModelType() == storm::jani::ModelType::MDP) { - std::map>> actionIndexToUsedVariablesAndDd; - - // Combine the edges of each action individually and keep track of how many local nondeterminism variables - // were used. - uint64_t highestNumberOfUsedNondeterminismVariables = 0; - for (auto& action : automatonDd.actionIndexToEdges) { - std::pair> usedVariablesAndDd = combineEdgesByNondeterministicChoice(action.second); - actionIndexToUsedVariablesAndDd.emplace(action.first, usedVariablesAndDd); - highestNumberOfUsedNondeterminismVariables = std::max(highestNumberOfUsedNondeterminismVariables, usedVariablesAndDd.first); - } - - storm::dd::Add result = this->variables.manager->template getAddZero(); - for (auto const& element : actionIndexToUsedVariablesAndDd) { - result += element.second.second * encodeAction(element.first != this->model.getSilentActionIndex() ? boost::optional(element.first) : boost::none, this->variables) * encodeIndex(0, element.second.first, highestNumberOfUsedNondeterminismVariables - element.second.first, this->variables); - } - - return ComposerResult(result, computeIllegalFragmentFromEdges(automatonDd.actionIndexToEdges), highestNumberOfUsedNondeterminismVariables); - } else if (this->model.getModelType() == storm::jani::ModelType::DTMC || this->model.getModelType() == storm::jani::ModelType::CTMC) { - storm::dd::Add result = this->variables.manager->template getAddZero(); - for (auto const& action : automatonDd.actionIndexToEdges) { - result += combineEdgesBySummation(action.second, this->variables); - } - return ComposerResult(result, computeIllegalFragmentFromEdges(automatonDd.actionIndexToEdges), 0); - } - - STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Illegal model type."); - } - - storm::dd::Add computeMissingGlobalVariableIdentities(EdgeDd const& edge, CompositionVariables const& variables) { - std::set missingIdentities; - std::set_difference(variables.allGlobalVariables.begin(), variables.allGlobalVariables.end(), edge.writtenGlobalVariables.begin(), edge.writtenGlobalVariables.end(), std::inserter(missingIdentities, missingIdentities.begin())); - storm::dd::Add identityEncoding = variables.manager->template getAddOne(); - for (auto const& variable : missingIdentities) { - identityEncoding *= variables.variableToIdentityMap.at(variable); - } - return identityEncoding; - } - - EdgeDd extendEdgeWithIdentity(EdgeDd const& edge, storm::dd::Add const& identity) { - EdgeDd result(edge); - result.transitions *= identity; - return result; - } - - EdgeDd composeEdgesInParallel(EdgeDd const& edge1, EdgeDd const& edge2) { - EdgeDd result; - - // Compose the guards. - result.guard = edge1.guard * edge2.guard; - - // If the composed guard is already zero, we can immediately return an empty result. - if (result.guard.isZero()) { - result.transitions = edge1.transitions.getDdManager().template getAddZero(); - return result; - } - - // Compute the set of variables written multiple times by the composition. - std::set oldVariablesWrittenMultipleTimes; - std::set_union(edge1.globalVariablesWrittenMultipleTimes.begin(), edge1.globalVariablesWrittenMultipleTimes.end(), edge2.globalVariablesWrittenMultipleTimes.begin(), edge2.globalVariablesWrittenMultipleTimes.end(), std::inserter(oldVariablesWrittenMultipleTimes, oldVariablesWrittenMultipleTimes.begin())); - - std::set newVariablesWrittenMultipleTimes; - std::set_intersection(edge1.writtenGlobalVariables.begin(), edge1.writtenGlobalVariables.end(), edge2.writtenGlobalVariables.begin(), edge2.writtenGlobalVariables.end(), std::inserter(newVariablesWrittenMultipleTimes, newVariablesWrittenMultipleTimes.begin())); - - std::set variablesWrittenMultipleTimes; - std::set_union(oldVariablesWrittenMultipleTimes.begin(), oldVariablesWrittenMultipleTimes.end(), newVariablesWrittenMultipleTimes.begin(), newVariablesWrittenMultipleTimes.end(), std::inserter(variablesWrittenMultipleTimes, variablesWrittenMultipleTimes.begin())); - - result.globalVariablesWrittenMultipleTimes = std::move(variablesWrittenMultipleTimes); - - // Compute the set of variables written by the composition. - std::set variablesWritten; - std::set_union(edge1.writtenGlobalVariables.begin(), edge1.writtenGlobalVariables.end(), edge2.writtenGlobalVariables.begin(), edge2.writtenGlobalVariables.end(), std::inserter(variablesWritten, variablesWritten.begin())); - - result.writtenGlobalVariables = variablesWritten; - - // Compose the guards. - result.guard = edge1.guard * edge2.guard; - - // Compose the transitions. - result.transitions = edge1.transitions * edge2.transitions; - - return result; - } - - /*! - * Builds the DD for the given edge. - */ - EdgeDd buildEdgeDd(storm::jani::Automaton const& automaton, storm::jani::Edge const& edge) { - STORM_LOG_TRACE("Translating guard " << edge.getGuard()); - storm::dd::Add guard = this->variables.rowExpressionAdapter->translateExpression(edge.getGuard());// * this->variables.automatonToRangeMap.at(automaton.getName()); - STORM_LOG_WARN_COND(!guard.isZero(), "The guard '" << edge.getGuard() << "' is unsatisfiable."); - - if (!guard.isZero()) { - // Create the DDs representing the individual updates. - std::vector> destinationDds; - for (storm::jani::EdgeDestination const& destination : edge.getDestinations()) { - destinationDds.push_back(buildEdgeDestinationDd(automaton, destination, guard, this->variables)); - - STORM_LOG_WARN_COND(!destinationDds.back().transitions.isZero(), "Destination does not have any effect."); - } - // Start by gathering all variables that were written in at least one update. - std::set globalVariablesInSomeUpdate; - - // If the edge is not labeled with the silent action, we have to analyze which portion of the global - // variables was written by any of the updates and make all update results equal w.r.t. this set. If - // the edge is labeled with the silent action, we can already multiply the identities of all global variables. - if (edge.getActionIndex() != this->model.getSilentActionIndex()) { - for (auto const& edgeDestinationDd : destinationDds) { - globalVariablesInSomeUpdate.insert(edgeDestinationDd.writtenGlobalVariables.begin(), edgeDestinationDd.writtenGlobalVariables.end()); - } - } else { - globalVariablesInSomeUpdate = this->variables.allGlobalVariables; - } - - // Then, multiply the missing identities. - for (auto& destinationDd : destinationDds) { - std::set missingIdentities; - std::set_difference(globalVariablesInSomeUpdate.begin(), globalVariablesInSomeUpdate.end(), destinationDd.writtenGlobalVariables.begin(), destinationDd.writtenGlobalVariables.end(), std::inserter(missingIdentities, missingIdentities.begin())); - - for (auto const& variable : missingIdentities) { - STORM_LOG_TRACE("Multiplying identity for variable " << variable.getName() << " to destination DD."); - destinationDd.transitions *= this->variables.variableToIdentityMap.at(variable); - } - } - - // Now combine the destination DDs to the edge DD. - storm::dd::Add transitions = this->variables.manager->template getAddZero(); - for (auto const& destinationDd : destinationDds) { - transitions += destinationDd.transitions; - } - - // Add the source location and the guard. - transitions *= this->variables.manager->getEncoding(this->variables.automatonToLocationVariableMap.at(automaton.getName()).first, edge.getSourceLocationIndex()).template toAdd() * guard; - - // If we multiply the ranges of global variables, make sure everything stays within its bounds. - if (!globalVariablesInSomeUpdate.empty()) { - transitions *= this->variables.globalVariableRanges; - } - - // If the edge has a rate, we multiply it to the DD. - if (edge.hasRate()) { - transitions *= this->variables.rowExpressionAdapter->translateExpression(edge.getRate()); - } - return EdgeDd(guard, transitions, globalVariablesInSomeUpdate); - } else { - return EdgeDd(this->variables.manager->template getAddZero(), this->variables.manager->template getAddZero()); - } - } - - /*! - * Builds the DD for the automaton with the given name. - */ - AutomatonDd buildAutomatonDd(std::string const& automatonName) { - AutomatonDd result(this->variables.automatonToIdentityMap.at(automatonName)); - - storm::jani::Automaton const& automaton = this->model.getAutomaton(automatonName); - for (auto const& edge : automaton.getEdges()) { - // Build the edge and add it if it adds transitions. - EdgeDd edgeDd = buildEdgeDd(automaton, edge); - if (!edgeDd.guard.isZero()) { - result.actionIndexToEdges[edge.getActionIndex()].push_back(edgeDd); - } - } - - return result; - } - }; - - template - class CombinedEdgesSystemComposer : public SystemComposer { - public: - // This structure represents an edge. - struct EdgeDd { - EdgeDd(storm::dd::Add const& guard = storm::dd::Add(), storm::dd::Add const& transitions = storm::dd::Add(), std::set const& writtenGlobalVariables = {}) : guard(guard), transitions(transitions), writtenGlobalVariables(writtenGlobalVariables) { + EdgeDd(bool isMarkovian, storm::dd::Add const& guard, storm::dd::Add const& transitions, std::map> const& transientEdgeAssignments, std::map> const& variableToWritingFragment) : isMarkovian(isMarkovian), guard(guard), transitions(transitions), transientEdgeAssignments(transientEdgeAssignments), variableToWritingFragment(variableToWritingFragment) { // Intentionally left empty. } + + // A flag storing whether this edge is a Markovian one (i.e. one with a rate). + bool isMarkovian; // A DD that represents all states that have this edge enabled. storm::dd::Add guard; @@ -918,13 +547,16 @@ namespace storm { // A DD that represents the transitions of this edge. storm::dd::Add transitions; - // The set of global variables written by this edge. - std::set writtenGlobalVariables; + // A mapping from transient variables to the DDs representing their value assignments. + std::map> transientEdgeAssignments; + + // A mapping of variables to the variables to the fragment of transitions that is writing the corresponding variable. + std::map> variableToWritingFragment; }; // This structure represents an edge. struct ActionDd { - ActionDd(storm::dd::Add const& guard = storm::dd::Add(), storm::dd::Add const& transitions = storm::dd::Add(), std::pair localNondeterminismVariables = std::pair(0, 0), std::map> const& variableToWritingFragment = {}, storm::dd::Bdd const& illegalFragment = storm::dd::Bdd()) : guard(guard), transitions(transitions), localNondeterminismVariables(localNondeterminismVariables), variableToWritingFragment(variableToWritingFragment), illegalFragment(illegalFragment) { + ActionDd(storm::dd::Add const& guard = storm::dd::Add(), storm::dd::Add const& transitions = storm::dd::Add(), std::map> const& transientEdgeAssignments = {}, std::pair localNondeterminismVariables = std::pair(0, 0), std::map> const& variableToWritingFragment = {}, storm::dd::Bdd const& illegalFragment = storm::dd::Bdd()) : guard(guard), transitions(transitions), transientEdgeAssignments(transientEdgeAssignments), localNondeterminismVariables(localNondeterminismVariables), variableToWritingFragment(variableToWritingFragment), illegalFragment(illegalFragment), inputEnabled(false) { // Intentionally left empty. } @@ -939,13 +571,28 @@ namespace storm { std::pair const& getLocalNondeterminismVariables() const { return localNondeterminismVariables; } + + ActionDd multiplyTransitions(storm::dd::Add const& factor) const { + return ActionDd(guard, transitions * factor, transientEdgeAssignments, localNondeterminismVariables, variableToWritingFragment, illegalFragment); + } + bool isInputEnabled() const { + return inputEnabled; + } + + void setIsInputEnabled() { + inputEnabled = true; + } + // A DD that represents all states that have this edge enabled. storm::dd::Add guard; // A DD that represents the transitions of this edge. storm::dd::Add transitions; + // A mapping from transient variables to their assignments. + std::map> transientEdgeAssignments; + // The local nondeterminism variables used by this action DD, given as the lowest std::pair localNondeterminismVariables; @@ -956,11 +603,14 @@ namespace storm { // A DD characterizing the fragment of the states satisfying the guard that are illegal because // there are synchronizing edges enabled that write to the same global variable. storm::dd::Bdd illegalFragment; + + // A flag storing whether this action is input-enabled. + bool inputEnabled; }; // This structure represents a subcomponent of a composition. struct AutomatonDd { - AutomatonDd(storm::dd::Add const& identity) : actionIndexToAction(), identity(identity), localNondeterminismVariables(std::make_pair(0, 0)) { + AutomatonDd(storm::dd::Add const& identity, std::map> const& transientLocationAssignments = {}) : actionIndexToAction(), transientLocationAssignments(transientLocationAssignments), identity(identity), localNondeterminismVariables(std::make_pair(0, 0)) { // Intentionally left empty. } @@ -988,171 +638,319 @@ namespace storm { // A mapping from action indices to the action DDs. std::map actionIndexToAction; + // A mapping from transient variables to their location-based transient assignment values. + std::map> transientLocationAssignments; + // The identity of the automaton's variables. storm::dd::Add identity; - // The local nondeterminism variables used by this action DD, given as the lowest + // The local nondeterminism variables used by this action DD, given as the lowest and highest variable index. std::pair localNondeterminismVariables; }; - CombinedEdgesSystemComposer(storm::jani::Model const& model, CompositionVariables const& variables) : SystemComposer(model, variables) { + CombinedEdgesSystemComposer(storm::jani::Model const& model, storm::jani::CompositionInformation const& actionInformation, CompositionVariables const& variables, std::vector const& transientVariables) : SystemComposer(model, variables, transientVariables), actionInformation(actionInformation) { // Intentionally left empty. } + + storm::jani::CompositionInformation const& actionInformation; ComposerResult compose() override { - std::map actionIndexToLocalNondeterminismVariableOffset; - for (auto const& action : this->model.getActions()) { - actionIndexToLocalNondeterminismVariableOffset[this->model.getActionIndex(action.getName())] = 0; + std::map actionIndexToLocalNondeterminismVariableOffset; + for (auto const& actionIndex : actionInformation.getNonSilentActionIndices()) { + actionIndexToLocalNondeterminismVariableOffset[actionIndex] = 0; } - + actionIndexToLocalNondeterminismVariableOffset[storm::jani::Model::SILENT_ACTION_INDEX] = 0; + AutomatonDd globalAutomaton = boost::any_cast(this->model.getSystemComposition().accept(*this, actionIndexToLocalNondeterminismVariableOffset)); return buildSystemFromAutomaton(globalAutomaton); } boost::any visit(storm::jani::AutomatonComposition const& composition, boost::any const& data) override { - std::map const& actionIndexToLocalNondeterminismVariableOffset = boost::any_cast const&>(data); - return buildAutomatonDd(composition.getAutomatonName(), actionIndexToLocalNondeterminismVariableOffset); - } - - boost::any visit(storm::jani::RenameComposition const& composition, boost::any const& data) override { - // Build a mapping from indices to indices for the renaming. - std::map renamingIndexToIndex; - for (auto const& entry : composition.getRenaming()) { - if (this->model.getActionIndex(entry.first) != this->model.getSilentActionIndex()) { - // Distinguish the cases where we hide the action or properly rename it. - if (entry.second) { - renamingIndexToIndex.emplace(this->model.getActionIndex(entry.first), this->model.getActionIndex(entry.second.get())); - } else { - renamingIndexToIndex.emplace(this->model.getActionIndex(entry.first), this->model.getSilentActionIndex()); - } - } else { - STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Renaming composition must not rename the silent action."); - } - } + std::map const& actionIndexToLocalNondeterminismVariableOffset = boost::any_cast const&>(data); - // Prepare the new offset mapping. - std::map const& actionIndexToLocalNondeterminismVariableOffset = boost::any_cast const&>(data); - std::map newSynchronizingActionToOffsetMap = actionIndexToLocalNondeterminismVariableOffset; - for (auto const& indexPair : renamingIndexToIndex) { - auto it = actionIndexToLocalNondeterminismVariableOffset.find(indexPair.second); - STORM_LOG_THROW(it != actionIndexToLocalNondeterminismVariableOffset.end(), storm::exceptions::InvalidArgumentException, "Invalid action index " << indexPair.second << "."); - newSynchronizingActionToOffsetMap[indexPair.first] = it->second; + std::set inputEnabledActionIndices; + for (auto const& actionName : composition.getInputEnabledActions()) { + inputEnabledActionIndices.insert(actionInformation.getActionIndex(actionName)); } - // Then, we translate the subcomposition. - AutomatonDd subautomaton = boost::any_cast(composition.getSubcomposition().accept(*this, newSynchronizingActionToOffsetMap)); - - // Now perform the renaming and return result. - return rename(subautomaton, renamingIndexToIndex); + return buildAutomatonDd(composition.getAutomatonName(), actionIndexToLocalNondeterminismVariableOffset, inputEnabledActionIndices); } boost::any visit(storm::jani::ParallelComposition const& composition, boost::any const& data) override { - // Build the set of synchronizing action indices. - std::set synchronizingActionIndices; - for (auto const& entry : composition.getSynchronizationAlphabet()) { - if (this->model.getActionIndex(entry) != this->model.getSilentActionIndex()) { - synchronizingActionIndices.insert(this->model.getActionIndex(entry)); - } else { - STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Parallel composition must not synchronize over silent action."); - } - } - - // Then translate the left subcomposition. - AutomatonDd left = boost::any_cast(composition.getLeftSubcomposition().accept(*this, data)); - - // Prepare the new offset mapping. std::map const& actionIndexToLocalNondeterminismVariableOffset = boost::any_cast const&>(data); - std::map newActionIndexToLocalNondeterminismVariableOffset = actionIndexToLocalNondeterminismVariableOffset; - for (auto const& actionIndex : synchronizingActionIndices) { - auto it = left.actionIndexToAction.find(actionIndex); - if (it != left.actionIndexToAction.end()) { - newActionIndexToLocalNondeterminismVariableOffset[actionIndex] = it->second.getHighestLocalNondeterminismVariable(); + + std::vector subautomata; + for (uint64_t subcompositionIndex = 0; subcompositionIndex < composition.getNumberOfSubcompositions(); ++subcompositionIndex) { + // Prepare the new offset mapping. + std::map newSynchronizingActionToOffsetMap = actionIndexToLocalNondeterminismVariableOffset; + + if (subcompositionIndex == 0) { + for (auto const& synchVector : composition.getSynchronizationVectors()) { + auto it = actionIndexToLocalNondeterminismVariableOffset.find(actionInformation.getActionIndex(synchVector.getOutput())); + STORM_LOG_THROW(it != actionIndexToLocalNondeterminismVariableOffset.end(), storm::exceptions::InvalidArgumentException, "Invalid action " << synchVector.getOutput() << "."); + if (synchVector.getInput(0) != storm::jani::SynchronizationVector::NO_ACTION_INPUT) { + newSynchronizingActionToOffsetMap[actionInformation.getActionIndex(synchVector.getInput(0))] = it->second; + } + } + } else { + // Based on the previous results, we need to update the offsets. + for (auto const& synchVector : composition.getSynchronizationVectors()) { + if (synchVector.getInput(subcompositionIndex) != storm::jani::SynchronizationVector::NO_ACTION_INPUT) { + boost::optional previousActionPosition = synchVector.getPositionOfPrecedingParticipatingAction(subcompositionIndex); + if (previousActionPosition) { + AutomatonDd const& previousAutomatonDd = subautomata[previousActionPosition.get()]; + + std::string const& previousAction = synchVector.getInput(previousActionPosition.get()); + auto it = previousAutomatonDd.actionIndexToAction.find(actionInformation.getActionIndex(previousAction)); + if (it != previousAutomatonDd.actionIndexToAction.end()) { + newSynchronizingActionToOffsetMap[actionInformation.getActionIndex(synchVector.getInput(subcompositionIndex))] = it->second.getHighestLocalNondeterminismVariable(); + } else { + STORM_LOG_ASSERT(false, "Subcomposition does not have action that is mentioned in parallel composition."); + } + } + } + } } + + // Build the DD for the next element of the composition wrt. to the current offset mapping. + subautomata.push_back(boost::any_cast(composition.getSubcomposition(subcompositionIndex).accept(*this, newSynchronizingActionToOffsetMap))); } - // Then translate the right subcomposition. - AutomatonDd right = boost::any_cast(composition.getRightSubcomposition().accept(*this, newActionIndexToLocalNondeterminismVariableOffset)); - - return composeInParallel(left, right, synchronizingActionIndices); + return composeInParallel(subautomata, composition.getSynchronizationVectors()); } private: - AutomatonDd composeInParallel(AutomatonDd const& automaton1, AutomatonDd const& automaton2, std::set const& synchronizingActionIndices) { - AutomatonDd result(automaton1); - - // Treat all actions of the first automaton. - for (auto const& action1 : automaton1.actionIndexToAction) { - // If we need to synchronize over this action index, we try to do so now. - if (synchronizingActionIndices.find(action1.first) != synchronizingActionIndices.end()) { - auto action2It = automaton2.actionIndexToAction.find(action1.first); - if (action2It != automaton2.actionIndexToAction.end()) { - ActionDd newAction = combineSynchronizingActions(action1.second, action2It->second); - result.actionIndexToAction[action1.first] = newAction; - result.extendLocalNondeterminismVariables(newAction.getLocalNondeterminismVariables()); + AutomatonDd composeInParallel(std::vector const& subautomata, std::vector const& synchronizationVectors) { + typedef storm::dd::Add IdentityAdd; + typedef std::pair ActionAndAutomatonIdentity; + typedef std::vector ActionAndAutomatonIdentities; + typedef std::vector>> SynchronizationVectorActionsAndIdentities; + + AutomatonDd result(this->variables.manager->template getAddOne()); + + std::map> nonSynchronizingActions; + SynchronizationVectorActionsAndIdentities synchronizationVectorActions(synchronizationVectors.size(), boost::none); + for (uint64_t automatonIndex = 0; automatonIndex < subautomata.size(); ++automatonIndex) { + AutomatonDd const& subautomaton = subautomata[automatonIndex]; + + // Add the transient assignments from the new subautomaton. + addToTransientAssignmentMap(result.transientLocationAssignments, subautomaton.transientLocationAssignments); + + // Initilize the used local nondeterminism variables appropriately. + if (automatonIndex == 0) { + result.setLowestLocalNondeterminismVariable(subautomaton.getLowestLocalNondeterminismVariable()); + result.setHighestLocalNondeterminismVariable(subautomaton.getHighestLocalNondeterminismVariable()); + } + + // Compose the actions according to the synchronization vectors. + std::set actionsInSynch; + for (uint64_t synchVectorIndex = 0; synchVectorIndex < synchronizationVectors.size(); ++synchVectorIndex) { + auto const& synchVector = synchronizationVectors[synchVectorIndex]; + + if (synchVector.isNoActionInput(synchVector.getInput(automatonIndex))) { + if (automatonIndex == 0) { + // Create a new action that is the identity over the first automaton. + synchronizationVectorActions[synchVectorIndex] = std::make_pair(ActionAndAutomatonIdentities{std::make_pair(ActionDd(this->variables.manager->template getAddOne(), subautomaton.identity, {}, subautomaton.localNondeterminismVariables, {}, this->variables.manager->getBddZero()), subautomaton.identity)}, this->variables.manager->template getAddOne()); + } else { + // If there is no action in the output spot, this means that some other subcomposition did + // not provide the action necessary for the synchronization vector to resolve. + if (synchronizationVectorActions[synchVectorIndex]) { + synchronizationVectorActions[synchVectorIndex].get().second *= subautomaton.identity; + } + } + } else { + // Determine the indices of input (at the current automaton position) and the output. + uint64_t inputActionIndex = actionInformation.getActionIndex(synchVector.getInput(automatonIndex)); + actionsInSynch.insert(inputActionIndex); + + // Either set the action (if it's the first of the ones to compose) or compose the actions directly. + if (automatonIndex == 0) { + // If the action cannot be found, the particular spot in the output will be left empty. + auto inputActionIt = subautomaton.actionIndexToAction.find(inputActionIndex); + if (inputActionIt != subautomaton.actionIndexToAction.end()) { + synchronizationVectorActions[synchVectorIndex] = std::make_pair(ActionAndAutomatonIdentities{std::make_pair(inputActionIt->second, subautomaton.identity)}, this->variables.manager->template getAddOne()); + } + } else { + // If there is no action in the output spot, this means that some other subcomposition did + // not provide the action necessary for the synchronization vector to resolve. + if (synchronizationVectorActions[synchVectorIndex]) { + auto inputActionIt = subautomaton.actionIndexToAction.find(inputActionIndex); + if (inputActionIt != subautomaton.actionIndexToAction.end()) { + synchronizationVectorActions[synchVectorIndex].get().first.push_back(std::make_pair(inputActionIt->second, subautomaton.identity)); + } else { + // If the current subcomposition does not provide the required action for the synchronization + // vector, we clear the action. + synchronizationVectorActions[synchVectorIndex] = boost::none; + } + } + } + } + } + + // Now treat all unsynchronizing actions. + if (automatonIndex == 0) { + // Since it's the first automaton, there is nothing to combine. + for (auto const& action : subautomaton.actionIndexToAction) { + if (actionsInSynch.find(action.first) == actionsInSynch.end()) { + nonSynchronizingActions[action.first].push_back(action.second); + } } } else { - // If we don't synchronize over this action, we need to construct the interleaving. + // Extend all other non-synchronizing actions with the identity of the current subautomaton. + for (auto& actions : nonSynchronizingActions) { + for (auto& action : actions.second) { + STORM_LOG_TRACE("Extending action '" << actionInformation.getActionName(actions.first) << "' with identity of next composition."); + action.transitions *= subautomaton.identity; + } + } - // If both automata contain the action, we need to combine the actions in an unsynchronized way. - auto action2It = automaton2.actionIndexToAction.find(action1.first); - if (action2It != automaton2.actionIndexToAction.end()) { - ActionDd newAction = combineUnsynchronizedActions(action1.second, action2It->second, automaton1.identity, automaton2.identity); - result.actionIndexToAction[action1.first] = newAction; - result.extendLocalNondeterminismVariables(newAction.getLocalNondeterminismVariables()); - } else { - // If only the first automaton has this action, we only need to apply the identity of the - // second automaton. - result.actionIndexToAction[action1.first] = ActionDd(action1.second.guard, action1.second.transitions * automaton2.identity, action1.second.localNondeterminismVariables, action1.second.variableToWritingFragment, action1.second.illegalFragment); + // Extend the actions of the current subautomaton with the identity of the previous system and + // add it to the overall non-synchronizing action result. + for (auto const& action : subautomaton.actionIndexToAction) { + if (actionsInSynch.find(action.first) == actionsInSynch.end()) { + STORM_LOG_TRACE("Adding action " << actionInformation.getActionName(action.first) << " to non-synchronizing actions and multiply it with system identity."); + nonSynchronizingActions[action.first].push_back(action.second.multiplyTransitions(result.identity)); + } } } + + // Finally, construct combined identity. + result.identity *= subautomaton.identity; } - // Treat the actions of the second automaton. - for (auto const& action2 : automaton2.actionIndexToAction) { - // Here, we only need to treat actions that the first automaton does not have, because we have handled - // this case earlier. Likewise, we have to consider non-synchronizing actions only. - if (automaton1.actionIndexToAction.find(action2.first) == automaton1.actionIndexToAction.end()) { - if (synchronizingActionIndices.find(action2.first) == synchronizingActionIndices.end()) { - // If only the second automaton has this action, we only need to apply the identity of the - // first automaton. - result.actionIndexToAction[action2.first] = ActionDd(action2.second.guard, action2.second.transitions * automaton1.identity, action2.second.localNondeterminismVariables, action2.second.variableToWritingFragment, action2.second.illegalFragment); - } + // Add the results of the synchronization vectors to that of the non-synchronizing actions. + for (uint64_t synchVectorIndex = 0; synchVectorIndex < synchronizationVectors.size(); ++synchVectorIndex) { + auto const& synchVector = synchronizationVectors[synchVectorIndex]; + + // If there is an action resulting from this combination of actions, add it to the output action. + if (synchronizationVectorActions[synchVectorIndex]) { + uint64_t outputActionIndex = actionInformation.getActionIndex(synchVector.getOutput()); + nonSynchronizingActions[outputActionIndex].push_back(combineSynchronizingActions(synchronizationVectorActions[synchVectorIndex].get().first, synchronizationVectorActions[synchVectorIndex].get().second)); } } - result.identity = automaton1.identity * automaton2.identity; + // Now that we have built the individual action DDs for all resulting actions, we need to combine them + // in an unsynchronizing way. + for (auto const& nonSynchronizingActionDds : nonSynchronizingActions) { + std::vector const& actionDds = nonSynchronizingActionDds.second; + if (actionDds.size() > 1) { + ActionDd combinedAction = combineUnsynchronizedActions(actionDds); + result.actionIndexToAction[nonSynchronizingActionDds.first] = combinedAction; + result.extendLocalNondeterminismVariables(combinedAction.getLocalNondeterminismVariables()); + } else { + result.actionIndexToAction[nonSynchronizingActionDds.first] = actionDds.front(); + result.extendLocalNondeterminismVariables(actionDds.front().getLocalNondeterminismVariables()); + } + } return result; } - ActionDd combineSynchronizingActions(ActionDd action1, ActionDd action2) { + ActionDd combineSynchronizingActions(std::vector>> const& actionsAndIdentities, storm::dd::Add const& nonSynchronizingAutomataIdentities) { + // If there is just one action, no need to combine anything. + if (actionsAndIdentities.size() == 1) { + return actionsAndIdentities.front().first; + } + + // If there are only input-enabled actions, we also need to build the disjunction of the guards. + bool allActionsInputEnabled = true; + for (auto const& actionIdentityPair : actionsAndIdentities) { + auto const& action = actionIdentityPair.first; + if (!action.isInputEnabled()) { + allActionsInputEnabled = false; + } + } + + boost::optional> guardDisjunction; + if (allActionsInputEnabled) { + guardDisjunction = this->variables.manager->getBddZero(); + } + + // Otherwise, construct the synchronization. storm::dd::Bdd illegalFragment = this->variables.manager->getBddZero(); - storm::dd::Bdd guard1 = action1.guard.toBdd(); - storm::dd::Bdd guard2 = action2.guard.toBdd(); - storm::dd::Bdd combinedGuard = guard1 && guard2; - // Cross-multiply the guards to the other fragments that write global variables and check for overlapping - // parts. This finds illegal parts in which a global variable is written multiple times. std::map> globalVariableToWritingFragment; - for (auto& entry : action1.variableToWritingFragment) { - entry.second &= guard2; - globalVariableToWritingFragment[entry.first] = entry.second; - } - for (auto& entry : action2.variableToWritingFragment) { - entry.second &= guard1; - auto it = globalVariableToWritingFragment.find(entry.first); - if (it != globalVariableToWritingFragment.end()) { - auto action1LocalNondeterminismVariableSet = std::set(this->variables.localNondeterminismVariables.begin() + action1.getLowestLocalNondeterminismVariable(), this->variables.localNondeterminismVariables.begin() + action1.getHighestLocalNondeterminismVariable()); - auto action2LocalNondeterminismVariableSet = std::set(this->variables.localNondeterminismVariables.begin() + action2.getLowestLocalNondeterminismVariable(), this->variables.localNondeterminismVariables.begin() + action2.getHighestLocalNondeterminismVariable()); - illegalFragment |= it->second.existsAbstract(action1LocalNondeterminismVariableSet) && entry.second.existsAbstract(action2LocalNondeterminismVariableSet); - it->second &= entry.second; + std::map> globalVariableToWritingFragmentWithoutNondeterminism; + + storm::dd::Bdd inputEnabledGuard = this->variables.manager->getBddOne(); + storm::dd::Add transitions = this->variables.manager->template getAddOne(); + std::map> transientEdgeAssignments; + + uint64_t lowestNondeterminismVariable = actionsAndIdentities.front().first.getLowestLocalNondeterminismVariable(); + uint64_t highestNondeterminismVariable = actionsAndIdentities.front().first.getHighestLocalNondeterminismVariable(); + + storm::dd::Bdd newIllegalFragment = this->variables.manager->getBddZero(); + for (auto const& actionIdentityPair : actionsAndIdentities) { + auto const& action = actionIdentityPair.first; + storm::dd::Bdd actionGuard = action.guard.toBdd(); + if (guardDisjunction) { + guardDisjunction.get() |= actionGuard; + } + + lowestNondeterminismVariable = std::min(lowestNondeterminismVariable, action.getLowestLocalNondeterminismVariable()); + highestNondeterminismVariable = std::max(highestNondeterminismVariable, action.getHighestLocalNondeterminismVariable()); + transientEdgeAssignments = joinTransientAssignmentMaps(transientEdgeAssignments, action.transientEdgeAssignments); + + if (action.isInputEnabled()) { + // If the action is input-enabled, we add self-loops to all states. + transitions *= actionGuard.ite(action.transitions, encodeIndex(0, action.getLowestLocalNondeterminismVariable(), action.getHighestLocalNondeterminismVariable() - action.getLowestLocalNondeterminismVariable(), this->variables) * actionIdentityPair.second); } else { - globalVariableToWritingFragment[entry.first] = entry.second; + transitions *= action.transitions; + } + + // Create a set of variables that is used as nondeterminism variables in this action. + auto nondetVariables = std::set(this->variables.localNondeterminismVariables.begin() + action.getLowestLocalNondeterminismVariable(), this->variables.localNondeterminismVariables.begin() + action.getHighestLocalNondeterminismVariable()); + + for (auto const& entry : action.variableToWritingFragment) { + storm::dd::Bdd guardedWritingFragment = inputEnabledGuard && entry.second; + + // Check whether there already is an entry for this variable in the mapping of global variables + // to their writing fragments. + auto globalFragmentIt = globalVariableToWritingFragment.find(entry.first); + if (globalFragmentIt != globalVariableToWritingFragment.end()) { + // If there is, take the conjunction of the entries and also of their versions without nondeterminism + // variables. + globalFragmentIt->second &= guardedWritingFragment; + illegalFragment |= globalVariableToWritingFragmentWithoutNondeterminism[entry.first] && guardedWritingFragment.existsAbstract(nondetVariables); + globalVariableToWritingFragmentWithoutNondeterminism[entry.first] |= guardedWritingFragment.existsAbstract(nondetVariables); + } else { + // If not, create the entry and also create a version of the entry that abstracts from the + // used nondeterminism variables. + globalVariableToWritingFragment[entry.first] = guardedWritingFragment; + globalVariableToWritingFragmentWithoutNondeterminism[entry.first] = guardedWritingFragment.existsAbstract(nondetVariables); + } + + // Join all individual illegal fragments so we can see whether any of these elements lie in the + // conjunction of all guards. + illegalFragment |= action.illegalFragment; + } + + // Now go through all fragments that are not written by the current action and join them with the + // guard of the current action if the current action is not input enabled. + for (auto& entry : globalVariableToWritingFragment) { + if (action.variableToWritingFragment.find(entry.first) == action.variableToWritingFragment.end() && !action.isInputEnabled()) { + entry.second &= actionGuard; + } } + + if (!action.isInputEnabled()) { + inputEnabledGuard &= actionGuard; + } + } + + // If all actions were input-enabled, we need to constrain the transitions with the disjunction of all + // guards to make sure there are not transitions resulting from input enabledness alone. + if (allActionsInputEnabled) { + inputEnabledGuard &= guardDisjunction.get(); + transitions *= guardDisjunction.get().template toAdd(); } - return ActionDd(action1.guard * action2.guard, action1.transitions * action2.transitions, std::make_pair(std::min(action1.getLowestLocalNondeterminismVariable(), action2.getLowestLocalNondeterminismVariable()), std::max(action1.getHighestLocalNondeterminismVariable(), action2.getHighestLocalNondeterminismVariable())), globalVariableToWritingFragment, illegalFragment); + // Cut the union of the illegal fragments to the conjunction of the guards since only these states have + // such a combined transition. + illegalFragment &= inputEnabledGuard; + + return ActionDd(inputEnabledGuard.template toAdd(), transitions * nonSynchronizingAutomataIdentities, transientEdgeAssignments, std::make_pair(lowestNondeterminismVariable, highestNondeterminismVariable), globalVariableToWritingFragment, illegalFragment); } ActionDd combineUnsynchronizedActions(ActionDd action1, ActionDd action2, storm::dd::Add const& identity1, storm::dd::Add const& identity2) { @@ -1166,82 +964,93 @@ namespace storm { } ActionDd combineUnsynchronizedActions(ActionDd action1, ActionDd action2) { + return combineUnsynchronizedActions({action1, action2}); + } + + ActionDd combineUnsynchronizedActions(std::vector actions) { STORM_LOG_TRACE("Combining unsynchronized actions."); if (this->model.getModelType() == storm::jani::ModelType::DTMC || this->model.getModelType() == storm::jani::ModelType::CTMC) { - return ActionDd(action1.guard + action2.guard, action1.transitions + action2.transitions, std::make_pair(0, 0), joinVariableWritingFragmentMaps(action1.variableToWritingFragment, action2.variableToWritingFragment), this->variables.manager->getBddZero()); + auto actionIt = actions.begin(); + ActionDd result(*actionIt); + + for (++actionIt; actionIt != actions.end(); ++actionIt) { + result = ActionDd(result.guard + actionIt->guard, result.transitions + actionIt->transitions, joinTransientAssignmentMaps(result.transientEdgeAssignments, actionIt->transientEdgeAssignments), std::make_pair(0, 0), joinVariableWritingFragmentMaps(result.variableToWritingFragment, actionIt->variableToWritingFragment), result.illegalFragment || actionIt->illegalFragment); + } + return result; } else if (this->model.getModelType() == storm::jani::ModelType::MDP) { - if (action1.transitions.isZero()) { - return action2; - } else if (action2.transitions.isZero()) { - return action1; + // Ensure that all actions start at the same local nondeterminism variable. + uint_fast64_t lowestLocalNondeterminismVariable = actions.front().getLowestLocalNondeterminismVariable(); + uint_fast64_t highestLocalNondeterminismVariable = actions.front().getHighestLocalNondeterminismVariable(); + for (auto const& action : actions) { + STORM_LOG_ASSERT(action.getLowestLocalNondeterminismVariable() == lowestLocalNondeterminismVariable, "Mismatching lowest nondeterminism variable indices."); + highestLocalNondeterminismVariable = std::max(highestLocalNondeterminismVariable, action.getHighestLocalNondeterminismVariable()); } - // Bring both choices to the same number of variables that encode the nondeterminism. - assert(action1.getLowestLocalNondeterminismVariable() == action2.getLowestLocalNondeterminismVariable()); - uint_fast64_t highestLocalNondeterminismVariable = std::max(action1.getHighestLocalNondeterminismVariable(), action2.getHighestLocalNondeterminismVariable()); - if (action1.getHighestLocalNondeterminismVariable() > action2.getHighestLocalNondeterminismVariable()) { - storm::dd::Add nondeterminismEncoding = this->variables.manager->template getAddOne(); - - for (uint_fast64_t i = action2.getHighestLocalNondeterminismVariable(); i < action1.getHighestLocalNondeterminismVariable(); ++i) { - nondeterminismEncoding *= this->variables.manager->getEncoding(this->variables.localNondeterminismVariables[i], 0).template toAdd(); + // Bring all actions to the same number of variables that encode the nondeterminism. + for (auto& action : actions) { + storm::dd::Bdd nondeterminismEncodingBdd = this->variables.manager->getBddOne(); + for (uint_fast64_t i = action.getHighestLocalNondeterminismVariable(); i < highestLocalNondeterminismVariable; ++i) { + nondeterminismEncodingBdd &= this->variables.manager->getEncoding(this->variables.localNondeterminismVariables[i], 0); } - action2.transitions *= nondeterminismEncoding; - } else if (action2.getHighestLocalNondeterminismVariable() > action1.getHighestLocalNondeterminismVariable()) { - storm::dd::Add nondeterminismEncoding = this->variables.manager->template getAddOne(); + storm::dd::Add nondeterminismEncoding = nondeterminismEncodingBdd.template toAdd(); + + action.transitions *= nondeterminismEncoding; - for (uint_fast64_t i = action1.getHighestLocalNondeterminismVariable(); i < action2.getHighestLocalNondeterminismVariable(); ++i) { - nondeterminismEncoding *= this->variables.manager->getEncoding(this->variables.localNondeterminismVariables[i], 0).template toAdd(); + for (auto& variableFragment : action.variableToWritingFragment) { + variableFragment.second &= nondeterminismEncodingBdd; + } + for (auto& transientAssignment : action.transientEdgeAssignments) { + transientAssignment.second *= nondeterminismEncoding; } - action1.transitions *= nondeterminismEncoding; } - // Add a new variable that resolves the nondeterminism between the two choices. - storm::dd::Add combinedTransitions = this->variables.manager->getEncoding(this->variables.localNondeterminismVariables[highestLocalNondeterminismVariable], 1).ite(action2.transitions, action1.transitions); - - // Add the new variable to the writing fragments of each global variable before joining them. - for (auto& entry : action1.variableToWritingFragment) { - entry.second = this->variables.manager->getEncoding(this->variables.localNondeterminismVariables[highestLocalNondeterminismVariable], 0) && entry.second; - } - for (auto& entry : action2.variableToWritingFragment) { - entry.second = this->variables.manager->getEncoding(this->variables.localNondeterminismVariables[highestLocalNondeterminismVariable], 1) && entry.second; + uint64_t numberOfLocalNondeterminismVariables = static_cast(std::ceil(std::log2(actions.size()))); + storm::dd::Bdd guard = this->variables.manager->getBddZero(); + storm::dd::Add transitions = this->variables.manager->template getAddZero(); + std::map> transientEdgeAssignments; + std::map> variableToWritingFragment; + storm::dd::Bdd illegalFragment = this->variables.manager->getBddZero(); + + for (uint64_t actionIndex = 0; actionIndex < actions.size(); ++actionIndex) { + ActionDd& action = actions[actionIndex]; + + guard |= action.guard.toBdd(); + + storm::dd::Add nondeterminismEncoding = encodeIndex(actionIndex, highestLocalNondeterminismVariable, numberOfLocalNondeterminismVariables, this->variables); + transitions += nondeterminismEncoding * action.transitions; + + joinTransientAssignmentMaps(transientEdgeAssignments, action.transientEdgeAssignments); + + storm::dd::Bdd nondeterminismEncodingBdd = nondeterminismEncoding.toBdd(); + for (auto& entry : action.variableToWritingFragment) { + entry.second &= nondeterminismEncodingBdd; + } + addToVariableWritingFragmentMap(variableToWritingFragment, action.variableToWritingFragment); + illegalFragment |= action.illegalFragment; } - return ActionDd((action1.guard.toBdd() || action2.guard.toBdd()).template toAdd(), combinedTransitions, std::make_pair(action1.getLowestLocalNondeterminismVariable(), highestLocalNondeterminismVariable + 1), joinVariableWritingFragmentMaps(action1.variableToWritingFragment, action2.variableToWritingFragment), action1.illegalFragment || action2.illegalFragment); + return ActionDd(guard.template toAdd(), transitions, transientEdgeAssignments, std::make_pair(lowestLocalNondeterminismVariable, highestLocalNondeterminismVariable + numberOfLocalNondeterminismVariables), variableToWritingFragment, illegalFragment); } else { STORM_LOG_THROW(false, storm::exceptions::InvalidStateException, "Illegal model type."); } } - AutomatonDd rename(AutomatonDd const& automaton, std::map const& indexToIndex) { - AutomatonDd result(automaton.identity); - - for (auto const& action : automaton.actionIndexToAction) { - auto renamingIt = indexToIndex.find(action.first); - if (renamingIt != indexToIndex.end()) { - // If the action is to be renamed and an action with the target index already exists, we need - // to combine the action DDs. - auto itNewActions = result.actionIndexToAction.find(renamingIt->second); - if (itNewActions != result.actionIndexToAction.end()) { - itNewActions->second = combineUnsynchronizedActions(action.second, itNewActions->second); - } else { - // In this case, we can simply copy the action over. - result.actionIndexToAction[renamingIt->second] = action.second; - } - } else { - // If the action is not to be renamed, we need to copy it over. However, if some other action - // was renamed to the very same action name before, we need to combine the transitions. - auto itNewActions = result.actionIndexToAction.find(action.first); - if (itNewActions != result.actionIndexToAction.end()) { - itNewActions->second = combineUnsynchronizedActions(action.second, itNewActions->second); - } else { - // In this case, we can simply copy the action over. - result.actionIndexToAction[action.first] = action.second; - } + void performTransientAssignments(storm::jani::detail::ConstAssignments const& transientAssignments, std::function const& callback) { + auto transientVariableIt = this->transientVariables.begin(); + auto transientVariableIte = this->transientVariables.end(); + for (auto const& assignment : transientAssignments) { + while (transientVariableIt != transientVariableIte && *transientVariableIt < assignment.getExpressionVariable()) { + ++transientVariableIt; + } + if (transientVariableIt == transientVariableIte) { + break; + } + if (*transientVariableIt == assignment.getExpressionVariable()) { + callback(assignment); + ++transientVariableIt; } } - - return result; } EdgeDd buildEdgeDd(storm::jani::Automaton const& automaton, storm::jani::Edge const& edge) { @@ -1271,7 +1080,7 @@ namespace storm { // If the edge is not labeled with the silent action, we have to analyze which portion of the global // variables was written by any of the updates and make all update results equal w.r.t. this set. If // the edge is labeled with the silent action, we can already multiply the identities of all global variables. - if (edge.getActionIndex() != this->model.getSilentActionIndex()) { + if (edge.getActionIndex() != storm::jani::Model::SILENT_ACTION_INDEX) { for (auto const& edgeDestinationDd : destinationDds) { globalVariablesInSomeDestination.insert(edgeDestinationDd.writtenGlobalVariables.begin(), edgeDestinationDd.writtenGlobalVariables.end()); } @@ -1297,7 +1106,8 @@ namespace storm { } // Add the source location and the guard. - transitions *= this->variables.manager->getEncoding(this->variables.automatonToLocationVariableMap.at(automaton.getName()).first, edge.getSourceLocationIndex()).template toAdd() * guard; + storm::dd::Add sourceLocationAndGuard = this->variables.manager->getEncoding(this->variables.automatonToLocationDdVariableMap.at(automaton.getName()).first, edge.getSourceLocationIndex()).template toAdd() * guard; + transitions *= sourceLocationAndGuard; // If we multiply the ranges of global variables, make sure everything stays within its bounds. if (!globalVariablesInSomeDestination.empty()) { @@ -1305,73 +1115,166 @@ namespace storm { } // If the edge has a rate, we multiply it to the DD. + bool isMarkovian = false; if (edge.hasRate()) { - transitions *= this->variables.rowExpressionAdapter->translateExpression(edge.getRate()); + transitions *= this->variables.rowExpressionAdapter->translateExpression(edge.getRate()); + isMarkovian = true; } - return EdgeDd(guard, guard * transitions, globalVariablesInSomeDestination); + // Finally treat the transient assignments. + std::map> transientEdgeAssignments; + if (!this->transientVariables.empty()) { + performTransientAssignments(edge.getAssignments().getTransientAssignments(), [this, &transientEdgeAssignments, &guard, &sourceLocationAndGuard] (storm::jani::Assignment const& assignment) { + transientEdgeAssignments[assignment.getExpressionVariable()] = sourceLocationAndGuard * this->variables.rowExpressionAdapter->translateExpression(assignment.getAssignedExpression()); + } ); + } + + return EdgeDd(isMarkovian, guard, guard * transitions, transientEdgeAssignments, globalVariablesInSomeDestination); } else { - return EdgeDd(this->variables.manager->template getAddZero(), this->variables.manager->template getAddZero()); + return EdgeDd(false, rangedGuard, rangedGuard, std::map>(), std::set()); + } + } + + EdgeDd combineMarkovianEdgesToSingleEdge(std::vector const& edgeDds) { + storm::dd::Bdd guard = this->variables.manager->getBddZero(); + storm::dd::Add transitions = this->variables.manager->template getAddZero(); + std::map> transientEdgeAssignments; + std::map> variableToWritingFragment; + + bool overlappingGuards = false; + for (auto const& edge : edgeDds) { + STORM_LOG_THROW(edge.isMarkovian, storm::exceptions::InvalidArgumentException, "Can only combine Markovian edges."); + + if (!overlappingGuards) { + overlappingGuards |= !(guard && edge.guard.toBdd()).isZero(); + } + + guard |= edge.guard.toBdd(); + transitions += edge.transitions; + variableToWritingFragment = joinVariableWritingFragmentMaps(variableToWritingFragment, edge.variableToWritingFragment); + joinTransientAssignmentMaps(transientEdgeAssignments, edge.transientEdgeAssignments); } + + // Currently, we can only combine the transient edge assignments if there is no overlap of the guards of the edges. + STORM_LOG_THROW(!overlappingGuards || transientEdgeAssignments.empty(), storm::exceptions::NotSupportedException, "Cannot have transient edge assignments when combining Markovian edges with overlapping guards."); + + return EdgeDd(true, guard.template toAdd(), transitions, transientEdgeAssignments, variableToWritingFragment); } ActionDd buildActionDdForActionIndex(storm::jani::Automaton const& automaton, uint64_t actionIndex, uint64_t localNondeterminismVariableOffset) { // Translate the individual edges. - std::vector edgeDds; + std::vector markovianEdges; + std::vector nonMarkovianEdges; + uint64_t numberOfEdges = 0; for (auto const& edge : automaton.getEdges()) { + ++numberOfEdges; if (edge.getActionIndex() == actionIndex) { - edgeDds.push_back(buildEdgeDd(automaton, edge)); + EdgeDd result = buildEdgeDd(automaton, edge); + if (result.isMarkovian) { + markovianEdges.push_back(result); + } else { + nonMarkovianEdges.push_back(result); + } } } // Now combine the edges to a single action. - if (!edgeDds.empty()) { - switch (this->model.getModelType()){ - case storm::jani::ModelType::DTMC: - case storm::jani::ModelType::CTMC: - return combineEdgesToActionMarkovChain(edgeDds); - break; - case storm::jani::ModelType::MDP: - return combineEdgesToActionMdp(edgeDds, localNondeterminismVariableOffset); - break; - default: - STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Cannot translate model of this type."); + if (numberOfEdges > 0) { + storm::jani::ModelType modelType = this->model.getModelType(); + if (modelType == storm::jani::ModelType::DTMC) { + STORM_LOG_THROW(markovianEdges.empty(), storm::exceptions::WrongFormatException, "Illegal Markovian edges in DTMC."); + return combineEdgesToActionDeterministic(nonMarkovianEdges); + } else if (modelType == storm::jani::ModelType::CTMC) { + STORM_LOG_THROW(nonMarkovianEdges.empty(), storm::exceptions::WrongFormatException, "Illegal non-Markovian edges in CTMC."); + return combineEdgesToActionDeterministic(markovianEdges); + } else if (modelType == storm::jani::ModelType::MDP) { + STORM_LOG_THROW(markovianEdges.empty(), storm::exceptions::WrongFormatException, "Illegal Markovian edges in MDP."); + return combineEdgesToActionNondeterministic(nonMarkovianEdges, boost::none, localNondeterminismVariableOffset); + } else if (modelType == storm::jani::ModelType::MA) { + boost::optional markovianEdge = boost::none; + if (markovianEdges.size() > 1) { + markovianEdge = combineMarkovianEdgesToSingleEdge(markovianEdges); + } else if (markovianEdges.size() == 1) { + markovianEdge = markovianEdges.front(); + } + return combineEdgesToActionNondeterministic(nonMarkovianEdges, markovianEdge, localNondeterminismVariableOffset); + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Cannot translate model of this type."); } } else { - return ActionDd(this->variables.manager->template getAddZero(), this->variables.manager->template getAddZero(), std::make_pair(0, 0), {}, this->variables.manager->getBddZero()); + return ActionDd(this->variables.manager->template getAddZero(), this->variables.manager->template getAddZero(), {}, std::make_pair(0, 0), {}, this->variables.manager->getBddZero()); } } - ActionDd combineEdgesToActionMarkovChain(std::vector const& edgeDds) { + void addToTransientAssignmentMap(std::map>& transientAssignments, std::map> const& assignmentsToAdd) { + for (auto const& entry : assignmentsToAdd) { + auto it = transientAssignments.find(entry.first); + if (it != transientAssignments.end()) { + it->second += entry.second; + } else { + transientAssignments[entry.first] = entry.second; + } + } + } + + void addToTransientAssignmentMap(std::map>& transientAssignments, storm::expressions::Variable const& variable, storm::dd::Add const& assignmentToAdd) { + auto it = transientAssignments.find(variable); + if (it != transientAssignments.end()) { + it->second += assignmentToAdd; + } else { + transientAssignments[variable] = assignmentToAdd; + } + } + + std::map> joinTransientAssignmentMaps(std::map> const& transientAssignments1, std::map> const& transientAssignments2) { + std::map> result = transientAssignments1; + + for (auto const& entry : transientAssignments2) { + auto resultIt = result.find(entry.first); + if (resultIt != result.end()) { + resultIt->second += entry.second; + } else { + result[entry.first] = entry.second; + } + } + + return result; + } + + ActionDd combineEdgesToActionDeterministic(std::vector const& edgeDds) { storm::dd::Bdd allGuards = this->variables.manager->getBddZero(); storm::dd::Add allTransitions = this->variables.manager->template getAddZero(); storm::dd::Bdd temporary; std::map> globalVariableToWritingFragment; + std::map> transientEdgeAssignments; + bool overlappingGuards = false; for (auto const& edgeDd : edgeDds) { + STORM_LOG_THROW((this->model.getModelType() == storm::jani::ModelType::CTMC) == edgeDd.isMarkovian, storm::exceptions::WrongFormatException, "Unexpected non-Markovian edge in CTMC."); + // Check for overlapping guards. storm::dd::Bdd guardBdd = edgeDd.guard.toBdd(); - temporary = guardBdd && allGuards; + overlappingGuards = !(guardBdd && allGuards).isZero(); // Issue a warning if there are overlapping guards in a DTMC. - STORM_LOG_WARN_COND(temporary.isZero() || this->model.getModelType() == storm::jani::ModelType::CTMC, "Guard of a command overlaps with previous guards."); + STORM_LOG_WARN_COND(!overlappingGuards || this->model.getModelType() == storm::jani::ModelType::CTMC, "Guard of an edge in a DTMC overlaps with previous guards."); // Add the elements of the current edge to the global ones. allGuards |= guardBdd; allTransitions += edgeDd.transitions; + // Add the transient variable assignments to the resulting one. This transformation is illegal for + // CTMCs for which there is some overlap in edges that have some transient assignment (this needs to + // be checked later). + addToTransientAssignmentMap(transientEdgeAssignments, edgeDd.transientEdgeAssignments); + // Keep track of the fragment that is writing global variables. - for (auto const& variable : edgeDd.writtenGlobalVariables) { - auto it = globalVariableToWritingFragment.find(variable); - if (it != globalVariableToWritingFragment.end()) { - it->second |= guardBdd; - } else { - globalVariableToWritingFragment[variable] = guardBdd; - } - } + globalVariableToWritingFragment = joinVariableWritingFragmentMaps(globalVariableToWritingFragment, edgeDd.variableToWritingFragment); } + + STORM_LOG_THROW(this->model.getModelType() == storm::jani::ModelType::DTMC || !overlappingGuards || transientEdgeAssignments.empty(), storm::exceptions::NotSupportedException, "Cannot have transient edge assignments when combining Markovian edges with overlapping guards."); - return ActionDd(allGuards.template toAdd(), allTransitions, std::make_pair(0, 0), globalVariableToWritingFragment, this->variables.manager->getBddZero()); + return ActionDd(allGuards.template toAdd(), allTransitions, transientEdgeAssignments, std::make_pair(0, 0), globalVariableToWritingFragment, this->variables.manager->getBddZero()); } void addToVariableWritingFragmentMap(std::map>& globalVariableToWritingFragment, storm::expressions::Variable const& variable, storm::dd::Bdd const& partToAdd) const { @@ -1382,7 +1285,13 @@ namespace storm { globalVariableToWritingFragment.emplace(variable, partToAdd); } } - + + void addToVariableWritingFragmentMap(std::map>& globalVariableToWritingFragment, std::map> const& partToAdd) const { + for (auto const& entry : partToAdd) { + addToVariableWritingFragmentMap(globalVariableToWritingFragment, entry.first, entry.second); + } + } + std::map> joinVariableWritingFragmentMaps(std::map> const& globalVariableToWritingFragment1, std::map> const& globalVariableToWritingFragment2) { std::map> result = globalVariableToWritingFragment1; @@ -1398,38 +1307,66 @@ namespace storm { return result; } - ActionDd combineEdgesBySummation(storm::dd::Add const& guard, std::vector const& edges) { + ActionDd combineEdgesBySummation(storm::dd::Add const& guard, std::vector const& edges, boost::optional const& markovianEdge) { + bool addMarkovianFlag = this->model.getModelType() == storm::jani::ModelType::MA; + STORM_LOG_ASSERT(addMarkovianFlag || !markovianEdge, "Illegally adding Markovian edge without marker."); + storm::dd::Add transitions = this->variables.manager->template getAddZero(); std::map> globalVariableToWritingFragment; + std::map> transientEdgeAssignments; + + storm::dd::Bdd flagBdd = addMarkovianFlag ? !this->variables.markovMarker : this->variables.manager->getBddOne(); + storm::dd::Add flag = flagBdd.template toAdd(); for (auto const& edge : edges) { - transitions += edge.transitions; - for (auto const& variable : edge.writtenGlobalVariables) { - addToVariableWritingFragmentMap(globalVariableToWritingFragment, variable, edge.guard.toBdd()); + transitions += addMarkovianFlag ? flag * edge.transitions : edge.transitions; + for (auto const& assignment : edge.transientEdgeAssignments) { + addToTransientAssignmentMap(transientEdgeAssignments, assignment.first, addMarkovianFlag ? flag * assignment.second : assignment.second); + } + for (auto const& variableFragment : edge.variableToWritingFragment) { + addToVariableWritingFragmentMap(globalVariableToWritingFragment, variableFragment.first, addMarkovianFlag ? flagBdd && variableFragment.second : variableFragment.second); + } + } + + // Add the Markovian edge (if any). + if (markovianEdge) { + flagBdd = addMarkovianFlag ? !this->variables.markovMarker : this->variables.manager->getBddOne(); + flag = flagBdd.template toAdd(); + EdgeDd const& edge = markovianEdge.get(); + + transitions += flag * edge.transitions; + for (auto const& assignment : edge.transientEdgeAssignments) { + addToTransientAssignmentMap(transientEdgeAssignments, assignment.first, addMarkovianFlag ? flag * assignment.second : assignment.second); + } + for (auto const& variableFragment : edge.variableToWritingFragment) { + addToVariableWritingFragmentMap(globalVariableToWritingFragment, variableFragment.first, addMarkovianFlag ? flagBdd && variableFragment.second : variableFragment.second); } } - return ActionDd(guard, transitions, std::make_pair(0, 0), globalVariableToWritingFragment, this->variables.manager->getBddZero()); + + return ActionDd(guard, transitions, transientEdgeAssignments, std::make_pair(0, 0), globalVariableToWritingFragment, this->variables.manager->getBddZero()); } - ActionDd combineEdgesToActionMdp(std::vector const& edges, uint64_t localNondeterminismVariableOffset) { + ActionDd combineEdgesToActionNondeterministic(std::vector const& nonMarkovianEdges, boost::optional const& markovianEdge, uint64_t localNondeterminismVariableOffset) { // Sum all guards, so we can read off the maximal number of nondeterministic choices in any given state. storm::dd::Bdd allGuards = this->variables.manager->getBddZero(); storm::dd::Add sumOfGuards = this->variables.manager->template getAddZero(); - for (auto const& edge : edges) { + for (auto const& edge : nonMarkovianEdges) { + STORM_LOG_ASSERT(!edge.isMarkovian, "Unexpected Markovian edge."); sumOfGuards += edge.guard; allGuards |= edge.guard.toBdd(); } uint_fast64_t maxChoices = static_cast(sumOfGuards.getMax()); - STORM_LOG_TRACE("Found " << maxChoices << " local choices."); + STORM_LOG_TRACE("Found " << maxChoices << " non-Markovian local choices."); // Depending on the maximal number of nondeterminstic choices, we need to use some variables to encode the nondeterminism. if (maxChoices <= 1) { - return combineEdgesBySummation(allGuards.template toAdd(), edges); + return combineEdgesBySummation(allGuards.template toAdd(), nonMarkovianEdges, markovianEdge); } else { // Calculate number of required variables to encode the nondeterminism. uint_fast64_t numberOfBinaryVariables = static_cast(std::ceil(storm::utility::math::log2(maxChoices))); storm::dd::Add allEdges = this->variables.manager->template getAddZero(); std::map> globalVariableToWritingFragment; + std::map> transientAssignments; storm::dd::Bdd equalsNumberOfChoicesDd; std::vector> choiceDds(maxChoices, this->variables.manager->template getAddZero()); @@ -1455,8 +1392,8 @@ namespace storm { remainingDds[j] = equalsNumberOfChoicesDd; } - for (std::size_t j = 0; j < edges.size(); ++j) { - EdgeDd const& currentEdge = edges[j]; + for (std::size_t j = 0; j < nonMarkovianEdges.size(); ++j) { + EdgeDd const& currentEdge = nonMarkovianEdges[j]; // Check if edge guard overlaps with equalsNumberOfChoicesDd. That is, there are states with exactly currentChoices // choices such that one outgoing choice is given by the j-th edge. @@ -1480,9 +1417,14 @@ namespace storm { // Combine the overlapping part of the guard with command updates and add it to the resulting DD. choiceDds[k] += remainingGuardChoicesIntersection.template toAdd() * currentEdge.transitions; + // Keep track of the fragment of transient assignments. + for (auto const& transientAssignment : currentEdge.transientEdgeAssignments) { + addToTransientAssignmentMap(transientAssignments, transientAssignment.first, remainingGuardChoicesIntersection.template toAdd() * transientAssignment.second * indicesEncodedWithLocalNondeterminismVariables[k].first.template toAdd()); + } + // Keep track of the written global variables of the fragment. - for (auto const& variable : currentEdge.writtenGlobalVariables) { - addToVariableWritingFragmentMap(globalVariableToWritingFragment, variable, remainingGuardChoicesIntersection && indicesEncodedWithLocalNondeterminismVariables[k].first); + for (auto const& variableFragment : currentEdge.variableToWritingFragment) { + addToVariableWritingFragmentMap(globalVariableToWritingFragment, variableFragment.first, remainingGuardChoicesIntersection && variableFragment.second && indicesEncodedWithLocalNondeterminismVariables[k].first); } } @@ -1505,11 +1447,41 @@ namespace storm { sumOfGuards = sumOfGuards * (!equalsNumberOfChoicesDd).template toAdd(); } - return ActionDd(allGuards.template toAdd(), allEdges, std::make_pair(localNondeterminismVariableOffset, localNondeterminismVariableOffset + numberOfBinaryVariables), globalVariableToWritingFragment, this->variables.manager->getBddZero()); + // Extend the transitions with the appropriate flag if needed. + bool addMarkovianFlag = this->model.getModelType() == storm::jani::ModelType::MA; + STORM_LOG_ASSERT(addMarkovianFlag || !markovianEdge, "Illegally adding Markovian edge without marker."); + if (addMarkovianFlag) { + storm::dd::Bdd flagBdd = !this->variables.markovMarker; + storm::dd::Add flag = flagBdd.template toAdd(); + allEdges *= flag; + for (auto& assignment : transientAssignments) { + assignment.second *= flag; + } + for (auto& writingFragment : globalVariableToWritingFragment) { + writingFragment.second &= flagBdd; + } + } + + // Add Markovian edge (if there is any). + if (markovianEdge) { + storm::dd::Bdd flagBdd = this->variables.markovMarker; + storm::dd::Add flag = flagBdd.template toAdd(); + EdgeDd const& edge = markovianEdge.get(); + + allEdges += flag * edge.transitions; + for (auto const& assignment : edge.transientEdgeAssignments) { + addToTransientAssignmentMap(transientAssignments, assignment.first, flag * assignment.second); + } + for (auto const& variableFragment : edge.variableToWritingFragment) { + addToVariableWritingFragmentMap(globalVariableToWritingFragment, variableFragment.first, flagBdd && variableFragment.second); + } + } + + return ActionDd(allGuards.template toAdd(), allEdges, transientAssignments, std::make_pair(localNondeterminismVariableOffset, localNondeterminismVariableOffset + numberOfBinaryVariables), globalVariableToWritingFragment, this->variables.manager->getBddZero()); } } - AutomatonDd buildAutomatonDd(std::string const& automatonName, std::map const& actionIndexToLocalNondeterminismVariableOffset) { + AutomatonDd buildAutomatonDd(std::string const& automatonName, std::map const& actionIndexToLocalNondeterminismVariableOffset, std::set const& inputEnabledActionIndices) { AutomatonDd result(this->variables.automatonToIdentityMap.at(automatonName)); storm::jani::Automaton const& automaton = this->model.getAutomaton(automatonName); @@ -1519,10 +1491,28 @@ namespace storm { continue; } ActionDd actionDd = buildActionDdForActionIndex(automaton, actionIndex, actionIndexToLocalNondeterminismVariableOffset.at(actionIndex)); + if (inputEnabledActionIndices.find(actionIndex) != inputEnabledActionIndices.end()) { + actionDd.setIsInputEnabled(); + } + result.actionIndexToAction[actionIndex] = actionDd; result.setLowestLocalNondeterminismVariable(std::max(result.getLowestLocalNondeterminismVariable(), actionDd.getLowestLocalNondeterminismVariable())); result.setHighestLocalNondeterminismVariable(std::max(result.getHighestLocalNondeterminismVariable(), actionDd.getHighestLocalNondeterminismVariable())); } + + for (uint64_t locationIndex = 0; locationIndex < automaton.getNumberOfLocations(); ++locationIndex) { + auto const& location = automaton.getLocation(locationIndex); + performTransientAssignments(location.getAssignments().getTransientAssignments(), [this,&automatonName,locationIndex,&result] (storm::jani::Assignment const& assignment) { + storm::dd::Add assignedValues = this->variables.manager->getEncoding(this->variables.automatonToLocationDdVariableMap.at(automatonName).first, locationIndex).template toAdd() * this->variables.rowExpressionAdapter->translateExpression(assignment.getAssignedExpression()); + auto it = result.transientLocationAssignments.find(assignment.getExpressionVariable()); + if (it != result.transientLocationAssignments.end()) { + it->second += assignedValues; + } else { + result.transientLocationAssignments[assignment.getExpressionVariable()] = assignedValues; + } + }); + } + return result; } @@ -1553,28 +1543,35 @@ namespace storm { uint64_t numberOfUsedNondeterminismVariables = automaton.getHighestLocalNondeterminismVariable(); // Add missing global variable identities, action and nondeterminism encodings. + std::map> transientEdgeAssignments; for (auto& action : automaton.actionIndexToAction) { illegalFragment |= action.second.illegalFragment; addMissingGlobalVariableIdentities(action.second); - storm::dd::Add actionEncoding = encodeAction(action.first != this->model.getSilentActionIndex() ? boost::optional(action.first) : boost::none, this->variables); + storm::dd::Add actionEncoding = encodeAction(action.first != storm::jani::Model::SILENT_ACTION_INDEX ? boost::optional(action.first) : boost::none, this->variables); storm::dd::Add missingNondeterminismEncoding = encodeIndex(0, action.second.getHighestLocalNondeterminismVariable(), numberOfUsedNondeterminismVariables - action.second.getHighestLocalNondeterminismVariable(), this->variables); storm::dd::Add extendedTransitions = actionEncoding * missingNondeterminismEncoding * action.second.transitions; + for (auto const& transientAssignment : action.second.transientEdgeAssignments) { + addToTransientAssignmentMap(transientEdgeAssignments, transientAssignment.first, actionEncoding * missingNondeterminismEncoding * transientAssignment.second); + } + result += extendedTransitions; } - return ComposerResult(result, illegalFragment, numberOfUsedNondeterminismVariables); + return ComposerResult(result, automaton.transientLocationAssignments, transientEdgeAssignments, illegalFragment, numberOfUsedNondeterminismVariables); } else if (this->model.getModelType() == storm::jani::ModelType::DTMC || this->model.getModelType() == storm::jani::ModelType::CTMC) { // Simply add all actions, but make sure to include the missing global variable identities. storm::dd::Add result = this->variables.manager->template getAddZero(); storm::dd::Bdd illegalFragment = this->variables.manager->getBddZero(); + std::map> transientEdgeAssignments; for (auto& action : automaton.actionIndexToAction) { illegalFragment |= action.second.illegalFragment; addMissingGlobalVariableIdentities(action.second); + addToTransientAssignmentMap(transientEdgeAssignments, action.second.transientEdgeAssignments); result += action.second.transitions; } - return ComposerResult(result, illegalFragment, 0); + return ComposerResult(result, automaton.transientLocationAssignments, transientEdgeAssignments, illegalFragment, 0); } else { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Illegal model type."); } @@ -1588,16 +1585,18 @@ namespace storm { storm::dd::Bdd deadlockStates; storm::dd::Add transitionMatrix; std::unordered_map> rewardModels; + std::map labelToExpressionMap; }; template std::shared_ptr> createModel(storm::jani::ModelType const& modelType, CompositionVariables const& variables, ModelComponents const& modelComponents) { + if (modelType == storm::jani::ModelType::DTMC) { - return std::shared_ptr>(new storm::models::symbolic::Dtmc(variables.manager, modelComponents.reachableStates, modelComponents.initialStates, modelComponents.deadlockStates, modelComponents.transitionMatrix, variables.rowMetaVariables, variables.rowExpressionAdapter, variables.columnMetaVariables, variables.columnExpressionAdapter, variables.rowColumnMetaVariablePairs, std::map(), modelComponents.rewardModels)); + return std::shared_ptr>(new storm::models::symbolic::Dtmc(variables.manager, modelComponents.reachableStates, modelComponents.initialStates, modelComponents.deadlockStates, modelComponents.transitionMatrix, variables.rowMetaVariables, variables.rowExpressionAdapter, variables.columnMetaVariables, variables.columnExpressionAdapter, variables.rowColumnMetaVariablePairs, modelComponents.labelToExpressionMap, modelComponents.rewardModels)); } else if (modelType == storm::jani::ModelType::CTMC) { - return std::shared_ptr>(new storm::models::symbolic::Ctmc(variables.manager, modelComponents.reachableStates, modelComponents.initialStates, modelComponents.deadlockStates, modelComponents.transitionMatrix, variables.rowMetaVariables, variables.rowExpressionAdapter, variables.columnMetaVariables, variables.columnExpressionAdapter, variables.rowColumnMetaVariablePairs, std::map(), modelComponents.rewardModels)); + return std::shared_ptr>(new storm::models::symbolic::Ctmc(variables.manager, modelComponents.reachableStates, modelComponents.initialStates, modelComponents.deadlockStates, modelComponents.transitionMatrix, variables.rowMetaVariables, variables.rowExpressionAdapter, variables.columnMetaVariables, variables.columnExpressionAdapter, variables.rowColumnMetaVariablePairs, modelComponents.labelToExpressionMap, modelComponents.rewardModels)); } else if (modelType == storm::jani::ModelType::MDP) { - return std::shared_ptr>(new storm::models::symbolic::Mdp(variables.manager, modelComponents.reachableStates, modelComponents.initialStates, modelComponents.deadlockStates, modelComponents.transitionMatrix, variables.rowMetaVariables, variables.rowExpressionAdapter, variables.columnMetaVariables, variables.columnExpressionAdapter, variables.rowColumnMetaVariablePairs, variables.allNondeterminismVariables, std::map(), modelComponents.rewardModels)); + return std::shared_ptr>(new storm::models::symbolic::Mdp(variables.manager, modelComponents.reachableStates, modelComponents.initialStates, modelComponents.deadlockStates, modelComponents.transitionMatrix, variables.rowMetaVariables, variables.rowExpressionAdapter, variables.columnMetaVariables, variables.columnExpressionAdapter, variables.rowColumnMetaVariablePairs, variables.allNondeterminismVariables, modelComponents.labelToExpressionMap, modelComponents.rewardModels)); } else { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Invalid model type."); } @@ -1628,7 +1627,13 @@ namespace storm { storm::dd::Bdd postprocessSystem(storm::jani::Model const& model, ComposerResult& system, CompositionVariables const& variables, typename DdJaniModelBuilder::Options const& options) { // For DTMCs, we normalize each row to 1 (to account for non-determinism). if (model.getModelType() == storm::jani::ModelType::DTMC) { - system.transitions = system.transitions / system.transitions.sumAbstract(variables.columnMetaVariables); + storm::dd::Add stateToNumberOfChoices = system.transitions.sumAbstract(variables.columnMetaVariables); + system.transitions = system.transitions / stateToNumberOfChoices; + + // Scale all state-action rewards. + for (auto& entry : system.transientEdgeAssignments) { + entry.second = entry.second / stateToNumberOfChoices; + } } // If we were asked to treat some states as terminal states, we cut away their transitions now. @@ -1659,7 +1664,7 @@ namespace storm { for (auto const& automaton : model.getAutomata()) { storm::dd::Bdd initialLocationIndices = variables.manager->getBddZero(); for (auto const& locationIndex : automaton.getInitialLocationIndices()) { - initialLocationIndices |= variables.manager->getEncoding(variables.automatonToLocationVariableMap.at(automaton.getName()).first, locationIndex); + initialLocationIndices |= variables.manager->getEncoding(variables.automatonToLocationDdVariableMap.at(automaton.getName()).first, locationIndex); } initialStates &= initialLocationIndices; } @@ -1718,31 +1723,120 @@ namespace storm { } template - std::shared_ptr> DdJaniModelBuilder::build() { + std::vector selectRewardVariables(storm::jani::Model const& model, typename DdJaniModelBuilder::Options const& options) { + std::vector result; + if (options.isBuildAllRewardModelsSet()) { + for (auto const& variable : model.getGlobalVariables()) { + if (variable.isTransient() && (variable.isRealVariable() || variable.isUnboundedIntegerVariable())) { + result.push_back(variable.getExpressionVariable()); + } + } + } else { + auto const& globalVariables = model.getGlobalVariables(); + for (auto const& rewardModelName : options.getRewardModelNames()) { + if (globalVariables.hasVariable(rewardModelName)) { + result.push_back(globalVariables.getVariable(rewardModelName).getExpressionVariable()); + } else { + STORM_LOG_THROW(rewardModelName.empty(), storm::exceptions::InvalidArgumentException, "Cannot build unknown reward model '" << rewardModelName << "'."); + STORM_LOG_THROW(globalVariables.getNumberOfRealTransientVariables() + globalVariables.getNumberOfUnboundedIntegerTransientVariables() == 1, storm::exceptions::InvalidArgumentException, "Reference to standard reward model is ambiguous."); + } + } + + // If no reward model was yet added, but there was one that was given in the options, we try to build the + // standard reward model. + if (result.empty() && !options.getRewardModelNames().empty()) { + result.push_back(globalVariables.getTransientVariables().front()->getExpressionVariable()); + } + } + + return result; + } + + template + std::unordered_map> buildRewardModels(ComposerResult const& system, std::vector const& rewardVariables) { + std::unordered_map> result; + + for (auto const& variable : rewardVariables) { + boost::optional> stateRewards = boost::none; + boost::optional> stateActionRewards = boost::none; + boost::optional> transitionRewards = boost::none; + + auto it = system.transientLocationAssignments.find(variable); + if (it != system.transientLocationAssignments.end()) { + stateRewards = it->second; + } + + it = system.transientEdgeAssignments.find(variable); + if (it != system.transientEdgeAssignments.end()) { + stateActionRewards = it->second; + } + + result.emplace(variable.getName(), storm::models::symbolic::StandardRewardModel(stateRewards, stateActionRewards, transitionRewards)); + } + + return result; + } + + template + std::map buildLabelExpressions(storm::jani::Model const& model, CompositionVariables const& variables, typename DdJaniModelBuilder::Options const& options) { + std::map result; + + for (auto const& variable : model.getGlobalVariables().getTransientVariables()) { + if (variable->isBooleanVariable()) { + if (options.buildAllLabels || options.labelNames.find(variable->getName()) != options.labelNames.end()) { + result[variable->getName()] = model.getLabelExpression(variable->asBooleanVariable(), variables.automatonToLocationVariableMap); + } + } + } + + return result; + } + + template + std::shared_ptr> DdJaniModelBuilder::build(storm::jani::Model const& model, Options const& options) { + if (model.hasUndefinedConstants()) { + std::vector> undefinedConstants = model.getUndefinedConstants(); + std::vector strings; + for (auto const& constant : undefinedConstants) { + std::stringstream stream; + stream << constant.get().getName() << " (" << constant.get().getType() << ")"; + strings.push_back(stream.str()); + } + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Model still contains these undefined constants: " << boost::join(strings, ", ") << "."); + } + + STORM_LOG_THROW(!model.hasTransientEdgeDestinationAssignments(), storm::exceptions::WrongFormatException, "The symbolic JANI model builder currently does not support transient edge destination assignments."); + + // Determine the actions that will appear in the parallel composition. + storm::jani::CompositionInformationVisitor visitor(model, model.getSystemComposition()); + storm::jani::CompositionInformation actionInformation = visitor.getInformation(); + // Create all necessary variables. - CompositionVariableCreator variableCreator(*this->model); + CompositionVariableCreator variableCreator(model, actionInformation); CompositionVariables variables = variableCreator.create(); + // Determine which transient assignments need to be considered in the building process. + std::vector rewardVariables = selectRewardVariables(model, options); + // Create a builder to compose and build the model. -// SeparateEdgesSystemComposer composer(*this->model, variables); - CombinedEdgesSystemComposer composer(*this->model, variables); + CombinedEdgesSystemComposer composer(model, actionInformation, variables, rewardVariables); ComposerResult system = composer.compose(); // Postprocess the variables in place. - postprocessVariables(this->model->getModelType(), system, variables); + postprocessVariables(model.getModelType(), system, variables); // Postprocess the system in place and get the states that were terminal (i.e. whose transitions were cut off). - storm::dd::Bdd terminalStates = postprocessSystem(*this->model, system, variables, options); + storm::dd::Bdd terminalStates = postprocessSystem(model, system, variables, options); // Start creating the model components. ModelComponents modelComponents; // Build initial states. - modelComponents.initialStates = computeInitialStates(*this->model, variables); + modelComponents.initialStates = computeInitialStates(model, variables); // Perform reachability analysis to obtain reachable states. storm::dd::Bdd transitionMatrixBdd = system.transitions.notZero(); - if (this->model->getModelType() == storm::jani::ModelType::MDP) { + if (model.getModelType() == storm::jani::ModelType::MDP) { transitionMatrixBdd = transitionMatrixBdd.existsAbstract(variables.allNondeterminismVariables); } modelComponents.reachableStates = storm::utility::dd::computeReachableStates(modelComponents.initialStates, transitionMatrixBdd, variables.rowMetaVariables, variables.columnMetaVariables); @@ -1756,16 +1850,22 @@ namespace storm { modelComponents.transitionMatrix = system.transitions * reachableStatesAdd; // Fix deadlocks if existing. - modelComponents.deadlockStates = fixDeadlocks(this->model->getModelType(), modelComponents.transitionMatrix, transitionMatrixBdd, modelComponents.reachableStates, variables); + modelComponents.deadlockStates = fixDeadlocks(model.getModelType(), modelComponents.transitionMatrix, transitionMatrixBdd, modelComponents.reachableStates, variables); // Cut the deadlock states by removing all states that we 'converted' to deadlock states by making them terminal. modelComponents.deadlockStates = modelComponents.deadlockStates && !terminalStates; + // Build the reward models. + modelComponents.rewardModels = buildRewardModels(system, rewardVariables); + + // Build the label to expressions mapping. + modelComponents.labelToExpressionMap = buildLabelExpressions(model, variables, options); + // Finally, create the model. - return createModel(this->model->getModelType(), variables, modelComponents); + return createModel(model.getModelType(), variables, modelComponents); } template class DdJaniModelBuilder; template class DdJaniModelBuilder; } -} \ No newline at end of file +} diff --git a/src/builder/DdJaniModelBuilder.h b/src/builder/DdJaniModelBuilder.h index 348d017ad..85c62b0bd 100644 --- a/src/builder/DdJaniModelBuilder.h +++ b/src/builder/DdJaniModelBuilder.h @@ -25,7 +25,7 @@ namespace storm { /*! * Creates an object representing the default building options. */ - Options(); + Options(bool buildAllLabels = false, bool buildAllRewardModels = false); /*! Creates an object representing the suggested building options assuming that the given formula is the * only one to check. Additional formulas may be preserved by calling preserveFormula. @@ -59,6 +59,32 @@ namespace storm { */ void setTerminalStatesFromFormula(storm::logic::Formula const& formula); + /*! + * Retrieves the names of the reward models to build. + */ + std::set const& getRewardModelNames() const; + + /*! + * Adds the given label to the ones that are supposed to be built. + */ + void addLabel(std::string const& labelName); + + /*! + * Retrieves whether the flag to build all labels is set. + */ + bool isBuildAllLabelsSet() const; + + /// A flag that indicates whether all labels are to be built. In this case, the label names are to be ignored. + bool buildAllLabels; + + /// A set of labels to build. + std::set labelNames; + + /*! + * Retrieves whether the flag to build all reward models is set. + */ + bool isBuildAllRewardModelsSet() const; + // A flag that indicates whether or not all reward models are to be build. bool buildAllRewardModels; @@ -77,11 +103,6 @@ namespace storm { boost::optional negatedTerminalStates; }; - /*! - * Creates a builder for the given model that uses the given options. - */ - DdJaniModelBuilder(storm::jani::Model const& model, Options const& options = Options()); - /*! * Translates the given program into a symbolic model (i.e. one that stores the transition relation as a * decision diagram). @@ -89,23 +110,8 @@ namespace storm { * @param model The model to translate. * @return A pointer to the resulting model. */ - std::shared_ptr> build(); - - /*! - * Retrieves the model that was actually translated (i.e. including constant substitutions etc.). Note - * that this function may only be called after a succesful translation. - * - * @return The translated model. - */ - storm::jani::Model const& getTranslatedModel() const; - - private: - /// The model to translate. - boost::optional model; - - /// The options to use for building the model. - Options options; + std::shared_ptr> build(storm::jani::Model const& model, Options const& options = Options()); }; } -} \ No newline at end of file +} diff --git a/src/builder/DdPrismModelBuilder.cpp b/src/builder/DdPrismModelBuilder.cpp index a397b0de0..5a1a38b98 100644 --- a/src/builder/DdPrismModelBuilder.cpp +++ b/src/builder/DdPrismModelBuilder.cpp @@ -1218,21 +1218,14 @@ namespace storm { transitionRewards.get() /= stateActionDd; } } - + return storm::models::symbolic::StandardRewardModel(stateRewards, stateActionRewards, transitionRewards); } - template - storm::prism::Program const& DdPrismModelBuilder::getTranslatedProgram() const { - return preparedProgram.get(); - } - template std::shared_ptr> DdPrismModelBuilder::build(storm::prism::Program const& program, Options const& options) { - preparedProgram = program; - - if (preparedProgram->hasUndefinedConstants()) { - std::vector> undefinedConstants = preparedProgram->getUndefinedConstants(); + if (program.hasUndefinedConstants()) { + std::vector> undefinedConstants = program.getUndefinedConstants(); std::stringstream stream; bool printComma = false; for (auto const& constant : undefinedConstants) { @@ -1247,13 +1240,11 @@ namespace storm { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Program still contains these undefined constants: " + stream.str()); } - preparedProgram = preparedProgram->substituteConstants(); - - STORM_LOG_DEBUG("Building representation of program:" << std::endl << *preparedProgram << std::endl); + STORM_LOG_DEBUG("Building representation of program:" << std::endl << program << std::endl); // Start by initializing the structure used for storing all information needed during the model generation. // In particular, this creates the meta variables used to encode the model. - GenerationInformation generationInfo(*preparedProgram); + GenerationInformation generationInfo(program); SystemResult system = createSystemDecisionDiagram(generationInfo); storm::dd::Add transitionMatrix = system.allTransitionsDd; @@ -1264,7 +1255,7 @@ namespace storm { // If we were asked to treat some states as terminal states, we cut away their transitions now. storm::dd::Bdd terminalStatesBdd = generationInfo.manager->getBddZero(); if (options.terminalStates || options.negatedTerminalStates) { - std::map constantsSubstitution = preparedProgram->getConstantsSubstitution(); + std::map constantsSubstitution = program.getConstantsSubstitution(); if (options.terminalStates) { storm::expressions::Expression terminalExpression; @@ -1273,7 +1264,7 @@ namespace storm { } else { std::string const& labelName = boost::get(options.terminalStates.get()); if (program.hasLabel(labelName)) { - terminalExpression = preparedProgram->getLabelExpression(labelName); + terminalExpression = program.getLabelExpression(labelName); } else { STORM_LOG_THROW(labelName == "init" || labelName == "deadlock", storm::exceptions::InvalidArgumentException, "Terminal states refer to illegal label '" << labelName << "'."); } @@ -1294,7 +1285,7 @@ namespace storm { } else { std::string const& labelName = boost::get(options.negatedTerminalStates.get()); if (program.hasLabel(labelName)) { - negatedTerminalExpression = preparedProgram->getLabelExpression(labelName); + negatedTerminalExpression = program.getLabelExpression(labelName); } else { STORM_LOG_THROW(labelName == "init" || labelName == "deadlock", storm::exceptions::InvalidArgumentException, "Terminal states refer to illegal label '" << labelName << "'."); } @@ -1377,18 +1368,18 @@ namespace storm { // First, we make sure that all selected reward models actually exist. for (auto const& rewardModelName : options.rewardModelsToBuild) { - STORM_LOG_THROW(rewardModelName.empty() || preparedProgram->hasRewardModel(rewardModelName), storm::exceptions::InvalidArgumentException, "Model does not possess a reward model with the name '" << rewardModelName << "'."); + STORM_LOG_THROW(rewardModelName.empty() || program.hasRewardModel(rewardModelName), storm::exceptions::InvalidArgumentException, "Model does not possess a reward model with the name '" << rewardModelName << "'."); } - for (auto const& rewardModel : preparedProgram->getRewardModels()) { + for (auto const& rewardModel : program.getRewardModels()) { if (options.buildAllRewardModels || options.rewardModelsToBuild.find(rewardModel.getName()) != options.rewardModelsToBuild.end()) { selectedRewardModels.push_back(rewardModel); } } // If no reward model was selected until now and a referenced reward model appears to be unique, we build // the only existing reward model (given that no explicit name was given for the referenced reward model). - if (selectedRewardModels.empty() && preparedProgram->getNumberOfRewardModels() == 1 && options.rewardModelsToBuild.size() == 1 && *options.rewardModelsToBuild.begin() == "") { - selectedRewardModels.push_back(preparedProgram->getRewardModel(0)); + if (selectedRewardModels.empty() && program.getNumberOfRewardModels() == 1 && options.rewardModelsToBuild.size() == 1 && *options.rewardModelsToBuild.begin() == "") { + selectedRewardModels.push_back(program.getRewardModel(0)); } std::unordered_map> rewardModels; @@ -1398,7 +1389,7 @@ namespace storm { // Build the labels that can be accessed as a shortcut. std::map labelToExpressionMapping; - for (auto const& label : preparedProgram->getLabels()) { + for (auto const& label : program.getLabels()) { labelToExpressionMapping.emplace(label.getName(), label.getStatePredicateExpression()); } @@ -1415,7 +1406,7 @@ namespace storm { template storm::dd::Bdd DdPrismModelBuilder::createInitialStatesDecisionDiagram(GenerationInformation& generationInfo) { - storm::dd::Bdd initialStates = generationInfo.rowExpressionAdapter->translateExpression(generationInfo.program.getInitialConstruct().getInitialStatesExpression()).toBdd(); + storm::dd::Bdd initialStates = generationInfo.rowExpressionAdapter->translateExpression(generationInfo.program.getInitialStatesExpression()).toBdd(); for (auto const& metaVariable : generationInfo.rowMetaVariables) { initialStates &= generationInfo.manager->getRange(metaVariable); diff --git a/src/builder/DdPrismModelBuilder.h b/src/builder/DdPrismModelBuilder.h index 6db0c4639..464a0a071 100644 --- a/src/builder/DdPrismModelBuilder.h +++ b/src/builder/DdPrismModelBuilder.h @@ -98,14 +98,6 @@ namespace storm { */ std::shared_ptr> build(storm::prism::Program const& program, Options const& options = Options()); - /*! - * Retrieves the program that was actually translated (i.e. including constant substitutions etc.). Note - * that this function may only be called after a succesful translation. - * - * @return The translated program. - */ - storm::prism::Program const& getTranslatedProgram() const; - private: // This structure can store the decision diagrams representing a particular action. struct UpdateDecisionDiagram { @@ -243,9 +235,6 @@ namespace storm { static SystemResult createSystemDecisionDiagram(GenerationInformation& generationInfo); static storm::dd::Bdd createInitialStatesDecisionDiagram(GenerationInformation& generationInfo); - - // This member holds the program that was most recently translated (if any). - boost::optional preparedProgram; }; } // namespace adapters diff --git a/src/builder/ExplicitDFTModelBuilder.cpp b/src/builder/ExplicitDFTModelBuilder.cpp index 291dec2ba..4090e0e12 100644 --- a/src/builder/ExplicitDFTModelBuilder.cpp +++ b/src/builder/ExplicitDFTModelBuilder.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include "src/utility/vector.h" #include #include "src/settings/modules/DFTSettings.h" #include "src/settings/SettingsManager.h" diff --git a/src/builder/ExplicitGspnModelBuilder.cpp b/src/builder/ExplicitGspnModelBuilder.cpp new file mode 100644 index 000000000..eae1a73b2 --- /dev/null +++ b/src/builder/ExplicitGspnModelBuilder.cpp @@ -0,0 +1,326 @@ +//#include "src/builder/ExplicitGspnModelBuilder.h" +// +//#include "src/models/sparse/StandardRewardModel.h" +// +//#include "src/utility/macros.h" +//#include "src/exceptions/NotImplementedException.h" +//#include "src/storage/expressions/ExpressionManager.h" +//#include "src/parser/FormulaParser.h" +//#include "src/storage/expressions/ExpressionEvaluator.h" +// +//namespace storm { +// namespace builder { +// +// template +// storm::models::sparse::MarkovAutomaton ExplicitGspnModelBuilder::translateGspn(storm::gspn::GSPN const& gspn, std::string const& formula) { +// // set the given gspn and compute the limits of the net +// this->gspn = gspn; +// computeCapacities(gspn); +// +// // markings maps markings to their corresponding rowgroups (indices) +// markings = storm::storage::BitVectorHashMap(numberOfTotalBits, 100); +// builder = storm::storage::SparseMatrixBuilder(0, 0, 0, false, true); +// +// // add initial marking to todo list +// auto bitvector = gspn.getInitialMarking(numberOfBits, numberOfTotalBits)->getBitVector(); +// findOrAddBitvectorToMarkings(*bitvector); +// currentRowIndex = 0; +// +// // vector marking markovian states (vector contains an 1 if the state is markovian) +// storm::storage::BitVector markovianStates(0); +// +// // vector containing the exit rates for the markovian states +// std::vector exitRates; +// +// +// while (!todo.empty()) { +// // take next element from the todo list +// auto currentBitvector = todo.front(); +// todo.pop_front(); +// auto currentMarking = storm::gspn::Marking(gspn.getNumberOfPlaces(), numberOfBits, *currentBitvector); +// +// // increment list of states by one +// markovianStates.resize(markovianStates.size() + 1, 0); +// +// // create new row group for the current marking +// builder.newRowGroup(markings.getValue(*currentBitvector)); +// +// std::cout << "work on: " << *currentBitvector << std::endl; +// +// auto enabledImmediateTransitions = getEnabledImmediateTransition(currentMarking); +// if (!enabledImmediateTransitions.empty()) { +// markovianStates.set(currentRowIndex, 0); +// exitRates.push_back(0); +// +// auto partitions = partitonEnabledImmediateTransitions(currentMarking, enabledImmediateTransitions); +// addRowForPartitions(partitions, currentMarking); +// } else { +// +// auto enabledTimedTransitions = getEnabledTimedTransition(currentMarking); +// if (!enabledTimedTransitions.empty()) { +// markovianStates.set(currentRowIndex, 1); +// +// auto accRate = getAccumulatedRate(enabledTimedTransitions); +// std::cout << "\t\tacc. rate: " << accRate << std::endl; +// exitRates.push_back(accRate); +// +// addRowForTimedTransitions(enabledTimedTransitions, currentMarking, accRate); +// } else { +// markovianStates.set(currentRowIndex, 1); +// } +// } +// ++currentRowIndex; +// } +// +// auto matrix = builder.build(); +// +// // create expression manager and add variables from the gspn +// auto expressionManager = std::make_shared(); +// for (auto& place : gspn.getPlaces()) { +// expressionManager->declareIntegerVariable(place.getName()); +// } +// +// // parse formula +// storm::parser::FormulaParser formulaParser(expressionManager); +// auto formulaPtr = formulaParser.parseSingleFormulaFromString(formula); +// auto atomicFormulas = formulaPtr->getAtomicExpressionFormulas(); +// +// // create empty state labeling +// storm::models::sparse::StateLabeling labeling(markings.size()); +// storm::expressions::ExpressionEvaluator expressionEvaluator(*expressionManager); +// +// std::cout << std::endl; +// std::cout << "build labeling:" << std::endl; +// for (auto& atomicFormula : atomicFormulas) { +// std::cout << atomicFormula; +// auto label = atomicFormula->toString(); +// labeling.addLabel(label); +// +// for (auto statePair : markings) { +// auto marking = storm::gspn::Marking(gspn.getNumberOfPlaces(), numberOfBits, statePair.first); +// for (auto& place : gspn.getPlaces()) { +// auto variable = expressionManager->getVariable(place.getName()); +// expressionEvaluator.setIntegerValue(variable, marking.getNumberOfTokensAt(place.getID())); +// } +// bool hold = expressionEvaluator.asBool(atomicFormula->getExpression()); +// if (hold) { +// labeling.addLabelToState(label, statePair.second); +// } +// } +// +// } +// +// //auto labeling = getStateLabeling(); +// +// return storm::models::sparse::MarkovAutomaton(matrix, labeling, markovianStates, exitRates); +// } +// +// template +// void ExplicitGspnModelBuilder::addRowForPartitions(std::vector>>> const& partitions, storm::gspn::Marking const& currentMarking) { +// for (auto& partition : partitions) { +// std::cout << "\tnew partition:" << std::endl; +// auto accWeight = getAccumulatedWeight(partition); +// std::cout << "\t\tacc. weight: " << accWeight << std::endl; +// +// std::map::cmpByIndex> weights; +// for (auto& trans : partition) { +// std::cout << "\t\ttransname: " << trans.getName() << std::endl; +// auto newMarking = trans.fire(currentMarking); +// std::cout << "\t\t\t target marking: " << *newMarking.getBitVector() << std::endl; +// +// findOrAddBitvectorToMarkings(*newMarking.getBitVector()); +// +// auto it = weights.find(markings.getValue(*newMarking.getBitVector())); +// double currentWeight = 0; +// if (it != weights.end()) { +// currentWeight = weights.at(markings.getValue(*newMarking.getBitVector())); +// } +// currentWeight += trans.getWeight() / accWeight; +// weights[markings.getValue(*newMarking.getBitVector())] = currentWeight; +// } +// +// addValuesToBuilder(weights); +// } +// } +// +// template +// void ExplicitGspnModelBuilder::addRowForTimedTransitions(std::vector>> const& enabledTimedTransitions, storm::gspn::Marking const& currentMarking, double const& accRate) { +// std::map::cmpByIndex> rates; +// for (auto& trans : enabledTimedTransitions) { +// std::cout << "\t\ttransname: " << trans.getName() << std::endl; +// auto newMarking = trans.fire(currentMarking); +// std::cout << "\t\t\t target marking: " << *newMarking.getBitVector() << std::endl; +// +// findOrAddBitvectorToMarkings(*newMarking.getBitVector()); +// +// auto it = rates.find(markings.getValue(*newMarking.getBitVector())); +// double currentWeightRate = 0; +// if (it != rates.end()) { +// currentWeightRate = rates.at(markings.getValue(*newMarking.getBitVector())); +// } +// currentWeightRate += trans.getRate() / accRate; +// rates[markings.getValue(*newMarking.getBitVector())] = currentWeightRate; +// +// } +// +// addValuesToBuilder(rates); +// } +// +// template +// void ExplicitGspnModelBuilder::addValuesToBuilder(std::map::cmpByIndex> const& values) { +// for (auto& it : values) { +// std::cout << "\t\tadd value \"" << it.second << "\" to " << getBitvector(it.first) << std::endl; +// builder.addNextValue(currentRowIndex, it.first, it.second); +// } +// } +// +// template +// std::vector>>> ExplicitGspnModelBuilder::partitonEnabledImmediateTransitions( +// storm::gspn::Marking const& marking, +// std::vector>> const& enabledImmediateTransitions) { +// decltype(partitonEnabledImmediateTransitions(marking, enabledImmediateTransitions)) result; +// +// std::vector>> weightedTransitions; +// +// for (auto& trans : enabledImmediateTransitions) { +// if (trans.noWeightAttached()) { +// decltype(weightedTransitions) singleton; +// singleton.push_back(trans); +// result.push_back(singleton); +// } else { +// weightedTransitions.push_back(trans); +// } +// } +// +// if (weightedTransitions.size() != 0) { +// result.push_back(weightedTransitions); +// } +// +// return result; +// } +// +// template +// double ExplicitGspnModelBuilder::getAccumulatedWeight(std::vector>> const& vector) const { +// double result = 0; +// +// for (auto &trans : vector) { +// result += trans.getWeight(); +// } +// +// return result; +// } +// +// template +// void ExplicitGspnModelBuilder::computeCapacities(storm::gspn::GSPN const& gspn) { +// uint_fast64_t sum = 0; +// for (auto& place : gspn.getPlaces()) {//TODO +// numberOfBits[place.getID()] = 1; +// sum += numberOfBits[place.getID()]; +// } +// +// // compute next multiple of 64 +// uint_fast64_t rem = sum % 64; +// numberOfTotalBits = sum + 64 - rem; +// } +// +// template +// std::vector>> ExplicitGspnModelBuilder::getEnabledTimedTransition( +// storm::gspn::Marking const& marking) { +// std::vector>>result; +// +// uint_fast64_t highestSeenPriority = 0; +// +// for (auto& trans : gspn.getTimedTransitions()) { +// if (trans.isEnabled(marking)) { +// if (trans.getPriority() > highestSeenPriority) { +// highestSeenPriority = trans.getPriority(); +// result.clear(); +// } +// result.push_back(trans); +// } +// } +// +// return result; +// } +// +// template +// std::vector>> ExplicitGspnModelBuilder::getEnabledImmediateTransition( +// storm::gspn::Marking const& marking) { +// std::vector>>result; +// +// uint_fast64_t highestSeenPriority = 0; +// +// for (auto& trans : gspn.getImmediateTransitions()) { +// if (trans.isEnabled(marking)) { +// if (trans.getPriority() > highestSeenPriority) { +// highestSeenPriority = trans.getPriority(); +// result.clear(); +// } +// result.push_back(trans); +// } +// } +// +// return result; +// } +// +// template +// double ExplicitGspnModelBuilder::getAccumulatedRate(std::vector>> const& vector) { +// double result = 0; +// for (auto trans : vector) { +// result += trans.getRate(); +// } +// +// return result; +// } +// +// template +// storm::storage::BitVector ExplicitGspnModelBuilder::getBitvector(uint_fast64_t const& index) { +// for (auto it = markings.begin(); it != markings.end(); ++it) { +// if (std::get<1>(*it) == index) { +// return std::get<0>(*it); +// } +// } +// return storm::storage::BitVector(); +// } +// +// template +// uint_fast64_t ExplicitGspnModelBuilder::findOrAddBitvectorToMarkings(storm::storage::BitVector const &bitvector) { +// auto index = markings.findOrAdd(bitvector, nextRowGroupIndex); +// +// if (index == nextRowGroupIndex) { +// // bitvector was not already in the map +// ++nextRowGroupIndex; +// // bitvector was also never in the todo list +// todo.push_back(std::make_shared(bitvector)); +// } +// return index; +// } +// +// template +// storm::models::sparse::StateLabeling ExplicitGspnModelBuilder::getStateLabeling() const { +// storm::models::sparse::StateLabeling labeling(markings.size()); +// +// std::map idToName; +// for (auto& place : gspn.getPlaces()) { +// idToName[place.getID()] = place.getName(); +// labeling.addLabel(place.getName()); +// } +// +// auto it = markings.begin(); +// for ( ; it != markings.end() ; ++it) { +// auto bitvector = std::get<0>(*it); +// storm::gspn::Marking marking(gspn.getNumberOfPlaces(), numberOfBits, bitvector); +// for (auto i = 0; i < marking.getNumberOfPlaces(); i++) { +// if (marking.getNumberOfTokensAt(i) > 0) { +// std::cout << i << std::endl; +// labeling.addLabelToState(idToName.at(i), i); +// } +// } +// } +// +// return labeling; +// } +// +// template class ExplicitGspnModelBuilder; +// } +//} diff --git a/src/builder/ExplicitGspnModelBuilder.h b/src/builder/ExplicitGspnModelBuilder.h new file mode 100644 index 000000000..6173820fb --- /dev/null +++ b/src/builder/ExplicitGspnModelBuilder.h @@ -0,0 +1,172 @@ +//#ifndef STORM_BUILDER_EXPLICITGSPNMODELBUILDER_H_ +//#define STORM_BUILDER_EXPLICITGSPNMODELBUILDER_H_ +// +//#include +// +//#include "src/models/sparse/MarkovAutomaton.h" +//#include "src/models/sparse/StandardRewardModel.h" +//#include "src/storage/BitVector.h" +//#include "src/storage/BitVectorHashMap.h" +//#include "src/storage/gspn/GSPN.h" +//#include "src/storage/gspn/ImmediateTransition.h" +//#include "src/storage/gspn/TimedTransition.h" +// +//namespace storm { +// namespace builder { +// +// /*! +// * This class provides the facilities for building an markov automaton. +// */ +// template +// class ExplicitGspnModelBuilder { +// public: +// +// /*! +// * Builds an MarkovAutomaton from the given GSPN. +// * +// * @param gspn The gspn whose semantic is covered by the MarkovAutomaton +// * @return The resulting MarkovAutomaton +// */ +// storm::models::sparse::MarkovAutomaton translateGspn(storm::gspn::GSPN const& gspn, std::string const& formula); +// private: +// +// /*! +// * Add for each partition a new row in the probability matrix. +// * +// * @param partitions The partitioned immediate transitions. +// * @param currentMarking The current marking which is considered at the moment. +// */ +// void addRowForPartitions(std::vector>>> const& partitions, storm::gspn::Marking const& currentMarking); +// +// +// /*! +// * Add row for a markovian state. +// * +// * @param enabledTimedTransitions List of enabled timed transitions. +// * @param currentMarking The current marking which is considered at the moment. +// * @param accRate The sum of all rates of the enabled timed transisitons +// */ +// void addRowForTimedTransitions(std::vector>> const& enabledTimedTransitions, storm::gspn::Marking const& currentMarking, double const& accRate); +// +// /*! +// * Struct for comparing unsigned integer for maps +// */ +// struct cmpByIndex { +// bool operator()(const uint_fast64_t &a, const uint_fast64_t &b) const { +// return a < b; +// } +// }; +// +// /*! +// * This method insert the values from a map into the matrix +// * +// * @param values The values which are inserted +// */ +// void addValuesToBuilder(std::map::cmpByIndex> const& values); +// +// +// /*! +// * This method partitions all enabled immediate transitions w.r.t. a marking. +// * All enabled weighted immediate transitions are in one vector. Between these transitions +// * is chosen probabilistically by the weights. +// * +// * All other enabled non-weighted immediate transitions are in an singleton vector. +// * Between different vectors is chosen non-deterministically. +// * +// * @param marking The current marking which is considered. +// * @param enabledImmediateTransistions A vector of enabled immediate transitions. +// * @return The vector of vectors which is described above. +// */ +// std::vector>>> partitonEnabledImmediateTransitions(storm::gspn::Marking const& marking, std::vector>> const& enabledImmediateTransitions); +// +// /*! +// * Computes the accumulated weight of immediate transisions which are stored in a list. +// * +// * @param vector List of immediate transisitions. +// */ +// double getAccumulatedWeight(std::vector>> const& vector) const; +// +// /*! +// * Compute the upper bound for the number of tokens in each place. +// * Also computes the number of bits which are used to store a marking. +// * +// * @param gspn The corresponding gspn. +// */ +// void computeCapacities(storm::gspn::GSPN const& gspn); +// +// /*! +// * Returns the vector of enabled timed transition with the highest priority. +// * +// * +// * @param marking The current marking which is considered. +// * @return The vector of enabled timed transitions. +// */ +// std::vector>> getEnabledTimedTransition( +// storm::gspn::Marking const& marking); +// +// /*! +// * Returns the vector of active immediate transition with the highest priority. +// * +// * @param marking The current marking which is considered. +// * @return The vector of enabled immediate transitions. +// */ +// std::vector>> getEnabledImmediateTransition( +// storm::gspn::Marking const& marking); +// +// /*! +// * Computes the accumulated rate of a vector of timed transitions. +// * +// * @param vector The vector of timed transitions. +// * @return The accumulated rate. +// */ +// double getAccumulatedRate(std::vector>> const& vector); +// +// // is only needed for debugging purposes +// // since markings is injective, we can determine the bitvector +// storm::storage::BitVector getBitvector(uint_fast64_t const& index); +// +// /*! +// * Adds the bitvector to the marking-map. +// * If the bitvector corresponds to a new marking the bitvector is added to the todo list. +// * +// * @return The rowGroup index for the bitvector. +// */ +// uint_fast64_t findOrAddBitvectorToMarkings(storm::storage::BitVector const& bitvector); +// +// /*! +// * Computes the state labeling and returns it. +// * Every state is labeled with its name. +// * +// * @return The computed state labeling. +// */ +// storm::models::sparse::StateLabeling getStateLabeling() const; +// +// +// // contains the number of bits which are used the store the number of tokens at each place +// std::map numberOfBits; +// +// // contains the number of bits used to create markings +// uint_fast64_t numberOfTotalBits; +// +// // maps bitvectors (markings w.r.t. the capacity) to their rowgroup +// storm::storage::BitVectorHashMap markings = storm::storage::BitVectorHashMap(64, 1); +// +// // a list of markings for which the outgoing edges need to be computed +// std::deque> todo; +// +// //the gspn which is transformed +// storm::gspn::GSPN gspn; +// +// // the next index for a new rowgroup +// uint_fast64_t nextRowGroupIndex = 0; +// +// // builder object which is used to create the probability matrix +// storm::storage::SparseMatrixBuilder builder; +// +// // contains the current row index during the computation +// uint_fast64_t currentRowIndex; +// }; +// } +//} +// +//#endif //STORM_BUILDER_EXPLICITGSPNMODELBUILDER_H_ diff --git a/src/builder/ExplicitModelBuilder.cpp b/src/builder/ExplicitModelBuilder.cpp index 5faf386e5..42321169f 100644 --- a/src/builder/ExplicitModelBuilder.cpp +++ b/src/builder/ExplicitModelBuilder.cpp @@ -169,16 +169,16 @@ namespace storm { } template - void ExplicitModelBuilder::buildMatrices(storm::storage::SparseMatrixBuilder& transitionMatrixBuilder, std::vector>& rewardModelBuilders, boost::optional>>& choiceLabels , boost::optional& markovianChoices) { + void ExplicitModelBuilder::buildMatrices(storm::storage::SparseMatrixBuilder& transitionMatrixBuilder, std::vector>& rewardModelBuilders, boost::optional>>& choiceLabels, boost::optional& markovianStates) { // Create choice labels, if requested, if (generator->getOptions().isBuildChoiceLabelsSet()) { choiceLabels = std::vector>(); } - // Create markovian states bit vector, if required + // Create markovian states bit vector, if required. if (generator->getModelType() == storm::generator::ModelType::MA) { - // The BitVector will be resized when the correct size is known - markovianChoices = storm::storage::BitVector(); + // The bit vector will be resized when the correct size is known. + markovianStates = storm::storage::BitVector(1000); } // Create a callback for the next-state generator to enable it to request the index of states. @@ -229,9 +229,9 @@ namespace storm { choiceLabels.get().push_back(boost::container::flat_set()); } - if (generator->getModelType() == storm::generator::ModelType::MA) { - markovianChoices->enlargeLiberally(currentRow+1, false); - markovianChoices->set(currentRow); + if (markovianStates) { + markovianStates.get().grow(currentRowGroup + 1, false); + markovianStates.get().set(currentRowGroup); } if (!generator->isDeterministicModel()) { @@ -274,13 +274,13 @@ namespace storm { for (auto const& choice : behavior) { // Add command labels if requested. if (generator->getOptions().isBuildChoiceLabelsSet()) { - choiceLabels.get().push_back(choice.getChoiceLabels()); + choiceLabels.get().push_back(choice.getLabels()); } // If we keep track of the Markovian choices, store whether the current one is Markovian. - if( markovianChoices && choice.isMarkovian() ) { - markovianChoices->enlargeLiberally(currentRow+1, false); - markovianChoices->set(currentRow); + if (markovianStates && choice.isMarkovian()) { + markovianStates.get().grow(currentRowGroup + 1, false); + markovianStates.get().set(currentRowGroup); } // Add the probabilistic behavior to the matrix. @@ -289,7 +289,7 @@ namespace storm { } // Add the rewards to the reward models. - auto choiceRewardIt = choice.getChoiceRewards().begin(); + auto choiceRewardIt = choice.getRewards().begin(); for (auto& rewardModelBuilder : rewardModelBuilders) { if (rewardModelBuilder.hasStateActionRewards()) { rewardModelBuilder.addStateActionReward(*choiceRewardIt); @@ -302,9 +302,9 @@ namespace storm { } } - if (markovianChoices) { - // We now know the correct size - markovianChoices->resize(currentRow, false); + if (markovianStates) { + // Since we now know the correct size, cut the bit vector to the correct length. + markovianStates->resize(currentRowGroup, false); } // If the exploration order was not breadth-first, we need to fix the entries in the matrix according to @@ -348,9 +348,9 @@ namespace storm { } boost::optional markovianChoices; - buildMatrices(transitionMatrixBuilder, rewardModelBuilders, modelComponents.choiceLabeling, markovianChoices); + buildMatrices(transitionMatrixBuilder, rewardModelBuilders, modelComponents.choiceLabeling, modelComponents.markovianStates); modelComponents.transitionMatrix = transitionMatrixBuilder.build(); - + // Now finalize all reward models. for (auto& rewardModelBuilder : rewardModelBuilders) { modelComponents.rewardModels.emplace(rewardModelBuilder.getName(), rewardModelBuilder.build(modelComponents.transitionMatrix.getRowCount(), modelComponents.transitionMatrix.getColumnCount(), modelComponents.transitionMatrix.getRowGroupCount())); @@ -367,44 +367,9 @@ namespace storm { } } - if (generator->getModelType() == storm::generator::ModelType::MA) { - STORM_LOG_ASSERT(markovianChoices, "No information regarding markovian choices available."); - buildMarkovianStates(modelComponents, *markovianChoices); - } - return modelComponents; } - template - void ExplicitModelBuilder::buildMarkovianStates(ModelComponents& modelComponents, storm::storage::BitVector const& markovianChoices) const { - modelComponents.markovianStates = storm::storage::BitVector(modelComponents.transitionMatrix.getRowGroupCount(), false); - // Check for each state whether it contains a markovian choice. - for (uint_fast64_t state = 0; state < modelComponents.transitionMatrix.getRowGroupCount(); ++state ) { - uint_fast64_t firstChoice = modelComponents.transitionMatrix.getRowGroupIndices()[state]; - uint_fast64_t markovianChoice = markovianChoices.getNextSetIndex(firstChoice); - if (markovianChoice < modelComponents.transitionMatrix.getRowGroupIndices()[state+1]) { - // Found a markovian choice. Assert that there is not a second one. - STORM_LOG_THROW(markovianChoices.getNextSetIndex(markovianChoice+1) >= modelComponents.transitionMatrix.getRowGroupIndices()[state+1], storm::exceptions::WrongFormatException, "Multiple Markovian choices defined for some state"); - modelComponents.markovianStates->set(state); - // Swap the first choice and the found markovian choice (if they are not equal) - if (firstChoice != markovianChoice) { - modelComponents.transitionMatrix.swapRows(firstChoice, markovianChoice); - for (auto& rewardModel : modelComponents.rewardModels) { - if (rewardModel.second.hasStateActionRewards()) { - std::swap(rewardModel.second.getStateActionRewardVector()[firstChoice], rewardModel.second.getStateActionRewardVector()[markovianChoice]); - } - if (rewardModel.second.hasTransitionRewards()) { - rewardModel.second.getTransitionRewardMatrix().swapRows(firstChoice, markovianChoice); - } - } - if (modelComponents.choiceLabeling) { - std::swap(modelComponents.choiceLabeling.get()[firstChoice], modelComponents.choiceLabeling.get()[markovianChoice]); - } - } - } - } - } - template storm::models::sparse::StateLabeling ExplicitModelBuilder::buildStateLabeling() { return generator->label(stateStorage.stateToId, stateStorage.initialStateIndices, stateStorage.deadlockStateIndices); diff --git a/src/builder/ExplicitModelBuilder.h b/src/builder/ExplicitModelBuilder.h index bb404f088..83ca54f6c 100644 --- a/src/builder/ExplicitModelBuilder.h +++ b/src/builder/ExplicitModelBuilder.h @@ -1,5 +1,5 @@ -#ifndef STORM_BUILDER_ExplicitModelBuilder_H -#define STORM_BUILDER_ExplicitModelBuilder_H +#ifndef STORM_BUILDER_EXPLICITMODELBUILDER_H +#define STORM_BUILDER_EXPLICITMODELBUILDER_H #include #include @@ -195,4 +195,4 @@ namespace storm { } // namespace adapters } // namespace storm -#endif /* STORM_BUILDER_ExplicitModelBuilder_H */ +#endif /* STORM_BUILDER_EXPLICITMODELBUILDER_H */ diff --git a/src/builder/JaniGSPNBuilder.cpp b/src/builder/JaniGSPNBuilder.cpp new file mode 100644 index 000000000..061e9bd67 --- /dev/null +++ b/src/builder/JaniGSPNBuilder.cpp @@ -0,0 +1 @@ +#include "JaniGSPNBuilder.h" diff --git a/src/builder/JaniGSPNBuilder.h b/src/builder/JaniGSPNBuilder.h new file mode 100644 index 000000000..e7da0e776 --- /dev/null +++ b/src/builder/JaniGSPNBuilder.h @@ -0,0 +1,162 @@ +#pragma once + +#include "src/storage/gspn/GSPN.h" +#include "src/storage/jani/Model.h" +#include "src/storage/expressions/ExpressionManager.h" + +namespace storm { + namespace builder { + class JaniGSPNBuilder { + public: + JaniGSPNBuilder(storm::gspn::GSPN const& gspn, std::shared_ptr const& expManager) : gspn(gspn), expressionManager(expManager) { + gspn.writeDotToStream(std::cout); + } + + virtual ~JaniGSPNBuilder() { + for (auto const& varEntry : vars) { + delete varEntry.second; + } + } + + void setIgnoreWeights(bool ignore = true) { + ignoreWeights = ignore; + } + + + storm::jani::Model* build() { + storm::jani::Model* model = new storm::jani::Model(gspn.getName(), storm::jani::ModelType::MA, janiVersion, expressionManager); + storm::jani::Automaton mainAutomaton("immediate"); + addVariables(model); + uint64_t locId = addLocation(mainAutomaton); + addEdges(mainAutomaton, locId); + model->addAutomaton(mainAutomaton); + model->setStandardSystemComposition(); + return model; + } + + void addVariables(storm::jani::Model* model) { + for (auto const& place : gspn.getPlaces()) { + storm::jani::Variable* janiVar = nullptr; + if (!place.hasRestrictedCapacity()) { + // Effectively no capacity limit known + janiVar = new storm::jani::UnboundedIntegerVariable(place.getName(), expressionManager->declareIntegerVariable(place.getName()), expressionManager->integer(place.getNumberOfInitialTokens()), false); + } else { + assert(place.hasRestrictedCapacity()); + janiVar = new storm::jani::BoundedIntegerVariable(place.getName(), expressionManager->declareIntegerVariable(place.getName()), expressionManager->integer(place.getNumberOfInitialTokens()), expressionManager->integer(0), expressionManager->integer(place.getCapacity())); + } + assert(janiVar != nullptr); + assert(vars.count(place.getID()) == 0); + vars[place.getID()] = janiVar; + model->addVariable(*janiVar); + } + } + + uint64_t addLocation(storm::jani::Automaton& automaton) { + uint64_t janiLoc = automaton.addLocation(storm::jani::Location("loc")); + automaton.addInitialLocation("loc"); + return janiLoc; + } + + void addEdges(storm::jani::Automaton& automaton, uint64_t locId) { + + storm::expressions::Expression guard = expressionManager->boolean(true); + for (auto const& trans : gspn.getImmediateTransitions()) { + if (ignoreWeights || trans.noWeightAttached()) { + std::vector assignments; + for (auto const& inPlace : trans.getInputPlaces()) { + guard = guard && (vars[(*inPlace).getID()]->getExpressionVariable() > trans.getInputArcMultiplicity(*inPlace)); + assignments.emplace_back( *vars[(*inPlace).getID()], (vars[(*inPlace).getID()]->getExpressionVariable() - trans.getInputArcMultiplicity(*inPlace)) ); + } + for (auto const& inhibPlace : trans.getInhibitionPlaces()) { + guard = guard && (vars[(*inhibPlace).getID()]->getExpressionVariable() > trans.getInhibitionArcMultiplicity(*inhibPlace)); + } + for (auto const& outputPlace : trans.getOutputPlaces()) { + assignments.emplace_back( *vars[(*outputPlace).getID()], (vars[(*outputPlace).getID()]->getExpressionVariable() + trans.getOutputArcMultiplicity(*outputPlace)) ); + } + storm::jani::OrderedAssignments oa(assignments); + storm::jani::EdgeDestination dest(locId, expressionManager->integer(1), oa); + storm::jani::Edge e(locId, storm::jani::Model::SILENT_ACTION_INDEX, boost::none, guard, {dest}); + automaton.addEdge(e); + } + + } + if(!ignoreWeights) { + + // TODO here there is something to fix if we add transition partitions. + storm::expressions::Expression guard = expressionManager->boolean(false); + std::vector weightedDestinations; + + // Compute enabled weight expression. + storm::expressions::Expression totalWeight = expressionManager->rational(0.0); + for (auto const& trans : gspn.getImmediateTransitions()) { + if (trans.noWeightAttached()) { + continue; + } + storm::expressions::Expression destguard = expressionManager->boolean(true); + for (auto const& inPlace : trans.getInputPlaces()) { + destguard = destguard && (vars[(*inPlace).getID()]->getExpressionVariable() > trans.getInputArcMultiplicity(*inPlace)); + } + for (auto const& inhibPlace : trans.getInhibitionPlaces()) { + destguard = destguard && (vars[(*inhibPlace).getID()]->getExpressionVariable() > trans.getInhibitionArcMultiplicity(*inhibPlace)); + } + totalWeight = totalWeight + storm::expressions::ite(destguard, expressionManager->rational(trans.getWeight()), expressionManager->rational(0.0)); + + } + totalWeight = totalWeight.simplify(); + + for (auto const& trans : gspn.getImmediateTransitions()) { + if (trans.noWeightAttached()) { + continue; + } + storm::expressions::Expression destguard = expressionManager->boolean(true); + std::vector assignments; + for (auto const& inPlace : trans.getInputPlaces()) { + destguard = destguard && (vars[(*inPlace).getID()]->getExpressionVariable() > trans.getInputArcMultiplicity(*inPlace)); + assignments.emplace_back( *vars[(*inPlace).getID()], (vars[(*inPlace).getID()]->getExpressionVariable() - trans.getInputArcMultiplicity(*inPlace)) ); + } + for (auto const& inhibPlace : trans.getInhibitionPlaces()) { + destguard = destguard && (vars[(*inhibPlace).getID()]->getExpressionVariable() > trans.getInhibitionArcMultiplicity(*inhibPlace)); + } + for (auto const& outputPlace : trans.getOutputPlaces()) { + assignments.emplace_back( *vars[(*outputPlace).getID()], (vars[(*outputPlace).getID()]->getExpressionVariable() + trans.getOutputArcMultiplicity(*outputPlace)) ); + } + destguard = destguard.simplify(); + guard = guard || destguard; + storm::jani::OrderedAssignments oa(assignments); + storm::jani::EdgeDestination dest(locId, storm::expressions::ite(destguard, (expressionManager->rational(trans.getWeight()) / totalWeight), expressionManager->rational(0.0)), oa); + weightedDestinations.push_back(dest); + } + storm::jani::Edge e(locId, storm::jani::Model::SILENT_ACTION_INDEX, boost::none, guard.simplify(), weightedDestinations); + automaton.addEdge(e); + } + for (auto const& trans : gspn.getTimedTransitions()) { + storm::expressions::Expression guard = expressionManager->boolean(true); + + std::vector assignments; + for (auto const& inPlace : trans.getInputPlaces()) { + guard = guard && (vars[(*inPlace).getID()]->getExpressionVariable() > trans.getInputArcMultiplicity(*inPlace)); + assignments.emplace_back( *vars[(*inPlace).getID()], (vars[(*inPlace).getID()]->getExpressionVariable() - trans.getInputArcMultiplicity(*inPlace)) ); + } + for (auto const& inhibPlace : trans.getInhibitionPlaces()) { + guard = guard && (vars[(*inhibPlace).getID()]->getExpressionVariable() > trans.getInhibitionArcMultiplicity(*inhibPlace)); + } + for (auto const& outputPlace : trans.getOutputPlaces()) { + assignments.emplace_back( *vars[(*outputPlace).getID()], (vars[(*outputPlace).getID()]->getExpressionVariable() + trans.getOutputArcMultiplicity(*outputPlace)) ); + } + storm::jani::OrderedAssignments oa(assignments); + storm::jani::EdgeDestination dest(locId, expressionManager->integer(1), oa); + storm::jani::Edge e(locId, storm::jani::Model::SILENT_ACTION_INDEX, expressionManager->rational(trans.getRate()), guard, {dest}); + automaton.addEdge(e); + } + } + + private: + bool ignoreWeights; + const uint64_t janiVersion = 1; + storm::gspn::GSPN const& gspn; + std::map vars; + std::shared_ptr expressionManager; + + }; + } +} \ No newline at end of file diff --git a/src/builder/JaniProgramGraphBuilder.cpp b/src/builder/JaniProgramGraphBuilder.cpp new file mode 100644 index 000000000..00965da52 --- /dev/null +++ b/src/builder/JaniProgramGraphBuilder.cpp @@ -0,0 +1,171 @@ +#include "JaniProgramGraphBuilder.h" + +#include "src/storage/jani/EdgeDestination.h" + +namespace storm { + namespace builder { + unsigned JaniProgramGraphBuilder::janiVersion = 1; + + void JaniProgramGraphBuilder::addProcedureVariables(storm::jani::Model& model, storm::jani::Automaton& automaton) { + for (auto const& v : programGraph.getVariables()) { + if (isConstant(v.first)) { + storm::jani::Constant constant(v.second.getName(), v.second, programGraph.getInitialValue(v.first)); + model.addConstant(constant); + } else if (v.second.hasBooleanType()) { + storm::jani::BooleanVariable* janiVar = new storm::jani::BooleanVariable(v.second.getName(), v.second, programGraph.getInitialValue(v.first), false); + automaton.addVariable(*janiVar); + variables.emplace(v.first, janiVar); + } else if (isRestrictedVariable(v.first) && !isRewardVariable(v.first)) { + storm::storage::IntegerInterval const& bounds = variableBounds(v.first); + if (bounds.hasLeftBound()) { + if (bounds.hasRightBound()) { + storm::jani::BoundedIntegerVariable* janiVar = new storm::jani::BoundedIntegerVariable (v.second.getName(), v.second, programGraph.getInitialValue(v.first), false, expManager->integer(bounds.getLeftBound().get()), expManager->integer(bounds.getRightBound().get())); + variables.emplace(v.first, janiVar); + automaton.addVariable(*janiVar); + } else { + // Not yet supported. + assert(false); + } + } else { + // Not yet supported. + assert(false); + } + } else { + storm::jani::UnboundedIntegerVariable* janiVar = new storm::jani::UnboundedIntegerVariable(v.second.getName(), v.second, programGraph.getInitialValue(v.first), isRewardVariable(v.first)); + if(isRewardVariable(v.first)) { + model.addVariable(*janiVar); + } else { + automaton.addVariable(*janiVar); + } + variables.emplace(v.first, janiVar); + + } + } + } + + + + storm::jani::OrderedAssignments JaniProgramGraphBuilder::buildOrderedAssignments(storm::jani::Automaton& automaton, storm::ppg::DeterministicProgramAction const& act) { + std::vector vec; + uint64_t level = 0; + for(auto const& group : act) { + for(auto const& assignment : group) { + if(isRewardVariable(assignment.first)) { + std::unordered_map eval; + eval.emplace((variables.at(assignment.first))->getExpressionVariable(), expManager->integer(0)); + vec.emplace_back(*(variables.at(assignment.first)), assignment.second.substitute(eval).simplify(), level); + } else { + vec.emplace_back(*(variables.at(assignment.first)), assignment.second, level); + } + } + ++level; + } + return storm::jani::OrderedAssignments(vec); + } + + std::vector JaniProgramGraphBuilder::buildProbabilisticDestinations(storm::jani::Automaton& automaton, storm::ppg::ProgramEdge const& edge ) { + storm::ppg::ProbabilisticProgramAction const& act = static_cast(edge.getAction()); + std::vector vec; + for(auto const& assign : act ) { + storm::jani::Assignment assignment(automaton.getVariables().getVariable(act.getVariableName()), expManager->integer(assign.value) ,0); + vec.emplace_back(janiLocId.at(edge.getTargetId()), assign.probability, assignment); + } + return vec; + } + + std::vector JaniProgramGraphBuilder::buildDestinations(storm::jani::Automaton& automaton, storm::ppg::ProgramEdge const& edge ) { + if (edge.getAction().isProbabilistic()) { + return buildProbabilisticDestinations(automaton, edge); + } else { + storm::jani::OrderedAssignments oa = buildOrderedAssignments(automaton, static_cast(edge.getAction())); + storm::jani::EdgeDestination dest(janiLocId.at(edge.getTargetId()), expManager->rational(1.0), oa); + return {dest}; + } + } + + storm::expressions::Expression simplifyExpression(storm::expressions::Expression const& in) { + // TODO use bound restrictions etc. + return in.simplify(); + } + + std::pair, storm::expressions::Expression> JaniProgramGraphBuilder::addVariableChecks(storm::ppg::ProgramEdge const& edge) { + std::vector edges; + storm::expressions::Expression newGuard; + newGuard = expManager->boolean(true); + if (edge.getAction().isProbabilistic()) { + // No check necessary currently, but at least we should statically check that the bounds are okay. + storm::ppg::ProbabilisticProgramAction const& act = static_cast(edge.getAction()); + if (isUserRestrictedVariable(act.getVariableIdentifier())) { + storm::storage::IntegerInterval const& bound = userVariableRestrictions.at(act.getVariableIdentifier()); + storm::storage::IntegerInterval supportInterval = act.getSupportInterval(); + STORM_LOG_THROW(bound.contains(supportInterval), storm::exceptions::NotSupportedException, "User provided bounds must contain all constant expressions"); + } + } else { + storm::ppg::DeterministicProgramAction const& act = static_cast(edge.getAction()); + STORM_LOG_THROW(act.nrLevels() <= 1, storm::exceptions::NotSupportedException, "Multi-level assignments with user variable bounds not supported"); + for(auto const& group : act) { + for(auto const& assignment : group) { + if (isUserRestrictedVariable(assignment.first)) { + assert(userVariableRestrictions.count(assignment.first) == 1); + storm::storage::IntegerInterval const& bound = userVariableRestrictions.at(assignment.first); + if (!assignment.second.containsVariables()) { + // Constant assignments can be checked statically. + // TODO we might still want to allow assignments which go out of bounds. + STORM_LOG_THROW(bound.contains(assignment.second.evaluateAsInt()), storm::exceptions::NotSupportedException, "User provided bounds must contain all constant expressions"); + } else { + // TODO currently only fully bounded restrictions are supported; + assert(userVariableRestrictions.at(assignment.first).hasLeftBound() && userVariableRestrictions.at(assignment.first).hasRightBound()); + storm::expressions::Expression newCondition = simplifyExpression(edge.getCondition() && (assignment.second > bound.getRightBound().get() || assignment.second < bound.getLeftBound().get())); + storm::jani::EdgeDestination dest(varOutOfBoundsLocations.at(assignment.first), expManager->rational(1.0), storm::jani::OrderedAssignments()); + storm::jani::Edge e(janiLocId.at(edge.getSourceId()), storm::jani::Model::SILENT_ACTION_INDEX, boost::none, newCondition, {dest}); + edges.push_back(e); + newGuard = newGuard && assignment.second <= bound.getRightBound().get() && assignment.second >= bound.getLeftBound().get(); + } + } + } + } + } + return {edges, newGuard}; + } + + + void JaniProgramGraphBuilder::addEdges(storm::jani::Automaton& automaton) { + for(auto it = programGraph.locationBegin(); it != programGraph.locationEnd(); ++it) { + ppg::ProgramLocation const& loc = it->second; + if (loc.nrOutgoingEdgeGroups() == 0) { + storm::jani::OrderedAssignments oa; + storm::jani::EdgeDestination dest(janiLocId.at(loc.id()), expManager->integer(1), oa); + storm::jani::Edge e(janiLocId.at(loc.id()), storm::jani::Model::SILENT_ACTION_INDEX, boost::none, expManager->boolean(true), {dest}); + automaton.addEdge(e); + } else if (loc.nrOutgoingEdgeGroups() == 1) { + for(auto const& edge : **(loc.begin())) { + std::pair, storm::expressions::Expression> checks = addVariableChecks(*edge); + for(auto const& check : checks.first) { + automaton.addEdge(check); + } + storm::jani::Edge e(janiLocId.at(loc.id()), storm::jani::Model::SILENT_ACTION_INDEX, boost::none, simplifyExpression(edge->getCondition() && checks.second), buildDestinations(automaton, *edge)); + automaton.addEdge(e); + } + } else { + // We have probabilistic branching + if(loc.hasNonDeterminism()) + { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Combi of nondeterminism and probabilistic choices within a loc not supported yet"); + } else { + std::vector destinations; + for(auto const& eg : loc) { + // TODO add assignments + assert(eg->nrEdges() < 2); // Otherwise, non-determinism occurs. + assert(eg->nrEdges() > 0); // Empty edge groups should not occur in input. + uint64_t target = janiLocId.at((*eg->begin())->getTargetId()); + destinations.emplace_back(target, eg->getProbability()); + } + storm::jani::Edge e(janiLocId.at(it->second.id()), storm::jani::Model::SILENT_ACTION_INDEX, boost::none, expManager->boolean(true), destinations); + automaton.addEdge(e); + } + } + } + } + + } +} diff --git a/src/builder/JaniProgramGraphBuilder.h b/src/builder/JaniProgramGraphBuilder.h new file mode 100644 index 000000000..4d03af2c7 --- /dev/null +++ b/src/builder/JaniProgramGraphBuilder.h @@ -0,0 +1,182 @@ +#include +#include + +#include "src/storage/ppg/ProgramGraph.h" +#include "src/storage/jani/Model.h" +#include "src/storage/jani/Location.h" +#include "src/storage/jani/EdgeDestination.h" +#include "src/storage/IntegerInterval.h" +#include "src/exceptions/NotSupportedException.h" + +#include "src/utility/macros.h" + +namespace storm { + namespace builder { + + enum class JaniProgramGraphVariableDomainMethod { + Unrestricted, IntervalPropagation + }; + + struct JaniProgramGraphBuilderSetting { + JaniProgramGraphVariableDomainMethod variableDomainMethod = JaniProgramGraphVariableDomainMethod::Unrestricted; + }; + + class JaniProgramGraphBuilder { + public: + static unsigned janiVersion; + + JaniProgramGraphBuilder(storm::ppg::ProgramGraph const& pg) : programGraph(pg) { + rewards = programGraph.rewardVariables(); + constants = programGraph.constants(); + auto boundedVars = programGraph.constantAssigned(); + for(auto const& v : boundedVars) { + variableRestrictions.emplace(v, programGraph.supportForConstAssignedVariable(v)); + } + } + + virtual ~JaniProgramGraphBuilder() { + for (auto& var : variables ) { + delete var.second; + } + } + + //void addVariableRestriction(storm::expressions::Variable const& var, storm::IntegerInterval const& interval ) { + + //} + + + void restrictAllVariables(int64_t from, int64_t to) { + restrictAllVariables(storm::storage::IntegerInterval(from, to)); + } + + void restrictAllVariables(storm::storage::IntegerInterval const& restr) { + for (auto const& v : programGraph.getVariables()) { + if(isConstant(v.first)) { + continue; + } + if(variableRestrictions.count(v.first) > 0) { + continue; // Currently we ignore user bounds if we have bounded integers; + } + if(v.second.hasIntegerType() ) { + userVariableRestrictions.emplace(v.first, restr); + } + } + } + + storm::jani::Model* build(std::string const& name = "program_graph") { + expManager = programGraph.getExpressionManager(); + storm::jani::Model* model = new storm::jani::Model(name, storm::jani::ModelType::MDP, janiVersion, expManager); + storm::jani::Automaton mainAutomaton("main"); + addProcedureVariables(*model, mainAutomaton); + janiLocId = addProcedureLocations(*model, mainAutomaton); + addVariableOoBLocations(mainAutomaton); + addEdges(mainAutomaton); + model->addAutomaton(mainAutomaton); + model->setStandardSystemComposition(); + return model; + } + + private: + std::string janiLocationName(storm::ppg::ProgramLocationIdentifier i) { + return "l" + std::to_string(i); + } + + std::string janiVariableOutOfBoundsLocationName(storm::ppg::ProgramVariableIdentifier i) { + return "oob-" + programGraph.getVariableName(i); + } + + storm::jani::OrderedAssignments buildOrderedAssignments(storm::jani::Automaton& automaton, storm::ppg::DeterministicProgramAction const& act) ; + void addEdges(storm::jani::Automaton& automaton); + std::vector buildDestinations(storm::jani::Automaton& automaton, storm::ppg::ProgramEdge const& edge ); + /** + * Helper for probabilistic assignments + */ + std::vector buildProbabilisticDestinations(storm::jani::Automaton& automaton, storm::ppg::ProgramEdge const& edge ); + + std::pair, storm::expressions::Expression> addVariableChecks(storm::ppg::ProgramEdge const& edge); + + bool isUserRestrictedVariable(storm::ppg::ProgramVariableIdentifier i) const { + return userVariableRestrictions.count(i) == 1 && !isRewardVariable(i); + } + + bool isRestrictedVariable(storm::ppg::ProgramVariableIdentifier i) const { + // Might be different from user restricted in near future. + return (variableRestrictions.count(i) == 1 && !isRewardVariable(i)) || isUserRestrictedVariable(i); + } + + storm::storage::IntegerInterval const& variableBounds(storm::ppg::ProgramVariableIdentifier i) const { + assert(isRestrictedVariable(i)); + if (userVariableRestrictions.count(i) == 1) { + return userVariableRestrictions.at(i); + } else { + return variableRestrictions.at(i); + } + + } + + bool isRewardVariable(storm::ppg::ProgramVariableIdentifier i) const { + return std::find(rewards.begin(), rewards.end(), i) != rewards.end(); + } + + bool isConstant(storm::ppg::ProgramVariableIdentifier i) const { + return std::find(constants.begin(), constants.end(), i) != constants.end(); + } + + void addProcedureVariables(storm::jani::Model& model, storm::jani::Automaton& automaton); + + std::map addProcedureLocations(storm::jani::Model& model, storm::jani::Automaton& automaton) { + std::map result; + std::map labelVars; + std::set labels = programGraph.getLabels(); + for(auto const& label : labels) { + storm::jani::BooleanVariable janiVar(label, expManager->declareBooleanVariable(label), expManager->boolean(false), true); + labelVars.emplace(label, &model.addVariable(janiVar)); + } + + for (auto it = programGraph.locationBegin(); it != programGraph.locationEnd(); ++it) { + storm::jani::Location janiLoc(janiLocationName(it->second.id())); + for(auto const& label : programGraph.getLabels(it->second.id())) { + assert(labelVars.count(label) > 0); + janiLoc.addTransientAssignment(storm::jani::Assignment(*(labelVars.at(label)), expManager->boolean(true))); + } + result[it->second.id()] = automaton.addLocation(janiLoc); + if (it->second.isInitial()) { + automaton.addInitialLocation(result[it->second.id()]); + } + } + return result; + } + + void addVariableOoBLocations(storm::jani::Automaton& automaton) { + for(auto const& restr : userVariableRestrictions) { + if(!isRewardVariable(restr.first)) { + storm::jani::Location janiLoc(janiVariableOutOfBoundsLocationName(restr.first)); + uint64_t locId = automaton.addLocation(janiLoc); + varOutOfBoundsLocations[restr.first] = locId; + } + + } + } + /// Transient variables + std::vector rewards; + /// Variables that are constants + std::vector constants; + /// Restrictions on variables (automatic) + std::map variableRestrictions; + /// Restrictions on variables (provided by users) + std::map userVariableRestrictions; + + /// Locations for variables that would have gone ot o + std::map varOutOfBoundsLocations; + std::map janiLocId; + std::map variables; + + /// The expression manager + std::shared_ptr expManager; + /// The program graph to be translated + storm::ppg::ProgramGraph const& programGraph; + + + }; + } +} \ No newline at end of file diff --git a/src/builder/ProgramGraphBuilder.cpp b/src/builder/ProgramGraphBuilder.cpp new file mode 100644 index 000000000..c23276168 --- /dev/null +++ b/src/builder/ProgramGraphBuilder.cpp @@ -0,0 +1,77 @@ +#include "ProgramGraphBuilder.h" +#include "src/storage/pgcl/AssignmentStatement.h" +#include "src/storage/pgcl/ObserveStatement.h" +#include "src/storage/pgcl/LoopStatement.h" +#include "src/storage/pgcl/IfStatement.h" +#include "src/storage/pgcl/NondeterministicBranch.h" +#include "src/storage/pgcl/ProbabilisticBranch.h" + + +namespace storm { + namespace builder { + void ProgramGraphBuilderVisitor::visit(storm::pgcl::AssignmentStatement const& s) { + if(s.isDeterministic()) { + builder.currentLoc()->addProgramEdgeToAllGroups(builder.addAction(s.getVariable(), boost::get(s.getExpression())), builder.nextLocId()); + } else { + builder.currentLoc()->addProgramEdgeToAllGroups(builder.addAction(s.getVariable(), boost::get(s.getExpression())), builder.nextLocId()); + + } + } + void ProgramGraphBuilderVisitor::visit(storm::pgcl::ObserveStatement const& s) { + builder.currentLoc()->addProgramEdgeToAllGroups(builder.noAction(), s.getCondition().getBooleanExpression(), builder.nextLocId()); + } + void ProgramGraphBuilderVisitor::visit(storm::pgcl::IfStatement const& s) { + storm::expressions::Expression elseCondition; + storm::ppg::ProgramLocation* beforeStatementLocation = builder.currentLoc(); + builder.storeNextLocation(builder.nextLoc()); + storm::ppg::ProgramLocation* ifbodyStart = builder.newLocation(); + builder.buildBlock(*s.getIfBody()); + storm::ppg::ProgramLocation* elsebodyStart; + if(s.hasElse()) { + builder.storeNextLocation(builder.nextLoc()); + elsebodyStart = builder.newLocation(); + builder.buildBlock(*s.getElseBody()); + } + beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), s.getCondition().getBooleanExpression(), ifbodyStart->id()); + elseCondition = !s.getCondition().getBooleanExpression(); + if(s.hasElse()) { + beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), elseCondition, elsebodyStart->id()); + } else { + beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), elseCondition, builder.nextLocId()); + } + + } + void ProgramGraphBuilderVisitor::visit(storm::pgcl::LoopStatement const& s) { + storm::ppg::ProgramLocation* beforeStatementLocation = builder.currentLoc(); + builder.storeNextLocation(beforeStatementLocation); + storm::ppg::ProgramLocation* bodyStart = builder.newLocation(); + builder.buildBlock(*s.getBody()); + beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), s.getCondition().getBooleanExpression(), bodyStart->id()); + beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), !s.getCondition().getBooleanExpression(), builder.nextLocId()); + } + + void ProgramGraphBuilderVisitor::visit(storm::pgcl::NondeterministicBranch const& s) { + storm::ppg::ProgramLocation* beforeStatementLocation = builder.currentLoc(); + builder.storeNextLocation(builder.nextLoc()); + storm::ppg::ProgramLocation* bodyStart = builder.newLocation(); + builder.buildBlock(*s.getLeftBranch()); + beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), builder.nextLocId()); + builder.storeNextLocation(builder.nextLoc()); + bodyStart = builder.newLocation(); + beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), builder.nextLocId()); + builder.buildBlock(*s.getRightBranch()); + + } + void ProgramGraphBuilderVisitor::visit(storm::pgcl::ProbabilisticBranch const& s) { + storm::ppg::ProgramLocation* beforeStatementLocation = builder.currentLoc(); + builder.storeNextLocation(builder.nextLoc()); + storm::ppg::ProgramLocation* bodyStart = builder.newLocation(); + beforeStatementLocation->addProgramEdgeGroup(s.getProbability())->addEdge(builder.nextLocId(), builder.noAction()); + builder.buildBlock(*s.getLeftBranch()); + builder.storeNextLocation(builder.nextLoc()); + bodyStart = builder.newLocation(); + beforeStatementLocation->addProgramEdgeGroup(1 - s.getProbability())->addEdge(builder.nextLocId(), builder.noAction()); + builder.buildBlock(*s.getRightBranch()); + } + } +} \ No newline at end of file diff --git a/src/builder/ProgramGraphBuilder.h b/src/builder/ProgramGraphBuilder.h new file mode 100644 index 000000000..d15355e0d --- /dev/null +++ b/src/builder/ProgramGraphBuilder.h @@ -0,0 +1,155 @@ +#pragma once + +#include "src/storage/pgcl/PgclProgram.h" +#include "src/storage/ppg/ProgramGraph.h" +#include "src/storage/pgcl/AbstractStatementVisitor.h" +#include "src/storage/pgcl/UniformExpression.h" + +namespace storm { + namespace builder { + class ProgramGraphBuilder; + + + class ProgramGraphBuilderVisitor: public storm::pgcl::AbstractStatementVisitor{ + public: + ProgramGraphBuilderVisitor(ProgramGraphBuilder& builder) : builder(builder) { + + } + + virtual void visit(storm::pgcl::AssignmentStatement const&); + virtual void visit(storm::pgcl::ObserveStatement const&); + virtual void visit(storm::pgcl::IfStatement const&); + virtual void visit(storm::pgcl::LoopStatement const&); + virtual void visit(storm::pgcl::NondeterministicBranch const&); + virtual void visit(storm::pgcl::ProbabilisticBranch const&); + + private: + ProgramGraphBuilder& builder; + }; + + + class ProgramGraphBuilder { + + + public: + static storm::ppg::ProgramGraph* build(storm::pgcl::PgclProgram const& program) { + ProgramGraphBuilder builder(program); + builder.run(); + return builder.finalize(); + } + + ~ProgramGraphBuilder() { + if (graph != nullptr) { + delete graph; + } + } + + storm::ppg::ProgramLocation* currentLoc() const { + return currentStack.back(); + } + + storm::ppg::ProgramLocation* newLocation() { + currentStack.push_back(graph->addLocation()); + return currentLoc(); + } + + void storeNextLocation(storm::ppg::ProgramLocation* loc) { + nextStack.push_back(loc); + } + + storm::ppg::ProgramLocation* nextLoc() const { + return nextStack.back(); + } + + storm::ppg::ProgramLocationIdentifier nextLocId() const { + return nextLoc()->id(); + } + + storm::ppg::ProgramActionIdentifier addAction(storm::expressions::Variable const& var, storm::expressions::Expression const& expr) const { + storm::ppg::DeterministicProgramAction* action = graph->addDeterministicAction(); + action->addAssignment(graph->getVariableId(var.getName()), expr); + return action->id(); + } + + storm::ppg::ProgramActionIdentifier addAction(storm::expressions::Variable const& var, storm::pgcl::UniformExpression const& expr) const { + storm::ppg::ProbabilisticProgramAction* action = graph->addUniformProbabilisticAction(graph->getVariableId(var.getName()), expr.getBegin(), expr.getEnd()); + return action->id(); + + } + + storm::ppg::ProgramActionIdentifier noAction() const { + return noActionId; + } + + std::shared_ptr const& getExpressionManager() const { + return program.getExpressionManager(); + } + + + + void buildBlock(storm::pgcl::PgclBlock const& block) { + ProgramGraphBuilderVisitor visitor(*this); + for (auto const& statement : block) { + if (!statement->isLast()) { + nextStack.push_back(graph->addLocation(false)); + } + assert(!currentStack.empty()); + assert(!nextStack.empty()); + statement->accept(visitor); + assert(!currentStack.empty()); + assert(!nextStack.empty()); + currentStack.back() = nextStack.back(); + nextStack.pop_back(); + } + } + + + private: + ProgramGraphBuilder(storm::pgcl::PgclProgram const& program) + : program(program) + { + graph = new storm::ppg::ProgramGraph(program.getExpressionManager(), program.getVariableDeclarations()); + noActionId = graph->getNoActionId(); + } + + /** + * Runs the translator. + */ + void run() { + currentStack.push_back(graph->addLocation(true)); + // Terminal state. + nextStack.push_back(graph->addLocation(false, true)); + // Observe Violated State. + if (program.hasObserve()) { + observeFailedState = graph->addLocation(false, false, true); + } + buildBlock(program); + } + + /** + * Extracts the program graph from the builder. + * @return + */ + storm::ppg::ProgramGraph* finalize() { + storm::ppg::ProgramGraph* tmp = graph; + graph = nullptr; + return tmp; + } + + std::vector currentStack; + std::vector nextStack; + /// Action id if no action is to be executed. + storm::ppg::ProgramActionIdentifier noActionId; + /// Resulting state of an failed observation. + storm::ppg::ProgramLocation* observeFailedState = nullptr; + /// PGCL Program to translate. + storm::pgcl::PgclProgram const& program; + /// Obtained Program Graph. + storm::ppg::ProgramGraph* graph; + + + + }; + + } +} \ No newline at end of file diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 148c8d357..2d0b467aa 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -3,12 +3,16 @@ #include "../utility/storm.h" +#include "src/storage/SymbolicModelDescription.h" + #include "src/settings/modules/DebugSettings.h" #include "src/settings/modules/IOSettings.h" #include "src/settings/modules/CoreSettings.h" #include "src/exceptions/OptionParserException.h" +#include "src/settings/modules/JaniExportSettings.h" #include "src/utility/storm-version.h" +#include "src/storage/jani/JSONExporter.h" // Includes for the linked libraries and versions header. @@ -206,54 +210,95 @@ namespace storm { storm::utility::initializeFileLogging(); } - if (storm::settings::getModule().isSymbolicSet()) { - // If we have to build the model from a symbolic representation, we need to parse the representation first. - storm::prism::Program program = storm::parseProgram(storm::settings::getModule().getSymbolicModelFilename()); + auto ioSettings = storm::settings::getModule(); + if (ioSettings.isPrismOrJaniInputSet()) { + storm::storage::SymbolicModelDescription model; + std::vector properties; + + if (ioSettings.isPrismInputSet()) { + model = storm::parseProgram(ioSettings.getPrismInputFilename()); + if (ioSettings.isPrismToJaniSet()) { + model = model.toJani(true); + } + } else if (ioSettings.isJaniInputSet()) { + auto input = storm::parseJaniModel(ioSettings.getJaniInputFilename()); + model = input.first; + if (ioSettings.isJaniPropertiesSet()) { + for (auto const& propName : ioSettings.getJaniProperties()) { + STORM_LOG_THROW( input.second.count(propName) == 1, storm::exceptions::InvalidArgumentException, "No property with name " << propName << " known."); + properties.push_back(input.second.at(propName)); + } + } + + } - // Get the string that assigns values to the unknown currently undefined constants in the model. - std::string constantDefinitionString = storm::settings::getModule().getConstantDefinitionString(); - storm::prism::Program preprocessedProgram = storm::utility::prism::preprocess(program, constantDefinitionString); - std::map constantsSubstitution = preprocessedProgram.getConstantsSubstitution(); - // Then proceed to parsing the properties (if given), since the model we are building may depend on the property. - std::vector> formulas; + uint64_t i = 0; if (storm::settings::getModule().isPropertySet()) { - formulas = storm::parseFormulasForProgram(storm::settings::getModule().getProperty(), preprocessedProgram); + if (model.isJaniModel()) { + for(auto const& formula : storm::parseFormulasForJaniModel(storm::settings::getModule().getProperty(), model.asJaniModel())) { + properties.emplace_back(std::to_string(i), formula); + ++i; + } + } else { + for(auto const& formula :storm::parseFormulasForPrismProgram(storm::settings::getModule().getProperty(), model.asPrismProgram())) { + properties.emplace_back(std::to_string(i), formula); + ++i; + } + } } - - // There may be constants of the model appearing in the formulas, so we replace all their occurrences - // by their definitions in the translated program. - std::vector> preprocessedFormulas; - for (auto const& formula : formulas) { - preprocessedFormulas.emplace_back(formula->substitute(constantsSubstitution)); + + if(model.isJaniModel() && storm::settings::getModule().isJaniFileSet()) { + if (storm::settings::getModule().isExportAsStandardJaniSet()) { + storm::jani::Model normalisedModel = storm::jani::Model(model.asJaniModel()); + normalisedModel.makeStandardJaniCompliant(); + storm::jani::JsonExporter::toFile(normalisedModel, formulasInProperties(properties), storm::settings::getModule().getJaniFilename()); + } else { + storm::jani::JsonExporter::toFile(model.asJaniModel(), formulasInProperties(properties), storm::settings::getModule().getJaniFilename()); + } } + + if (ioSettings.isNoBuildModelSet()) { + return; + } + + // Get the string that assigns values to the unknown currently undefined constants in the model. + std::string constantDefinitionString = ioSettings.getConstantDefinitionString(); + model = model.preprocess(constantDefinitionString); + + if (storm::settings::getModule().isParametricSet()) { #ifdef STORM_HAVE_CARL - buildAndCheckSymbolicModel(preprocessedProgram, preprocessedFormulas, true); + buildAndCheckSymbolicModel(model, properties, true); #else STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "No parameters are supported in this build."); #endif } else if (storm::settings::getModule().isExactSet()) { #ifdef STORM_HAVE_CARL - buildAndCheckSymbolicModel(preprocessedProgram, preprocessedFormulas, true); + buildAndCheckSymbolicModel(model, properties, true); #else STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "No exact numbers are supported in this build."); #endif } else { - buildAndCheckSymbolicModel(preprocessedProgram, preprocessedFormulas, true); + buildAndCheckSymbolicModel(model, properties, true); } } else if (storm::settings::getModule().isExplicitSet()) { STORM_LOG_THROW(storm::settings::getModule().getEngine() == storm::settings::modules::CoreSettings::Engine::Sparse, storm::exceptions::InvalidSettingsException, "Only the sparse engine supports explicit model input."); // If the model is given in an explicit format, we parse the properties without allowing expressions // in formulas. - std::vector> formulas; + std::vector properties; if (storm::settings::getModule().isPropertySet()) { - formulas = storm::parseFormulasForExplicit(storm::settings::getModule().getProperty()); + uint64_t i = 0; + for(auto const& formula : storm::parseFormulasForExplicit(storm::settings::getModule().getProperty())) { + properties.emplace_back(std::to_string(i), formula); + ++i; + + } } - buildAndCheckExplicitModel(formulas, true); + buildAndCheckExplicitModel(properties, true); } else { STORM_LOG_THROW(false, storm::exceptions::InvalidSettingsException, "No input model."); } diff --git a/src/cli/entrypoints.h b/src/cli/entrypoints.h index b41a0f07f..6cc2453ee 100644 --- a/src/cli/entrypoints.h +++ b/src/cli/entrypoints.h @@ -3,21 +3,82 @@ #include "src/utility/storm.h" +#include "src/storage/SymbolicModelDescription.h" +#include "src/utility/ExplicitExporter.h" + #include "src/exceptions/NotImplementedException.h" +#include "src/exceptions/InvalidSettingsException.h" namespace storm { namespace cli { template - void verifySparseModel(std::shared_ptr> model, std::vector> const& formulas, bool onlyInitialStatesRelevant = false) { - for (auto const& formula : formulas) { - std::cout << std::endl << "Model checking property: " << *formula << " ..."; - std::unique_ptr result(storm::verifySparseModel(model, formula, onlyInitialStatesRelevant)); + void applyFilterFunctionAndOutput(std::unique_ptr const& result, storm::modelchecker::FilterType ft) { + + if(result->isQuantitative()) { + switch(ft) { + case storm::modelchecker::FilterType::VALUES: + std::cout << *result << std::endl; + return; + case storm::modelchecker::FilterType::SUM: + std::cout << result->asQuantitativeCheckResult().sum(); + return; + case storm::modelchecker::FilterType::AVG: + std::cout << result->asQuantitativeCheckResult().average(); + return; + case storm::modelchecker::FilterType::MIN: + std::cout << result->asQuantitativeCheckResult().getMin(); + return; + case storm::modelchecker::FilterType::MAX: + std::cout << result->asQuantitativeCheckResult().getMax(); + return; + case storm::modelchecker::FilterType::ARGMIN: + case storm::modelchecker::FilterType::ARGMAX: + STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Outputting states is not supported"); + case storm::modelchecker::FilterType::EXISTS: + case storm::modelchecker::FilterType::FORALL: + case storm::modelchecker::FilterType::COUNT: + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "FilterType only defined for qualitative results"); + } + } else { + switch(ft) { + case storm::modelchecker::FilterType::VALUES: + std::cout << *result << std::endl; + return; + case storm::modelchecker::FilterType::EXISTS: + std::cout << result->asQualitativeCheckResult().existsTrue(); + return; + case storm::modelchecker::FilterType::FORALL: + std::cout << result->asQualitativeCheckResult().forallTrue(); + return; + case storm::modelchecker::FilterType::COUNT: + std::cout << result->asQualitativeCheckResult().count(); + return; + + case storm::modelchecker::FilterType::ARGMIN: + case storm::modelchecker::FilterType::ARGMAX: + STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Outputting states is not supported"); + case storm::modelchecker::FilterType::SUM: + case storm::modelchecker::FilterType::AVG: + case storm::modelchecker::FilterType::MIN: + case storm::modelchecker::FilterType::MAX: + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "FilterType only defined for quantitative results"); + } + + } + } + + template + void verifySparseModel(std::shared_ptr> model, std::vector const& properties, bool onlyInitialStatesRelevant = false) { + for (auto const& property : properties) { + std::cout << std::endl << "Model checking property: " << property << " ..."; + std::unique_ptr result(storm::verifySparseModel(model, property.getFilter().getFormula(), onlyInitialStatesRelevant)); if (result) { std::cout << " done." << std::endl; std::cout << "Result (initial states): "; result->filter(storm::modelchecker::ExplicitQualitativeCheckResult(model->getInitialStates())); - std::cout << *result << std::endl; + applyFilterFunctionAndOutput(result, property.getFilter().getFilterType()); + std::cout << std::endl; } else { std::cout << " skipped, because the modelling formalism is currently unsupported." << std::endl; } @@ -26,17 +87,18 @@ namespace storm { #ifdef STORM_HAVE_CARL template<> - inline void verifySparseModel(std::shared_ptr> model, std::vector> const& formulas, bool onlyInitialStatesRelevant) { + inline void verifySparseModel(std::shared_ptr> model, std::vector const& properties, bool onlyInitialStatesRelevant) { - for (auto const& formula : formulas) { + for (auto const& property : properties) { STORM_LOG_THROW(model->getType() == storm::models::ModelType::Dtmc || model->getType() == storm::models::ModelType::Ctmc, storm::exceptions::InvalidSettingsException, "Currently parametric verification is only available for DTMCs and CTMCs."); - std::cout << std::endl << "Model checking property: " << *formula << " ..."; - std::unique_ptr result(storm::verifySparseModel(model, formula, onlyInitialStatesRelevant)); + std::cout << std::endl << "Model checking property: " << property << " ..."; + std::unique_ptr result(storm::verifySparseModel(model, property.getFilter().getFormula(), onlyInitialStatesRelevant)); if (result) { std::cout << " done." << std::endl; std::cout << "Result (initial states): "; result->filter(storm::modelchecker::ExplicitQualitativeCheckResult(model->getInitialStates())); - std::cout << *result << std::endl; + applyFilterFunctionAndOutput(result, property.getFilter().getFilterType()); + std::cout << std::endl; } else { std::cout << " skipped, because the modelling formalism is currently unsupported." << std::endl; } @@ -49,22 +111,24 @@ namespace storm { #endif template - void verifySymbolicModelWithAbstractionRefinementEngine(storm::prism::Program const& program, std::vector> const& formulas, bool onlyInitialStatesRelevant = false) { + void verifySymbolicModelWithAbstractionRefinementEngine(storm::storage::SymbolicModelDescription const& model, std::vector const& formulas, bool onlyInitialStatesRelevant = false) { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Abstraction Refinement is not yet implemented."); } template - void verifySymbolicModelWithExplorationEngine(storm::prism::Program const& program, std::vector> const& formulas, bool onlyInitialStatesRelevant = false) { + void verifySymbolicModelWithExplorationEngine(storm::storage::SymbolicModelDescription const& model, std::vector const& formulas, bool onlyInitialStatesRelevant = false) { + STORM_LOG_THROW(model.isPrismProgram(), storm::exceptions::InvalidSettingsException, "Exploration engine is currently only applicable to PRISM models."); + storm::prism::Program const& program = model.asPrismProgram(); STORM_LOG_THROW(program.getModelType() == storm::prism::Program::ModelType::DTMC || program.getModelType() == storm::prism::Program::ModelType::MDP, storm::exceptions::InvalidSettingsException, "Currently exploration-based verification is only available for DTMCs and MDPs."); - for (auto const& formula : formulas) { - std::cout << std::endl << "Model checking property: " << *formula << " ..."; + for (auto const& property : formulas) { + std::cout << std::endl << "Model checking property: " << property << " ..."; bool supportFormula; std::unique_ptr result; if(program.getModelType() == storm::prism::Program::ModelType::DTMC) { storm::modelchecker::SparseExplorationModelChecker> checker(program); - storm::modelchecker::CheckTask task(*formula, onlyInitialStatesRelevant); + storm::modelchecker::CheckTask task(*property.getFilter().getFormula(), onlyInitialStatesRelevant); supportFormula = checker.canHandle(task); if (supportFormula) { @@ -72,7 +136,7 @@ namespace storm { } } else if(program.getModelType() == storm::prism::Program::ModelType::MDP) { storm::modelchecker::SparseExplorationModelChecker> checker(program); - storm::modelchecker::CheckTask task(*formula, onlyInitialStatesRelevant); + storm::modelchecker::CheckTask task(*property.getFilter().getFormula(), onlyInitialStatesRelevant); supportFormula = checker.canHandle(task); if (supportFormula) { @@ -89,7 +153,8 @@ namespace storm { if (result) { std::cout << " done." << std::endl; std::cout << "Result (initial states): "; - std::cout << *result << std::endl; + applyFilterFunctionAndOutput(result, property.getFilter().getFilterType()); + std::cout << std::endl; } else { std::cout << " skipped, because the modelling formalism is currently unsupported." << std::endl; } @@ -98,22 +163,23 @@ namespace storm { #ifdef STORM_HAVE_CARL template<> - void verifySymbolicModelWithExplorationEngine(storm::prism::Program const& program, std::vector> const& formulas, bool onlyInitialStatesRelevant) { + void verifySymbolicModelWithExplorationEngine(storm::storage::SymbolicModelDescription const& model, std::vector const& formulas, bool onlyInitialStatesRelevant) { STORM_LOG_THROW(false, storm::exceptions::InvalidSettingsException, "Exploration-based verification does currently not support parametric models."); } #endif template - void verifySymbolicModelWithHybridEngine(std::shared_ptr> model, std::vector> const& formulas, bool onlyInitialStatesRelevant = false) { - for (auto const& formula : formulas) { - std::cout << std::endl << "Model checking property: " << *formula << " ..."; - std::unique_ptr result(storm::verifySymbolicModelWithHybridEngine(model, formula, onlyInitialStatesRelevant)); + void verifySymbolicModelWithHybridEngine(std::shared_ptr> model, std::vector const& formulas, bool onlyInitialStatesRelevant = false) { + for (auto const& property : formulas) { + std::cout << std::endl << "Model checking property: " << property << " ..."; + std::unique_ptr result(storm::verifySymbolicModelWithHybridEngine(model, property.getFilter().getFormula(), onlyInitialStatesRelevant)); if (result) { std::cout << " done." << std::endl; std::cout << "Result (initial states): "; result->filter(storm::modelchecker::SymbolicQualitativeCheckResult(model->getReachableStates(), model->getInitialStates())); - std::cout << *result << std::endl; + applyFilterFunctionAndOutput(result, property.getFilter().getFilterType()); + std::cout << std::endl; } else { std::cout << " skipped, because the modelling formalism is currently unsupported." << std::endl; } @@ -121,15 +187,16 @@ namespace storm { } template - void verifySymbolicModelWithDdEngine(std::shared_ptr> model, std::vector> const& formulas, bool onlyInitialStatesRelevant = false) { - for (auto const& formula : formulas) { - std::cout << std::endl << "Model checking property: " << *formula << " ..."; - std::unique_ptr result(storm::verifySymbolicModelWithDdEngine(model, formula, onlyInitialStatesRelevant)); + void verifySymbolicModelWithDdEngine(std::shared_ptr> model, std::vector const& formulas, bool onlyInitialStatesRelevant = false) { + for (auto const& property : formulas) { + std::cout << std::endl << "Model checking property: " << property << " ..."; + std::unique_ptr result(storm::verifySymbolicModelWithDdEngine(model, property.getFilter().getFormula(), onlyInitialStatesRelevant)); if (result) { std::cout << " done." << std::endl; std::cout << "Result (initial states): "; result->filter(storm::modelchecker::SymbolicQualitativeCheckResult(model->getReachableStates(), model->getInitialStates())); - std::cout << *result << std::endl; + applyFilterFunctionAndOutput(result, property.getFilter().getFilterType()); + std::cout << std::endl; } else { std::cout << " skipped, because the modelling formalism is currently unsupported." << std::endl; } @@ -177,101 +244,109 @@ namespace storm { } template - void buildAndCheckSymbolicModelWithSymbolicEngine(bool hybrid, storm::prism::Program const& program, std::vector> const& formulas, bool onlyInitialStatesRelevant = false) { + void buildAndCheckSymbolicModelWithSymbolicEngine(bool hybrid, storm::storage::SymbolicModelDescription const& model, std::vector const& properties, bool onlyInitialStatesRelevant = false) { // Start by building the model. - auto model = buildSymbolicModel(program, formulas); + auto markovModel = buildSymbolicModel(model, formulasInProperties(properties)); // Print some information about the model. - model->printModelInformationToStream(std::cout); + markovModel->printModelInformationToStream(std::cout); // Then select the correct engine. if (hybrid) { - verifySymbolicModelWithHybridEngine(model, formulas, onlyInitialStatesRelevant); + verifySymbolicModelWithHybridEngine(markovModel, properties, onlyInitialStatesRelevant); } else { - verifySymbolicModelWithDdEngine(model, formulas, onlyInitialStatesRelevant); + verifySymbolicModelWithDdEngine(markovModel, properties, onlyInitialStatesRelevant); } } template - void buildAndCheckSymbolicModelWithSparseEngine(storm::prism::Program const& program, std::vector> const& formulas, bool onlyInitialStatesRelevant = false) { + void buildAndCheckSymbolicModelWithSparseEngine(storm::storage::SymbolicModelDescription const& model, std::vector const& properties, bool onlyInitialStatesRelevant = false) { + auto formulas = formulasInProperties(properties); // Start by building the model. - std::shared_ptr model = buildSparseModel(program, formulas); + std::shared_ptr markovModel = buildSparseModel(model, formulas); // Print some information about the model. - model->printModelInformationToStream(std::cout); + markovModel->printModelInformationToStream(std::cout); // Preprocess the model. - BRANCH_ON_SPARSE_MODELTYPE(model, model, ValueType, preprocessModel, formulas); + BRANCH_ON_SPARSE_MODELTYPE(markovModel, markovModel, ValueType, preprocessModel, formulas); - std::shared_ptr> sparseModel = model->template as>(); + std::shared_ptr> sparseModel = markovModel->template as>(); // Finally, treat the formulas. if (storm::settings::getModule().isCounterexampleSet()) { - generateCounterexamples(program, sparseModel, formulas); + generateCounterexamples(model, sparseModel, formulas); } else { - verifySparseModel(sparseModel, formulas, onlyInitialStatesRelevant); + verifySparseModel(sparseModel, properties, onlyInitialStatesRelevant); + } + + // And export if required. + if(storm::settings::getModule().isExportExplicitSet()) { + std::ofstream ofs; + ofs.open(storm::settings::getModule().getExportExplicitFilename(), std::ofstream::out); + storm::exporter::explicitExportSparseModel(ofs, sparseModel, model.getParameterNames()); + ofs.close(); } } template - void buildAndCheckSymbolicModel(storm::prism::Program const& program, std::vector> const& formulas, bool onlyInitialStatesRelevant = false) { + void buildAndCheckSymbolicModel(storm::storage::SymbolicModelDescription const& model, std::vector const& formulas, bool onlyInitialStatesRelevant = false) { if (storm::settings::getModule().getEngine() == storm::settings::modules::CoreSettings::Engine::AbstractionRefinement) { auto ddlib = storm::settings::getModule().getDdLibraryType(); if (ddlib == storm::dd::DdType::CUDD) { - verifySymbolicModelWithAbstractionRefinementEngine(program, formulas, onlyInitialStatesRelevant); + verifySymbolicModelWithAbstractionRefinementEngine(model, formulas, onlyInitialStatesRelevant); } else { - verifySymbolicModelWithAbstractionRefinementEngine(program, formulas, onlyInitialStatesRelevant); + verifySymbolicModelWithAbstractionRefinementEngine(model, formulas, onlyInitialStatesRelevant); } } else if (storm::settings::getModule().getEngine() == storm::settings::modules::CoreSettings::Engine::Exploration) { - verifySymbolicModelWithExplorationEngine(program, formulas, onlyInitialStatesRelevant); + verifySymbolicModelWithExplorationEngine(model, formulas, onlyInitialStatesRelevant); } else { auto engine = storm::settings::getModule().getEngine(); if (engine == storm::settings::modules::CoreSettings::Engine::Dd || engine == storm::settings::modules::CoreSettings::Engine::Hybrid) { auto ddlib = storm::settings::getModule().getDdLibraryType(); if (ddlib == storm::dd::DdType::CUDD) { - buildAndCheckSymbolicModelWithSymbolicEngine(engine == storm::settings::modules::CoreSettings::Engine::Hybrid, program, formulas, onlyInitialStatesRelevant); + buildAndCheckSymbolicModelWithSymbolicEngine(engine == storm::settings::modules::CoreSettings::Engine::Hybrid, model, formulas, onlyInitialStatesRelevant); } else { - buildAndCheckSymbolicModelWithSymbolicEngine(engine == storm::settings::modules::CoreSettings::Engine::Hybrid, program, formulas, onlyInitialStatesRelevant); + buildAndCheckSymbolicModelWithSymbolicEngine(engine == storm::settings::modules::CoreSettings::Engine::Hybrid, model, formulas, onlyInitialStatesRelevant); } } else { STORM_LOG_THROW(engine == storm::settings::modules::CoreSettings::Engine::Sparse, storm::exceptions::InvalidSettingsException, "Illegal engine."); - - buildAndCheckSymbolicModelWithSparseEngine(program, formulas, onlyInitialStatesRelevant); + buildAndCheckSymbolicModelWithSparseEngine(model, formulas, onlyInitialStatesRelevant); } } } #ifdef STORM_HAVE_CARL template<> - void buildAndCheckSymbolicModel(storm::prism::Program const& program, std::vector> const& formulas, bool onlyInitialStatesRelevant) { + void buildAndCheckSymbolicModel(storm::storage::SymbolicModelDescription const& model, std::vector const& formulas, bool onlyInitialStatesRelevant) { STORM_LOG_THROW(storm::settings::getModule().getEngine() == storm::settings::modules::CoreSettings::Engine::Sparse, storm::exceptions::InvalidSettingsException, "Cannot use this data type with an engine different than the sparse one."); - buildAndCheckSymbolicModelWithSparseEngine(program, formulas, onlyInitialStatesRelevant); + buildAndCheckSymbolicModelWithSparseEngine(model, formulas, onlyInitialStatesRelevant); } template<> - void buildAndCheckSymbolicModel(storm::prism::Program const& program, std::vector> const& formulas, bool onlyInitialStatesRelevant) { + void buildAndCheckSymbolicModel(storm::storage::SymbolicModelDescription const& model, std::vector const& formulas, bool onlyInitialStatesRelevant) { STORM_LOG_THROW(storm::settings::getModule().getEngine() == storm::settings::modules::CoreSettings::Engine::Sparse, storm::exceptions::InvalidSettingsException, "Cannot use this data type with an engine different than the sparse one."); - buildAndCheckSymbolicModelWithSparseEngine(program, formulas, onlyInitialStatesRelevant); + buildAndCheckSymbolicModelWithSparseEngine(model, formulas, onlyInitialStatesRelevant); } #endif template - void buildAndCheckExplicitModel(std::vector> const& formulas, bool onlyInitialStatesRelevant = false) { + void buildAndCheckExplicitModel(std::vector const& properties, bool onlyInitialStatesRelevant = false) { storm::settings::modules::IOSettings const& settings = storm::settings::getModule(); STORM_LOG_THROW(settings.isExplicitSet(), storm::exceptions::InvalidStateException, "Unable to build explicit model without model files."); std::shared_ptr model = buildExplicitModel(settings.getTransitionFilename(), settings.getLabelingFilename(), settings.isStateRewardsSet() ? boost::optional(settings.getStateRewardsFilename()) : boost::none, settings.isTransitionRewardsSet() ? boost::optional(settings.getTransitionRewardsFilename()) : boost::none, settings.isChoiceLabelingSet() ? boost::optional(settings.getChoiceLabelingFilename()) : boost::none); // Preprocess the model if needed. - BRANCH_ON_MODELTYPE(model, model, ValueType, storm::dd::DdType::CUDD, preprocessModel, formulas); + BRANCH_ON_MODELTYPE(model, model, ValueType, storm::dd::DdType::CUDD, preprocessModel, formulasInProperties(properties)); // Print some information about the model. model->printModelInformationToStream(std::cout); // Verify the model, if a formula was given. - if (!formulas.empty()) { + if (!properties.empty()) { STORM_LOG_THROW(model->isSparseModel(), storm::exceptions::InvalidStateException, "Expected sparse model."); - verifySparseModel(model->as>(), formulas, onlyInitialStatesRelevant); + verifySparseModel(model->as>(), properties, onlyInitialStatesRelevant); } } } diff --git a/src/counterexamples/SMTMinimalCommandSetGenerator.h b/src/counterexamples/SMTMinimalCommandSetGenerator.h index 44ebb71ec..d0a72443d 100644 --- a/src/counterexamples/SMTMinimalCommandSetGenerator.h +++ b/src/counterexamples/SMTMinimalCommandSetGenerator.h @@ -628,7 +628,7 @@ namespace storm { } // Construct an expression that exactly characterizes the initial state. - storm::expressions::Expression initialStateExpression = program.getInitialConstruct().getInitialStatesExpression(); + storm::expressions::Expression initialStateExpression = program.getInitialStatesExpression(); // Store the found implications in a container similar to the preceding label sets. std::map, std::set>> backwardImplications; @@ -1488,7 +1488,6 @@ namespace storm { storm::storage::BitVector reachableStates(subMdp.getNumberOfStates()); // Initialize the stack for the DFS. - bool targetStateIsReachable = false; std::vector stack; stack.reserve(subMdp.getNumberOfStates()); for (auto initialState : subMdp.getInitialStates()) { @@ -1516,9 +1515,9 @@ namespace storm { reachableStates.set(successorEntry.getColumn(), true); stack.push_back(successorEntry.getColumn()); } - } else if (psiStates.get(successorEntry.getColumn())) { - targetStateIsReachable = true; - } + } //else if (psiStates.get(successorEntry.getColumn())) { + //targetStateIsReachable = true; + //} } if (choiceTargetsRelevantState) { diff --git a/src/generator/Choice.cpp b/src/generator/Choice.cpp index 7f91a4b4d..151716340 100644 --- a/src/generator/Choice.cpp +++ b/src/generator/Choice.cpp @@ -4,14 +4,49 @@ #include "src/utility/constants.h" +#include "src/utility/macros.h" +#include "src/exceptions/InvalidOperationException.h" + namespace storm { namespace generator { template - Choice::Choice(uint_fast64_t actionIndex, bool markovian) : markovian(markovian), actionIndex(actionIndex), distribution(), totalMass(storm::utility::zero()), choiceRewards() { + Choice::Choice(uint_fast64_t actionIndex, bool markovian) : markovian(markovian), actionIndex(actionIndex), distribution(), totalMass(storm::utility::zero()), rewards(), labels() { // Intentionally left empty. } + template + void Choice::add(Choice const& other) { + STORM_LOG_THROW(this->markovian == other.markovian, storm::exceptions::InvalidOperationException, "Type of choices do not match."); + STORM_LOG_THROW(this->actionIndex == other.actionIndex, storm::exceptions::InvalidOperationException, "Action index of choices do not match."); + STORM_LOG_THROW(this->rewards.size() == other.rewards.size(), storm::exceptions::InvalidOperationException, "Reward value sizes of choices do not match."); + + // Add the elements to the distribution. + this->distribution.add(other.distribution); + + // Update the total mass of the choice. + this->totalMass += other.totalMass; + + // Add all reward values. + auto otherRewIt = other.rewards.begin(); + for (auto& rewardValue : this->rewards) { + rewardValue += *otherRewIt; + } + + // Join label sets. + if (this->labels) { + if (other.labels) { + LabelSet newLabelSet; + std::set_union(this->labels.get().begin(), this->labels.get().end(), other.labels.get().begin(), other.labels.get().end(), std::inserter(newLabelSet, newLabelSet.begin())); + this->labels = std::move(newLabelSet); + } + } else { + if (other.labels) { + this->labels = std::move(other.labels); + } + } + } + template typename storm::storage::Distribution::iterator Choice::begin() { return distribution.begin(); @@ -33,24 +68,24 @@ namespace storm { } template - void Choice::addChoiceLabel(uint_fast64_t label) { - if (!choiceLabels) { - choiceLabels = LabelSet(); + void Choice::addLabel(uint_fast64_t label) { + if (!labels) { + labels = LabelSet(); } - choiceLabels->insert(label); + labels->insert(label); } template - void Choice::addChoiceLabels(LabelSet const& labelSet) { - if (!choiceLabels) { - choiceLabels = LabelSet(); + void Choice::addLabels(LabelSet const& labelSet) { + if (!labels) { + labels = LabelSet(); } - choiceLabels->insert(labelSet.begin(), labelSet.end()); + labels->insert(labelSet.begin(), labelSet.end()); } template - boost::container::flat_set const& Choice::getChoiceLabels() const { - return *choiceLabels; + boost::container::flat_set const& Choice::getLabels() const { + return *labels; } template @@ -70,13 +105,18 @@ namespace storm { } template - void Choice::addChoiceReward(ValueType const& value) { - choiceRewards.push_back(value); + void Choice::addReward(ValueType const& value) { + rewards.push_back(value); + } + + template + void Choice::addRewards(std::vector&& values) { + this->rewards = std::move(values); } template - std::vector const& Choice::getChoiceRewards() const { - return choiceRewards; + std::vector const& Choice::getRewards() const { + return rewards; } template diff --git a/src/generator/Choice.h b/src/generator/Choice.h index 76b6c8d16..ca4e9e748 100644 --- a/src/generator/Choice.h +++ b/src/generator/Choice.h @@ -25,6 +25,11 @@ namespace storm { Choice(Choice&& other) = default; Choice& operator=(Choice&& other) = default; + /*! + * Adds the given choice to the current one. + */ + void add(Choice const& other); + /*! * Returns an iterator to the distribution associated with this choice. * @@ -66,21 +71,21 @@ namespace storm { * * @param label The label to associate with this choice. */ - void addChoiceLabel(uint_fast64_t label); + void addLabel(uint_fast64_t label); /*! * Adds the given label set to the labels associated with this choice. * * @param labelSet The label set to associate with this choice. */ - void addChoiceLabels(LabelSet const& labelSet); + void addLabels(LabelSet const& labelSet); /*! * Retrieves the set of labels associated with this choice. * * @return The set of labels associated with this choice. */ - LabelSet const& getChoiceLabels() const; + LabelSet const& getLabels() const; /*! * Retrieves the index of the action of this choice. @@ -104,12 +109,17 @@ namespace storm { /*! * Adds the given value to the reward associated with this choice. */ - void addChoiceReward(ValueType const& value); + void addReward(ValueType const& value); + + /*! + * Adds the given choices rewards to this choice. + */ + void addRewards(std::vector&& values); /*! * Retrieves the rewards for this choice under selected reward models. */ - std::vector const& getChoiceRewards() const; + std::vector const& getRewards() const; /*! * Retrieves whether the choice is Markovian. @@ -135,10 +145,10 @@ namespace storm { ValueType totalMass; // The reward values associated with this choice. - std::vector choiceRewards; + std::vector rewards; // The labels that are associated with this choice. - boost::optional choiceLabels; + boost::optional labels; }; template @@ -147,4 +157,4 @@ namespace storm { } } -#endif /* STORM_GENERATOR_CHOICE_H_ */ \ No newline at end of file +#endif /* STORM_GENERATOR_CHOICE_H_ */ diff --git a/src/generator/CompressedState.cpp b/src/generator/CompressedState.cpp index d7707d740..820b2000e 100644 --- a/src/generator/CompressedState.cpp +++ b/src/generator/CompressedState.cpp @@ -10,6 +10,13 @@ namespace storm { template void unpackStateIntoEvaluator(CompressedState const& state, VariableInformation const& variableInformation, storm::expressions::ExpressionEvaluator& evaluator) { + for (auto const& locationVariable : variableInformation.locationVariables) { + if (locationVariable.bitWidth != 0) { + evaluator.setIntegerValue(locationVariable.variable, state.getAsInt(locationVariable.bitOffset, locationVariable.bitWidth)); + } else { + evaluator.setIntegerValue(locationVariable.variable, 0); + } + } for (auto const& booleanVariable : variableInformation.booleanVariables) { evaluator.setBooleanValue(booleanVariable.variable, state.get(booleanVariable.bitOffset)); } @@ -20,6 +27,13 @@ namespace storm { storm::expressions::SimpleValuation unpackStateIntoValuation(CompressedState const& state, VariableInformation const& variableInformation, storm::expressions::ExpressionManager const& manager) { storm::expressions::SimpleValuation result(manager.getSharedPointer()); + for (auto const& locationVariable : variableInformation.locationVariables) { + if (locationVariable.bitWidth != 0) { + result.setIntegerValue(locationVariable.variable, state.getAsInt(locationVariable.bitOffset, locationVariable.bitWidth)); + } else { + result.setIntegerValue(locationVariable.variable, 0); + } + } for (auto const& booleanVariable : variableInformation.booleanVariables) { result.setBooleanValue(booleanVariable.variable, state.get(booleanVariable.bitOffset)); } diff --git a/src/generator/JaniNextStateGenerator.cpp b/src/generator/JaniNextStateGenerator.cpp index 0b2fad41a..80473c2f9 100644 --- a/src/generator/JaniNextStateGenerator.cpp +++ b/src/generator/JaniNextStateGenerator.cpp @@ -11,6 +11,7 @@ #include "src/utility/solver.h" #include "src/exceptions/InvalidSettingsException.h" #include "src/exceptions/WrongFormatException.h" +#include "src/exceptions/InvalidArgumentException.h" namespace storm { namespace generator { @@ -21,18 +22,79 @@ namespace storm { } template - JaniNextStateGenerator::JaniNextStateGenerator(storm::jani::Model const& model, NextStateGeneratorOptions const& options, bool flag) : NextStateGenerator(model.getExpressionManager(), VariableInformation(model), options), model(model) { - STORM_LOG_THROW(model.hasDefaultComposition(), storm::exceptions::WrongFormatException, "The explicit next-state generator currently does not support custom system compositions."); - STORM_LOG_THROW(!this->options.isBuildAllRewardModelsSet() && this->options.getRewardModelNames().empty(), storm::exceptions::InvalidSettingsException, "The explicit next-state generator currently does not support building reward models."); + JaniNextStateGenerator::JaniNextStateGenerator(storm::jani::Model const& model, NextStateGeneratorOptions const& options, bool flag) : NextStateGenerator(model.getExpressionManager(), options), model(model), rewardVariables(), hasStateActionRewards(false) { + STORM_LOG_THROW(model.hasStandardComposition(), storm::exceptions::WrongFormatException, "The explicit next-state generator currently does not support custom system compositions."); + STORM_LOG_THROW(!model.hasNonGlobalTransientVariable(), storm::exceptions::InvalidSettingsException, "The explicit next-state generator currently does not support automata-local transient variables."); + STORM_LOG_THROW(!model.hasTransientEdgeDestinationAssignments(), storm::exceptions::InvalidSettingsException, "The explicit next-state generator currently does not support transient edge destination assignments."); STORM_LOG_THROW(!this->options.isBuildChoiceLabelsSet(), storm::exceptions::InvalidSettingsException, "JANI next-state generator cannot generate choice labels."); + // Only after checking validity of the program, we initialize the variable information. + this->checkValid(); + this->variableInformation = VariableInformation(model); + + // Create a proper evalator. + this->evaluator = std::make_unique>(model.getManager()); + + if (this->options.isBuildAllRewardModelsSet()) { + for (auto const& variable : model.getGlobalVariables()) { + if (variable.isTransient()) { + rewardVariables.push_back(variable.getExpressionVariable()); + } + } + } else { + // Extract the reward models from the program based on the names we were given. + auto const& globalVariables = model.getGlobalVariables(); + for (auto const& rewardModelName : this->options.getRewardModelNames()) { + if (globalVariables.hasVariable(rewardModelName)) { + rewardVariables.push_back(globalVariables.getVariable(rewardModelName).getExpressionVariable()); + } else { + STORM_LOG_THROW(rewardModelName.empty(), storm::exceptions::InvalidArgumentException, "Cannot build unknown reward model '" << rewardModelName << "'."); + STORM_LOG_THROW(globalVariables.getNumberOfRealTransientVariables() + globalVariables.getNumberOfUnboundedIntegerTransientVariables() == 1, storm::exceptions::InvalidArgumentException, "Reference to standard reward model is ambiguous."); + } + } + + // If no reward model was yet added, but there was one that was given in the options, we try to build the + // standard reward model. + if (rewardVariables.empty() && !this->options.getRewardModelNames().empty()) { + bool foundTransientVariable = false; + for (auto const& transientVariable : globalVariables.getTransientVariables()) { + if (transientVariable->isUnboundedIntegerVariable() || transientVariable->isRealVariable()) { + rewardVariables.push_back(transientVariable->getExpressionVariable()); + foundTransientVariable = true; + break; + } + } + STORM_LOG_ASSERT(foundTransientVariable, "Expected to find a fitting transient variable."); + } + } + + // Build the information structs for the reward models. + buildRewardModelInformation(); + // If there are terminal states we need to handle, we now need to translate all labels to expressions. if (this->options.hasTerminalStates()) { + std::map locationVariables; + auto locationVariableIt = this->variableInformation.locationVariables.begin(); + for (auto const& automaton : this->model.getAutomata()) { + locationVariables[automaton.getName()] = locationVariableIt->variable; + ++locationVariableIt; + } + for (auto const& expressionOrLabelAndBool : this->options.getTerminalStates()) { if (expressionOrLabelAndBool.first.isExpression()) { this->terminalStates.push_back(std::make_pair(expressionOrLabelAndBool.first.getExpression(), expressionOrLabelAndBool.second)); } else { - STORM_LOG_THROW(expressionOrLabelAndBool.first.getLabel() == "init" || expressionOrLabelAndBool.first.getLabel() == "deadlock", storm::exceptions::InvalidSettingsException, "Terminal states refer to illegal label '" << expressionOrLabelAndBool.first.getLabel() << "'."); + // If it's a label, i.e. refers to a transient boolean variable we need to derive the expression + // for the label so we can cut off the exploration there. + if (expressionOrLabelAndBool.first.getLabel() != "init" && expressionOrLabelAndBool.first.getLabel() != "deadlock") { + STORM_LOG_THROW(model.getGlobalVariables().hasVariable(expressionOrLabelAndBool.first.getLabel()) , storm::exceptions::InvalidSettingsException, "Terminal states refer to illegal label '" << expressionOrLabelAndBool.first.getLabel() << "'."); + + storm::jani::Variable const& variable = model.getGlobalVariables().getVariable(expressionOrLabelAndBool.first.getLabel()); + STORM_LOG_THROW(variable.isBooleanVariable(), storm::exceptions::InvalidSettingsException, "Terminal states refer to non-boolean variable '" << expressionOrLabelAndBool.first.getLabel() << "'."); + STORM_LOG_THROW(variable.isTransient(), storm::exceptions::InvalidSettingsException, "Terminal states refer to non-transient variable '" << expressionOrLabelAndBool.first.getLabel() << "'."); + + this->terminalStates.push_back(std::make_pair(this->model.getLabelExpression(variable.asBooleanVariable(), locationVariables), expressionOrLabelAndBool.second)); + } } } } @@ -82,7 +144,11 @@ namespace storm { auto resultIt = result.begin(); for (auto it = this->variableInformation.locationVariables.begin(), ite = this->variableInformation.locationVariables.end(); it != ite; ++it, ++resultIt) { - *resultIt = getLocation(state, *it); + if (it->bitWidth == 0) { + *resultIt = 0; + } else { + *resultIt = state.getAsInt(it->bitOffset, it->bitWidth); + } } return result; @@ -122,7 +188,7 @@ namespace storm { blockingExpression = blockingExpression.isInitialized() ? blockingExpression || localBlockingExpression : localBlockingExpression; initialState.setFromInt(integerVariable.bitOffset, integerVariable.bitWidth, static_cast(variableValue - integerVariable.lowerBound)); } - + // Gather iterators to the initial locations of all the automata. std::vector::const_iterator> initialLocationsIterators; uint64_t currentLocationVariable = 0; @@ -171,16 +237,15 @@ namespace storm { } template - CompressedState JaniNextStateGenerator::applyUpdate(CompressedState const& state, storm::jani::EdgeDestination const& destination) { + CompressedState JaniNextStateGenerator::applyUpdate(CompressedState const& state, storm::jani::EdgeDestination const& destination, storm::generator::LocationVariableInformation const& locationVariable) { CompressedState newState(state); - // NOTE: the following process assumes that the assignments of the destination are ordered in such a way - // that the assignments to boolean variables precede the assignments to all integer variables and that - // within the types, the assignments to variables are ordered (in ascending order) by the expression variables. - // This is guaranteed for JANI models, by sorting the assignments as soon as an edge destination is created. + // Update the location of the state. + setLocation(newState, locationVariable, destination.getLocationIndex()); - auto assignmentIt = destination.getAssignments().begin(); - auto assignmentIte = destination.getAssignments().end(); + // Then perform the assignments. + auto assignmentIt = destination.getOrderedAssignments().getNonTransientAssignments().begin(); + auto assignmentIte = destination.getOrderedAssignments().getNonTransientAssignments().end(); // Iterate over all boolean assignments and carry them out. auto boolIt = this->variableInformation.booleanVariables.begin(); @@ -188,7 +253,7 @@ namespace storm { while (assignmentIt->getExpressionVariable() != boolIt->variable) { ++boolIt; } - newState.set(boolIt->bitOffset, this->evaluator.asBool(assignmentIt->getAssignedExpression())); + newState.set(boolIt->bitOffset, this->evaluator->asBool(assignmentIt->getAssignedExpression())); } // Iterate over all integer assignments and carry them out. @@ -197,7 +262,7 @@ namespace storm { while (assignmentIt->getExpressionVariable() != integerIt->variable) { ++integerIt; } - int_fast64_t assignedValue = this->evaluator.asInt(assignmentIt->getAssignedExpression()); + int_fast64_t assignedValue = this->evaluator->asInt(assignmentIt->getAssignedExpression()); STORM_LOG_THROW(assignedValue <= integerIt->upperBound, storm::exceptions::WrongFormatException, "The update " << assignmentIt->getExpressionVariable().getName() << " := " << assignmentIt->getAssignedExpression() << " leads to an out-of-bounds value (" << assignedValue << ") for the variable '" << assignmentIt->getExpressionVariable().getName() << "'."); newState.setFromInt(integerIt->bitOffset, integerIt->bitWidth, assignedValue - integerIt->lowerBound); STORM_LOG_ASSERT(static_cast(newState.getAsInt(integerIt->bitOffset, integerIt->bitWidth)) + integerIt->lowerBound == assignedValue, "Writing to the bit vector bucket failed (read " << newState.getAsInt(integerIt->bitOffset, integerIt->bitWidth) << " but wrote " << assignedValue << ")."); @@ -205,7 +270,7 @@ namespace storm { // Check that we processed all assignments. STORM_LOG_ASSERT(assignmentIt == assignmentIte, "Not all assignments were consumed."); - + return newState; } @@ -214,19 +279,33 @@ namespace storm { // Prepare the result, in case we return early. StateBehavior result; + // Retrieve the locations from the state. + std::vector locations = getLocations(*this->state); + + // First, construct the state rewards, as we may return early if there are no choices later and we already + // need the state rewards then. + std::vector stateRewards(this->rewardVariables.size(), storm::utility::zero()); + uint64_t automatonIndex = 0; + for (auto const& automaton : model.getAutomata()) { + uint64_t currentLocationIndex = locations[automatonIndex]; + storm::jani::Location const& location = automaton.getLocation(currentLocationIndex); + auto valueIt = stateRewards.begin(); + performTransientAssignments(location.getAssignments().getTransientAssignments(), [&valueIt] (ValueType const& value) { *valueIt += value; ++valueIt; } ); + ++automatonIndex; + } + result.addStateRewards(std::move(stateRewards)); + // If a terminal expression was set and we must not expand this state, return now. if (!this->terminalStates.empty()) { for (auto const& expressionBool : this->terminalStates) { - if (this->evaluator.asBool(expressionBool.first) == expressionBool.second) { + if (this->evaluator->asBool(expressionBool.first) == expressionBool.second) { return result; } } } - // Retrieve the locations from the state. - std::vector locations = getLocations(*this->state); - // Get all choices for the state. + result.setExpanded(); std::vector> allChoices = getSilentActionChoices(locations, *this->state, stateToIdCallback); std::vector> allLabeledChoices = getNonsilentActionChoices(locations, *this->state, stateToIdCallback); for (auto& choice : allLabeledChoices) { @@ -245,6 +324,10 @@ namespace storm { if (this->isDeterministicModel() && totalNumberOfChoices > 1) { Choice globalChoice; + // For CTMCs, we need to keep track of the total exit rate to scale the action rewards later. For DTMCs + // this is equal to the number of choices, which is why we initialize it like this here. + ValueType totalExitRate = this->isDiscreteTimeModel() ? static_cast(totalNumberOfChoices) : storm::utility::zero(); + // Iterate over all choices and combine the probabilities/rates into one choice. for (auto const& choice : allChoices) { for (auto const& stateProbabilityPair : choice) { @@ -255,11 +338,23 @@ namespace storm { } } + if (hasStateActionRewards && !this->isDiscreteTimeModel()) { + totalExitRate += choice.getTotalMass(); + } + if (this->options.isBuildChoiceLabelsSet()) { - globalChoice.addChoiceLabels(choice.getChoiceLabels()); + globalChoice.addLabels(choice.getLabels()); } } - + + std::vector stateActionRewards(rewardVariables.size(), storm::utility::zero()); + for (auto const& choice : allChoices) { + for (uint_fast64_t rewardVariableIndex = 0; rewardVariableIndex < rewardVariables.size(); ++rewardVariableIndex) { + stateActionRewards[rewardVariableIndex] += choice.getRewards()[rewardVariableIndex] * choice.getTotalMass() / totalExitRate; + } + } + globalChoice.addRewards(std::move(stateActionRewards)); + // Move the newly fused choice in place. allChoices.clear(); allChoices.push_back(std::move(globalChoice)); @@ -270,7 +365,8 @@ namespace storm { result.addChoice(std::move(choice)); } - result.setExpanded(); + this->postprocess(result); + return result; } @@ -280,22 +376,29 @@ namespace storm { // Iterate over all automata. uint64_t automatonIndex = 0; + for (auto const& automaton : model.getAutomata()) { uint64_t location = locations[automatonIndex]; // Iterate over all edges from the source location. for (auto const& edge : automaton.getEdgesFromLocation(location)) { // Skip the edge if it is labeled with a non-silent action. - if (edge.getActionIndex() != model.getSilentActionIndex()) { + if (edge.getActionIndex() != storm::jani::Model::SILENT_ACTION_INDEX) { continue; } // Skip the command, if it is not enabled. - if (!this->evaluator.asBool(edge.getGuard())) { + if (!this->evaluator->asBool(edge.getGuard())) { continue; } - result.push_back(Choice(edge.getActionIndex())); + // Determine the exit rate if it's a Markovian edge. + boost::optional exitRate = boost::none; + if (edge.hasRate()) { + exitRate = this->evaluator->asRational(edge.getRate()); + } + + result.push_back(Choice(edge.getActionIndex(), static_cast(exitRate))); Choice& choice = result.back(); // Iterate over all updates of the current command. @@ -303,14 +406,18 @@ namespace storm { for (auto const& destination : edge.getDestinations()) { // Obtain target state index and add it to the list of known states. If it has not yet been // seen, we also add it to the set of states that have yet to be explored. - StateType stateIndex = stateToIdCallback(applyUpdate(state, destination)); + StateType stateIndex = stateToIdCallback(applyUpdate(state, destination, this->variableInformation.locationVariables[automatonIndex])); // Update the choice by adding the probability/target state to it. - ValueType probability = this->evaluator.asRational(destination.getProbability()); + ValueType probability = this->evaluator->asRational(destination.getProbability()); + probability = exitRate ? exitRate.get() * probability : probability; choice.addProbability(stateIndex, probability); probabilitySum += probability; } + // Create the state-action reward for the newly created choice. + performTransientAssignments(edge.getAssignments().getTransientAssignments(), [&choice] (ValueType const& value) { choice.addReward(value); } ); + // Check that the resulting distribution is in fact a distribution. STORM_LOG_THROW(!this->isDiscreteTimeModel() || this->comparator.isOne(probabilitySum), storm::exceptions::WrongFormatException, "Probabilities do not sum to one for edge (actually sum to " << probabilitySum << ")."); } @@ -345,26 +452,32 @@ namespace storm { while (!done) { boost::container::flat_map* currentTargetStates = new boost::container::flat_map(); boost::container::flat_map* newTargetStates = new boost::container::flat_map(); + std::vector stateActionRewards(rewardVariables.size(), storm::utility::zero()); currentTargetStates->emplace(state, storm::utility::one()); + auto locationVariableIt = this->variableInformation.locationVariables.cbegin(); for (uint_fast64_t i = 0; i < iteratorList.size(); ++i) { storm::jani::Edge const& edge = **iteratorList[i]; for (auto const& destination : edge.getDestinations()) { for (auto const& stateProbabilityPair : *currentTargetStates) { // Compute the new state under the current update and add it to the set of new target states. - CompressedState newTargetState = applyUpdate(stateProbabilityPair.first, destination); + CompressedState newTargetState = applyUpdate(stateProbabilityPair.first, destination, *locationVariableIt); // If the new state was already found as a successor state, update the probability // and otherwise insert it. auto targetStateIt = newTargetStates->find(newTargetState); if (targetStateIt != newTargetStates->end()) { - targetStateIt->second += stateProbabilityPair.second * this->evaluator.asRational(destination.getProbability()); + targetStateIt->second += stateProbabilityPair.second * this->evaluator->asRational(destination.getProbability()); } else { - newTargetStates->emplace(newTargetState, stateProbabilityPair.second * this->evaluator.asRational(destination.getProbability())); + newTargetStates->emplace(newTargetState, stateProbabilityPair.second * this->evaluator->asRational(destination.getProbability())); } } + + // Create the state-action reward for the newly created choice. + auto valueIt = stateActionRewards.begin(); + performTransientAssignments(edge.getAssignments().getTransientAssignments(), [&valueIt] (ValueType const& value) { *valueIt += value; ++valueIt; } ); } // If there is one more command to come, shift the target states one time step back. @@ -373,6 +486,8 @@ namespace storm { currentTargetStates = newTargetStates; newTargetStates = new boost::container::flat_map(); } + + ++locationVariableIt; } // At this point, we applied all commands of the current command combination and newTargetStates @@ -383,6 +498,9 @@ namespace storm { // Now create the actual distribution. Choice& choice = result.back(); + // Add the rewards to the choice. + choice.addRewards(std::move(stateActionRewards)); + // Add the probabilities/rates to the newly created choice. ValueType probabilitySum = storm::utility::zero(); for (auto const& stateProbabilityPair : *newTargetStates) { @@ -425,7 +543,6 @@ namespace storm { // Iterate over all automata. uint64_t automatonIndex = 0; for (auto const& automaton : model.getAutomata()) { - // If the automaton has no edge labeled with the given action, we can skip it. if (!automaton.hasEdgeLabeledWithActionIndex(actionIndex)) { continue; @@ -441,7 +558,7 @@ namespace storm { std::vector edgePointers; for (auto const& edge : edges) { - if (this->evaluator.asBool(edge.getGuard())) { + if (this->evaluator->asBool(edge.getGuard())) { edgePointers.push_back(&edge); } } @@ -480,18 +597,148 @@ namespace storm { template std::size_t JaniNextStateGenerator::getNumberOfRewardModels() const { - return 0; + return rewardVariables.size(); } template RewardModelInformation JaniNextStateGenerator::getRewardModelInformation(uint64_t const& index) const { - STORM_LOG_THROW(false, storm::exceptions::InvalidSettingsException, "Cannot retrieve reward model information."); - return RewardModelInformation("", false, false, false); + return rewardModelInformation[index]; } template storm::models::sparse::StateLabeling JaniNextStateGenerator::label(storm::storage::BitVectorHashMap const& states, std::vector const& initialStateIndices, std::vector const& deadlockStateIndices) { - return NextStateGenerator::label(states, initialStateIndices, deadlockStateIndices, {}); + + // Prepare a mapping from automata names to the location variables. + std::map locationVariables; + auto locationVariableIt = this->variableInformation.locationVariables.begin(); + for (auto const& automaton : model.getAutomata()) { + locationVariables[automaton.getName()] = locationVariableIt->variable; + ++locationVariableIt; + } + + // As in JANI we can use transient boolean variable assignments in locations to identify states, we need to + // create a list of boolean transient variables and the expressions that define them. + std::unordered_map transientVariableToExpressionMap; + for (auto const& variable : model.getGlobalVariables().getTransientVariables()) { + if (variable->isBooleanVariable()) { + if (this->options.isBuildAllLabelsSet() || this->options.getLabelNames().find(variable->getName()) != this->options.getLabelNames().end()) { + transientVariableToExpressionMap[variable->getExpressionVariable()] = model.getLabelExpression(variable->asBooleanVariable(), locationVariables); + } + } + } + + std::vector> transientVariableExpressions; + for (auto const& element : transientVariableToExpressionMap) { + transientVariableExpressions.push_back(std::make_pair(element.first.getName(), element.second)); + } + + return NextStateGenerator::label(states, initialStateIndices, deadlockStateIndices, transientVariableExpressions); + } + + template + void JaniNextStateGenerator::performTransientAssignments(storm::jani::detail::ConstAssignments const& transientAssignments, std::function const& callback) { + // If there are no reward variables, there is no need to iterate at all. + if (rewardVariables.empty()) { + return; + } + + // Otherwise, perform the callback for all selected reward variables. + auto rewardVariableIt = rewardVariables.begin(); + auto rewardVariableIte = rewardVariables.end(); + for (auto const& assignment : transientAssignments) { + while (rewardVariableIt != rewardVariableIte && *rewardVariableIt < assignment.getExpressionVariable()) { + callback(storm::utility::zero()); + ++rewardVariableIt; + } + if (rewardVariableIt == rewardVariableIte) { + break; + } else if (*rewardVariableIt == assignment.getExpressionVariable()) { + callback(ValueType(this->evaluator->asRational(assignment.getAssignedExpression()))); + ++rewardVariableIt; + } + } + // Add a value of zero for all variables that have no assignment. + for (; rewardVariableIt != rewardVariableIte; ++rewardVariableIt) { + callback(storm::utility::zero()); + } + } + + template + void JaniNextStateGenerator::buildRewardModelInformation() { + // Prepare all reward model information structs. + for (auto const& variable : rewardVariables) { + rewardModelInformation.emplace_back(variable.getName(), false, false, false); + } + + // Then fill them. + for (auto const& automaton : model.getAutomata()) { + for (auto const& location : automaton.getLocations()) { + auto rewardVariableIt = rewardVariables.begin(); + auto rewardVariableIte = rewardVariables.end(); + + for (auto const& assignment : location.getAssignments().getTransientAssignments()) { + while (rewardVariableIt != rewardVariableIte && *rewardVariableIt < assignment.getExpressionVariable()) { + ++rewardVariableIt; + } + if (rewardVariableIt == rewardVariableIte) { + break; + } + if (*rewardVariableIt == assignment.getExpressionVariable()) { + rewardModelInformation[std::distance(rewardVariables.begin(), rewardVariableIt)].setHasStateRewards(); + ++rewardVariableIt; + } + } + } + + for (auto const& edge : automaton.getEdges()) { + auto rewardVariableIt = rewardVariables.begin(); + auto rewardVariableIte = rewardVariables.end(); + + for (auto const& assignment : edge.getAssignments().getTransientAssignments()) { + while (rewardVariableIt != rewardVariableIte && *rewardVariableIt < assignment.getExpressionVariable()) { + ++rewardVariableIt; + } + if (rewardVariableIt == rewardVariableIte) { + break; + } + if (*rewardVariableIt == assignment.getExpressionVariable()) { + rewardModelInformation[std::distance(rewardVariables.begin(), rewardVariableIt)].setHasStateActionRewards(); + hasStateActionRewards = true; + ++rewardVariableIt; + } + } + } + } + } + + template + void JaniNextStateGenerator::checkValid() const { + // If the program still contains undefined constants and we are not in a parametric setting, assemble an appropriate error message. +#ifdef STORM_HAVE_CARL + if (!std::is_same::value && model.hasUndefinedConstants()) { +#else + if (model.hasUndefinedConstants()) { +#endif + std::vector> undefinedConstants = model.getUndefinedConstants(); + std::stringstream stream; + bool printComma = false; + for (auto const& constant : undefinedConstants) { + if (printComma) { + stream << ", "; + } else { + printComma = true; + } + stream << constant.get().getName() << " (" << constant.get().getType() << ")"; + } + stream << "."; + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Program still contains these undefined constants: " + stream.str()); + } + +#ifdef STORM_HAVE_CARL + else if (std::is_same::value && !model.undefinedConstantsAreGraphPreserving()) { + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "The input model contains undefined constants that influence the graph structure of the underlying model, which is not allowed."); + } +#endif } template class JaniNextStateGenerator; diff --git a/src/generator/JaniNextStateGenerator.h b/src/generator/JaniNextStateGenerator.h index 316d6e074..7d5907c21 100644 --- a/src/generator/JaniNextStateGenerator.h +++ b/src/generator/JaniNextStateGenerator.h @@ -54,9 +54,10 @@ namespace storm { * the given compressed state. * @params state The state to which to apply the new values. * @params update The update to apply. + * @params locationVariable The location variable that is being updated. * @return The resulting state. */ - CompressedState applyUpdate(CompressedState const& state, storm::jani::EdgeDestination const& update); + CompressedState applyUpdate(CompressedState const& state, storm::jani::EdgeDestination const& update, storm::generator::LocationVariableInformation const& locationVariable); /*! * Retrieves all choices labeled with the silent action possible from the given state. @@ -89,9 +90,34 @@ namespace storm { */ void checkGlobalVariableWritesValid(std::vector> const& enabledEdges) const; + /*! + * Treats the given transient assignments by calling the callback function whenever a transient assignment + * to one of the reward variables of this generator is performed. + */ + void performTransientAssignments(storm::jani::detail::ConstAssignments const& transientAssignments, std::function const& callback); + + /*! + * Builds the information structs for the reward models. + */ + void buildRewardModelInformation(); + + /*! + * Checks the underlying model for validity for this next-state generator. + */ + void checkValid() const; + /// The model used for the generation of next states. storm::jani::Model model; + + /// The transient variables of reward models that need to be considered. + std::vector rewardVariables; + + /// A vector storing information about the corresponding reward models (variables). + std::vector rewardModelInformation; + + // A flag that stores whether at least one of the selected reward models has state-action rewards. + bool hasStateActionRewards; }; } -} \ No newline at end of file +} diff --git a/src/generator/NextStateGenerator.cpp b/src/generator/NextStateGenerator.cpp index 9c1eefbd5..cf15f0a3f 100644 --- a/src/generator/NextStateGenerator.cpp +++ b/src/generator/NextStateGenerator.cpp @@ -211,13 +211,25 @@ namespace storm { return transitionRewards; } + void RewardModelInformation::setHasStateRewards() { + stateRewards = true; + } + + void RewardModelInformation::setHasStateActionRewards() { + stateActionRewards = true; + } + + void RewardModelInformation::setHasTransitionRewards() { + transitionRewards = true; + } + template - NextStateGenerator::NextStateGenerator(storm::expressions::ExpressionManager const& expressionManager, VariableInformation const& variableInformation, NextStateGeneratorOptions const& options) : options(options), expressionManager(expressionManager.getSharedPointer()), variableInformation(variableInformation), evaluator(expressionManager), state(nullptr) { + NextStateGenerator::NextStateGenerator(storm::expressions::ExpressionManager const& expressionManager, VariableInformation const& variableInformation, NextStateGeneratorOptions const& options) : options(options), expressionManager(expressionManager.getSharedPointer()), variableInformation(variableInformation), evaluator(nullptr), state(nullptr) { // Intentionally left empty. } template - NextStateGenerator::NextStateGenerator(storm::expressions::ExpressionManager const& expressionManager, NextStateGeneratorOptions const& options) : options(options), expressionManager(expressionManager.getSharedPointer()), variableInformation(), evaluator(expressionManager), state(nullptr) { + NextStateGenerator::NextStateGenerator(storm::expressions::ExpressionManager const& expressionManager, NextStateGeneratorOptions const& options) : options(options), expressionManager(expressionManager.getSharedPointer()), variableInformation(), evaluator(nullptr), state(nullptr) { // Intentionally left empty. } @@ -234,7 +246,7 @@ namespace storm { template void NextStateGenerator::load(CompressedState const& state) { // Since almost all subsequent operations are based on the evaluator, we load the state into it now. - unpackStateIntoEvaluator(state, variableInformation, evaluator); + unpackStateIntoEvaluator(state, variableInformation, *evaluator); // Also, we need to store a pointer to the state itself, because we need to be able to access it when expanding it. this->state = &state; @@ -245,7 +257,7 @@ namespace storm { if (expression.isTrue()) { return true; } - return evaluator.asBool(expression); + return evaluator->asBool(expression); } template @@ -270,11 +282,11 @@ namespace storm { result.addLabel(label.first); } for (auto const& stateIndexPair : states) { - unpackStateIntoEvaluator(stateIndexPair.first, variableInformation, this->evaluator); + unpackStateIntoEvaluator(stateIndexPair.first, variableInformation, *this->evaluator); for (auto const& label : labelsAndExpressions) { // Add label to state, if the corresponding expression is true. - if (evaluator.asBool(label.second)) { + if (evaluator->asBool(label.second)) { result.addLabelToState(label.first, stateIndexPair.second); } } @@ -297,6 +309,48 @@ namespace storm { return result; } + template + void NextStateGenerator::postprocess(StateBehavior& result) { + // If the model we build is a Markov Automaton, we postprocess the choices to sum all Markovian choices + // and make the Markovian choice the very first one (if there is any). + bool foundPreviousMarkovianChoice = false; + if (this->getModelType() == ModelType::MA) { + uint64_t numberOfChoicesToDelete = 0; + + for (uint_fast64_t index = 0; index + numberOfChoicesToDelete < result.getNumberOfChoices();) { + Choice& choice = result.getChoices()[index]; + + if (choice.isMarkovian()) { + if (foundPreviousMarkovianChoice) { + // If there was a previous Markovian choice, we need to sum them. Note that we can assume + // that the previous Markovian choice is the very first one in the choices vector. + result.getChoices().front().add(choice); + + // Swap the choice to the end to indicate it can be removed (if it's not already there). + if (index != result.getNumberOfChoices() - 1) { + std::swap(choice, result.getChoices().back()); + } + ++numberOfChoicesToDelete; + } else { + // If there is no previous Markovian choice, just move the Markovian choice to the front. + if (index != 0) { + std::swap(result.getChoices().front(), choice); + foundPreviousMarkovianChoice = true; + } + ++index; + } + } else { + ++index; + } + } + + // Finally remove the choices that were added to other Markovian choices. + if (numberOfChoicesToDelete > 0) { + result.getChoices().resize(result.getChoices().size() - numberOfChoicesToDelete); + } + } + } + template storm::expressions::SimpleValuation NextStateGenerator::toValuation(CompressedState const& state) const { return unpackStateIntoValuation(state, variableInformation, *expressionManager); diff --git a/src/generator/NextStateGenerator.h b/src/generator/NextStateGenerator.h index 529dae357..b9b7bfe23 100644 --- a/src/generator/NextStateGenerator.h +++ b/src/generator/NextStateGenerator.h @@ -148,6 +148,9 @@ namespace storm { bool hasStateActionRewards() const; bool hasTransitionRewards() const; + void setHasStateRewards(); + void setHasStateActionRewards(); + void setHasTransitionRewards(); private: std::string name; bool stateRewards; @@ -193,6 +196,8 @@ namespace storm { */ storm::models::sparse::StateLabeling label(storm::storage::BitVectorHashMap const& states, std::vector const& initialStateIndices, std::vector const& deadlockStateIndices, std::vector> labelsAndExpressions); + void postprocess(StateBehavior& result); + /// The options to be used for next-state generation. NextStateGeneratorOptions options; @@ -206,7 +211,7 @@ namespace storm { VariableInformation variableInformation; /// An evaluator used to evaluate expressions. - storm::expressions::ExpressionEvaluator evaluator; + std::unique_ptr> evaluator; /// The currently loaded state. CompressedState const* state; diff --git a/src/generator/PrismNextStateGenerator.cpp b/src/generator/PrismNextStateGenerator.cpp index ab1311076..e344ab13a 100644 --- a/src/generator/PrismNextStateGenerator.cpp +++ b/src/generator/PrismNextStateGenerator.cpp @@ -27,9 +27,12 @@ namespace storm { STORM_LOG_THROW(!this->program.specifiesSystemComposition(), storm::exceptions::WrongFormatException, "The explicit next-state generator currently does not support custom system compositions."); // Only after checking validity of the program, we initialize the variable information. - this->checkValid(program); + this->checkValid(); this->variableInformation = VariableInformation(program); + // Create a proper evalator. + this->evaluator = std::make_unique>(program.getManager()); + if (this->options.isBuildAllRewardModelsSet()) { for (auto const& rewardModel : this->program.getRewardModels()) { rewardModels.push_back(rewardModel); @@ -42,11 +45,10 @@ namespace storm { } else { STORM_LOG_THROW(rewardModelName.empty(), storm::exceptions::InvalidArgumentException, "Cannot build unknown reward model '" << rewardModelName << "'."); STORM_LOG_THROW(this->program.getNumberOfRewardModels() == 1, storm::exceptions::InvalidArgumentException, "Reference to standard reward model is ambiguous."); - STORM_LOG_THROW(this->program.getNumberOfRewardModels() > 0, storm::exceptions::InvalidArgumentException, "Reference to standard reward model is invalid, because there is no reward model."); } } - // If no reward model was yet added, but there was one that was given in the options, we try to build + // If no reward model was yet added, but there was one that was given in the options, we try to build the // standard reward model. if (rewardModels.empty() && !this->options.getRewardModelNames().empty()) { rewardModels.push_back(this->program.getRewardModel(0)); @@ -76,7 +78,7 @@ namespace storm { } template - void PrismNextStateGenerator::checkValid(storm::prism::Program const& program) { + void PrismNextStateGenerator::checkValid() const { // If the program still contains undefined constants and we are not in a parametric setting, assemble an appropriate error message. #ifdef STORM_HAVE_CARL if (!std::is_same::value && program.hasUndefinedConstants()) { @@ -99,7 +101,7 @@ namespace storm { } #ifdef STORM_HAVE_CARL - else if (std::is_same::value && !program.hasUndefinedConstantsOnlyInUpdateProbabilitiesAndRewards()) { + else if (std::is_same::value && !program.undefinedConstantsAreGraphPreserving()) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "The program contains undefined constants that appear in some places other than update probabilities and reward value expressions, which is not admitted."); } #endif @@ -137,7 +139,7 @@ namespace storm { for (auto const& expression : rangeExpressions) { solver->add(expression); } - solver->add(program.getInitialConstruct().getInitialStatesExpression()); + solver->add(program.getInitialStatesExpression()); // Proceed ss long as the solver can still enumerate initial states. std::vector initialStateIndices; @@ -187,8 +189,8 @@ namespace storm { ValueType stateRewardValue = storm::utility::zero(); if (rewardModel.get().hasStateRewards()) { for (auto const& stateReward : rewardModel.get().getStateRewards()) { - if (this->evaluator.asBool(stateReward.getStatePredicateExpression())) { - stateRewardValue += ValueType(this->evaluator.asRational(stateReward.getRewardValueExpression())); + if (this->evaluator->asBool(stateReward.getStatePredicateExpression())) { + stateRewardValue += ValueType(this->evaluator->asRational(stateReward.getRewardValueExpression())); } } } @@ -198,7 +200,7 @@ namespace storm { // If a terminal expression was set and we must not expand this state, return now. if (!this->terminalStates.empty()) { for (auto const& expressionBool : this->terminalStates) { - if (this->evaluator.asBool(expressionBool.first) == expressionBool.second) { + if (this->evaluator->asBool(expressionBool.first) == expressionBool.second) { return result; } } @@ -243,7 +245,7 @@ namespace storm { } if (this->options.isBuildChoiceLabelsSet()) { - globalChoice.addChoiceLabels(choice.getChoiceLabels()); + globalChoice.addLabels(choice.getLabels()); } } @@ -253,14 +255,14 @@ namespace storm { if (rewardModel.get().hasStateActionRewards()) { for (auto const& stateActionReward : rewardModel.get().getStateActionRewards()) { for (auto const& choice : allChoices) { - if (stateActionReward.getActionIndex() == choice.getActionIndex() && this->evaluator.asBool(stateActionReward.getStatePredicateExpression())) { - stateActionRewardValue += ValueType(this->evaluator.asRational(stateActionReward.getRewardValueExpression())) * choice.getTotalMass() / totalExitRate; + if (stateActionReward.getActionIndex() == choice.getActionIndex() && this->evaluator->asBool(stateActionReward.getStatePredicateExpression())) { + stateActionRewardValue += ValueType(this->evaluator->asRational(stateActionReward.getRewardValueExpression())) * choice.getTotalMass() / totalExitRate; } } } } - globalChoice.addChoiceReward(stateActionRewardValue); + globalChoice.addReward(stateActionRewardValue); } // Move the newly fused choice in place. @@ -273,6 +275,8 @@ namespace storm { result.addChoice(std::move(choice)); } + this->postprocess(result); + return result; } @@ -294,7 +298,7 @@ namespace storm { while (assignmentIt->getVariable() != boolIt->variable) { ++boolIt; } - newState.set(boolIt->bitOffset, this->evaluator.asBool(assignmentIt->getExpression())); + newState.set(boolIt->bitOffset, this->evaluator->asBool(assignmentIt->getExpression())); } // Iterate over all integer assignments and carry them out. @@ -303,7 +307,7 @@ namespace storm { while (assignmentIt->getVariable() != integerIt->variable) { ++integerIt; } - int_fast64_t assignedValue = this->evaluator.asInt(assignmentIt->getExpression()); + int_fast64_t assignedValue = this->evaluator->asInt(assignmentIt->getExpression()); STORM_LOG_THROW(assignedValue <= integerIt->upperBound, storm::exceptions::WrongFormatException, "The update " << update << " leads to an out-of-bounds value (" << assignedValue << ") for the variable '" << assignmentIt->getVariableName() << "'."); STORM_LOG_THROW(assignedValue >= integerIt->lowerBound, storm::exceptions::WrongFormatException, "The update " << update << " leads to an out-of-bounds value (" << assignedValue << ") for the variable '" << assignmentIt->getVariableName() << "'."); newState.setFromInt(integerIt->bitOffset, integerIt->bitWidth, assignedValue - integerIt->lowerBound); @@ -342,7 +346,7 @@ namespace storm { // Look up commands by their indices and add them if the guard evaluates to true in the given state. for (uint_fast64_t commandIndex : commandIndices) { storm::prism::Command const& command = module.getCommand(commandIndex); - if (this->evaluator.asBool(command.getGuardExpression())) { + if (this->evaluator->asBool(command.getGuardExpression())) { commands.push_back(command); } } @@ -375,7 +379,7 @@ namespace storm { if (command.isLabeled()) continue; // Skip the command, if it is not enabled. - if (!this->evaluator.asBool(command.getGuardExpression())) { + if (!this->evaluator->asBool(command.getGuardExpression())) { continue; } @@ -384,7 +388,7 @@ namespace storm { // Remember the command labels only if we were asked to. if (this->options.isBuildChoiceLabelsSet()) { - choice.addChoiceLabel(command.getGlobalIndex()); + choice.addLabel(command.getGlobalIndex()); } // Iterate over all updates of the current command. @@ -397,7 +401,7 @@ namespace storm { StateType stateIndex = stateToIdCallback(applyUpdate(state, update)); // Update the choice by adding the probability/target state to it. - ValueType probability = this->evaluator.asRational(update.getLikelihoodExpression()); + ValueType probability = this->evaluator->asRational(update.getLikelihoodExpression()); choice.addProbability(stateIndex, probability); probabilitySum += probability; } @@ -407,12 +411,12 @@ namespace storm { ValueType stateActionRewardValue = storm::utility::zero(); if (rewardModel.get().hasStateActionRewards()) { for (auto const& stateActionReward : rewardModel.get().getStateActionRewards()) { - if (stateActionReward.getActionIndex() == choice.getActionIndex() && this->evaluator.asBool(stateActionReward.getStatePredicateExpression())) { - stateActionRewardValue += ValueType(this->evaluator.asRational(stateActionReward.getRewardValueExpression())); + if (stateActionReward.getActionIndex() == choice.getActionIndex() && this->evaluator->asBool(stateActionReward.getStatePredicateExpression())) { + stateActionRewardValue += ValueType(this->evaluator->asRational(stateActionReward.getRewardValueExpression())); } } } - choice.addChoiceReward(stateActionRewardValue); + choice.addReward(stateActionRewardValue); } // Check that the resulting distribution is in fact a distribution. @@ -461,9 +465,9 @@ namespace storm { // and otherwise insert it. auto targetStateIt = newTargetStates->find(newTargetState); if (targetStateIt != newTargetStates->end()) { - targetStateIt->second += stateProbabilityPair.second * this->evaluator.asRational(update.getLikelihoodExpression()); + targetStateIt->second += stateProbabilityPair.second * this->evaluator->asRational(update.getLikelihoodExpression()); } else { - newTargetStates->emplace(newTargetState, stateProbabilityPair.second * this->evaluator.asRational(update.getLikelihoodExpression())); + newTargetStates->emplace(newTargetState, stateProbabilityPair.second * this->evaluator->asRational(update.getLikelihoodExpression())); } } } @@ -488,7 +492,7 @@ namespace storm { if (this->options.isBuildChoiceLabelsSet()) { // Add the labels of all commands to this choice. for (uint_fast64_t i = 0; i < iteratorList.size(); ++i) { - choice.addChoiceLabel(iteratorList[i]->get().getGlobalIndex()); + choice.addLabel(iteratorList[i]->get().getGlobalIndex()); } } @@ -508,12 +512,12 @@ namespace storm { ValueType stateActionRewardValue = storm::utility::zero(); if (rewardModel.get().hasStateActionRewards()) { for (auto const& stateActionReward : rewardModel.get().getStateActionRewards()) { - if (stateActionReward.getActionIndex() == choice.getActionIndex() && this->evaluator.asBool(stateActionReward.getStatePredicateExpression())) { - stateActionRewardValue += ValueType(this->evaluator.asRational(stateActionReward.getRewardValueExpression())); + if (stateActionReward.getActionIndex() == choice.getActionIndex() && this->evaluator->asBool(stateActionReward.getStatePredicateExpression())) { + stateActionRewardValue += ValueType(this->evaluator->asRational(stateActionReward.getRewardValueExpression())); } } } - choice.addChoiceReward(stateActionRewardValue); + choice.addReward(stateActionRewardValue); } // Dispose of the temporary maps. diff --git a/src/generator/PrismNextStateGenerator.h b/src/generator/PrismNextStateGenerator.h index f5728c872..dcf2e3f73 100644 --- a/src/generator/PrismNextStateGenerator.h +++ b/src/generator/PrismNextStateGenerator.h @@ -27,9 +27,9 @@ namespace storm { virtual storm::models::sparse::StateLabeling label(storm::storage::BitVectorHashMap const& states, std::vector const& initialStateIndices = {}, std::vector const& deadlockStateIndices = {}) override; - static void checkValid(storm::prism::Program const& program); - private: + void checkValid() const; + /*! * A delegate constructor that is used to preprocess the program before the constructor of the superclass is * being called. The last argument is only present to distinguish the signature of this constructor from the diff --git a/src/generator/StateBehavior.cpp b/src/generator/StateBehavior.cpp index a0af59bf6..c8ba1f10d 100644 --- a/src/generator/StateBehavior.cpp +++ b/src/generator/StateBehavior.cpp @@ -20,6 +20,11 @@ namespace storm { stateRewards.push_back(stateReward); } + template + void StateBehavior::addStateRewards(std::vector&& stateRewards) { + this->stateRewards = std::move(stateRewards); + } + template void StateBehavior::setExpanded(bool newValue) { this->expanded = newValue; @@ -45,6 +50,16 @@ namespace storm { return choices.end(); } + template + std::vector> const& StateBehavior::getChoices() const { + return choices; + } + + template + std::vector>& StateBehavior::getChoices() { + return choices; + } + template std::vector const& StateBehavior::getStateRewards() const { return stateRewards; diff --git a/src/generator/StateBehavior.h b/src/generator/StateBehavior.h index 8f81c8b30..f6219c996 100644 --- a/src/generator/StateBehavior.h +++ b/src/generator/StateBehavior.h @@ -25,7 +25,12 @@ namespace storm { * Adds the given state reward to the behavior of the state. */ void addStateReward(ValueType const& stateReward); - + + /*! + * Adds the given state rewards to the behavior of the state. + */ + void addStateRewards(std::vector&& stateRewards); + /*! * Sets whether the state was expanded. */ @@ -51,6 +56,16 @@ namespace storm { */ typename std::vector>::const_iterator end() const; + /*! + * Retrieves the vector of choices. + */ + std::vector> const& getChoices() const; + + /*! + * Retrieves the vector of choices. + */ + std::vector>& getChoices(); + /*! * Retrieves the list of state rewards under selected reward models. */ diff --git a/src/generator/VariableInformation.cpp b/src/generator/VariableInformation.cpp index b329cd42f..3545f1e49 100644 --- a/src/generator/VariableInformation.cpp +++ b/src/generator/VariableInformation.cpp @@ -2,6 +2,7 @@ #include "src/storage/prism/Program.h" #include "src/storage/jani/Model.h" +#include "src/storage/expressions/ExpressionManager.h" #include "src/utility/macros.h" #include "src/exceptions/InvalidArgumentException.h" @@ -19,7 +20,7 @@ namespace storm { // Intentionally left empty. } - LocationVariableInformation::LocationVariableInformation(uint64_t highestValue, uint_fast64_t bitOffset, uint_fast64_t bitWidth) : highestValue(highestValue), bitOffset(bitOffset), bitWidth(bitWidth) { + LocationVariableInformation::LocationVariableInformation(storm::expressions::Variable const& variable, uint64_t highestValue, uint_fast64_t bitOffset, uint_fast64_t bitWidth) : variable(variable), highestValue(highestValue), bitOffset(bitOffset), bitWidth(bitWidth) { // Intentionally left empty. } @@ -53,32 +54,48 @@ namespace storm { } VariableInformation::VariableInformation(storm::jani::Model const& model) : totalBitOffset(0) { + // Check that the model does not contain non-transient unbounded integer or non-transient real variables. + STORM_LOG_THROW(!model.getGlobalVariables().containsNonTransientRealVariables(), storm::exceptions::InvalidArgumentException, "Cannot build model from JANI model that contains global non-transient real variables."); + STORM_LOG_THROW(!model.getGlobalVariables().containsNonTransientUnboundedIntegerVariables(), storm::exceptions::InvalidArgumentException, "Cannot build model from JANI model that contains non-transient unbounded integer variables."); + for (auto const& automaton : model.getAutomata()) { + STORM_LOG_THROW(!automaton.getVariables().containsNonTransientUnboundedIntegerVariables(), storm::exceptions::InvalidArgumentException, "Cannot build model from JANI model that contains non-transient unbounded integer variables in automaton '" << automaton.getName() << "'."); + STORM_LOG_THROW(!automaton.getVariables().containsNonTransientRealVariables(), storm::exceptions::InvalidArgumentException, "Cannot build model from JANI model that contains non-transient real variables in automaton '" << automaton.getName() << "'."); + } + for (auto const& variable : model.getGlobalVariables().getBooleanVariables()) { - booleanVariables.emplace_back(variable.getExpressionVariable(), totalBitOffset, true); - ++totalBitOffset; + if (!variable.isTransient()) { + booleanVariables.emplace_back(variable.getExpressionVariable(), totalBitOffset, true); + ++totalBitOffset; + } } for (auto const& variable : model.getGlobalVariables().getBoundedIntegerVariables()) { - int_fast64_t lowerBound = variable.getLowerBound().evaluateAsInt(); - int_fast64_t upperBound = variable.getUpperBound().evaluateAsInt(); - uint_fast64_t bitwidth = static_cast(std::ceil(std::log2(upperBound - lowerBound + 1))); - integerVariables.emplace_back(variable.getExpressionVariable(), lowerBound, upperBound, totalBitOffset, bitwidth, true); - totalBitOffset += bitwidth; + if (!variable.isTransient()) { + int_fast64_t lowerBound = variable.getLowerBound().evaluateAsInt(); + int_fast64_t upperBound = variable.getUpperBound().evaluateAsInt(); + uint_fast64_t bitwidth = static_cast(std::ceil(std::log2(upperBound - lowerBound + 1))); + integerVariables.emplace_back(variable.getExpressionVariable(), lowerBound, upperBound, totalBitOffset, bitwidth, true); + totalBitOffset += bitwidth; + } } for (auto const& automaton : model.getAutomata()) { uint_fast64_t bitwidth = static_cast(std::ceil(std::log2(automaton.getNumberOfLocations()))); - locationVariables.emplace_back(automaton.getNumberOfLocations() - 1, totalBitOffset, bitwidth); + locationVariables.emplace_back(model.getManager().declareFreshIntegerVariable(false, "loc"), automaton.getNumberOfLocations() - 1, totalBitOffset, bitwidth); totalBitOffset += bitwidth; for (auto const& variable : automaton.getVariables().getBooleanVariables()) { - booleanVariables.emplace_back(variable.getExpressionVariable(), totalBitOffset); - ++totalBitOffset; + if (!variable.isTransient()) { + booleanVariables.emplace_back(variable.getExpressionVariable(), totalBitOffset); + ++totalBitOffset; + } } for (auto const& variable : automaton.getVariables().getBoundedIntegerVariables()) { - int_fast64_t lowerBound = variable.getLowerBound().evaluateAsInt(); - int_fast64_t upperBound = variable.getUpperBound().evaluateAsInt(); - uint_fast64_t bitwidth = static_cast(std::ceil(std::log2(upperBound - lowerBound + 1))); - integerVariables.emplace_back(variable.getExpressionVariable(), lowerBound, upperBound, totalBitOffset, bitwidth); - totalBitOffset += bitwidth; + if (!variable.isTransient()) { + int_fast64_t lowerBound = variable.getLowerBound().evaluateAsInt(); + int_fast64_t upperBound = variable.getUpperBound().evaluateAsInt(); + uint_fast64_t bitwidth = static_cast(std::ceil(std::log2(upperBound - lowerBound + 1))); + integerVariables.emplace_back(variable.getExpressionVariable(), lowerBound, upperBound, totalBitOffset, bitwidth); + totalBitOffset += bitwidth; + } } } diff --git a/src/generator/VariableInformation.h b/src/generator/VariableInformation.h index 1aa8ee95c..0bbef3a6e 100644 --- a/src/generator/VariableInformation.h +++ b/src/generator/VariableInformation.h @@ -56,7 +56,10 @@ namespace storm { // A structure storing information about the location variables of the model. struct LocationVariableInformation { - LocationVariableInformation(uint64_t highestValue, uint_fast64_t bitOffset, uint_fast64_t bitWidth); + LocationVariableInformation(storm::expressions::Variable const& variable, uint64_t highestValue, uint_fast64_t bitOffset, uint_fast64_t bitWidth); + + // The expression variable for this location. + storm::expressions::Variable variable; // The highest possible location value. uint64_t highestValue; @@ -98,4 +101,4 @@ namespace storm { } } -#endif /* STORM_GENERATOR_VARIABLEINFORMATION_H_ */ \ No newline at end of file +#endif /* STORM_GENERATOR_VARIABLEINFORMATION_H_ */ diff --git a/src/modelchecker/prctl/helper/SymbolicDtmcPrctlHelper.cpp b/src/modelchecker/prctl/helper/SymbolicDtmcPrctlHelper.cpp index b5adb7e15..6266fbb73 100644 --- a/src/modelchecker/prctl/helper/SymbolicDtmcPrctlHelper.cpp +++ b/src/modelchecker/prctl/helper/SymbolicDtmcPrctlHelper.cpp @@ -172,7 +172,7 @@ namespace storm { // for solving the equation system (i.e. compute (I-A)). submatrix *= maybeStatesAdd.swapVariables(model.getRowColumnMetaVariablePairs()); submatrix = (model.getRowColumnIdentity() * maybeStatesAdd) - submatrix; - + // Solve the equation system. std::unique_ptr> solver = linearEquationSolverFactory.create(submatrix, maybeStates, model.getRowVariables(), model.getColumnVariables(), model.getRowColumnMetaVariablePairs()); storm::dd::Add result = solver->solveEquations(model.getManager().getConstant(0.5) * maybeStatesAdd, subvector); diff --git a/src/modelchecker/region/ApproximationModel.cpp b/src/modelchecker/region/ApproximationModel.cpp index 2c5ab2e3c..1c9b9d5c2 100644 --- a/src/modelchecker/region/ApproximationModel.cpp +++ b/src/modelchecker/region/ApproximationModel.cpp @@ -33,7 +33,7 @@ namespace storm { this->computeRewards=true; STORM_LOG_THROW(this->typeOfParametricModel==storm::models::ModelType::Dtmc, storm::exceptions::InvalidArgumentException, "Approximation with rewards is only implemented for Dtmcs"); STORM_LOG_THROW(parametricModel.hasUniqueRewardModel(), storm::exceptions::InvalidArgumentException, "The rewardmodel of the approximation model should be unique"); - STORM_LOG_THROW(parametricModel.getUniqueRewardModel()->second.hasOnlyStateRewards(), storm::exceptions::InvalidArgumentException, "The rewardmodel of the approximation model should have state rewards only"); + STORM_LOG_THROW(parametricModel.getUniqueRewardModel().hasOnlyStateRewards(), storm::exceptions::InvalidArgumentException, "The rewardmodel of the approximation model should have state rewards only"); } else { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Invalid formula: " << formula << ". Approximation model only supports eventually or reachability reward formulae."); } @@ -211,8 +211,8 @@ namespace storm { ConstantType dummyNonZeroValue = storm::utility::one(); auto vectorIt = this->vectorData.vector.begin(); for(auto oldState : this->maybeStates){ - if(storm::utility::isConstant(parametricModel.getUniqueRewardModel()->second.getStateRewardVector()[oldState])){ - ConstantType reward = storm::utility::region::convertNumber(storm::utility::region::getConstantPart(parametricModel.getUniqueRewardModel()->second.getStateRewardVector()[oldState])); + if(storm::utility::isConstant(parametricModel.getUniqueRewardModel().getStateRewardVector()[oldState])){ + ConstantType reward = storm::utility::region::convertNumber(storm::utility::region::getConstantPart(parametricModel.getUniqueRewardModel().getStateRewardVector()[oldState])); //Add one of these entries for every row in the row group of oldState for(auto matrixRow=this->matrixData.matrix.getRowGroupIndices()[oldState]; matrixRowmatrixData.matrix.getRowGroupIndices()[oldState+1]; ++matrixRow){ *vectorIt = reward; @@ -220,7 +220,7 @@ namespace storm { } } else { std::set occurringRewVariables; - storm::utility::region::gatherOccurringVariables(parametricModel.getUniqueRewardModel()->second.getStateRewardVector()[oldState], occurringRewVariables); + storm::utility::region::gatherOccurringVariables(parametricModel.getUniqueRewardModel().getStateRewardVector()[oldState], occurringRewVariables); // For each row in the row group of oldState, we get the corresponding substitution and insert the FunctionSubstitution for(auto matrixRow=this->matrixData.matrix.getRowGroupIndices()[oldState]; matrixRowmatrixData.matrix.getRowGroupIndices()[oldState+1]; ++matrixRow){ //Extend the substitution for the probabilities with the reward parameters @@ -230,7 +230,7 @@ namespace storm { substitution.insert(typename std::map::value_type(rewardVar, RegionBoundary::UNSPECIFIED)); } // insert the FunctionSubstitution - auto functionsIt = this->funcSubData.functions.insert(FunctionEntry(FunctionSubstitution(parametricModel.getUniqueRewardModel()->second.getStateRewardVector()[oldState], this->matrixData.rowSubstitutions[matrixRow]), dummyNonZeroValue)).first; + auto functionsIt = this->funcSubData.functions.insert(FunctionEntry(FunctionSubstitution(parametricModel.getUniqueRewardModel().getStateRewardVector()[oldState], this->matrixData.rowSubstitutions[matrixRow]), dummyNonZeroValue)).first; //insert assignment and dummy data this->vectorData.assignment.emplace_back(vectorIt, functionsIt->second); *vectorIt = dummyNonZeroValue; diff --git a/src/modelchecker/region/SamplingModel.cpp b/src/modelchecker/region/SamplingModel.cpp index 81c7aa61f..2a3d960dc 100644 --- a/src/modelchecker/region/SamplingModel.cpp +++ b/src/modelchecker/region/SamplingModel.cpp @@ -43,7 +43,7 @@ namespace storm { this->computeRewards=true; STORM_LOG_THROW(this->typeOfParametricModel==storm::models::ModelType::Dtmc, storm::exceptions::InvalidArgumentException, "Sampling with rewards is only implemented for Dtmcs"); STORM_LOG_THROW(parametricModel.hasUniqueRewardModel(), storm::exceptions::InvalidArgumentException, "The rewardmodel of the sampling model should be unique"); - STORM_LOG_THROW(parametricModel.getUniqueRewardModel()->second.hasOnlyStateRewards(), storm::exceptions::InvalidArgumentException, "The rewardmodel of the sampling model should have state rewards only"); + STORM_LOG_THROW(parametricModel.getUniqueRewardModel().hasOnlyStateRewards(), storm::exceptions::InvalidArgumentException, "The rewardmodel of the sampling model should have state rewards only"); STORM_LOG_THROW(formula->getSubformula().isEventuallyFormula(), storm::exceptions::InvalidArgumentException, "The subformula should be a reachabilityreward formula"); STORM_LOG_THROW(formula->getSubformula().asEventuallyFormula().getSubformula().isInFragment(storm::logic::propositional()), storm::exceptions::InvalidArgumentException, "The subsubformula should be a propositional formula"); } else { @@ -131,7 +131,7 @@ namespace storm { std::vector b; if(this->computeRewards){ b.resize(submatrix.getRowCount()); - storm::utility::vector::selectVectorValues(b, this->maybeStates, instantiatedModel.getUniqueRewardModel()->second.getStateRewardVector()); + storm::utility::vector::selectVectorValues(b, this->maybeStates, instantiatedModel.getUniqueRewardModel().getStateRewardVector()); } else { b = instantiatedModel.getTransitionMatrix().getConstrainedRowSumVector(this->maybeStates, this->targetStates); } diff --git a/src/modelchecker/region/SparseDtmcRegionModelChecker.cpp b/src/modelchecker/region/SparseDtmcRegionModelChecker.cpp index 099eeb62f..3c091ab9f 100644 --- a/src/modelchecker/region/SparseDtmcRegionModelChecker.cpp +++ b/src/modelchecker/region/SparseDtmcRegionModelChecker.cpp @@ -317,7 +317,7 @@ namespace storm { } else { STORM_LOG_THROW(this->getModel()->hasRewardModel(), storm::exceptions::InvalidArgumentException, "No reward model specified"); STORM_LOG_THROW(this->getModel()->hasUniqueRewardModel(), storm::exceptions::InvalidArgumentException, "Ambiguous reward model. Specify it in the formula!"); - rewardModel=&(this->getModel()->getUniqueRewardModel()->second); + rewardModel=&(this->getModel()->getUniqueRewardModel()); } //Get target states storm::modelchecker::SparsePropositionalModelChecker modelChecker(*(this->getModel())); @@ -416,7 +416,7 @@ namespace storm { storm::storage::BitVector phiStates(simpleModel.getNumberOfStates(), true); std::vector values; if(this->isComputeRewards()){ - values = simpleModel.getUniqueRewardModel()->second.getTotalRewardVector(maybeStates.getNumberOfSetBits(), simpleModel.getTransitionMatrix(), maybeStates); + values = simpleModel.getUniqueRewardModel().getTotalRewardVector(maybeStates.getNumberOfSetBits(), simpleModel.getTransitionMatrix(), maybeStates); } else { values = oneStepProbabilities; } diff --git a/src/modelchecker/results/ExplicitQualitativeCheckResult.cpp b/src/modelchecker/results/ExplicitQualitativeCheckResult.cpp index aa86846fa..f5488122c 100644 --- a/src/modelchecker/results/ExplicitQualitativeCheckResult.cpp +++ b/src/modelchecker/results/ExplicitQualitativeCheckResult.cpp @@ -70,6 +70,47 @@ namespace storm { return *this; } + + bool ExplicitQualitativeCheckResult::existsTrue() const { + if (this->isResultForAllStates()) { + return !boost::get(truthValues).empty(); + } else { + for (auto& element : boost::get(truthValues)) { + if(element.second) { + return true; + } + } + return false; + } + } + bool ExplicitQualitativeCheckResult::forallTrue() const { + if (this->isResultForAllStates()) { + return boost::get(truthValues).full(); + } else { + for (auto& element : boost::get(truthValues)) { + if(!element.second) { + return false; + } + } + return true; + } + } + + uint64_t ExplicitQualitativeCheckResult::count() const { + if (this->isResultForAllStates()) { + return boost::get(truthValues).getNumberOfSetBits(); + } else { + uint64_t result = 0; + for (auto& element : boost::get(truthValues)) { + if(element.second) { + ++result; + } + } + return result; + } + } + + bool ExplicitQualitativeCheckResult::operator[](storm::storage::sparse::state_type state) const { if (this->isResultForAllStates()) { return boost::get(truthValues).get(state); diff --git a/src/modelchecker/results/ExplicitQualitativeCheckResult.h b/src/modelchecker/results/ExplicitQualitativeCheckResult.h index 665675cfd..afb54b4be 100644 --- a/src/modelchecker/results/ExplicitQualitativeCheckResult.h +++ b/src/modelchecker/results/ExplicitQualitativeCheckResult.h @@ -47,6 +47,12 @@ namespace storm { vector_type const& getTruthValuesVector() const; map_type const& getTruthValuesVectorMap() const; + + virtual bool existsTrue() const override; + virtual bool forallTrue() const override; + virtual uint64_t count() const override; + + virtual std::ostream& writeToStream(std::ostream& out) const override; virtual void filter(QualitativeCheckResult const& filter) override; diff --git a/src/modelchecker/results/ExplicitQuantitativeCheckResult.cpp b/src/modelchecker/results/ExplicitQuantitativeCheckResult.cpp index 6233216d9..87ba9e0fa 100644 --- a/src/modelchecker/results/ExplicitQuantitativeCheckResult.cpp +++ b/src/modelchecker/results/ExplicitQuantitativeCheckResult.cpp @@ -3,6 +3,7 @@ #include "src/modelchecker/results/ExplicitQualitativeCheckResult.h" #include "src/storage/BitVector.h" #include "src/utility/macros.h" +#include "src/utility/constants.h" #include "src/utility/vector.h" #include "src/exceptions/InvalidOperationException.h" #include "src/exceptions/InvalidAccessException.h" @@ -81,6 +82,64 @@ namespace storm { } } + template + ValueType ExplicitQuantitativeCheckResult::getMin() const { + STORM_LOG_THROW(!values.empty(),storm::exceptions::InvalidOperationException, "Minimum of empty set is not defined"); + + if (this->isResultForAllStates()) { + return storm::utility::minimum(boost::get(values)); + } else { + return storm::utility::minimum(boost::get(values)); + } + } + + + template + ValueType ExplicitQuantitativeCheckResult::getMax() const { + STORM_LOG_THROW(!values.empty(),storm::exceptions::InvalidOperationException, "Minimum of empty set is not defined"); + + if (this->isResultForAllStates()) { + return storm::utility::maximum(boost::get(values)); + } else { + return storm::utility::maximum(boost::get(values)); + } + } + + template + ValueType ExplicitQuantitativeCheckResult::sum() const { + STORM_LOG_THROW(!values.empty(),storm::exceptions::InvalidOperationException, "Minimum of empty set is not defined"); + + ValueType sum = storm::utility::zero(); + if (this->isResultForAllStates()) { + for (auto& element : boost::get(values)) { + sum += element; + } + } else { + for (auto& element : boost::get(values)) { + sum += element.second; + } + } + return sum; + } + + template + ValueType ExplicitQuantitativeCheckResult::average() const { + STORM_LOG_THROW(!values.empty(),storm::exceptions::InvalidOperationException, "Minimum of empty set is not defined"); + + ValueType sum = storm::utility::zero(); + if (this->isResultForAllStates()) { + for (auto& element : boost::get(values)) { + sum += element; + } + return sum / boost::get(values).size(); + } else { + for (auto& element : boost::get(values)) { + sum += element.second; + } + return sum / boost::get(values).size(); + } + } + template bool ExplicitQuantitativeCheckResult::hasScheduler() const { return static_cast(scheduler); diff --git a/src/modelchecker/results/ExplicitQuantitativeCheckResult.h b/src/modelchecker/results/ExplicitQuantitativeCheckResult.h index 639da4fa7..d2bb9f711 100644 --- a/src/modelchecker/results/ExplicitQuantitativeCheckResult.h +++ b/src/modelchecker/results/ExplicitQuantitativeCheckResult.h @@ -53,6 +53,12 @@ namespace storm { virtual void oneMinus() override; + + virtual ValueType getMin() const override; + virtual ValueType getMax() const override; + virtual ValueType average() const override; + virtual ValueType sum() const override; + bool hasScheduler() const; void setScheduler(std::unique_ptr&& scheduler); storm::storage::Scheduler const& getScheduler() const; diff --git a/src/modelchecker/results/FilterType.cpp b/src/modelchecker/results/FilterType.cpp new file mode 100644 index 000000000..3a15c8169 --- /dev/null +++ b/src/modelchecker/results/FilterType.cpp @@ -0,0 +1,32 @@ +#include "FilterType.h" + + +namespace storm { + namespace modelchecker { + + std::string toString(FilterType ft) { + switch(ft) { + case FilterType::ARGMAX: + return "the argmax"; + case FilterType::ARGMIN: + return "the argmin"; + case FilterType::AVG: + return "the average"; + case FilterType::COUNT: + return "the number of"; + case FilterType::EXISTS: + return "whether there exists a state in"; + case FilterType::FORALL: + return "whether for all states in"; + case FilterType::MAX: + return "the maximum"; + case FilterType::MIN: + return "the minumum"; + case FilterType::SUM: + return "the sum"; + case FilterType::VALUES: + return "the values"; + } + } + } +} \ No newline at end of file diff --git a/src/modelchecker/results/FilterType.h b/src/modelchecker/results/FilterType.h new file mode 100644 index 000000000..040b09084 --- /dev/null +++ b/src/modelchecker/results/FilterType.h @@ -0,0 +1,14 @@ +#pragma once +#include + +namespace storm { + namespace modelchecker { + + enum class StateFilter { ARGMIN, ARGMAX }; + + enum class FilterType { MIN, MAX, SUM, AVG, COUNT, FORALL, EXISTS, ARGMIN, ARGMAX, VALUES }; + + std::string toString(FilterType); + bool isStateFilter(FilterType); + } +} \ No newline at end of file diff --git a/src/modelchecker/results/HybridQuantitativeCheckResult.cpp b/src/modelchecker/results/HybridQuantitativeCheckResult.cpp index a32095e40..2aeab204f 100644 --- a/src/modelchecker/results/HybridQuantitativeCheckResult.cpp +++ b/src/modelchecker/results/HybridQuantitativeCheckResult.cpp @@ -5,9 +5,12 @@ #include "src/storage/dd/cudd/CuddAddIterator.h" #include "src/exceptions/InvalidOperationException.h" + +#include "src/exceptions/NotImplementedException.h" #include "src/utility/macros.h" #include "src/utility/constants.h" + namespace storm { namespace modelchecker { template @@ -54,7 +57,7 @@ namespace storm { template bool HybridQuantitativeCheckResult::isResultForAllStates() const { - return true; + return (symbolicStates || explicitStates) == reachableStates; } template @@ -164,6 +167,20 @@ namespace storm { return max; } + template + ValueType HybridQuantitativeCheckResult::sum() const { + ValueType sum = symbolicValues.sumAbstract(symbolicValues.getContainedMetaVariables()).getValue(); + for (auto const& value : explicitValues) { + sum += value; + } + return sum; + } + + template + ValueType HybridQuantitativeCheckResult::average() const { + return this->sum() / (symbolicStates || explicitStates).getNonZeroCount(); + } + template void HybridQuantitativeCheckResult::oneMinus() { storm::dd::Add one = symbolicValues.getDdManager().template getAddOne(); @@ -175,8 +192,9 @@ namespace storm { } } + // Explicitly instantiate the class. template class HybridQuantitativeCheckResult; template class HybridQuantitativeCheckResult; } -} \ No newline at end of file +} diff --git a/src/modelchecker/results/HybridQuantitativeCheckResult.h b/src/modelchecker/results/HybridQuantitativeCheckResult.h index 8b7db1cea..43b1a39a4 100644 --- a/src/modelchecker/results/HybridQuantitativeCheckResult.h +++ b/src/modelchecker/results/HybridQuantitativeCheckResult.h @@ -46,9 +46,13 @@ namespace storm { virtual void filter(QualitativeCheckResult const& filter) override; - virtual ValueType getMin() const; + virtual ValueType getMin() const override; - virtual ValueType getMax() const; + virtual ValueType getMax() const override; + + virtual ValueType sum() const override; + + virtual ValueType average() const override; virtual void oneMinus() override; @@ -74,4 +78,4 @@ namespace storm { } } -#endif /* STORM_MODELCHECKER_HYBRIDQUANTITATIVECHECKRESULT_H_ */ \ No newline at end of file +#endif /* STORM_MODELCHECKER_HYBRIDQUANTITATIVECHECKRESULT_H_ */ diff --git a/src/modelchecker/results/QualitativeCheckResult.h b/src/modelchecker/results/QualitativeCheckResult.h index 608e2c0d1..f4a89665b 100644 --- a/src/modelchecker/results/QualitativeCheckResult.h +++ b/src/modelchecker/results/QualitativeCheckResult.h @@ -12,6 +12,10 @@ namespace storm { virtual QualitativeCheckResult& operator|=(QualitativeCheckResult const& other); virtual void complement(); + virtual bool existsTrue() const = 0; + virtual bool forallTrue() const = 0; + virtual uint64_t count() const = 0; + virtual bool isQualitative() const override; }; } diff --git a/src/modelchecker/results/QuantitativeCheckResult.h b/src/modelchecker/results/QuantitativeCheckResult.h index bb268ae3f..2e9abe6a9 100644 --- a/src/modelchecker/results/QuantitativeCheckResult.h +++ b/src/modelchecker/results/QuantitativeCheckResult.h @@ -1,5 +1,4 @@ -#ifndef STORM_MODELCHECKER_QUANTITATIVECHECKRESULT_H_ -#define STORM_MODELCHECKER_QUANTITATIVECHECKRESULT_H_ +#pragma once #include "src/modelchecker/results/CheckResult.h" @@ -14,9 +13,16 @@ namespace storm { virtual void oneMinus() = 0; + + virtual ValueType getMin() const = 0; + + virtual ValueType getMax() const = 0; + + virtual ValueType average() const = 0; + virtual ValueType sum() const = 0; + virtual bool isQuantitative() const override; }; } } -#endif /* STORM_MODELCHECKER_QUANTITATIVECHECKRESULT_H_ */ \ No newline at end of file diff --git a/src/modelchecker/results/SymbolicQualitativeCheckResult.cpp b/src/modelchecker/results/SymbolicQualitativeCheckResult.cpp index 2275b942f..da97a38da 100644 --- a/src/modelchecker/results/SymbolicQualitativeCheckResult.cpp +++ b/src/modelchecker/results/SymbolicQualitativeCheckResult.cpp @@ -3,10 +3,12 @@ #include "src/utility/macros.h" #include "src/exceptions/InvalidOperationException.h" +#include "src/exceptions/NotImplementedException.h" + namespace storm { namespace modelchecker { template - SymbolicQualitativeCheckResult::SymbolicQualitativeCheckResult(storm::dd::Bdd const& reachableStates, storm::dd::Bdd const& truthValues) : reachableStates(reachableStates), truthValues(truthValues) { + SymbolicQualitativeCheckResult::SymbolicQualitativeCheckResult(storm::dd::Bdd const& reachableStates, storm::dd::Bdd const& truthValues) : reachableStates(reachableStates), states(reachableStates), truthValues(truthValues) { // Intentionally left empty. } @@ -17,7 +19,7 @@ namespace storm { template bool SymbolicQualitativeCheckResult::isResultForAllStates() const { - return true; + return reachableStates == states; } template @@ -46,7 +48,22 @@ namespace storm { template storm::dd::Bdd const& SymbolicQualitativeCheckResult::getTruthValuesVector() const { - return truthValues; + return this->truthValues; + } + + template + bool SymbolicQualitativeCheckResult::existsTrue() const { + return !this->truthValues.isZero(); + } + + template + bool SymbolicQualitativeCheckResult::forallTrue() const { + return this->truthValues == this->states; + } + + template + uint64_t SymbolicQualitativeCheckResult::count() const { + return this->truthValues.getNonZeroCount(); } template @@ -63,9 +80,10 @@ namespace storm { void SymbolicQualitativeCheckResult::filter(QualitativeCheckResult const& filter) { STORM_LOG_THROW(filter.isSymbolicQualitativeCheckResult(), storm::exceptions::InvalidOperationException, "Cannot filter symbolic check result with non-symbolic filter."); this->truthValues &= filter.asSymbolicQualitativeCheckResult().getTruthValuesVector(); + this->states &= filter.asSymbolicQualitativeCheckResult().getTruthValuesVector(); } template class SymbolicQualitativeCheckResult; template class SymbolicQualitativeCheckResult; } -} \ No newline at end of file +} diff --git a/src/modelchecker/results/SymbolicQualitativeCheckResult.h b/src/modelchecker/results/SymbolicQualitativeCheckResult.h index 3e94f5ee8..db3ee1ab5 100644 --- a/src/modelchecker/results/SymbolicQualitativeCheckResult.h +++ b/src/modelchecker/results/SymbolicQualitativeCheckResult.h @@ -30,6 +30,12 @@ namespace storm { virtual QualitativeCheckResult& operator|=(QualitativeCheckResult const& other) override; virtual void complement() override; + + virtual bool existsTrue() const override; + virtual bool forallTrue() const override; + virtual uint64_t count() const override; + + storm::dd::Bdd const& getTruthValuesVector() const; virtual std::ostream& writeToStream(std::ostream& out) const override; @@ -39,11 +45,14 @@ namespace storm { private: // The set of all reachable states. storm::dd::Bdd reachableStates; - + + // The set of states for which this check result contains values. + storm::dd::Bdd states; + // The values of the qualitative check result. storm::dd::Bdd truthValues; }; } } -#endif /* STORM_MODELCHECKER_SYMBOLICQUALITATIVECHECKRESULT_H_ */ \ No newline at end of file +#endif /* STORM_MODELCHECKER_SYMBOLICQUALITATIVECHECKRESULT_H_ */ diff --git a/src/modelchecker/results/SymbolicQuantitativeCheckResult.cpp b/src/modelchecker/results/SymbolicQuantitativeCheckResult.cpp index 57f68bdf1..5bc712d2d 100644 --- a/src/modelchecker/results/SymbolicQuantitativeCheckResult.cpp +++ b/src/modelchecker/results/SymbolicQuantitativeCheckResult.cpp @@ -5,6 +5,8 @@ #include "src/storage/dd/cudd/CuddAddIterator.h" #include "src/exceptions/InvalidOperationException.h" + +#include "src/exceptions/NotImplementedException.h" #include "src/utility/macros.h" #include "src/utility/constants.h" @@ -89,6 +91,16 @@ namespace storm { return this->values.getMax(); } + template + ValueType SymbolicQuantitativeCheckResult::average() const { + return this->sum() / this->states.getNonZeroCount(); + } + + template + ValueType SymbolicQuantitativeCheckResult::sum() const { + return this->values.sumAbstract(this->values.getContainedMetaVariables()).getValue(); + } + template void SymbolicQuantitativeCheckResult::oneMinus() { storm::dd::Add one = values.getDdManager().template getAddOne(); @@ -99,4 +111,4 @@ namespace storm { template class SymbolicQuantitativeCheckResult; template class SymbolicQuantitativeCheckResult; } -} \ No newline at end of file +} diff --git a/src/modelchecker/results/SymbolicQuantitativeCheckResult.h b/src/modelchecker/results/SymbolicQuantitativeCheckResult.h index fd03da786..36b0c4cce 100644 --- a/src/modelchecker/results/SymbolicQuantitativeCheckResult.h +++ b/src/modelchecker/results/SymbolicQuantitativeCheckResult.h @@ -35,9 +35,12 @@ namespace storm { virtual void filter(QualitativeCheckResult const& filter) override; - virtual ValueType getMin() const; + virtual ValueType getMin() const override; - virtual ValueType getMax() const; + virtual ValueType getMax() const override; + + virtual ValueType average() const override; + virtual ValueType sum() const override; virtual void oneMinus() override; diff --git a/src/models/sparse/MarkovAutomaton.cpp b/src/models/sparse/MarkovAutomaton.cpp index 3667e8d90..32525ad5e 100644 --- a/src/models/sparse/MarkovAutomaton.cpp +++ b/src/models/sparse/MarkovAutomaton.cpp @@ -259,15 +259,15 @@ namespace storm { this->exitRates.resize(this->getNumberOfStates()); for (uint_fast64_t state = 0; state< this->getNumberOfStates(); ++state) { uint_fast64_t row = this->getTransitionMatrix().getRowGroupIndices()[state]; - if(this->markovianStates.get(state)) { + if (this->markovianStates.get(state)) { this->exitRates[state] = this->getTransitionMatrix().getRowSum(row); for (auto& transition : this->getTransitionMatrix().getRow(row)) { transition.setValue(transition.getValue() / this->exitRates[state]); } ++row; } - for(; row < this->getTransitionMatrix().getRowGroupIndices()[state+1]; ++row) { - STORM_LOG_THROW(storm::utility::isOne(this->getTransitionMatrix().getRowSum(row)), storm::exceptions::InvalidArgumentException, "Transitions of rateMatrix do not sum up to one for some non-Markovian choice. Sum is " << this->getTransitionMatrix().getRowSum(row) << ". State is " << state << ". Choice is " << row << "."); + for (; row < this->getTransitionMatrix().getRowGroupIndices()[state+1]; ++row) { + STORM_LOG_THROW(storm::utility::isOne(this->getTransitionMatrix().getRowSum(row)), storm::exceptions::InvalidArgumentException, "Entries of transition matrix do not sum up to one for (non-Markovian) choice " << row << " of state " << state << " (sum is " << this->getTransitionMatrix().getRowSum(row) << ")."); } } } diff --git a/src/models/sparse/Model.cpp b/src/models/sparse/Model.cpp index ef4ad7b25..34ec5d2cc 100644 --- a/src/models/sparse/Model.cpp +++ b/src/models/sparse/Model.cpp @@ -101,7 +101,7 @@ namespace storm { if (it == this->rewardModels.end()) { if (rewardModelName.empty()) { if (this->hasUniqueRewardModel()) { - return this->getUniqueRewardModel()->second; + return this->getUniqueRewardModel(); } else { STORM_LOG_THROW(false, storm::exceptions::IllegalArgumentException, "Unable to refer to default reward model, because there is no default model or it is not unique."); } @@ -142,15 +142,15 @@ namespace storm { } template - typename std::unordered_map::const_iterator Model::getUniqueRewardModel() const { + RewardModelType const& Model::getUniqueRewardModel() const { STORM_LOG_THROW(this->getNumberOfRewardModels() == 1, storm::exceptions::IllegalFunctionCallException, "The reward model is not unique."); - return this->rewardModels.cbegin(); + return this->rewardModels.cbegin()->second; } template - typename std::unordered_map::iterator Model::getUniqueRewardModel() { + RewardModelType& Model::getUniqueRewardModel() { STORM_LOG_THROW(this->getNumberOfRewardModels() == 1, storm::exceptions::IllegalFunctionCallException, "The reward model is not unique."); - return this->rewardModels.begin(); + return this->rewardModels.begin()->second; } template diff --git a/src/models/sparse/Model.h b/src/models/sparse/Model.h index 99288fd4a..8087df6a9 100644 --- a/src/models/sparse/Model.h +++ b/src/models/sparse/Model.h @@ -180,16 +180,16 @@ namespace storm { /*! * Retrieves the unique reward model, if there exists exactly one. Otherwise, an exception is thrown. * - * @return An iterator to the name and the reward model. + * @return The requested reward model. */ - typename std::unordered_map::const_iterator getUniqueRewardModel() const; + RewardModelType const& getUniqueRewardModel() const; /*! * Retrieves the unique reward model, if there exists exactly one. Otherwise, an exception is thrown. * - * @return An iterator to the name and the reward model. + * @return The requested reward model. */ - typename std::unordered_map::iterator getUniqueRewardModel(); + RewardModelType& getUniqueRewardModel(); /*! * Retrieves whether the model has a unique reward model. diff --git a/src/models/sparse/NondeterministicModel.cpp b/src/models/sparse/NondeterministicModel.cpp index f3c4d29d4..0d97b87d0 100644 --- a/src/models/sparse/NondeterministicModel.cpp +++ b/src/models/sparse/NondeterministicModel.cpp @@ -72,7 +72,7 @@ namespace storm { std::cout << i++ << "/" << modifications.size() << std::endl; rewardModel.setStateActionReward(mod.first, mod.second); } - }; + } template template @@ -81,7 +81,7 @@ namespace storm { for(auto const& mod : modifications) { rewardModel.setStateReward(mod.first, mod.second); } - }; + } template void NondeterministicModel::reduceToStateBasedRewards() { diff --git a/src/models/symbolic/Model.cpp b/src/models/symbolic/Model.cpp index 16339c0d1..cfca623dc 100644 --- a/src/models/symbolic/Model.cpp +++ b/src/models/symbolic/Model.cpp @@ -156,7 +156,7 @@ namespace storm { if (it == this->rewardModels.end()) { if (rewardModelName.empty()) { if (this->hasUniqueRewardModel()) { - return this->getUniqueRewardModel()->second; + return this->getUniqueRewardModel(); } else { STORM_LOG_THROW(false, storm::exceptions::IllegalArgumentException, "Unable to refer to default reward model, because there is no default model or it is not unique."); } @@ -168,11 +168,17 @@ namespace storm { } template - typename std::unordered_map::RewardModelType>::const_iterator Model::getUniqueRewardModel() const { + typename Model::RewardModelType const& Model::getUniqueRewardModel() const { STORM_LOG_THROW(this->hasUniqueRewardModel(), storm::exceptions::InvalidOperationException, "Cannot retrieve unique reward model, because there is no unique one."); - return this->rewardModels.begin(); + return this->rewardModels.cbegin()->second; } - + + template + typename Model::RewardModelType& Model::getUniqueRewardModel() { + STORM_LOG_THROW(this->hasUniqueRewardModel(), storm::exceptions::InvalidOperationException, "Cannot retrieve unique reward model, because there is no unique one."); + return this->rewardModels.begin()->second; + } + template bool Model::hasUniqueRewardModel() const { return this->rewardModels.size() == 1; diff --git a/src/models/symbolic/Model.h b/src/models/symbolic/Model.h index b2e9d3e87..e9ebf8ddf 100644 --- a/src/models/symbolic/Model.h +++ b/src/models/symbolic/Model.h @@ -207,9 +207,16 @@ namespace storm { /*! * Retrieves the unique reward model, if there exists exactly one. Otherwise, an exception is thrown. * - * @return An iterator to the name and the reward model. + * @return The requested reward model. */ - typename std::unordered_map::const_iterator getUniqueRewardModel() const; + RewardModelType const& getUniqueRewardModel() const; + + /*! + * Retrieves the unique reward model, if there exists exactly one. Otherwise, an exception is thrown. + * + * @return The requested reward model. + */ + RewardModelType& getUniqueRewardModel(); /*! * Retrieves whether the model has a unique reward model. diff --git a/src/parser/CSVParser.cpp b/src/parser/CSVParser.cpp new file mode 100644 index 000000000..04e26a3fa --- /dev/null +++ b/src/parser/CSVParser.cpp @@ -0,0 +1,23 @@ +#include "src/parser/CSVParser.h" +#include + +#include +#include "src/utility/macros.h" +#include "src/exceptions/InvalidArgumentException.h" + + +namespace storm { + namespace parser { + + std::vector parseCommaSeperatedValues(std::string const& input) { + std::vector values; + std::vector definitions; + boost::split(definitions, input, boost::is_any_of(",")); + for (auto& definition : definitions) { + boost::trim(definition); + values.push_back(definition); + } + return values; + } + } +} \ No newline at end of file diff --git a/src/parser/CSVParser.h b/src/parser/CSVParser.h new file mode 100644 index 000000000..ec21f2e80 --- /dev/null +++ b/src/parser/CSVParser.h @@ -0,0 +1,12 @@ +#include +#include + +namespace storm { + namespace parser { + /** + * Given a string seperated by commas, returns the values. + */ + std::vector parseCommaSeperatedValues(std::string const& input); + + } +} \ No newline at end of file diff --git a/src/parser/ExpressionCreator.cpp b/src/parser/ExpressionCreator.cpp new file mode 100644 index 000000000..85f65b012 --- /dev/null +++ b/src/parser/ExpressionCreator.cpp @@ -0,0 +1,265 @@ +#include "ExpressionCreator.h" + +#include "src/storage/expressions/Expression.h" +#include "src/storage/expressions/ExpressionManager.h" +#include "src/exceptions/InvalidTypeException.h" +#include "src/exceptions/InvalidArgumentException.h" +#include "src/exceptions/WrongFormatException.h" + +#include "src/utility/constants.h" +#include "src/utility/macros.h" + +namespace storm { + namespace parser { + + ExpressionCreator::ExpressionCreator(storm::expressions::ExpressionManager const& manager) : manager(manager) { + // Intenetionally left empty. + } + + storm::expressions::Expression ExpressionCreator::createIteExpression(storm::expressions::Expression const& e1, storm::expressions::Expression const& e2, storm::expressions::Expression const& e3, bool& pass) const { + if (this->createExpressions) { + try { + return storm::expressions::ite(e1, e2, e3); + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::createOrExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { + if (this->createExpressions) { + try { + switch (operatorType) { + case storm::expressions::OperatorType::Or: return e1 || e2; break; + case storm::expressions::OperatorType::Implies: return storm::expressions::implies(e1, e2); break; + default: STORM_LOG_ASSERT(false, "Invalid operation."); break; + } + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::createAndExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { + if (this->createExpressions) { + storm::expressions::Expression result; + try { + switch (operatorType) { + case storm::expressions::OperatorType::And: result = e1 && e2; break; + default: STORM_LOG_ASSERT(false, "Invalid operation."); break; + } + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + return result; + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::createRelationalExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { + if (this->createExpressions) { + try { + switch (operatorType) { + case storm::expressions::OperatorType::GreaterOrEqual: return e1 >= e2; break; + case storm::expressions::OperatorType::Greater: return e1 > e2; break; + case storm::expressions::OperatorType::LessOrEqual: return e1 <= e2; break; + case storm::expressions::OperatorType::Less: return e1 < e2; break; + default: STORM_LOG_ASSERT(false, "Invalid operation."); break; + } + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::createEqualsExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { + if (this->createExpressions) { + try { + switch (operatorType) { + case storm::expressions::OperatorType::Equal: return e1.hasBooleanType() && e2.hasBooleanType() ? storm::expressions::iff(e1, e2) : e1 == e2; break; + case storm::expressions::OperatorType::NotEqual: return e1 != e2; break; + default: STORM_LOG_ASSERT(false, "Invalid operation."); break; + } + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::createPlusExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { + if (this->createExpressions) { + try { + switch (operatorType) { + case storm::expressions::OperatorType::Plus: return e1 + e2; break; + case storm::expressions::OperatorType::Minus: return e1 - e2; break; + default: STORM_LOG_ASSERT(false, "Invalid operation."); break; + } + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::createMultExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { + if (this->createExpressions) { + try { + switch (operatorType) { + case storm::expressions::OperatorType::Times: return e1 * e2; break; + case storm::expressions::OperatorType::Divide: return e1 / e2; break; + default: STORM_LOG_ASSERT(false, "Invalid operation."); break; + } + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::createPowerExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { + if (this->createExpressions) { + try { + switch (operatorType) { + case storm::expressions::OperatorType::Power: return e1 ^ e2; break; + default: STORM_LOG_ASSERT(false, "Invalid operation."); break; + } + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::createUnaryExpression(boost::optional const& operatorType, storm::expressions::Expression const& e1, bool& pass) const { + if (this->createExpressions) { + try { + if (operatorType) { + switch (operatorType.get()) { + case storm::expressions::OperatorType::Not: return !e1; break; + case storm::expressions::OperatorType::Minus: return -e1; break; + default: STORM_LOG_ASSERT(false, "Invalid operation."); break; + } + } else { + return e1; + } + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::createRationalLiteralExpression(storm::RationalNumber const& value, bool& pass) const { + // If we are not supposed to accept double expressions, we reject it by setting pass to false. + if (!this->acceptDoubleLiterals) { + pass = false; + } + + if (this->createExpressions) { + return manager.rational(value); + } else { + return manager.boolean(false); + } + } + + storm::expressions::Expression ExpressionCreator::createIntegerLiteralExpression(int value, bool& pass) const { + if (this->createExpressions) { + return manager.integer(value); + } else { + return manager.boolean(false); + } + } + + + storm::expressions::Expression ExpressionCreator::createBooleanLiteralExpression(bool value, bool& pass) const { + if (this->createExpressions) { + return manager.boolean(value); + } else { + return manager.boolean(false); + } + } + + storm::expressions::Expression ExpressionCreator::createMinimumMaximumExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { + if (this->createExpressions) { + try { + switch (operatorType) { + case storm::expressions::OperatorType::Min: return storm::expressions::minimum(e1, e2); break; + case storm::expressions::OperatorType::Max: return storm::expressions::maximum(e1, e2); break; + default: STORM_LOG_ASSERT(false, "Invalid operation."); break; + } + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::createFloorCeilExpression(storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e1, bool& pass) const { + if (this->createExpressions) { + try { + switch (operatorType) { + case storm::expressions::OperatorType::Floor: return storm::expressions::floor(e1); break; + case storm::expressions::OperatorType::Ceil: return storm::expressions::ceil(e1); break; + default: STORM_LOG_ASSERT(false, "Invalid operation."); break; + } + } catch (storm::exceptions::InvalidTypeException const& e) { + pass = false; + } + } + return manager.boolean(false); + } + + storm::expressions::Expression ExpressionCreator::getIdentifierExpression(std::string const& identifier, bool allowBacktracking, bool& pass) const { + if (this->createExpressions) { + STORM_LOG_THROW(this->identifiers != nullptr, storm::exceptions::WrongFormatException, "Unable to substitute identifier expressions without given mapping."); + storm::expressions::Expression const* expression = this->identifiers->find(identifier); + if (expression == nullptr) { + pass = false; + return manager.boolean(false); + } + return *expression; + } else { + return manager.boolean(false); + } + } + + void ExpressionCreator::setIdentifierMapping(qi::symbols const* identifiers_) { + + if (identifiers_ != nullptr) { + createExpressions = true; + identifiers = identifiers_; + } else { + createExpressions = false; + identifiers = nullptr; + } + } + + void ExpressionCreator::setIdentifierMapping(std::unordered_map const& identifierMapping) { + unsetIdentifierMapping(); + + createExpressions =true; + identifiers = new qi::symbols(); + for (auto const& identifierExpressionPair : identifierMapping) { + identifiers->add(identifierExpressionPair.first, identifierExpressionPair.second); + } + deleteIdentifierMapping = true; + } + + void ExpressionCreator::unsetIdentifierMapping() { + createExpressions = false; + if (deleteIdentifierMapping) { + delete this->identifiers; + deleteIdentifierMapping = false; + } + this->identifiers = nullptr; + } + + + + + } +} \ No newline at end of file diff --git a/src/parser/ExpressionCreator.h b/src/parser/ExpressionCreator.h new file mode 100644 index 000000000..0d6d45c5e --- /dev/null +++ b/src/parser/ExpressionCreator.h @@ -0,0 +1,93 @@ +#pragma once +#include +// Very ugly, but currently we would like to have the symbol table here. +#include "src/parser/SpiritParserDefinitions.h" + +#include +#include "src/adapters/NumberAdapter.h" + +namespace storm { + + namespace expressions { + class Expression; + class ExpressionManager; + enum struct OperatorType; + } + + namespace parser { + class ExpressionCreator { + public: + ExpressionCreator(storm::expressions::ExpressionManager const& manager); + + virtual ~ExpressionCreator() { + if (deleteIdentifierMapping) { + delete this->identifiers; + } + } + + /*! + * Sets an identifier mapping that is used to determine valid variables in the expression. The mapped-to + * expressions will be substituted wherever the key value appears in the parsed expression. After setting + * this, the parser will generate expressions. + * + * @param identifiers_ A pointer to a mapping from identifiers to expressions. + */ + void setIdentifierMapping(qi::symbols const* identifiers_); + + /*! + * Sets an identifier mapping that is used to determine valid variables in the expression. The mapped-to + * expressions will be substituted wherever the key value appears in the parsed expression. After setting + * this, the parser will generate expressions. + * + * @param identifierMapping A mapping from identifiers to expressions. + */ + void setIdentifierMapping(std::unordered_map const& identifierMapping); + + /*! + * Unsets a previously set identifier mapping. This will make the parser not generate expressions any more + * but merely check for syntactic correctness of an expression. + */ + void unsetIdentifierMapping(); + + bool getAcceptDoubleLiterals() const { + return acceptDoubleLiterals; + } + + void setAcceptDoubleLiterals(bool set = true) { + acceptDoubleLiterals = set; + } + + + + storm::expressions::Expression createIteExpression(storm::expressions::Expression const& e1, storm::expressions::Expression const& e2, storm::expressions::Expression const& e3, bool& pass) const; + + storm::expressions::Expression createOrExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; + storm::expressions::Expression createAndExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; + storm::expressions::Expression createRelationalExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; + storm::expressions::Expression createEqualsExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; + storm::expressions::Expression createPlusExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; + storm::expressions::Expression createMultExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; + storm::expressions::Expression createPowerExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; + storm::expressions::Expression createUnaryExpression(boost::optional const& operatorType, storm::expressions::Expression const& e1, bool& pass) const; + storm::expressions::Expression createRationalLiteralExpression(storm::RationalNumber const& value, bool& pass) const; + storm::expressions::Expression createIntegerLiteralExpression(int value, bool& pass) const; + storm::expressions::Expression createBooleanLiteralExpression(bool value, bool& pass) const; + storm::expressions::Expression createMinimumMaximumExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; + storm::expressions::Expression createFloorCeilExpression(storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e1, bool& pass) const; + storm::expressions::Expression getIdentifierExpression(std::string const& identifier, bool allowBacktracking, bool& pass) const; + + + private: + // The manager responsible for the expressions. + storm::expressions::ExpressionManager const& manager; + qi::symbols const* identifiers = nullptr; + + bool createExpressions = false; + + bool acceptDoubleLiterals = true; + + bool deleteIdentifierMapping = false; + + }; + } +} \ No newline at end of file diff --git a/src/parser/ExpressionParser.cpp b/src/parser/ExpressionParser.cpp index 3054f2fe0..1d78a2c64 100644 --- a/src/parser/ExpressionParser.cpp +++ b/src/parser/ExpressionParser.cpp @@ -4,6 +4,9 @@ #include "src/exceptions/WrongFormatException.h" #include "src/utility/constants.h" +#include "src/parser/ExpressionCreator.h" +#include "src/storage/expressions/Expression.h" + namespace boost { namespace spirit { @@ -33,85 +36,91 @@ namespace boost { namespace storm { namespace parser { - ExpressionParser::ExpressionParser(storm::expressions::ExpressionManager const& manager, qi::symbols const& invalidIdentifiers_, bool enableErrorHandling, bool allowBacktracking) : ExpressionParser::base_type(expression), orOperator_(), andOperator_(), equalityOperator_(), relationalOperator_(), plusOperator_(), multiplicationOperator_(), infixPowerOperator_(), unaryOperator_(), floorCeilOperator_(), minMaxOperator_(), prefixPowerOperator_(), trueFalse_(manager), manager(manager.getSharedPointer()), createExpressions(false), acceptDoubleLiterals(true), identifiers_(nullptr), invalidIdentifiers_(invalidIdentifiers_) { - identifier %= qi::as_string[qi::raw[qi::lexeme[((qi::alpha | qi::char_('_')) >> *(qi::alnum | qi::char_('_')))]]][qi::_pass = phoenix::bind(&ExpressionParser::isValidIdentifier, phoenix::ref(*this), qi::_1)]; + ExpressionParser::ExpressionParser(storm::expressions::ExpressionManager const& manager, qi::symbols const& invalidIdentifiers_, bool enableErrorHandling, bool allowBacktracking) : ExpressionParser::base_type(expression), orOperator_(), andOperator_(), equalityOperator_(), relationalOperator_(), plusOperator_(), multiplicationOperator_(), infixPowerOperator_(), unaryOperator_(), floorCeilOperator_(), minMaxOperator_(), prefixPowerOperator_(), invalidIdentifiers_(invalidIdentifiers_) { + + expressionCreator = new ExpressionCreator(manager); + + identifier %= qi::as_string[qi::raw[qi::lexeme[((qi::alpha | qi::char_('_') | qi::char_('.')) >> *(qi::alnum | qi::char_('_')))]]][qi::_pass = phoenix::bind(&ExpressionParser::isValidIdentifier, phoenix::ref(*this), qi::_1)]; identifier.name("identifier"); if (allowBacktracking) { - floorCeilExpression = ((floorCeilOperator_ >> qi::lit("(")) >> expression >> qi::lit(")"))[qi::_val = phoenix::bind(&ExpressionParser::createFloorCeilExpression, phoenix::ref(*this), qi::_1, qi::_2, qi::_pass)]; + floorCeilExpression = ((floorCeilOperator_ >> qi::lit("(")) >> expression >> qi::lit(")"))[qi::_val = phoenix::bind(&ExpressionCreator::createFloorCeilExpression, phoenix::ref(*expressionCreator), qi::_1, qi::_2, qi::_pass)]; } else { - floorCeilExpression = ((floorCeilOperator_ >> qi::lit("(")) > expression > qi::lit(")"))[qi::_val = phoenix::bind(&ExpressionParser::createFloorCeilExpression, phoenix::ref(*this), qi::_1, qi::_2, qi::_pass)]; + floorCeilExpression = ((floorCeilOperator_ >> qi::lit("(")) > expression > qi::lit(")"))[qi::_val = phoenix::bind(&ExpressionCreator::createFloorCeilExpression, phoenix::ref(*expressionCreator), qi::_1, qi::_2, qi::_pass)]; } floorCeilExpression.name("floor/ceil expression"); if (allowBacktracking) { - minMaxExpression = ((minMaxOperator_[qi::_a = qi::_1] >> qi::lit("(")) >> expression[qi::_val = qi::_1] >> +(qi::lit(",") >> expression)[qi::_val = phoenix::bind(&ExpressionParser::createMinimumMaximumExpression, phoenix::ref(*this), qi::_val, qi::_a, qi::_1, qi::_pass)]) >> qi::lit(")"); + minMaxExpression = ((minMaxOperator_[qi::_a = qi::_1] >> qi::lit("(")) >> expression[qi::_val = qi::_1] >> +(qi::lit(",") >> expression)[qi::_val = phoenix::bind(&ExpressionCreator::createMinimumMaximumExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_a, qi::_1, qi::_pass)]) >> qi::lit(")"); } else { - minMaxExpression = ((minMaxOperator_[qi::_a = qi::_1] >> qi::lit("(")) > expression[qi::_val = qi::_1] > +(qi::lit(",") > expression)[qi::_val = phoenix::bind(&ExpressionParser::createMinimumMaximumExpression, phoenix::ref(*this), qi::_val, qi::_a, qi::_1, qi::_pass)]) > qi::lit(")"); + minMaxExpression = ((minMaxOperator_[qi::_a = qi::_1] >> qi::lit("(")) > expression[qi::_val = qi::_1] > +(qi::lit(",") > expression)[qi::_val = phoenix::bind(&ExpressionCreator::createMinimumMaximumExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_a, qi::_1, qi::_pass)]) > qi::lit(")"); } minMaxExpression.name("min/max expression"); if (allowBacktracking) { - prefixPowerExpression = ((prefixPowerOperator_ >> qi::lit("(")) >> expression >> qi::lit(",") >> expression >> qi::lit(")"))[qi::_val = phoenix::bind(&ExpressionParser::createPowerExpression, phoenix::ref(*this), qi::_2, qi::_1, qi::_3, qi::_pass)]; + prefixPowerExpression = ((prefixPowerOperator_ >> qi::lit("(")) >> expression >> qi::lit(",") >> expression >> qi::lit(")"))[qi::_val = phoenix::bind(&ExpressionCreator::createPowerExpression, phoenix::ref(*expressionCreator), qi::_2, qi::_1, qi::_3, qi::_pass)]; } else { - prefixPowerExpression = ((prefixPowerOperator_ >> qi::lit("(")) > expression > qi::lit(",") > expression > qi::lit(")"))[qi::_val = phoenix::bind(&ExpressionParser::createPowerExpression, phoenix::ref(*this), qi::_2, qi::_1, qi::_3, qi::_pass)]; + prefixPowerExpression = ((prefixPowerOperator_ >> qi::lit("(")) > expression > qi::lit(",") > expression > qi::lit(")"))[qi::_val = phoenix::bind(&ExpressionCreator::createPowerExpression, phoenix::ref(*expressionCreator), qi::_2, qi::_1, qi::_3, qi::_pass)]; } prefixPowerExpression.name("pow expression"); - identifierExpression = identifier[qi::_val = phoenix::bind(&ExpressionParser::getIdentifierExpression, phoenix::ref(*this), qi::_1, allowBacktracking, qi::_pass)]; + identifierExpression = identifier[qi::_val = phoenix::bind(&ExpressionCreator::getIdentifierExpression, phoenix::ref(*expressionCreator), qi::_1, allowBacktracking, qi::_pass)]; identifierExpression.name("identifier expression"); - literalExpression = trueFalse_[qi::_val = qi::_1] | rationalLiteral_[qi::_val = phoenix::bind(&ExpressionParser::createRationalLiteralExpression, phoenix::ref(*this), qi::_1, qi::_pass)] | qi::int_[qi::_val = phoenix::bind(&ExpressionParser::createIntegerLiteralExpression, phoenix::ref(*this), qi::_1, qi::_pass)]; + literalExpression = qi::lit("true")[qi::_val = phoenix::bind(&ExpressionCreator::createBooleanLiteralExpression, phoenix::ref(*expressionCreator), true, qi::_pass)] + | qi::lit("false")[qi::_val = phoenix::bind(&ExpressionCreator::createBooleanLiteralExpression, phoenix::ref(*expressionCreator), false, qi::_pass)] + | rationalLiteral_[qi::_val = phoenix::bind(&ExpressionCreator::createRationalLiteralExpression, phoenix::ref(*expressionCreator), qi::_1, qi::_pass)] + | qi::int_[qi::_val = phoenix::bind(&ExpressionCreator::createIntegerLiteralExpression, phoenix::ref(*expressionCreator), qi::_1, qi::_pass)]; literalExpression.name("literal expression"); atomicExpression = floorCeilExpression | prefixPowerExpression | minMaxExpression | (qi::lit("(") >> expression >> qi::lit(")")) | literalExpression | identifierExpression; atomicExpression.name("atomic expression"); - unaryExpression = (-unaryOperator_ >> atomicExpression)[qi::_val = phoenix::bind(&ExpressionParser::createUnaryExpression, phoenix::ref(*this), qi::_1, qi::_2, qi::_pass)]; + unaryExpression = (-unaryOperator_ >> atomicExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createUnaryExpression, phoenix::ref(*expressionCreator), qi::_1, qi::_2, qi::_pass)]; unaryExpression.name("unary expression"); if (allowBacktracking) { - infixPowerExpression = unaryExpression[qi::_val = qi::_1] > -(infixPowerOperator_ > expression)[qi::_val = phoenix::bind(&ExpressionParser::createPowerExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + infixPowerExpression = unaryExpression[qi::_val = qi::_1] > -(infixPowerOperator_ > expression)[qi::_val = phoenix::bind(&ExpressionCreator::createPowerExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; } else { - infixPowerExpression = unaryExpression[qi::_val = qi::_1] > -(infixPowerOperator_ >> expression)[qi::_val = phoenix::bind(&ExpressionParser::createPowerExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + infixPowerExpression = unaryExpression[qi::_val = qi::_1] > -(infixPowerOperator_ >> expression)[qi::_val = phoenix::bind(&ExpressionCreator::createPowerExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; } infixPowerExpression.name("power expression"); if (allowBacktracking) { - multiplicationExpression = infixPowerExpression[qi::_val = qi::_1] >> *(multiplicationOperator_ >> infixPowerExpression)[qi::_val = phoenix::bind(&ExpressionParser::createMultExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + multiplicationExpression = infixPowerExpression[qi::_val = qi::_1] >> *(multiplicationOperator_ >> infixPowerExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createMultExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; } else { - multiplicationExpression = infixPowerExpression[qi::_val = qi::_1] > *(multiplicationOperator_ > infixPowerExpression)[qi::_val = phoenix::bind(&ExpressionParser::createMultExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + multiplicationExpression = infixPowerExpression[qi::_val = qi::_1] > *(multiplicationOperator_ > infixPowerExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createMultExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; } multiplicationExpression.name("multiplication expression"); - plusExpression = multiplicationExpression[qi::_val = qi::_1] > *(plusOperator_ >> multiplicationExpression)[qi::_val = phoenix::bind(&ExpressionParser::createPlusExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + plusExpression = multiplicationExpression[qi::_val = qi::_1] > *(plusOperator_ >> multiplicationExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createPlusExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; plusExpression.name("plus expression"); if (allowBacktracking) { - relativeExpression = plusExpression[qi::_val = qi::_1] >> -(relationalOperator_ >> plusExpression)[qi::_val = phoenix::bind(&ExpressionParser::createRelationalExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + relativeExpression = plusExpression[qi::_val = qi::_1] >> -(relationalOperator_ >> plusExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createRelationalExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; } else { - relativeExpression = plusExpression[qi::_val = qi::_1] > -(relationalOperator_ > plusExpression)[qi::_val = phoenix::bind(&ExpressionParser::createRelationalExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + relativeExpression = plusExpression[qi::_val = qi::_1] > -(relationalOperator_ > plusExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createRelationalExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; } relativeExpression.name("relative expression"); - equalityExpression = relativeExpression[qi::_val = qi::_1] >> *(equalityOperator_ >> relativeExpression)[qi::_val = phoenix::bind(&ExpressionParser::createEqualsExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + equalityExpression = relativeExpression[qi::_val = qi::_1] >> *(equalityOperator_ >> relativeExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createEqualsExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; equalityExpression.name("equality expression"); if (allowBacktracking) { - andExpression = equalityExpression[qi::_val = qi::_1] >> *(andOperator_ >> equalityExpression)[qi::_val = phoenix::bind(&ExpressionParser::createAndExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + andExpression = equalityExpression[qi::_val = qi::_1] >> *(andOperator_ >> equalityExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createAndExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; } else { - andExpression = equalityExpression[qi::_val = qi::_1] >> *(andOperator_ > equalityExpression)[qi::_val = phoenix::bind(&ExpressionParser::createAndExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + andExpression = equalityExpression[qi::_val = qi::_1] >> *(andOperator_ > equalityExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createAndExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; } andExpression.name("and expression"); if (allowBacktracking) { - orExpression = andExpression[qi::_val = qi::_1] >> *(orOperator_ >> andExpression)[qi::_val = phoenix::bind(&ExpressionParser::createOrExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + orExpression = andExpression[qi::_val = qi::_1] >> *(orOperator_ >> andExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createOrExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; } else { - orExpression = andExpression[qi::_val = qi::_1] > *(orOperator_ > andExpression)[qi::_val = phoenix::bind(&ExpressionParser::createOrExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + orExpression = andExpression[qi::_val = qi::_1] > *(orOperator_ > andExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createOrExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; } orExpression.name("or expression"); - iteExpression = orExpression[qi::_val = qi::_1] > -(qi::lit("?") > orExpression > qi::lit(":") > orExpression)[qi::_val = phoenix::bind(&ExpressionParser::createIteExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2, qi::_pass)]; + iteExpression = orExpression[qi::_val = qi::_1] > -(qi::lit("?") > orExpression > qi::lit(":") > orExpression)[qi::_val = phoenix::bind(&ExpressionCreator::createIteExpression, phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)]; iteExpression.name("if-then-else expression"); expression %= iteExpression; @@ -154,240 +163,22 @@ namespace storm { } void ExpressionParser::setIdentifierMapping(qi::symbols const* identifiers_) { - if (identifiers_ != nullptr) { - this->createExpressions = true; - this->identifiers_ = identifiers_; - } else { - this->createExpressions = false; - this->identifiers_ = nullptr; - } + expressionCreator->setIdentifierMapping(identifiers_); } void ExpressionParser::setIdentifierMapping(std::unordered_map const& identifierMapping) { - unsetIdentifierMapping(); - this->createExpressions = true; - this->identifiers_ = new qi::symbols(); - for (auto const& identifierExpressionPair : identifierMapping) { - this->identifiers_->add(identifierExpressionPair.first, identifierExpressionPair.second); - } - deleteIdentifierMapping = true; + expressionCreator->setIdentifierMapping(identifierMapping); } void ExpressionParser::unsetIdentifierMapping() { - this->createExpressions = false; - if (deleteIdentifierMapping) { - delete this->identifiers_; - deleteIdentifierMapping = false; - } - this->identifiers_ = nullptr; + expressionCreator->unsetIdentifierMapping(); } void ExpressionParser::setAcceptDoubleLiterals(bool flag) { - this->acceptDoubleLiterals = flag; - } - - storm::expressions::Expression ExpressionParser::createIteExpression(storm::expressions::Expression e1, storm::expressions::Expression e2, storm::expressions::Expression e3, bool& pass) const { - if (this->createExpressions) { - try { - return storm::expressions::ite(e1, e2, e3); - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - } - return manager->boolean(false); - } - - storm::expressions::Expression ExpressionParser::createOrExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { - if (this->createExpressions) { - try { - switch (operatorType) { - case storm::expressions::OperatorType::Or: return e1 || e2; break; - case storm::expressions::OperatorType::Implies: return storm::expressions::implies(e1, e2); break; - default: STORM_LOG_ASSERT(false, "Invalid operation."); break; - } - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - } - return manager->boolean(false); - } - - storm::expressions::Expression ExpressionParser::createAndExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { - if (this->createExpressions) { - storm::expressions::Expression result; - try { - switch (operatorType) { - case storm::expressions::OperatorType::And: result = e1 && e2; break; - default: STORM_LOG_ASSERT(false, "Invalid operation."); break; - } - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - return result; - } - return manager->boolean(false); - } - - storm::expressions::Expression ExpressionParser::createRelationalExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { - if (this->createExpressions) { - try { - switch (operatorType) { - case storm::expressions::OperatorType::GreaterOrEqual: return e1 >= e2; break; - case storm::expressions::OperatorType::Greater: return e1 > e2; break; - case storm::expressions::OperatorType::LessOrEqual: return e1 <= e2; break; - case storm::expressions::OperatorType::Less: return e1 < e2; break; - default: STORM_LOG_ASSERT(false, "Invalid operation."); break; - } - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - } - return manager->boolean(false); - } - - storm::expressions::Expression ExpressionParser::createEqualsExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { - if (this->createExpressions) { - try { - switch (operatorType) { - case storm::expressions::OperatorType::Equal: return e1.hasBooleanType() && e2.hasBooleanType() ? storm::expressions::iff(e1, e2) : e1 == e2; break; - case storm::expressions::OperatorType::NotEqual: return e1 != e2; break; - default: STORM_LOG_ASSERT(false, "Invalid operation."); break; - } - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - } - return manager->boolean(false); - } - - storm::expressions::Expression ExpressionParser::createPlusExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { - if (this->createExpressions) { - try { - switch (operatorType) { - case storm::expressions::OperatorType::Plus: return e1 + e2; break; - case storm::expressions::OperatorType::Minus: return e1 - e2; break; - default: STORM_LOG_ASSERT(false, "Invalid operation."); break; - } - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - } - return manager->boolean(false); - } - - storm::expressions::Expression ExpressionParser::createMultExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { - if (this->createExpressions) { - try { - switch (operatorType) { - case storm::expressions::OperatorType::Times: return e1 * e2; break; - case storm::expressions::OperatorType::Divide: return e1 / e2; break; - default: STORM_LOG_ASSERT(false, "Invalid operation."); break; - } - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - } - return manager->boolean(false); - } - - storm::expressions::Expression ExpressionParser::createPowerExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { - if (this->createExpressions) { - try { - switch (operatorType) { - case storm::expressions::OperatorType::Power: return e1 ^ e2; break; - default: STORM_LOG_ASSERT(false, "Invalid operation."); break; - } - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - } - return manager->boolean(false); - } - - storm::expressions::Expression ExpressionParser::createUnaryExpression(boost::optional const& operatorType, storm::expressions::Expression const& e1, bool& pass) const { - if (this->createExpressions) { - try { - if (operatorType) { - switch (operatorType.get()) { - case storm::expressions::OperatorType::Not: return !e1; break; - case storm::expressions::OperatorType::Minus: return -e1; break; - default: STORM_LOG_ASSERT(false, "Invalid operation."); break; - } - } else { - return e1; - } - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - } - return manager->boolean(false); + expressionCreator->setAcceptDoubleLiterals(flag); } + - storm::expressions::Expression ExpressionParser::createRationalLiteralExpression(storm::RationalNumber const& value, bool& pass) const { - // If we are not supposed to accept double expressions, we reject it by setting pass to false. - if (!this->acceptDoubleLiterals) { - pass = false; - } - - if (this->createExpressions) { - return manager->rational(value); - } else { - return manager->boolean(false); - } - } - - storm::expressions::Expression ExpressionParser::createIntegerLiteralExpression(int value, bool& pass) const { - if (this->createExpressions) { - return manager->integer(value); - } else { - return manager->boolean(false); - } - } - - storm::expressions::Expression ExpressionParser::createMinimumMaximumExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const { - if (this->createExpressions) { - try { - switch (operatorType) { - case storm::expressions::OperatorType::Min: return storm::expressions::minimum(e1, e2); break; - case storm::expressions::OperatorType::Max: return storm::expressions::maximum(e1, e2); break; - default: STORM_LOG_ASSERT(false, "Invalid operation."); break; - } - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - } - return manager->boolean(false); - } - - storm::expressions::Expression ExpressionParser::createFloorCeilExpression(storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e1, bool& pass) const { - if (this->createExpressions) { - try { - switch (operatorType) { - case storm::expressions::OperatorType::Floor: return storm::expressions::floor(e1); break; - case storm::expressions::OperatorType::Ceil: return storm::expressions::ceil(e1); break; - default: STORM_LOG_ASSERT(false, "Invalid operation."); break; - } - } catch (storm::exceptions::InvalidTypeException const& e) { - pass = false; - } - } - return manager->boolean(false); - } - - storm::expressions::Expression ExpressionParser::getIdentifierExpression(std::string const& identifier, bool allowBacktracking, bool& pass) const { - if (this->createExpressions) { - STORM_LOG_THROW(this->identifiers_ != nullptr, storm::exceptions::WrongFormatException, "Unable to substitute identifier expressions without given mapping."); - storm::expressions::Expression const* expression = this->identifiers_->find(identifier); - if (expression == nullptr) { - pass = false; - return manager->boolean(false); - } - return *expression; - } else { - return manager->boolean(false); - } - } - bool ExpressionParser::isValidIdentifier(std::string const& identifier) { if (this->invalidIdentifiers_.find(identifier) != nullptr) { return false; diff --git a/src/parser/ExpressionParser.h b/src/parser/ExpressionParser.h index 077be8db2..15c039255 100644 --- a/src/parser/ExpressionParser.h +++ b/src/parser/ExpressionParser.h @@ -1,16 +1,19 @@ -#ifndef STORM_PARSER_EXPRESSIONPARSER_H_ -#define STORM_PARSER_EXPRESSIONPARSER_H_ +#pragma once #include #include "src/parser/SpiritParserDefinitions.h" #include "src/parser/SpiritErrorHandler.h" -#include "src/storage/expressions/Expression.h" -#include "src/storage/expressions/ExpressionManager.h" +#include "src/storage/expressions/OperatorType.h" -#include "src/adapters/CarlAdapter.h" +#include "src/adapters/NumberAdapter.h" namespace storm { + namespace expressions { + class Expression; + class ExpressionManager; + } + namespace parser { template struct RationalPolicies : boost::spirit::qi::strict_real_policies { @@ -22,6 +25,8 @@ namespace storm { static bool parse_inf(It&, It const&, Attr&) { return false; } }; + class ExpressionCreator; + class ExpressionParser : public qi::grammar { public: /*! @@ -197,33 +202,9 @@ namespace storm { // A parser used for recognizing the operators at the "power" precedence level. prefixPowerOperatorStruct prefixPowerOperator_; - struct trueFalseOperatorStruct : qi::symbols { - trueFalseOperatorStruct(storm::expressions::ExpressionManager const& manager) { - add - ("true", manager.boolean(true)) - ("false", manager.boolean(false)); - } - }; - - // A parser used for recognizing the literals true and false. - trueFalseOperatorStruct trueFalse_; - - // The manager responsible for the expressions. - std::shared_ptr manager; - - // A flag that indicates whether expressions should actually be generated or just a syntax check shall be - // performed. - bool createExpressions; - - // A flag that indicates whether double literals are accepted. - bool acceptDoubleLiterals; - // A flag that indicates whether the mapping must be deleted on unsetting. - bool deleteIdentifierMapping; + ExpressionCreator* expressionCreator; - // The currently used mapping of identifiers to expressions. This is used if the parser is set to create - // expressions. - qi::symbols const* identifiers_; // The symbol table of invalid identifiers. qi::symbols invalidIdentifiers_; @@ -250,21 +231,6 @@ namespace storm { // Parser that is used to recognize doubles only (as opposed to Spirit's double_ parser). boost::spirit::qi::real_parser> rationalLiteral_; - // Helper functions to create expressions. - storm::expressions::Expression createIteExpression(storm::expressions::Expression e1, storm::expressions::Expression e2, storm::expressions::Expression e3, bool& pass) const; - storm::expressions::Expression createOrExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; - storm::expressions::Expression createAndExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; - storm::expressions::Expression createRelationalExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; - storm::expressions::Expression createEqualsExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; - storm::expressions::Expression createPlusExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; - storm::expressions::Expression createMultExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; - storm::expressions::Expression createPowerExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; - storm::expressions::Expression createUnaryExpression(boost::optional const& operatorType, storm::expressions::Expression const& e1, bool& pass) const; - storm::expressions::Expression createRationalLiteralExpression(storm::RationalNumber const& value, bool& pass) const; - storm::expressions::Expression createIntegerLiteralExpression(int value, bool& pass) const; - storm::expressions::Expression createMinimumMaximumExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2, bool& pass) const; - storm::expressions::Expression createFloorCeilExpression(storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e1, bool& pass) const; - storm::expressions::Expression getIdentifierExpression(std::string const& identifier, bool allowBacktracking, bool& pass) const; bool isValidIdentifier(std::string const& identifier); @@ -274,4 +240,3 @@ namespace storm { } // namespace parser } // namespace storm -#endif /* STORM_PARSER_EXPRESSIONPARSER_H_ */ diff --git a/src/parser/FormulaParser.cpp b/src/parser/FormulaParser.cpp index 74dbf31cf..2bf1c392d 100644 --- a/src/parser/FormulaParser.cpp +++ b/src/parser/FormulaParser.cpp @@ -4,179 +4,26 @@ #include "src/parser/SpiritErrorHandler.h" +#include "src/storage/prism/Program.h" +#include "src/storage/jani/Model.h" + // If the parser fails due to ill-formed data, this exception is thrown. #include "src/exceptions/WrongFormatException.h" #include "src/storage/expressions/ExpressionEvaluator.h" +#include "FormulaParserGrammar.h" +#include "src/storage/expressions/ExpressionManager.h" namespace storm { namespace parser { - class FormulaParserGrammar : public qi::grammar>(), Skipper> { - public: - FormulaParserGrammar(std::shared_ptr const& manager = std::shared_ptr(new storm::expressions::ExpressionManager())); - - FormulaParserGrammar(FormulaParserGrammar const& other) = default; - FormulaParserGrammar& operator=(FormulaParserGrammar const& other) = default; - - /*! - * Adds an identifier and the expression it is supposed to be replaced with. This can, for example be used - * to substitute special identifiers in the formula by expressions. - * - * @param identifier The identifier that is supposed to be substituted. - * @param expression The expression it is to be substituted with. - */ - void addIdentifierExpression(std::string const& identifier, storm::expressions::Expression const& expression); - - private: - struct keywordsStruct : qi::symbols { - keywordsStruct() { - add - ("true", 1) - ("false", 2) - ("min", 3) - ("max", 4) - ("F", 5) - ("G", 6) - ("X", 7); - } - }; - - // A parser used for recognizing the keywords. - keywordsStruct keywords_; - - struct relationalOperatorStruct : qi::symbols { - relationalOperatorStruct() { - add - (">=", storm::logic::ComparisonType::GreaterEqual) - (">", storm::logic::ComparisonType::Greater) - ("<=", storm::logic::ComparisonType::LessEqual) - ("<", storm::logic::ComparisonType::Less); - } - }; - - // A parser used for recognizing the operators at the "relational" precedence level. - relationalOperatorStruct relationalOperator_; - - struct binaryBooleanOperatorStruct : qi::symbols { - binaryBooleanOperatorStruct() { - add - ("&", storm::logic::BinaryBooleanStateFormula::OperatorType::And) - ("|", storm::logic::BinaryBooleanStateFormula::OperatorType::Or); - } - }; - - // A parser used for recognizing the operators at the "binary" precedence level. - binaryBooleanOperatorStruct binaryBooleanOperator_; - - struct unaryBooleanOperatorStruct : qi::symbols { - unaryBooleanOperatorStruct() { - add - ("!", storm::logic::UnaryBooleanStateFormula::OperatorType::Not); - } - }; - - // A parser used for recognizing the operators at the "unary" precedence level. - unaryBooleanOperatorStruct unaryBooleanOperator_; - - struct optimalityOperatorStruct : qi::symbols { - optimalityOperatorStruct() { - add - ("min", storm::OptimizationDirection::Minimize) - ("max", storm::OptimizationDirection::Maximize); - } - }; - - // A parser used for recognizing the optimality operators. - optimalityOperatorStruct optimalityOperator_; - - struct rewardMeasureTypeStruct : qi::symbols { - rewardMeasureTypeStruct() { - add - ("exp", storm::logic::RewardMeasureType::Expectation) - ("var", storm::logic::RewardMeasureType::Variance); - } - }; + + FormulaParser::FormulaParser() : manager(new storm::expressions::ExpressionManager()), grammar(new FormulaParserGrammar(manager)) { + // Intentionally left empty. + } - // A parser used for recognizing the reward measure types. - rewardMeasureTypeStruct rewardMeasureType_; - - // The manager used to parse expressions. - std::shared_ptr manager; - - // Parser and manager used for recognizing expressions. - storm::parser::ExpressionParser expressionParser; - - // A symbol table that is a mapping from identifiers that can be used in expressions to the expressions - // they are to be replaced with. - qi::symbols identifiers_; - - qi::rule>(), Skipper> start; - - qi::rule, boost::optional, boost::optional>, Skipper> operatorInformation; - qi::rule rewardMeasureType; - qi::rule(), Skipper> probabilityOperator; - qi::rule(), Skipper> rewardOperator; - qi::rule(), Skipper> timeOperator; - qi::rule(), Skipper> longRunAverageOperator; - - qi::rule(), Skipper> simpleFormula; - qi::rule(), Skipper> stateFormula; - qi::rule(storm::logic::FormulaContext), Skipper> pathFormula; - qi::rule(storm::logic::FormulaContext), Skipper> pathFormulaWithoutUntil; - qi::rule(), Skipper> simplePathFormula; - qi::rule(), Skipper> atomicStateFormula; - qi::rule(), Skipper> operatorFormula; - qi::rule label; - qi::rule rewardModelName; - - qi::rule(), Skipper> andStateFormula; - qi::rule(), Skipper> orStateFormula; - qi::rule(), Skipper> notStateFormula; - qi::rule(), Skipper> labelFormula; - qi::rule(), Skipper> expressionFormula; - qi::rule(), qi::locals, Skipper> booleanLiteralFormula; - - qi::rule(storm::logic::FormulaContext), Skipper> conditionalFormula; - qi::rule(storm::logic::FormulaContext), Skipper> eventuallyFormula; - qi::rule(storm::logic::FormulaContext), Skipper> nextFormula; - qi::rule(storm::logic::FormulaContext), Skipper> globallyFormula; - qi::rule(storm::logic::FormulaContext), Skipper> untilFormula; - qi::rule, uint_fast64_t>(), Skipper> timeBound; - - qi::rule(), Skipper> rewardPathFormula; - qi::rule(), Skipper> cumulativeRewardFormula; - qi::rule(), Skipper> instantaneousRewardFormula; - qi::rule(), Skipper> longRunAverageRewardFormula; - - // Parser that is used to recognize doubles only (as opposed to Spirit's double_ parser). - boost::spirit::qi::real_parser> strict_double; - - // Methods that actually create the expression objects. - std::shared_ptr createInstantaneousRewardFormula(boost::variant const& timeBound) const; - std::shared_ptr createCumulativeRewardFormula(boost::variant const& timeBound) const; - std::shared_ptr createLongRunAverageRewardFormula() const; - std::shared_ptr createAtomicExpressionFormula(storm::expressions::Expression const& expression) const; - std::shared_ptr createBooleanLiteralFormula(bool literal) const; - std::shared_ptr createAtomicLabelFormula(std::string const& label) const; - std::shared_ptr createEventuallyFormula(boost::optional, uint_fast64_t>> const& timeBound, storm::logic::FormulaContext context, std::shared_ptr const& subformula) const; - std::shared_ptr createGloballyFormula(std::shared_ptr const& subformula) const; - std::shared_ptr createNextFormula(std::shared_ptr const& subformula) const; - std::shared_ptr createUntilFormula(std::shared_ptr const& leftSubformula, boost::optional, uint_fast64_t>> const& timeBound, std::shared_ptr const& rightSubformula); - std::shared_ptr createConditionalFormula(std::shared_ptr const& leftSubformula, std::shared_ptr const& rightSubformula, storm::logic::FormulaContext context) const; - storm::logic::OperatorInformation createOperatorInformation(boost::optional const& optimizationDirection, boost::optional const& comparisonType, boost::optional const& threshold) const; - std::shared_ptr createLongRunAverageOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const; - std::shared_ptr createRewardOperatorFormula(boost::optional const& rewardMeasureType, boost::optional const& rewardModelName, storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const; - std::shared_ptr createTimeOperatorFormula(boost::optional const& rewardMeasureType, storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const; - std::shared_ptr createProbabilityOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula); - std::shared_ptr createBinaryBooleanStateFormula(std::shared_ptr const& leftSubformula, std::shared_ptr const& rightSubformula, storm::logic::BinaryBooleanStateFormula::OperatorType operatorType); - std::shared_ptr createUnaryBooleanStateFormula(std::shared_ptr const& subformula, boost::optional const& operatorType); - - // An error handler function. - phoenix::function handler; - }; - FormulaParser::FormulaParser(std::shared_ptr const& manager) : manager(manager->getSharedPointer()), grammar(new FormulaParserGrammar(manager)) { + FormulaParser::FormulaParser(std::shared_ptr const& manager) : manager(manager), grammar(new FormulaParserGrammar(manager)) { // Intentionally left empty. } @@ -253,278 +100,5 @@ namespace storm { grammar->addIdentifierExpression(identifier, expression); } - FormulaParserGrammar::FormulaParserGrammar(std::shared_ptr const& manager) : FormulaParserGrammar::base_type(start), manager(manager), expressionParser(*manager, keywords_, true, true) { - // Register all variables so we can parse them in the expressions. - for (auto variableTypePair : *manager) { - identifiers_.add(variableTypePair.first.getName(), variableTypePair.first); - } - // Set the identifier mapping to actually generate expressions. - expressionParser.setIdentifierMapping(&identifiers_); - - longRunAverageRewardFormula = (qi::lit("LRA") | qi::lit("S"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createLongRunAverageRewardFormula, phoenix::ref(*this))]; - longRunAverageRewardFormula.name("long run average reward formula"); - - instantaneousRewardFormula = (qi::lit("I=") >> strict_double)[qi::_val = phoenix::bind(&FormulaParserGrammar::createInstantaneousRewardFormula, phoenix::ref(*this), qi::_1)] | (qi::lit("I=") > qi::uint_)[qi::_val = phoenix::bind(&FormulaParserGrammar::createInstantaneousRewardFormula, phoenix::ref(*this), qi::_1)]; - instantaneousRewardFormula.name("instantaneous reward formula"); - - cumulativeRewardFormula = (qi::lit("C<=") >> strict_double)[qi::_val = phoenix::bind(&FormulaParserGrammar::createCumulativeRewardFormula, phoenix::ref(*this), qi::_1)] | (qi::lit("C<=") > qi::uint_)[qi::_val = phoenix::bind(&FormulaParserGrammar::createCumulativeRewardFormula, phoenix::ref(*this), qi::_1)]; - cumulativeRewardFormula.name("cumulative reward formula"); - - rewardPathFormula = longRunAverageRewardFormula | conditionalFormula(storm::logic::FormulaContext::Reward) | eventuallyFormula(storm::logic::FormulaContext::Reward) | cumulativeRewardFormula | instantaneousRewardFormula; - rewardPathFormula.name("reward path formula"); - - expressionFormula = expressionParser[qi::_val = phoenix::bind(&FormulaParserGrammar::createAtomicExpressionFormula, phoenix::ref(*this), qi::_1)]; - expressionFormula.name("expression formula"); - - label = qi::as_string[qi::raw[qi::lexeme[((qi::alpha | qi::char_('_')) >> *(qi::alnum | qi::char_('_')))]]]; - label.name("label"); - - labelFormula = (qi::lit("\"") >> label >> qi::lit("\""))[qi::_val = phoenix::bind(&FormulaParserGrammar::createAtomicLabelFormula, phoenix::ref(*this), qi::_1)]; - labelFormula.name("label formula"); - - booleanLiteralFormula = (qi::lit("true")[qi::_a = true] | qi::lit("false")[qi::_a = false])[qi::_val = phoenix::bind(&FormulaParserGrammar::createBooleanLiteralFormula, phoenix::ref(*this), qi::_a)]; - booleanLiteralFormula.name("boolean literal formula"); - - operatorFormula = probabilityOperator | rewardOperator | longRunAverageOperator | timeOperator; - operatorFormula.name("operator formulas"); - - atomicStateFormula = booleanLiteralFormula | labelFormula | expressionFormula | (qi::lit("(") > stateFormula > qi::lit(")")) | operatorFormula; - atomicStateFormula.name("atomic state formula"); - - notStateFormula = (-unaryBooleanOperator_ >> atomicStateFormula)[qi::_val = phoenix::bind(&FormulaParserGrammar::createUnaryBooleanStateFormula, phoenix::ref(*this), qi::_2, qi::_1)]; - notStateFormula.name("negation formula"); - - eventuallyFormula = (qi::lit("F") >> -timeBound >> pathFormulaWithoutUntil(qi::_r1))[qi::_val = phoenix::bind(&FormulaParserGrammar::createEventuallyFormula, phoenix::ref(*this), qi::_1, qi::_r1, qi::_2)]; - eventuallyFormula.name("eventually formula"); - - globallyFormula = (qi::lit("G") >> pathFormulaWithoutUntil(qi::_r1))[qi::_val = phoenix::bind(&FormulaParserGrammar::createGloballyFormula, phoenix::ref(*this), qi::_1)]; - globallyFormula.name("globally formula"); - - nextFormula = (qi::lit("X") >> pathFormulaWithoutUntil(qi::_r1))[qi::_val = phoenix::bind(&FormulaParserGrammar::createNextFormula, phoenix::ref(*this), qi::_1)]; - nextFormula.name("next formula"); - - pathFormulaWithoutUntil = eventuallyFormula(qi::_r1) | globallyFormula(qi::_r1) | nextFormula(qi::_r1) | stateFormula; - pathFormulaWithoutUntil.name("path formula"); - - untilFormula = pathFormulaWithoutUntil(qi::_r1)[qi::_val = qi::_1] >> *(qi::lit("U") >> -timeBound >> pathFormulaWithoutUntil(qi::_r1))[qi::_val = phoenix::bind(&FormulaParserGrammar::createUntilFormula, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; - untilFormula.name("until formula"); - - conditionalFormula = untilFormula(qi::_r1)[qi::_val = qi::_1] >> *(qi::lit("||") >> untilFormula(storm::logic::FormulaContext::Probability))[qi::_val = phoenix::bind(&FormulaParserGrammar::createConditionalFormula, phoenix::ref(*this), qi::_val, qi::_1, qi::_r1)]; - conditionalFormula.name("conditional formula"); - - timeBound = (qi::lit("[") > qi::double_ > qi::lit(",") > qi::double_ > qi::lit("]"))[qi::_val = phoenix::construct>(qi::_1, qi::_2)] | (qi::lit("<=") >> strict_double)[qi::_val = phoenix::construct>(0, qi::_1)] | (qi::lit("<=") > qi::uint_)[qi::_val = qi::_1]; - timeBound.name("time bound"); - - pathFormula = conditionalFormula(qi::_r1); - pathFormula.name("path formula"); - - rewardMeasureType = qi::lit("[") >> rewardMeasureType_ >> qi::lit("]"); - rewardMeasureType.name("reward measure type"); - - operatorInformation = (-optimalityOperator_[qi::_a = qi::_1] >> ((relationalOperator_[qi::_b = qi::_1] > expressionParser[qi::_c = qi::_1]) | (qi::lit("=") > qi::lit("?"))))[qi::_val = phoenix::bind(&FormulaParserGrammar::createOperatorInformation, phoenix::ref(*this), qi::_a, qi::_b, qi::_c)]; - operatorInformation.name("operator information"); - - longRunAverageOperator = ((qi::lit("LRA") | qi::lit("S")) > operatorInformation > qi::lit("[") > stateFormula > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createLongRunAverageOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2)]; - longRunAverageOperator.name("long-run average operator"); - - rewardModelName = qi::lit("{\"") > label > qi::lit("\"}"); - rewardModelName.name("reward model name"); - - rewardOperator = (qi::lit("R") > -rewardMeasureType > -rewardModelName > operatorInformation > qi::lit("[") > rewardPathFormula > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createRewardOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2, qi::_3, qi::_4)]; - rewardOperator.name("reward operator"); - - timeOperator = (qi::lit("T") > -rewardMeasureType > operatorInformation > qi::lit("[") > eventuallyFormula(storm::logic::FormulaContext::Time) > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createTimeOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2, qi::_3)]; - timeOperator.name("time operator"); - - probabilityOperator = (qi::lit("P") > operatorInformation > qi::lit("[") > pathFormula(storm::logic::FormulaContext::Probability) > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createProbabilityOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2)]; - probabilityOperator.name("probability operator"); - - andStateFormula = notStateFormula[qi::_val = qi::_1] >> *(qi::lit("&") >> notStateFormula)[qi::_val = phoenix::bind(&FormulaParserGrammar::createBinaryBooleanStateFormula, phoenix::ref(*this), qi::_val, qi::_1, storm::logic::BinaryBooleanStateFormula::OperatorType::And)]; - andStateFormula.name("and state formula"); - - orStateFormula = andStateFormula[qi::_val = qi::_1] >> *(qi::lit("|") >> andStateFormula)[qi::_val = phoenix::bind(&FormulaParserGrammar::createBinaryBooleanStateFormula, phoenix::ref(*this), qi::_val, qi::_1, storm::logic::BinaryBooleanStateFormula::OperatorType::Or)]; - orStateFormula.name("or state formula"); - - stateFormula = (orStateFormula); - stateFormula.name("state formula"); - - start = qi::eps > (stateFormula % +(qi::char_("\n;"))) >> qi::skip(boost::spirit::ascii::space | qi::lit("//") >> *(qi::char_ - (qi::eol | qi::eoi)))[qi::eps] >> qi::eoi; - start.name("start"); - - //Enable the following lines to print debug output for most the rules. - /* - debug(start); - debug(stateFormula); - debug(orStateFormula); - debug(andStateFormula); - debug(probabilityOperator); - debug(rewardOperator); - debug(longRunAverageOperator); - debug(timeOperator); - debug(pathFormulaWithoutUntil); - debug(pathFormula); -// debug(conditionalFormula); - debug(nextFormula); - debug(globallyFormula); -// debug(eventuallyFormula); - debug(atomicStateFormula); - debug(booleanLiteralFormula); - debug(labelFormula); - debug(expressionFormula); - debug(rewardPathFormula); - debug(cumulativeRewardFormula); - debug(instantaneousRewardFormula); - */ - - // Enable error reporting. - qi::on_error(start, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(stateFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(orStateFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(andStateFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(probabilityOperator, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(rewardOperator, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(longRunAverageOperator, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(timeOperator, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(operatorInformation, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(pathFormulaWithoutUntil, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(pathFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(conditionalFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(untilFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(nextFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(globallyFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(eventuallyFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(atomicStateFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(booleanLiteralFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(labelFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(expressionFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(rewardPathFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(cumulativeRewardFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - qi::on_error(instantaneousRewardFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); - } - - void FormulaParserGrammar::addIdentifierExpression(std::string const& identifier, storm::expressions::Expression const& expression) { - this->identifiers_.add(identifier, expression); - } - - std::shared_ptr FormulaParserGrammar::createInstantaneousRewardFormula(boost::variant const& timeBound) const { - if (timeBound.which() == 0) { - return std::shared_ptr(new storm::logic::InstantaneousRewardFormula(static_cast(boost::get(timeBound)))); - } else { - double timeBoundAsDouble = boost::get(timeBound); - STORM_LOG_THROW(timeBoundAsDouble >= 0, storm::exceptions::WrongFormatException, "Instantaneous reward property must have non-negative bound."); - return std::shared_ptr(new storm::logic::InstantaneousRewardFormula(timeBoundAsDouble)); - } - } - - std::shared_ptr FormulaParserGrammar::createCumulativeRewardFormula(boost::variant const& timeBound) const { - if (timeBound.which() == 0) { - return std::shared_ptr(new storm::logic::CumulativeRewardFormula(static_cast(boost::get(timeBound)))); - } else { - double timeBoundAsDouble = boost::get(timeBound); - STORM_LOG_THROW(timeBoundAsDouble >= 0, storm::exceptions::WrongFormatException, "Cumulative reward property must have non-negative bound."); - return std::shared_ptr(new storm::logic::CumulativeRewardFormula(static_cast(timeBoundAsDouble))); - } - } - - std::shared_ptr FormulaParserGrammar::createLongRunAverageRewardFormula() const { - return std::shared_ptr(new storm::logic::LongRunAverageRewardFormula()); - } - - std::shared_ptr FormulaParserGrammar::createAtomicExpressionFormula(storm::expressions::Expression const& expression) const { - STORM_LOG_THROW(expression.hasBooleanType(), storm::exceptions::WrongFormatException, "Expected expression of boolean type."); - return std::shared_ptr(new storm::logic::AtomicExpressionFormula(expression)); - } - - std::shared_ptr FormulaParserGrammar::createBooleanLiteralFormula(bool literal) const { - return std::shared_ptr(new storm::logic::BooleanLiteralFormula(literal)); - } - - std::shared_ptr FormulaParserGrammar::createAtomicLabelFormula(std::string const& label) const { - return std::shared_ptr(new storm::logic::AtomicLabelFormula(label)); - } - - std::shared_ptr FormulaParserGrammar::createEventuallyFormula(boost::optional, uint_fast64_t>> const& timeBound, storm::logic::FormulaContext context, std::shared_ptr const& subformula) const { - if (timeBound) { - if (timeBound.get().which() == 0) { - std::pair const& bounds = boost::get>(timeBound.get()); - return std::shared_ptr(new storm::logic::BoundedUntilFormula(createBooleanLiteralFormula(true), subformula, bounds.first, bounds.second)); - } else { - return std::shared_ptr(new storm::logic::BoundedUntilFormula(createBooleanLiteralFormula(true), subformula, static_cast(boost::get(timeBound.get())))); - } - } else { - return std::shared_ptr(new storm::logic::EventuallyFormula(subformula, context)); - } - } - - std::shared_ptr FormulaParserGrammar::createGloballyFormula(std::shared_ptr const& subformula) const { - return std::shared_ptr(new storm::logic::GloballyFormula(subformula)); - } - - std::shared_ptr FormulaParserGrammar::createNextFormula(std::shared_ptr const& subformula) const { - return std::shared_ptr(new storm::logic::NextFormula(subformula)); - } - - std::shared_ptr FormulaParserGrammar::createUntilFormula(std::shared_ptr const& leftSubformula, boost::optional, uint_fast64_t>> const& timeBound, std::shared_ptr const& rightSubformula) { - if (timeBound) { - if (timeBound.get().which() == 0) { - std::pair const& bounds = boost::get>(timeBound.get()); - return std::shared_ptr(new storm::logic::BoundedUntilFormula(leftSubformula, rightSubformula, bounds.first, bounds.second)); - } else { - return std::shared_ptr(new storm::logic::BoundedUntilFormula(leftSubformula, rightSubformula, static_cast(boost::get(timeBound.get())))); - } - } else { - return std::shared_ptr(new storm::logic::UntilFormula(leftSubformula, rightSubformula)); - } - } - - std::shared_ptr FormulaParserGrammar::createConditionalFormula(std::shared_ptr const& leftSubformula, std::shared_ptr const& rightSubformula, storm::logic::FormulaContext context) const { - return std::shared_ptr(new storm::logic::ConditionalFormula(leftSubformula, rightSubformula, context)); - } - - storm::logic::OperatorInformation FormulaParserGrammar::createOperatorInformation(boost::optional const& optimizationDirection, boost::optional const& comparisonType, boost::optional const& threshold) const { - if (comparisonType && threshold) { - storm::expressions::ExpressionEvaluator evaluator(*manager); - return storm::logic::OperatorInformation(optimizationDirection, storm::logic::Bound(comparisonType.get(), evaluator.asRational(threshold.get()))); - } else { - return storm::logic::OperatorInformation(optimizationDirection, boost::none); - } - } - - std::shared_ptr FormulaParserGrammar::createLongRunAverageOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const { - return std::shared_ptr(new storm::logic::LongRunAverageOperatorFormula(subformula, operatorInformation)); - } - - std::shared_ptr FormulaParserGrammar::createRewardOperatorFormula(boost::optional const& rewardMeasureType, boost::optional const& rewardModelName, storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const { - storm::logic::RewardMeasureType measureType = storm::logic::RewardMeasureType::Expectation; - if (rewardMeasureType) { - measureType = rewardMeasureType.get(); - } - return std::shared_ptr(new storm::logic::RewardOperatorFormula(subformula, rewardModelName, operatorInformation, measureType)); - } - - std::shared_ptr FormulaParserGrammar::createTimeOperatorFormula(boost::optional const& rewardMeasureType, storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const { - storm::logic::RewardMeasureType measureType = storm::logic::RewardMeasureType::Expectation; - if (rewardMeasureType) { - measureType = rewardMeasureType.get(); - } - return std::shared_ptr(new storm::logic::TimeOperatorFormula(subformula, operatorInformation, measureType)); - } - - std::shared_ptr FormulaParserGrammar::createProbabilityOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) { - return std::shared_ptr(new storm::logic::ProbabilityOperatorFormula(subformula, operatorInformation)); - } - - std::shared_ptr FormulaParserGrammar::createBinaryBooleanStateFormula(std::shared_ptr const& leftSubformula, std::shared_ptr const& rightSubformula, storm::logic::BinaryBooleanStateFormula::OperatorType operatorType) { - return std::shared_ptr(new storm::logic::BinaryBooleanStateFormula(operatorType, leftSubformula, rightSubformula)); - } - - std::shared_ptr FormulaParserGrammar::createUnaryBooleanStateFormula(std::shared_ptr const& subformula, boost::optional const& operatorType) { - if (operatorType) { - return std::shared_ptr(new storm::logic::UnaryBooleanStateFormula(operatorType.get(), subformula)); - } else { - return subformula; - } - } - } // namespace parser } // namespace storm diff --git a/src/parser/FormulaParser.h b/src/parser/FormulaParser.h index 86570c4f6..6afacf173 100644 --- a/src/parser/FormulaParser.h +++ b/src/parser/FormulaParser.h @@ -9,9 +9,11 @@ #include "src/storage/expressions/Expression.h" #include "src/utility/macros.h" -#include "src/storage/prism/Program.h" - namespace storm { + namespace prism { + class Program; + } + namespace parser { // Forward-declare grammar. @@ -19,8 +21,9 @@ namespace storm { class FormulaParser { public: - FormulaParser(std::shared_ptr const& manager = std::shared_ptr(new storm::expressions::ExpressionManager())); - FormulaParser(storm::prism::Program const& program); + FormulaParser(); + explicit FormulaParser(std::shared_ptr const& manager); + explicit FormulaParser(storm::prism::Program const& program); FormulaParser(FormulaParser const& other); FormulaParser& operator=(FormulaParser const& other); diff --git a/src/parser/FormulaParserGrammar.cpp b/src/parser/FormulaParserGrammar.cpp new file mode 100644 index 000000000..a4bc1bc73 --- /dev/null +++ b/src/parser/FormulaParserGrammar.cpp @@ -0,0 +1,281 @@ +#include "FormulaParserGrammar.h" +#include "src/storage/expressions/ExpressionManager.h" + +namespace storm { + namespace parser { + + FormulaParserGrammar::FormulaParserGrammar(std::shared_ptr const& manager) : FormulaParserGrammar::base_type(start), manager(manager), expressionParser(*manager, keywords_, true, true) { + // Register all variables so we can parse them in the expressions. + for (auto variableTypePair : *manager) { + identifiers_.add(variableTypePair.first.getName(), variableTypePair.first); + } + // Set the identifier mapping to actually generate expressions. + expressionParser.setIdentifierMapping(&identifiers_); + + longRunAverageRewardFormula = (qi::lit("LRA") | qi::lit("S"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createLongRunAverageRewardFormula, phoenix::ref(*this))]; + longRunAverageRewardFormula.name("long run average reward formula"); + + instantaneousRewardFormula = (qi::lit("I=") >> strict_double)[qi::_val = phoenix::bind(&FormulaParserGrammar::createInstantaneousRewardFormula, phoenix::ref(*this), qi::_1)] | (qi::lit("I=") > qi::uint_)[qi::_val = phoenix::bind(&FormulaParserGrammar::createInstantaneousRewardFormula, phoenix::ref(*this), qi::_1)]; + instantaneousRewardFormula.name("instantaneous reward formula"); + + cumulativeRewardFormula = (qi::lit("C<=") >> strict_double)[qi::_val = phoenix::bind(&FormulaParserGrammar::createCumulativeRewardFormula, phoenix::ref(*this), qi::_1)] | (qi::lit("C<=") > qi::uint_)[qi::_val = phoenix::bind(&FormulaParserGrammar::createCumulativeRewardFormula, phoenix::ref(*this), qi::_1)]; + cumulativeRewardFormula.name("cumulative reward formula"); + + rewardPathFormula = longRunAverageRewardFormula | conditionalFormula(storm::logic::FormulaContext::Reward) | eventuallyFormula(storm::logic::FormulaContext::Reward) | cumulativeRewardFormula | instantaneousRewardFormula; + rewardPathFormula.name("reward path formula"); + + expressionFormula = expressionParser[qi::_val = phoenix::bind(&FormulaParserGrammar::createAtomicExpressionFormula, phoenix::ref(*this), qi::_1)]; + expressionFormula.name("expression formula"); + + label = qi::as_string[qi::raw[qi::lexeme[((qi::alpha | qi::char_('_')) >> *(qi::alnum | qi::char_('_')))]]]; + label.name("label"); + + labelFormula = (qi::lit("\"") >> label >> qi::lit("\""))[qi::_val = phoenix::bind(&FormulaParserGrammar::createAtomicLabelFormula, phoenix::ref(*this), qi::_1)]; + labelFormula.name("label formula"); + + booleanLiteralFormula = (qi::lit("true")[qi::_a = true] | qi::lit("false")[qi::_a = false])[qi::_val = phoenix::bind(&FormulaParserGrammar::createBooleanLiteralFormula, phoenix::ref(*this), qi::_a)]; + booleanLiteralFormula.name("boolean literal formula"); + + operatorFormula = probabilityOperator | rewardOperator | longRunAverageOperator | timeOperator; + operatorFormula.name("operator formulas"); + + atomicStateFormula = booleanLiteralFormula | labelFormula | expressionFormula | (qi::lit("(") > stateFormula > qi::lit(")")) | operatorFormula; + atomicStateFormula.name("atomic state formula"); + + notStateFormula = (-unaryBooleanOperator_ >> atomicStateFormula)[qi::_val = phoenix::bind(&FormulaParserGrammar::createUnaryBooleanStateFormula, phoenix::ref(*this), qi::_2, qi::_1)]; + notStateFormula.name("negation formula"); + + eventuallyFormula = (qi::lit("F") >> -timeBound >> pathFormulaWithoutUntil(qi::_r1))[qi::_val = phoenix::bind(&FormulaParserGrammar::createEventuallyFormula, phoenix::ref(*this), qi::_1, qi::_r1, qi::_2)]; + eventuallyFormula.name("eventually formula"); + + globallyFormula = (qi::lit("G") >> pathFormulaWithoutUntil(qi::_r1))[qi::_val = phoenix::bind(&FormulaParserGrammar::createGloballyFormula, phoenix::ref(*this), qi::_1)]; + globallyFormula.name("globally formula"); + + nextFormula = (qi::lit("X") >> pathFormulaWithoutUntil(qi::_r1))[qi::_val = phoenix::bind(&FormulaParserGrammar::createNextFormula, phoenix::ref(*this), qi::_1)]; + nextFormula.name("next formula"); + + pathFormulaWithoutUntil = eventuallyFormula(qi::_r1) | globallyFormula(qi::_r1) | nextFormula(qi::_r1) | stateFormula; + pathFormulaWithoutUntil.name("path formula"); + + untilFormula = pathFormulaWithoutUntil(qi::_r1)[qi::_val = qi::_1] >> *(qi::lit("U") >> -timeBound >> pathFormulaWithoutUntil(qi::_r1))[qi::_val = phoenix::bind(&FormulaParserGrammar::createUntilFormula, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; + untilFormula.name("until formula"); + + conditionalFormula = untilFormula(qi::_r1)[qi::_val = qi::_1] >> *(qi::lit("||") >> untilFormula(storm::logic::FormulaContext::Probability))[qi::_val = phoenix::bind(&FormulaParserGrammar::createConditionalFormula, phoenix::ref(*this), qi::_val, qi::_1, qi::_r1)]; + conditionalFormula.name("conditional formula"); + + timeBound = (qi::lit("[") > qi::double_ > qi::lit(",") > qi::double_ > qi::lit("]"))[qi::_val = phoenix::construct>(qi::_1, qi::_2)] | (qi::lit("<=") >> strict_double)[qi::_val = phoenix::construct>(0, qi::_1)] | (qi::lit("<=") > qi::uint_)[qi::_val = qi::_1]; + timeBound.name("time bound"); + + pathFormula = conditionalFormula(qi::_r1); + pathFormula.name("path formula"); + + rewardMeasureType = qi::lit("[") >> rewardMeasureType_ >> qi::lit("]"); + rewardMeasureType.name("reward measure type"); + + operatorInformation = (-optimalityOperator_[qi::_a = qi::_1] >> ((relationalOperator_[qi::_b = qi::_1] > expressionParser[qi::_c = qi::_1]) | (qi::lit("=") > qi::lit("?"))))[qi::_val = phoenix::bind(&FormulaParserGrammar::createOperatorInformation, phoenix::ref(*this), qi::_a, qi::_b, qi::_c)]; + operatorInformation.name("operator information"); + + longRunAverageOperator = ((qi::lit("LRA") | qi::lit("S")) > operatorInformation > qi::lit("[") > stateFormula > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createLongRunAverageOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2)]; + longRunAverageOperator.name("long-run average operator"); + + rewardModelName = qi::lit("{\"") > label > qi::lit("\"}"); + rewardModelName.name("reward model name"); + + rewardOperator = (qi::lit("R") > -rewardMeasureType > -rewardModelName > operatorInformation > qi::lit("[") > rewardPathFormula > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createRewardOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2, qi::_3, qi::_4)]; + rewardOperator.name("reward operator"); + + timeOperator = (qi::lit("T") > -rewardMeasureType > operatorInformation > qi::lit("[") > eventuallyFormula(storm::logic::FormulaContext::Time) > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createTimeOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2, qi::_3)]; + timeOperator.name("time operator"); + + probabilityOperator = (qi::lit("P") > operatorInformation > qi::lit("[") > pathFormula(storm::logic::FormulaContext::Probability) > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createProbabilityOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2)]; + probabilityOperator.name("probability operator"); + + andStateFormula = notStateFormula[qi::_val = qi::_1] >> *(qi::lit("&") >> notStateFormula)[qi::_val = phoenix::bind(&FormulaParserGrammar::createBinaryBooleanStateFormula, phoenix::ref(*this), qi::_val, qi::_1, storm::logic::BinaryBooleanStateFormula::OperatorType::And)]; + andStateFormula.name("and state formula"); + + orStateFormula = andStateFormula[qi::_val = qi::_1] >> *(qi::lit("|") >> andStateFormula)[qi::_val = phoenix::bind(&FormulaParserGrammar::createBinaryBooleanStateFormula, phoenix::ref(*this), qi::_val, qi::_1, storm::logic::BinaryBooleanStateFormula::OperatorType::Or)]; + orStateFormula.name("or state formula"); + + stateFormula = (orStateFormula); + stateFormula.name("state formula"); + + start = qi::eps > (stateFormula % +(qi::char_("\n;"))) >> qi::skip(boost::spirit::ascii::space | qi::lit("//") >> *(qi::char_ - (qi::eol | qi::eoi)))[qi::eps] >> qi::eoi; + start.name("start"); + + //Enable the following lines to print debug output for most the rules. + /* + debug(start); + debug(stateFormula); + debug(orStateFormula); + debug(andStateFormula); + debug(probabilityOperator); + debug(rewardOperator); + debug(longRunAverageOperator); + debug(timeOperator); + debug(pathFormulaWithoutUntil); + debug(pathFormula); + // debug(conditionalFormula); + debug(nextFormula); + debug(globallyFormula); + // debug(eventuallyFormula); + debug(atomicStateFormula); + debug(booleanLiteralFormula); + debug(labelFormula); + debug(expressionFormula); + debug(rewardPathFormula); + debug(cumulativeRewardFormula); + debug(instantaneousRewardFormula); + */ + + // Enable error reporting. + qi::on_error(start, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(stateFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(orStateFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(andStateFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(probabilityOperator, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(rewardOperator, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(longRunAverageOperator, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(timeOperator, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(operatorInformation, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(pathFormulaWithoutUntil, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(pathFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(conditionalFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(untilFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(nextFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(globallyFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(eventuallyFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(atomicStateFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(booleanLiteralFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(labelFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(expressionFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(rewardPathFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(cumulativeRewardFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(instantaneousRewardFormula, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + } + + void FormulaParserGrammar::addIdentifierExpression(std::string const& identifier, storm::expressions::Expression const& expression) { + this->identifiers_.add(identifier, expression); + } + + std::shared_ptr FormulaParserGrammar::createInstantaneousRewardFormula(boost::variant const& timeBound) const { + if (timeBound.which() == 0) { + return std::shared_ptr(new storm::logic::InstantaneousRewardFormula(static_cast(boost::get(timeBound)))); + } else { + double timeBoundAsDouble = boost::get(timeBound); + STORM_LOG_THROW(timeBoundAsDouble >= 0, storm::exceptions::WrongFormatException, "Instantaneous reward property must have non-negative bound."); + return std::shared_ptr(new storm::logic::InstantaneousRewardFormula(timeBoundAsDouble)); + } + } + + std::shared_ptr FormulaParserGrammar::createCumulativeRewardFormula(boost::variant const& timeBound) const { + if (timeBound.which() == 0) { + return std::shared_ptr(new storm::logic::CumulativeRewardFormula(static_cast(boost::get(timeBound)))); + } else { + double timeBoundAsDouble = boost::get(timeBound); + STORM_LOG_THROW(timeBoundAsDouble >= 0, storm::exceptions::WrongFormatException, "Cumulative reward property must have non-negative bound."); + return std::shared_ptr(new storm::logic::CumulativeRewardFormula(static_cast(timeBoundAsDouble))); + } + } + + std::shared_ptr FormulaParserGrammar::createLongRunAverageRewardFormula() const { + return std::shared_ptr(new storm::logic::LongRunAverageRewardFormula()); + } + + std::shared_ptr FormulaParserGrammar::createAtomicExpressionFormula(storm::expressions::Expression const& expression) const { + STORM_LOG_THROW(expression.hasBooleanType(), storm::exceptions::WrongFormatException, "Expected expression of boolean type."); + return std::shared_ptr(new storm::logic::AtomicExpressionFormula(expression)); + } + + std::shared_ptr FormulaParserGrammar::createBooleanLiteralFormula(bool literal) const { + return std::shared_ptr(new storm::logic::BooleanLiteralFormula(literal)); + } + + std::shared_ptr FormulaParserGrammar::createAtomicLabelFormula(std::string const& label) const { + return std::shared_ptr(new storm::logic::AtomicLabelFormula(label)); + } + + std::shared_ptr FormulaParserGrammar::createEventuallyFormula(boost::optional, uint_fast64_t>> const& timeBound, storm::logic::FormulaContext context, std::shared_ptr const& subformula) const { + if (timeBound) { + if (timeBound.get().which() == 0) { + std::pair const& bounds = boost::get>(timeBound.get()); + return std::shared_ptr(new storm::logic::BoundedUntilFormula(createBooleanLiteralFormula(true), subformula, bounds.first, bounds.second)); + } else { + return std::shared_ptr(new storm::logic::BoundedUntilFormula(createBooleanLiteralFormula(true), subformula, static_cast(boost::get(timeBound.get())))); + } + } else { + return std::shared_ptr(new storm::logic::EventuallyFormula(subformula, context)); + } + } + + std::shared_ptr FormulaParserGrammar::createGloballyFormula(std::shared_ptr const& subformula) const { + return std::shared_ptr(new storm::logic::GloballyFormula(subformula)); + } + + std::shared_ptr FormulaParserGrammar::createNextFormula(std::shared_ptr const& subformula) const { + return std::shared_ptr(new storm::logic::NextFormula(subformula)); + } + + std::shared_ptr FormulaParserGrammar::createUntilFormula(std::shared_ptr const& leftSubformula, boost::optional, uint_fast64_t>> const& timeBound, std::shared_ptr const& rightSubformula) { + if (timeBound) { + if (timeBound.get().which() == 0) { + std::pair const& bounds = boost::get>(timeBound.get()); + return std::shared_ptr(new storm::logic::BoundedUntilFormula(leftSubformula, rightSubformula, bounds.first, bounds.second)); + } else { + return std::shared_ptr(new storm::logic::BoundedUntilFormula(leftSubformula, rightSubformula, static_cast(boost::get(timeBound.get())))); + } + } else { + return std::shared_ptr(new storm::logic::UntilFormula(leftSubformula, rightSubformula)); + } + } + + std::shared_ptr FormulaParserGrammar::createConditionalFormula(std::shared_ptr const& leftSubformula, std::shared_ptr const& rightSubformula, storm::logic::FormulaContext context) const { + return std::shared_ptr(new storm::logic::ConditionalFormula(leftSubformula, rightSubformula, context)); + } + + storm::logic::OperatorInformation FormulaParserGrammar::createOperatorInformation(boost::optional const& optimizationDirection, boost::optional const& comparisonType, boost::optional const& threshold) const { + if (comparisonType && threshold) { + storm::expressions::ExpressionEvaluator evaluator(*manager); + return storm::logic::OperatorInformation(optimizationDirection, storm::logic::Bound(comparisonType.get(), evaluator.asRational(threshold.get()))); + } else { + return storm::logic::OperatorInformation(optimizationDirection, boost::none); + } + } + + std::shared_ptr FormulaParserGrammar::createLongRunAverageOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const { + return std::shared_ptr(new storm::logic::LongRunAverageOperatorFormula(subformula, operatorInformation)); + } + + std::shared_ptr FormulaParserGrammar::createRewardOperatorFormula(boost::optional const& rewardMeasureType, boost::optional const& rewardModelName, storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const { + storm::logic::RewardMeasureType measureType = storm::logic::RewardMeasureType::Expectation; + if (rewardMeasureType) { + measureType = rewardMeasureType.get(); + } + return std::shared_ptr(new storm::logic::RewardOperatorFormula(subformula, rewardModelName, operatorInformation, measureType)); + } + + std::shared_ptr FormulaParserGrammar::createTimeOperatorFormula(boost::optional const& rewardMeasureType, storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const { + storm::logic::RewardMeasureType measureType = storm::logic::RewardMeasureType::Expectation; + if (rewardMeasureType) { + measureType = rewardMeasureType.get(); + } + return std::shared_ptr(new storm::logic::TimeOperatorFormula(subformula, operatorInformation, measureType)); + } + + std::shared_ptr FormulaParserGrammar::createProbabilityOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) { + return std::shared_ptr(new storm::logic::ProbabilityOperatorFormula(subformula, operatorInformation)); + } + + std::shared_ptr FormulaParserGrammar::createBinaryBooleanStateFormula(std::shared_ptr const& leftSubformula, std::shared_ptr const& rightSubformula, storm::logic::BinaryBooleanStateFormula::OperatorType operatorType) { + return std::shared_ptr(new storm::logic::BinaryBooleanStateFormula(operatorType, leftSubformula, rightSubformula)); + } + + std::shared_ptr FormulaParserGrammar::createUnaryBooleanStateFormula(std::shared_ptr const& subformula, boost::optional const& operatorType) { + if (operatorType) { + return std::shared_ptr(new storm::logic::UnaryBooleanStateFormula(operatorType.get(), subformula)); + } else { + return subformula; + } + } + + } +} \ No newline at end of file diff --git a/src/parser/FormulaParserGrammar.h b/src/parser/FormulaParserGrammar.h new file mode 100644 index 000000000..227c5aa47 --- /dev/null +++ b/src/parser/FormulaParserGrammar.h @@ -0,0 +1,185 @@ +#pragma once + +#include +#include + +#include "src/parser/SpiritErrorHandler.h" +#include "src/exceptions/WrongFormatException.h" +#include "src/logic/Formulas.h" +#include "src/parser/ExpressionParser.h" + +#include "src/storage/expressions/ExpressionEvaluator.h" + +namespace storm { + namespace logic { + class Formula; + } + + namespace parser { + + class FormulaParserGrammar : public qi::grammar>(), Skipper> { + public: + FormulaParserGrammar(std::shared_ptr const& manager); + + FormulaParserGrammar(FormulaParserGrammar const& other) = default; + FormulaParserGrammar& operator=(FormulaParserGrammar const& other) = default; + + /*! + * Adds an identifier and the expression it is supposed to be replaced with. This can, for example be used + * to substitute special identifiers in the formula by expressions. + * + * @param identifier The identifier that is supposed to be substituted. + * @param expression The expression it is to be substituted with. + */ + void addIdentifierExpression(std::string const& identifier, storm::expressions::Expression const& expression); + + private: + struct keywordsStruct : qi::symbols { + keywordsStruct() { + add + ("true", 1) + ("false", 2) + ("min", 3) + ("max", 4) + ("F", 5) + ("G", 6) + ("X", 7); + } + }; + + // A parser used for recognizing the keywords. + keywordsStruct keywords_; + + struct relationalOperatorStruct : qi::symbols { + relationalOperatorStruct() { + add + (">=", storm::logic::ComparisonType::GreaterEqual) + (">", storm::logic::ComparisonType::Greater) + ("<=", storm::logic::ComparisonType::LessEqual) + ("<", storm::logic::ComparisonType::Less); + } + }; + + // A parser used for recognizing the operators at the "relational" precedence level. + relationalOperatorStruct relationalOperator_; + + struct binaryBooleanOperatorStruct : qi::symbols { + binaryBooleanOperatorStruct() { + add + ("&", storm::logic::BinaryBooleanStateFormula::OperatorType::And) + ("|", storm::logic::BinaryBooleanStateFormula::OperatorType::Or); + } + }; + + // A parser used for recognizing the operators at the "binary" precedence level. + binaryBooleanOperatorStruct binaryBooleanOperator_; + + struct unaryBooleanOperatorStruct : qi::symbols { + unaryBooleanOperatorStruct() { + add + ("!", storm::logic::UnaryBooleanStateFormula::OperatorType::Not); + } + }; + + // A parser used for recognizing the operators at the "unary" precedence level. + unaryBooleanOperatorStruct unaryBooleanOperator_; + + struct optimalityOperatorStruct : qi::symbols { + optimalityOperatorStruct() { + add + ("min", storm::OptimizationDirection::Minimize) + ("max", storm::OptimizationDirection::Maximize); + } + }; + + // A parser used for recognizing the optimality operators. + optimalityOperatorStruct optimalityOperator_; + + struct rewardMeasureTypeStruct : qi::symbols { + rewardMeasureTypeStruct() { + add + ("exp", storm::logic::RewardMeasureType::Expectation) + ("var", storm::logic::RewardMeasureType::Variance); + } + }; + + // A parser used for recognizing the reward measure types. + rewardMeasureTypeStruct rewardMeasureType_; + + // The manager used to parse expressions. + std::shared_ptr manager; + + // Parser and manager used for recognizing expressions. + storm::parser::ExpressionParser expressionParser; + + // A symbol table that is a mapping from identifiers that can be used in expressions to the expressions + // they are to be replaced with. + qi::symbols identifiers_; + + qi::rule>(), Skipper> start; + + qi::rule, boost::optional, boost::optional>, Skipper> operatorInformation; + qi::rule rewardMeasureType; + qi::rule(), Skipper> probabilityOperator; + qi::rule(), Skipper> rewardOperator; + qi::rule(), Skipper> timeOperator; + qi::rule(), Skipper> longRunAverageOperator; + + qi::rule(), Skipper> simpleFormula; + qi::rule(), Skipper> stateFormula; + qi::rule(storm::logic::FormulaContext), Skipper> pathFormula; + qi::rule(storm::logic::FormulaContext), Skipper> pathFormulaWithoutUntil; + qi::rule(), Skipper> simplePathFormula; + qi::rule(), Skipper> atomicStateFormula; + qi::rule(), Skipper> operatorFormula; + qi::rule label; + qi::rule rewardModelName; + + qi::rule(), Skipper> andStateFormula; + qi::rule(), Skipper> orStateFormula; + qi::rule(), Skipper> notStateFormula; + qi::rule(), Skipper> labelFormula; + qi::rule(), Skipper> expressionFormula; + qi::rule(), qi::locals, Skipper> booleanLiteralFormula; + + qi::rule(storm::logic::FormulaContext), Skipper> conditionalFormula; + qi::rule(storm::logic::FormulaContext), Skipper> eventuallyFormula; + qi::rule(storm::logic::FormulaContext), Skipper> nextFormula; + qi::rule(storm::logic::FormulaContext), Skipper> globallyFormula; + qi::rule(storm::logic::FormulaContext), Skipper> untilFormula; + qi::rule, uint_fast64_t>(), Skipper> timeBound; + + qi::rule(), Skipper> rewardPathFormula; + qi::rule(), Skipper> cumulativeRewardFormula; + qi::rule(), Skipper> instantaneousRewardFormula; + qi::rule(), Skipper> longRunAverageRewardFormula; + + // Parser that is used to recognize doubles only (as opposed to Spirit's double_ parser). + boost::spirit::qi::real_parser> strict_double; + + // Methods that actually create the expression objects. + std::shared_ptr createInstantaneousRewardFormula(boost::variant const& timeBound) const; + std::shared_ptr createCumulativeRewardFormula(boost::variant const& timeBound) const; + std::shared_ptr createLongRunAverageRewardFormula() const; + std::shared_ptr createAtomicExpressionFormula(storm::expressions::Expression const& expression) const; + std::shared_ptr createBooleanLiteralFormula(bool literal) const; + std::shared_ptr createAtomicLabelFormula(std::string const& label) const; + std::shared_ptr createEventuallyFormula(boost::optional, uint_fast64_t>> const& timeBound, storm::logic::FormulaContext context, std::shared_ptr const& subformula) const; + std::shared_ptr createGloballyFormula(std::shared_ptr const& subformula) const; + std::shared_ptr createNextFormula(std::shared_ptr const& subformula) const; + std::shared_ptr createUntilFormula(std::shared_ptr const& leftSubformula, boost::optional, uint_fast64_t>> const& timeBound, std::shared_ptr const& rightSubformula); + std::shared_ptr createConditionalFormula(std::shared_ptr const& leftSubformula, std::shared_ptr const& rightSubformula, storm::logic::FormulaContext context) const; + storm::logic::OperatorInformation createOperatorInformation(boost::optional const& optimizationDirection, boost::optional const& comparisonType, boost::optional const& threshold) const; + std::shared_ptr createLongRunAverageOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const; + std::shared_ptr createRewardOperatorFormula(boost::optional const& rewardMeasureType, boost::optional const& rewardModelName, storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const; + std::shared_ptr createTimeOperatorFormula(boost::optional const& rewardMeasureType, storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const; + std::shared_ptr createProbabilityOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula); + std::shared_ptr createBinaryBooleanStateFormula(std::shared_ptr const& leftSubformula, std::shared_ptr const& rightSubformula, storm::logic::BinaryBooleanStateFormula::OperatorType operatorType); + std::shared_ptr createUnaryBooleanStateFormula(std::shared_ptr const& subformula, boost::optional const& operatorType); + + // An error handler function. + phoenix::function handler; + }; + + } +} \ No newline at end of file diff --git a/src/parser/GreatSpnEditorProjectParser.cpp b/src/parser/GreatSpnEditorProjectParser.cpp new file mode 100644 index 000000000..5398414f2 --- /dev/null +++ b/src/parser/GreatSpnEditorProjectParser.cpp @@ -0,0 +1,342 @@ +#include "GreatSpnEditorProjectParser.h" +#ifdef USE_XERCES + +#include + +#include "src/adapters/XercesAdapter.h" + +#include "src/exceptions/UnexpectedException.h" +#include "src/exceptions/WrongFormatException.h" +#include "src/utility/macros.h" + +namespace storm { + namespace parser { + storm::gspn::GSPN* GreatSpnEditorProjectParser::parse(xercesc::DOMElement const* elementRoot) { + if (storm::adapters::XMLtoString(elementRoot->getTagName()) == "project") { + GreatSpnEditorProjectParser p; + return p.parse(elementRoot); + } else { + // If the top-level node is not a "pnml" or "" node, then throw an exception. + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Failed to identify the root element.\n"); + } + + + } + + void GreatSpnEditorProjectParser::traverseProjectElement(xercesc::DOMNode const* const node) { + // traverse attributes + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + if (name.compare("version") == 0 || + name.compare("name") == 0) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment not handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown attribute (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + + // traverse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (name.compare("gspn") == 0) { + traverseGspnElement(child); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + } + + void GreatSpnEditorProjectParser::traverseGspnElement(xercesc::DOMNode const* const node) { + // traverse attributes + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + if (name.compare("name") == 0) { + builder.setGspnName(storm::adapters::XMLtoString(attr->getNodeValue())); + } else if (name.compare("show-color-cmd") == 0 || + name.compare("show-fluid-cmd") == 0) { + // ignore node + } else { + // Found node or attribute which is at the moment not handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG( + "unknown attribute (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + + // traverse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (name.compare("nodes") == 0) { + traverseNodesElement(child); + } else if (name.compare("edges") == 0) { + traverseEdgesElement(child); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + } + + void GreatSpnEditorProjectParser::traverseNodesElement(xercesc::DOMNode const* const node) { + // traverse attributes + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + // Found node or attribute which is at the moment not handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown attribute (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + + // traverse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (name.compare("place") == 0) { + traversePlaceElement(child); + } else if(name.compare("transition") == 0) { + traverseTransitionElement(child); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + } + + void GreatSpnEditorProjectParser::traverseEdgesElement(xercesc::DOMNode const* const node) { + // traverse attributes + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + + // Found node or attribute which is at the moment not handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown attribute (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + + } + + // traverse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (name.compare("arc") == 0) { + traverseArcElement(child); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + } + + bool ignorePlaceAttribute(std::string const& name) { + // TODO we should probably not ignore x-servers but check that it is 0.5. + if ((name == "label-x") || (name == "label-y") || (name == "x") || (name == "y")) { + return true; + } + return false; + } + + + void GreatSpnEditorProjectParser::traversePlaceElement(xercesc::DOMNode const* const node) { + // traverse attributes + std::string placeName; + uint64_t initialTokens = 0; + + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + if (name.compare("name") == 0) { + placeName = storm::adapters::XMLtoString(attr->getNodeValue()); + } else if (name.compare("marking") == 0) { + initialTokens = std::stoull(storm::adapters::XMLtoString(attr->getNodeValue())); + } else if (ignorePlaceAttribute(name)) { + // ignore node + } else { + // Found node or attribute which is at the moment not handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG( + "unknown attribute (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + + } + + // traverse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + builder.addPlace(-1, initialTokens, placeName); + } + + bool ignoreTransitionAttribute(std::string const& name) { + // TODO we should probably not ignore x-servers but check that it is 0.5. + if ((name == "label-x") || (name == "label-y") || (name == "x") || (name == "y") || (name == "nservers-x")) { + return true; + } + return false; + } + + void GreatSpnEditorProjectParser::traverseTransitionElement(xercesc::DOMNode const* const node) { + std::string transitionName; + bool immediateTransition; + double rate = 1.0; // The default rate in GreatSPN. + + // traverse attributes + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + if (name.compare("name") == 0) { + transitionName = storm::adapters::XMLtoString(attr->getNodeValue()); + } else if (name.compare("type") == 0) { + if (storm::adapters::XMLtoString(attr->getNodeValue()).compare("EXP") == 0) { + immediateTransition = false; + } else { + immediateTransition = true; + } + } else if(name.compare("delay") == 0) { + rate = std::stod(storm::adapters::XMLtoString(attr->getNodeValue())); + } else if (ignoreTransitionAttribute(name)) { + // ignore node + } else { + // Found node or attribute which is at the moment not handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG( + "unknown attribute (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + + if (immediateTransition) { + builder.addImmediateTransition(0, 0, transitionName); + } else { + builder.addTimedTransition(0, rate, transitionName); + } + + // traverse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + } + + bool ignoreArcAttribute(std::string const& name) { + if ((name == "mult-x") || (name == "mult-y") || (name == "mult-k")) { + return true; + } + return false; + } + + bool ignoreArcChild(std::string const& name) { + if (name == "point") { + return true; + } + return false; + } + + void GreatSpnEditorProjectParser::traverseArcElement(xercesc::DOMNode const* const node) { + std::string head = "____NOT_SET____"; + std::string tail = "____NOT_SET____"; + std::string kind = "____NOT_SET____"; + uint_fast64_t mult = 1; + + // traverse attributes + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + if (name.compare("head") == 0) { + head = storm::adapters::XMLtoString(attr->getNodeValue()); + } else if (name.compare("tail") == 0) { + tail = storm::adapters::XMLtoString(attr->getNodeValue()); + } else if (name.compare("kind") == 0) { + kind = storm::adapters::XMLtoString(attr->getNodeValue()); + } else if (name.compare("mult") == 0) { + mult = std::stoull(storm::adapters::XMLtoString(attr->getNodeValue())); + } else if (ignoreArcAttribute(name)) { + // ignore node + } else { + // Found node or attribute which is at the moment not handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG( + "unknown attribute (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + + STORM_LOG_THROW(head.compare("____NOT_SET____") != 0, storm::exceptions::WrongFormatException, "Arc must have a head"); + STORM_LOG_THROW(tail.compare("____NOT_SET____") != 0, storm::exceptions::WrongFormatException, "Arc must have a tail"); + STORM_LOG_THROW(kind.compare("____NOT_SET____") != 0, storm::exceptions::WrongFormatException, "Arc must have a kind"); + + + if (kind.compare("INPUT") == 0) { + builder.addInputArc(head, tail, mult); + } else if (kind.compare("INHIBITOR") == 0) { + builder.addInhibitionArc(head, tail, mult); + } else if (kind.compare("OUTPUT") == 0) { + builder.addOutputArc(head, tail, mult); + } else { + // TODO error! + } + + // traverse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else if(ignoreArcChild(name)) { + // ignore + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + } + + } +} +#endif \ No newline at end of file diff --git a/src/parser/GreatSpnEditorProjectParser.h b/src/parser/GreatSpnEditorProjectParser.h new file mode 100644 index 000000000..a931f15d9 --- /dev/null +++ b/src/parser/GreatSpnEditorProjectParser.h @@ -0,0 +1,45 @@ +#pragma once + +#include "storm-config.h" +#ifdef USE_XERCES +#include + +#include +#include + +#include "src/storage/gspn/GSPN.h" + +#include "src/storage/gspn/GspnBuilder.h" + +namespace storm { + namespace parser { + class GreatSpnEditorProjectParser { + + public: + + /*! + * Parses the given file into the GSPN. + * + * @param filename The name of the file to parse. + * @return The resulting GSPN. + */ + storm::gspn::GSPN* parse(xercesc::DOMElement const* elementRoot); + private: + void traverseProjectElement(xercesc::DOMNode const* const node); + + void traverseGspnElement(xercesc::DOMNode const* const node); + void traverseNodesElement(xercesc::DOMNode const* const node); + void traverseEdgesElement(xercesc::DOMNode const* const node); + + void traversePlaceElement(xercesc::DOMNode const* const node); + void traverseTransitionElement(xercesc::DOMNode const* const node); + void traverseArcElement(xercesc::DOMNode const* const node); + + + // the constructed gspn + storm::gspn::GspnBuilder builder; + + }; + } +} +#endif \ No newline at end of file diff --git a/src/parser/GspnParser.cpp b/src/parser/GspnParser.cpp new file mode 100644 index 000000000..fada33102 --- /dev/null +++ b/src/parser/GspnParser.cpp @@ -0,0 +1,88 @@ +#include "GspnParser.h" +#include "storm-config.h" +#include "src/adapters/XercesAdapter.h" + +#include "src/exceptions/UnexpectedException.h" +#include "src/exceptions/WrongFormatException.h" +#include "src/utility/macros.h" + +#include "PnmlParser.h" +#include "GreatSpnEditorProjectParser.h" + +namespace storm { + namespace parser { + + storm::gspn::GSPN* GspnParser::parse(std::string const& filename) { +#ifdef USE_XERCES + // initialize xercesc + try { + xercesc::XMLPlatformUtils::Initialize(); + } + catch (xercesc::XMLException const& toCatch) { + // Error occurred during the initialization process. Abort parsing since it is not possible. + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Failed to initialize xercesc\n"); + } + + auto parser = new xercesc::XercesDOMParser(); + parser->setValidationScheme(xercesc::XercesDOMParser::Val_Always); + parser->setDoNamespaces(false); + parser->setDoSchema(false); + parser->setLoadExternalDTD(false); + parser->setIncludeIgnorableWhitespace(false); + + auto errHandler = (xercesc::ErrorHandler*) new xercesc::HandlerBase(); + parser->setErrorHandler(errHandler); + + // parse file + try { + parser->parse(filename.c_str()); + } + catch (xercesc::XMLException const& toCatch) { + auto message = xercesc::XMLString::transcode(toCatch.getMessage()); + // Error occurred while parsing the file. Abort constructing the gspn since the input file is not valid + // or the parser run into a problem. + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, message); + xercesc::XMLString::release(&message); + } + catch (const xercesc::DOMException& toCatch) { + auto message = xercesc::XMLString::transcode(toCatch.msg); + // Error occurred while parsing the file. Abort constructing the gspn since the input file is not valid + // or the parser run into a problem. + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, message); + xercesc::XMLString::release(&message); + } + catch (...) { + // Error occurred while parsing the file. Abort constructing the gspn since the input file is not valid + // or the parser run into a problem. + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Failed to parse pnml file.\n"); + } + + // build gspn by traversing the DOM object + parser->getDocument()->normalizeDocument(); + xercesc::DOMElement* elementRoot = parser->getDocument()->getDocumentElement(); + + if (storm::adapters::XMLtoString(elementRoot->getTagName()) == "pnml") { + PnmlParser p; + return p.parse(elementRoot); + } else if (storm::adapters::XMLtoString(elementRoot->getTagName()) == "project") { + GreatSpnEditorProjectParser p; + return p.parse(elementRoot); + } else { + // If the top-level node is not a "pnml" or "" node, then throw an exception. + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Failed to identify the root element.\n"); + } + + + + + + // clean up + delete parser; + delete errHandler; + xercesc::XMLPlatformUtils::Terminate(); +#else + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Storm is not compiled with XML support"); +#endif + } + } +} diff --git a/src/parser/GspnParser.h b/src/parser/GspnParser.h new file mode 100644 index 000000000..cec4c5f6f --- /dev/null +++ b/src/parser/GspnParser.h @@ -0,0 +1,10 @@ +#include "src/storage/gspn/GSPN.h" + +namespace storm { + namespace parser { + class GspnParser { + public: + static storm::gspn::GSPN* parse(std::string const& filename); + }; + } +} diff --git a/src/parser/JaniParser.cpp b/src/parser/JaniParser.cpp index 72655906e..76d3d1e1e 100644 --- a/src/parser/JaniParser.cpp +++ b/src/parser/JaniParser.cpp @@ -1,10 +1,17 @@ #include "JaniParser.h" #include "src/storage/jani/Model.h" +#include "src/storage/jani/Property.h" +#include "src/storage/jani/AutomatonComposition.h" +#include "src/storage/jani/ParallelComposition.h" #include "src/exceptions/FileIoException.h" #include "src/exceptions/InvalidJaniException.h" + +#include "src/exceptions/NotSupportedException.h" #include "src/exceptions/NotImplementedException.h" #include "src/storage/jani/ModelType.h" +#include "src/modelchecker/results/FilterType.h" + #include #include #include @@ -15,12 +22,28 @@ namespace storm { namespace parser { + //////////// + // Defaults + //////////// + const bool JaniParser::defaultVariableTransient = false; + const bool JaniParser::defaultBooleanInitialValue = false; + const double JaniParser::defaultRationalInitialValue = 0.0; + const int64_t JaniParser::defaultIntegerInitialValue = 0; + const std::string VARIABLE_AUTOMATON_DELIMITER = "_"; + const std::set JaniParser::unsupportedOpstrings({"sin", "cos", "tan", "cot", "sec", "csc", "asin", "acos", "atan", "acot", "asec", "acsc", + "sinh", "cosh", "tanh", "coth", "sech", "csch", "asinh", "acosh", "atanh", "asinh", "acosh"}); + std::string getString(json const& structure, std::string const& errorInfo) { STORM_LOG_THROW(structure.is_string(), storm::exceptions::InvalidJaniException, "Expected a string in " << errorInfo << ", got '" << structure.dump() << "'"); return structure.front(); } + bool getBoolean(json const& structure, std::string const& errorInfo) { + STORM_LOG_THROW(structure.is_boolean(), storm::exceptions::InvalidJaniException, "Expected a Boolean in " << errorInfo << ", got " << structure.dump() << "'"); + return structure.front(); + } + uint64_t getUnsignedInt(json const& structure, std::string const& errorInfo) { STORM_LOG_THROW(structure.is_number(), storm::exceptions::InvalidJaniException, "Expected a number in " << errorInfo << ", got '" << structure.dump() << "'"); int num = structure.front(); @@ -29,13 +52,13 @@ namespace storm { } - storm::jani::Model JaniParser::parse(std::string const& path) { + std::pair> JaniParser::parse(std::string const& path) { JaniParser parser; parser.readFile(path); return parser.parseModel(); } - JaniParser::JaniParser(std::string &jsonstring) { + JaniParser::JaniParser(std::string const& jsonstring) { parsedStructure = json::parse(jsonstring); } @@ -53,86 +76,576 @@ namespace storm { parsedStructure << file; file.close(); - } - storm::jani::Model JaniParser::parseModel() { + std::pair> JaniParser::parseModel(bool parseProperties) { + //jani-version STORM_LOG_THROW(parsedStructure.count("jani-version") == 1, storm::exceptions::InvalidJaniException, "Jani-version must be given exactly once."); uint64_t version = getUnsignedInt(parsedStructure.at("jani-version"), "jani version"); + //name STORM_LOG_THROW(parsedStructure.count("name") == 1, storm::exceptions::InvalidJaniException, "A model must have a (single) name"); std::string name = getString(parsedStructure.at("name"), "model name"); + //model type STORM_LOG_THROW(parsedStructure.count("type") == 1, storm::exceptions::InvalidJaniException, "A type must be given exactly once"); std::string modeltypestring = getString(parsedStructure.at("type"), "type of the model"); storm::jani::ModelType type = storm::jani::getModelType(modeltypestring); STORM_LOG_THROW(type != storm::jani::ModelType::UNDEFINED, storm::exceptions::InvalidJaniException, "model type " + modeltypestring + " not recognized"); - storm::jani::Model model(name, type, version); + storm::jani::Model model(name, type, version, expressionManager); STORM_LOG_THROW(parsedStructure.count("actions") < 2, storm::exceptions::InvalidJaniException, "Action-declarations can be given at most once."); parseActions(parsedStructure.at("actions"), model); - STORM_LOG_THROW(parsedStructure.count("variables") < 2, storm::exceptions::InvalidJaniException, "Variable-declarations can be given at most once for global variables."); - for(auto const& varStructure : parsedStructure.at("variables")) { - parseVariable(varStructure, "global"); + size_t constantsCount = parsedStructure.count("constants"); + STORM_LOG_THROW(constantsCount < 2, storm::exceptions::InvalidJaniException, "Constant-declarations can be given at most once."); + if (constantsCount == 1) { + for (auto const &constStructure : parsedStructure.at("constants")) { + model.addConstant(*parseConstant(constStructure, "global")); + } + } + size_t variablesCount = parsedStructure.count("variables"); + STORM_LOG_THROW(variablesCount < 2, storm::exceptions::InvalidJaniException, "Variable-declarations can be given at most once for global variables."); + if (variablesCount == 1) { + for (auto const& varStructure : parsedStructure.at("variables")) { + model.addVariable(*parseVariable(varStructure, "global")); + } } STORM_LOG_THROW(parsedStructure.count("automata") == 1, storm::exceptions::InvalidJaniException, "Exactly one list of automata must be given"); STORM_LOG_THROW(parsedStructure.at("automata").is_array(), storm::exceptions::InvalidJaniException, "Automata must be an array"); // Automatons can only be parsed after constants and variables. - for(auto const& automataEntry : parsedStructure.at("automata")) { - storm::jani::Automaton automaton = parseAutomaton(automataEntry); - + for (auto const& automataEntry : parsedStructure.at("automata")) { + model.addAutomaton(parseAutomaton(automataEntry, model)); } + STORM_LOG_THROW(parsedStructure.count("restrict-initial") < 2, storm::exceptions::InvalidJaniException, "Model has multiple initial value restrictions"); + storm::expressions::Expression initialValueRestriction = expressionManager->boolean(true); + if(parsedStructure.count("restrict-initial") > 0) { + STORM_LOG_THROW(parsedStructure.at("restrict-initial").count("exp") == 1, storm::exceptions::InvalidJaniException, "Model needs an expression inside the initial restricion"); + initialValueRestriction = parseExpression(parsedStructure.at("restrict-initial").at("exp"), "Initial value restriction for automaton " + name); + } + model.setInitialStatesRestriction(initialValueRestriction); STORM_LOG_THROW(parsedStructure.count("system") == 1, storm::exceptions::InvalidJaniException, "Exactly one system description must be given"); std::shared_ptr composition = parseComposition(parsedStructure.at("system")); + model.setSystemComposition(composition); + STORM_LOG_THROW(parsedStructure.count("properties") <= 1, storm::exceptions::InvalidJaniException, "At most one list of properties can be given"); + std::map properties; + if (parseProperties && parsedStructure.count("properties") == 1) { + STORM_LOG_THROW(parsedStructure.at("properties").is_array(), storm::exceptions::InvalidJaniException, "Properties should be an array"); + for(auto const& propertyEntry : parsedStructure.at("properties")) { + try { + auto prop = this->parseProperty(propertyEntry); + properties.emplace(prop.getName(), prop); + } catch (storm::exceptions::NotSupportedException const& ex) { + STORM_LOG_WARN("Cannot handle property " << ex.what()); + } catch (storm::exceptions::NotImplementedException const& ex) { + STORM_LOG_WARN("Cannot handle property " << ex.what()); + } + } + } + return {model, properties}; + } - return model; + + std::vector> JaniParser::parseUnaryFormulaArgument(json const& propertyStructure, storm::logic::FormulaContext formulaContext, std::string const& opstring, std::string const& context) { + STORM_LOG_THROW(propertyStructure.count("exp") == 1, storm::exceptions::InvalidJaniException, "Expecting operand for operator " << opstring << " in " << context); + return { parseFormula(propertyStructure.at("exp"), formulaContext, "Operand of operator " + opstring) }; + } + + + std::vector> JaniParser::parseBinaryFormulaArguments(json const& propertyStructure, storm::logic::FormulaContext formulaContext, std::string const& opstring, std::string const& context) { + STORM_LOG_THROW(propertyStructure.count("left") == 1, storm::exceptions::InvalidJaniException, "Expecting left operand for operator " << opstring << " in " << context); + STORM_LOG_THROW(propertyStructure.count("right") == 1, storm::exceptions::InvalidJaniException, "Expecting right operand for operator " << opstring << " in " << context); + return { parseFormula(propertyStructure.at("left"), formulaContext, "Operand of operator " + opstring), parseFormula(propertyStructure.at("right"), formulaContext, "Operand of operator " + opstring) }; + } + + storm::jani::PropertyInterval JaniParser::parsePropertyInterval(json const& piStructure) { + storm::jani::PropertyInterval pi; + if (piStructure.count("lower") > 0) { + pi.lowerBound = parseExpression(piStructure.at("lower"), "Lower bound for property interval"); + // TODO substitute constants. + STORM_LOG_THROW(!pi.lowerBound.containsVariables(), storm::exceptions::NotSupportedException, "Only constant expressions are supported as lower bounds"); + + + } + if (piStructure.count("lower-exclusive") > 0) { + STORM_LOG_THROW(pi.lowerBound.isInitialized(), storm::exceptions::InvalidJaniException, "Lower-exclusive can only be set if a lower bound is present"); + pi.lowerBoundStrict = piStructure.at("lower-exclusive"); + + } + if (piStructure.count("upper") > 0) { + pi.upperBound = parseExpression(piStructure.at("upper"), "Upper bound for property interval"); + // TODO substitute constants. + STORM_LOG_THROW(!pi.upperBound.containsVariables(), storm::exceptions::NotSupportedException, "Only constant expressions are supported as upper bounds"); + + } + if (piStructure.count("upper-exclusive") > 0) { + STORM_LOG_THROW(pi.lowerBound.isInitialized(), storm::exceptions::InvalidJaniException, "Lower-exclusive can only be set if a lower bound is present"); + pi.lowerBoundStrict = piStructure.at("upper-exclusive"); + } + STORM_LOG_THROW(pi.lowerBound.isInitialized() || pi.upperBound.isInitialized(), storm::exceptions::InvalidJaniException, "Bounded operators must be bounded"); + return pi; + + + } + + + std::shared_ptr JaniParser::parseFormula(json const& propertyStructure, storm::logic::FormulaContext formulaContext, std::string const& context, boost::optional> bound) { + if (propertyStructure.is_boolean()) { + return std::make_shared(propertyStructure.get()); + } + if (propertyStructure.is_string()) { + if (labels.count(propertyStructure.get()) > 0) { + return std::make_shared(propertyStructure.get()); + } + } + storm::expressions::Expression expr = parseExpression(propertyStructure, "expression in property", {}, true); + if(expr.isInitialized()) { + assert(bound == boost::none); + return std::make_shared(expr); + } else if(propertyStructure.count("op") == 1) { + std::string opString = getString(propertyStructure.at("op"), "Operation description"); + + if(opString == "Pmin" || opString == "Pmax") { + std::vector> args = parseUnaryFormulaArgument(propertyStructure, storm::logic::FormulaContext::Probability, opString, ""); + assert(args.size() == 1); + storm::logic::OperatorInformation opInfo; + opInfo.optimalityType = opString == "Pmin" ? storm::solver::OptimizationDirection::Minimize : storm::solver::OptimizationDirection::Maximize; + opInfo.bound = bound; + return std::make_shared(args[0], opInfo); + + } else if (opString == "∀" || opString == "∃") { + assert(bound == boost::none); + STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Forall and Exists are currently not supported"); + } else if (opString == "Emin" || opString == "Emax") { + bool time=false; + STORM_LOG_THROW(propertyStructure.count("exp") == 1, storm::exceptions::InvalidJaniException, "Expecting reward-expression for operator " << opString << " in " << context); + storm::expressions::Expression rewExpr = parseExpression(propertyStructure.at("exp"), "Reward expression in " + context); + if (rewExpr.isVariable()) { + time = false; + } else { + time = true; + } + std::shared_ptr reach; + if (propertyStructure.count("reach") > 0) { + reach = std::make_shared(parseFormula(propertyStructure.at("reach"), time ? storm::logic::FormulaContext::Time : storm::logic::FormulaContext::Reward, "Reach-expression of operator " + opString)); + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Total reward is currently not supported"); + } + storm::logic::OperatorInformation opInfo; + opInfo.optimalityType = opString == "Emin" ? storm::solver::OptimizationDirection::Minimize : storm::solver::OptimizationDirection::Maximize; + opInfo.bound = bound; + + bool accTime = false; + bool accSteps = false; + if (propertyStructure.count("accumulate") > 0) { + STORM_LOG_THROW(propertyStructure.at("accumulate").is_array(), storm::exceptions::InvalidJaniException, "Accumulate should be an array"); + for(auto const& accEntry : propertyStructure.at("accumulate")) { + if (accEntry == "steps") { + accSteps = true; + } else if (accEntry == "time") { + accTime = true; + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "One may only accumulate either 'steps' or 'time', got " << accEntry.dump() << " in " << context); + } + } + } + STORM_LOG_THROW(!(accTime && accSteps), storm::exceptions::NotSupportedException, "Storm does not allow to accumulate over both time and steps"); + + + if (propertyStructure.count("step-instant") > 0) { + storm::expressions::Expression stepInstantExpr = parseExpression(propertyStructure.at("step-instant"), "Step instant in " + context); + STORM_LOG_THROW(!stepInstantExpr.containsVariables(), storm::exceptions::NotSupportedException, "Storm only allows constant step-instants"); + int64_t stepInstant = stepInstantExpr.evaluateAsInt(); + STORM_LOG_THROW(stepInstant >= 0, storm::exceptions::InvalidJaniException, "Only non-negative step-instants are allowed"); + if(!accTime && !accSteps) { + if (rewExpr.isVariable()) { + std::string rewardName = rewExpr.getVariables().begin()->getName(); + return std::make_shared(std::make_shared(static_cast(stepInstant)), rewardName, opInfo); + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Only simple reward expressions are currently supported"); + } + } else { + if (rewExpr.isVariable()) { + std::string rewardName = rewExpr.getVariables().begin()->getName(); + return std::make_shared(std::make_shared(static_cast(stepInstant)), rewardName, opInfo); + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Only simple reward expressions are currently supported"); + } + } + } else if (propertyStructure.count("time-instant") > 0) { + storm::expressions::Expression timeInstantExpr = parseExpression(propertyStructure.at("time-instant"), "time instant in " + context); + STORM_LOG_THROW(!timeInstantExpr.containsVariables(), storm::exceptions::NotSupportedException, "Storm only allows constant time-instants"); + double timeInstant = timeInstantExpr.evaluateAsDouble(); + STORM_LOG_THROW(timeInstant >= 0, storm::exceptions::InvalidJaniException, "Only non-negative time-instants are allowed"); + if(!accTime && !accSteps) { + if (rewExpr.isVariable()) { + std::string rewardName = rewExpr.getVariables().begin()->getName(); + return std::make_shared(std::make_shared(timeInstant), rewardName, opInfo); + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Only simple reward expressions are currently supported"); + } + } else { + if (rewExpr.isVariable()) { + std::string rewardName = rewExpr.getVariables().begin()->getName(); + return std::make_shared(std::make_shared(timeInstant), rewardName, opInfo); + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Only simple reward expressions are currently supported"); + } + } + } else if (propertyStructure.count("reward-instants") > 0) { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Instant/Cumul. Reward for reward constraints not supported currently."); + } + + //STORM_LOG_THROW(!accTime && !accSteps, storm::exceptions::NotSupportedException, "Storm only allows accumulation if a step- or time-bound is given."); + + if (rewExpr.isVariable()) { + std::string rewardName = rewExpr.getVariables().begin()->getName(); + return std::make_shared(reach, rewardName, opInfo); + } else if (!rewExpr.containsVariables()) { + if(rewExpr.hasIntegerType()) { + if (rewExpr.evaluateAsInt() == 1) { + + return std::make_shared(reach, opInfo); + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Expected steps/time only works with constant one."); + } + } else if (rewExpr.hasRationalType()){ + if (rewExpr.evaluateAsDouble() == 1.0) { + + return std::make_shared(reach, opInfo); + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Expected steps/time only works with constant one."); + } + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Only numerical reward expressions are allowed"); + } + + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "No complex reward expressions are supported at the moment"); + } + + + } else if (opString == "Smin" || opString == "Smax") { + STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Smin and Smax are currently not supported"); + } else if (opString == "U" || opString == "F") { + assert(bound == boost::none); + std::vector> args; + if (opString == "U") { + args = parseBinaryFormulaArguments(propertyStructure, formulaContext, opString, ""); + } else { + assert(opString == "F"); + args = parseUnaryFormulaArgument(propertyStructure, formulaContext, opString, ""); + args.push_back(args[0]); + args[0] = storm::logic::BooleanLiteralFormula::getTrueFormula(); + } + if (propertyStructure.count("step-bounds") > 0) { + storm::jani::PropertyInterval pi = parsePropertyInterval(propertyStructure.at("step-bounds")); + STORM_LOG_THROW(pi.hasUpperBound(), storm::exceptions::NotSupportedException, "Storm only supports step-bounded until with an upper bound"); + if(pi.hasLowerBound()) { + STORM_LOG_THROW(pi.lowerBound.evaluateAsInt() == 0, storm::exceptions::NotSupportedException, "Storm only supports step-bounded until without a (non-trivial) lower-bound"); + } + int64_t upperBound = pi.upperBound.evaluateAsInt(); + if(pi.upperBoundStrict) { + upperBound--; + } + STORM_LOG_THROW(upperBound >= 0, storm::exceptions::InvalidJaniException, "Step-bounds cannot be negative"); + return std::make_shared(args[0], args[1], upperBound); + } else if (propertyStructure.count("time-bounds") > 0) { + storm::jani::PropertyInterval pi = parsePropertyInterval(propertyStructure.at("time-bounds")); + STORM_LOG_THROW(pi.hasUpperBound(), storm::exceptions::NotSupportedException, "Storm only supports time-bounded until with an upper bound."); + double lowerBound = 0.0; + if(pi.hasLowerBound()) { + lowerBound = pi.lowerBound.evaluateAsDouble(); + } + double upperBound = pi.upperBound.evaluateAsDouble(); + STORM_LOG_THROW(lowerBound >= 0, storm::exceptions::InvalidJaniException, "(Lower) time-bounds cannot be negative"); + STORM_LOG_THROW(upperBound >= 0, storm::exceptions::InvalidJaniException, "(Upper) time-bounds cannot be negative"); + return std::make_shared(args[0], args[1], upperBound); + + } else if (propertyStructure.count("reward-bounds") > 0 ) { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Reward bounded properties are not supported by Storm"); + } + if (args[0]->isTrueFormula()) { + return std::make_shared(args[1], storm::logic::FormulaContext::Reward); + } else { + return std::make_shared(args[0], args[1]); + } + } else if (opString == "G") { + assert(bound == boost::none); + std::vector> args = parseUnaryFormulaArgument(propertyStructure, formulaContext, opString, "Subformula of globally operator " + context); + if (propertyStructure.count("step-bounds") > 0) { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Globally and step-bounds are not supported currently"); + } else if (propertyStructure.count("time-bounds") > 0) { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Globally and time bounds are not supported by Storm"); + } else if (propertyStructure.count("reward-bounds") > 0 ) { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Reward bounded properties are not supported by Storm"); + } + return std::make_shared(args[1]); + + } else if (opString == "W") { + assert(bound == boost::none); + STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Weak until is not supported"); + } else if (opString == "R") { + assert(bound == boost::none); + STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Release is not supported"); + } else if (opString == "∧" || opString == "∨") { + assert(bound == boost::none); + std::vector> args = parseBinaryFormulaArguments(propertyStructure, formulaContext, opString, ""); + assert(args.size() == 2); + storm::logic::BinaryBooleanStateFormula::OperatorType oper = opString == "∧" ? storm::logic::BinaryBooleanStateFormula::OperatorType::And : storm::logic::BinaryBooleanStateFormula::OperatorType::Or; + return std::make_shared(oper, args[0], args[1]); + } else if (opString == "¬") { + assert(bound == boost::none); + std::vector> args = parseUnaryFormulaArgument(propertyStructure, formulaContext, opString, ""); + assert(args.size() == 1); + return std::make_shared(storm::logic::UnaryBooleanStateFormula::OperatorType::Not, args[0]); + + } else if (opString == "≥" || opString == "≤" || opString == "<" || opString == ">") { + assert(bound == boost::none); + storm::logic::ComparisonType ct; + if(opString == "≥") { + ct = storm::logic::ComparisonType::GreaterEqual; + } else if (opString == "≤") { + ct = storm::logic::ComparisonType::LessEqual; + } else if (opString == "<") { + ct = storm::logic::ComparisonType::Less; + } else if (opString == ">") { + ct = storm::logic::ComparisonType::Greater; + } + if (propertyStructure.at("left").count("op") > 0 && (propertyStructure.at("left").at("op") == "Pmin" || propertyStructure.at("left").at("op") == "Pmax" || propertyStructure.at("left").at("op") == "Emin" || propertyStructure.at("left").at("op") == "Emax" || propertyStructure.at("left").at("op") == "Smin" || propertyStructure.at("left").at("op") == "Smax")) { + auto expr = parseExpression(propertyStructure.at("right"), "Threshold for operator " + propertyStructure.at("left").at("op").get()); + STORM_LOG_THROW(expr.getVariables().empty(), storm::exceptions::NotSupportedException, "Only constant thresholds supported"); + // TODO evaluate this expression directly as rational number + return parseFormula(propertyStructure.at("left"), formulaContext, "", storm::logic::Bound(ct, storm::utility::convertNumber(expr.evaluateAsDouble()))); + } else if(propertyStructure.at("right").count("op") > 0 && (propertyStructure.at("right").at("op") == "Pmin" || propertyStructure.at("right").at("op") == "Pmax" || propertyStructure.at("right").at("op") == "Emin" || propertyStructure.at("right").at("op") == "Emax" || propertyStructure.at("right").at("op") == "Smin" || propertyStructure.at("right").at("op") == "Smax")) { + auto expr = parseExpression(propertyStructure.at("left"), "Threshold for operator " + propertyStructure.at("right").at("op").get()); + STORM_LOG_THROW(expr.getVariables().empty(), storm::exceptions::NotSupportedException, "Only constant thresholds supported"); + // TODO evaluate this expression directly as rational number + return parseFormula(propertyStructure.at("right"),formulaContext, "", storm::logic::Bound(ct, storm::utility::convertNumber(expr.evaluateAsDouble()))); + + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "No complex comparisons are allowed."); + } + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unknown operator " << opString); + } + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Looking for operator for formula " << propertyStructure.dump() << ", but did not find one"); + } + + } + + storm::jani::Property JaniParser::parseProperty(json const& propertyStructure) { + STORM_LOG_THROW(propertyStructure.count("name") == 1, storm::exceptions::InvalidJaniException, "Property must have a name"); + // TODO check unique name + std::string name = getString(propertyStructure.at("name"), "property-name"); + std::string comment = ""; + if (propertyStructure.count("comment") > 0) { + comment = getString(propertyStructure.at("comment"), "comment for property named '" + name + "'."); + } + STORM_LOG_THROW(propertyStructure.count("expression") == 1, storm::exceptions::InvalidJaniException, "Property must have an expression"); + // Parse filter expression. + json const& expressionStructure = propertyStructure.at("expression"); + + STORM_LOG_THROW(expressionStructure.count("op") == 1, storm::exceptions::InvalidJaniException, "Expression in property must have an operation description"); + STORM_LOG_THROW(expressionStructure.at("op") == "filter", storm::exceptions::InvalidJaniException, "Top level operation of a property must be a filter"); + STORM_LOG_THROW(expressionStructure.count("fun") == 1, storm::exceptions::InvalidJaniException, "Filter must have a function descritpion"); + std::string funDescr = getString(expressionStructure.at("fun"), "Filter function in property named " + name); + storm::modelchecker::FilterType ft; + if (funDescr == "min") { + ft = storm::modelchecker::FilterType::MIN; + } else if (funDescr == "max") { + ft = storm::modelchecker::FilterType::MAX; + } else if (funDescr == "sum") { + ft = storm::modelchecker::FilterType::SUM; + } else if (funDescr == "avg") { + ft = storm::modelchecker::FilterType::AVG; + } else if (funDescr == "count") { + ft = storm::modelchecker::FilterType::COUNT; + } else if (funDescr == "∀") { + ft = storm::modelchecker::FilterType::FORALL; + } else if (funDescr == "∃") { + ft = storm::modelchecker::FilterType::EXISTS; + } else if (funDescr == "argmin") { + ft = storm::modelchecker::FilterType::ARGMIN; + } else if (funDescr == "argmax") { + ft = storm::modelchecker::FilterType::ARGMAX; + } else if (funDescr == "values") { + ft = storm::modelchecker::FilterType::VALUES; + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unknown filter description " << funDescr << " in property named " << name); + } + + STORM_LOG_THROW(expressionStructure.count("states") == 1, storm::exceptions::InvalidJaniException, "Filter must have a states description"); + STORM_LOG_THROW(expressionStructure.at("states").count("op") > 0, storm::exceptions::NotImplementedException, "We only support properties where the filter has initial states"); + std::string statesDescr = getString(expressionStructure.at("states").at("op"), "Filtered states in property named " + name); + STORM_LOG_THROW(statesDescr == "initial", storm::exceptions::NotImplementedException, "Only initial states are allowed as set of states we are interested in."); + STORM_LOG_THROW(expressionStructure.count("values") == 1, storm::exceptions::InvalidJaniException, "Values as input for a filter must be given"); + auto formula = parseFormula(expressionStructure.at("values"), storm::logic::FormulaContext::Undefined, "Values of property " + name); + return storm::jani::Property(name, storm::jani::FilterExpression(formula, ft), comment); + } + + std::shared_ptr JaniParser::parseConstant(json const& constantStructure, std::string const& scopeDescription) { + STORM_LOG_THROW(constantStructure.count("name") == 1, storm::exceptions::InvalidJaniException, "Variable (scope: " + scopeDescription + ") must have a name"); + std::string name = getString(constantStructure.at("name"), "variable-name in " + scopeDescription + "-scope"); + // TODO check existance of name. + // TODO store prefix in variable. + std::string exprManagerName = name; + STORM_LOG_THROW(constantStructure.count("type") == 1, storm::exceptions::InvalidJaniException, "Constant '" + name + "' (scope: " + scopeDescription + ") must have a (single) type-declaration."); + size_t valueCount = constantStructure.count("value"); + storm::expressions::Expression initExpr; + STORM_LOG_THROW(valueCount < 2, storm::exceptions::InvalidJaniException, "Value for constant '" + name + "' (scope: " + scopeDescription + ") must be given at most once."); + if (valueCount == 1) { + // Read initial value before; that makes creation later on a bit easier, and has as an additional benefit that we do not need to check whether the variable occurs also on the assignment. + initExpr = parseExpression(constantStructure.at("value"), "Value of constant " + name + " (scope: " + scopeDescription + ")"); + assert(initExpr.isInitialized()); + } + + if (constantStructure.at("type").is_object()) { +// STORM_LOG_THROW(variableStructure.at("type").count("kind") == 1, storm::exceptions::InvalidJaniException, "For complex type as in variable " << name << "(scope: " << scopeDescription << ") kind must be given"); +// std::string kind = getString(variableStructure.at("type").at("kind"), "kind for complex type as in variable " + name + "(scope: " + scopeDescription + ") "); +// if(kind == "bounded") { +// // First do the bounds, that makes the code a bit more streamlined +// STORM_LOG_THROW(variableStructure.at("type").count("lower-bound") == 1, storm::exceptions::InvalidJaniException, "For bounded type as in variable " << name << "(scope: " << scopeDescription << ") lower-bound must be given"); +// storm::expressions::Expression lowerboundExpr = parseExpression(variableStructure.at("type").at("lower-bound"), "Lower bound for variable "+ name + " (scope: " + scopeDescription + ")"); +// assert(lowerboundExpr.isInitialized()); +// STORM_LOG_THROW(variableStructure.at("type").count("upper-bound") == 1, storm::exceptions::InvalidJaniException, "For bounded type as in variable " << name << "(scope: " << scopeDescription << ") upper-bound must be given"); +// storm::expressions::Expression upperboundExpr = parseExpression(variableStructure.at("type").at("upper-bound"), "Upper bound for variable "+ name + " (scope: " + scopeDescription + ")"); +// assert(upperboundExpr.isInitialized()); +// STORM_LOG_THROW(variableStructure.at("type").count("base") == 1, storm::exceptions::InvalidJaniException, "For bounded type as in variable " << name << "(scope: " << scopeDescription << ") base must be given"); +// std::string basictype = getString(variableStructure.at("type").at("base"), "base for bounded type as in variable " + name + "(scope: " + scopeDescription + ") "); +// if(basictype == "int") { +// STORM_LOG_THROW(lowerboundExpr.hasIntegerType(), storm::exceptions::InvalidJaniException, "Lower bound for bounded integer variable " << name << "(scope: " << scopeDescription << ") must be integer-typed"); +// STORM_LOG_THROW(upperboundExpr.hasIntegerType(), storm::exceptions::InvalidJaniException, "Upper bound for bounded integer variable " << name << "(scope: " << scopeDescription << ") must be integer-typed"); +// return std::make_shared(name, expressionManager->declareIntegerVariable(exprManagerName), lowerboundExpr, upperboundExpr); +// } else { +// STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unsupported base " << basictype << " for bounded variable " << name << "(scope: " << scopeDescription << ") "); +// } +// } else { +// STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unsupported kind " << kind << " for complex type of variable " << name << "(scope: " << scopeDescription << ") "); +// } + } + else if(constantStructure.at("type").is_string()) { + if(constantStructure.at("type") == "real") { + if(initExpr.isInitialized()) { + return std::make_shared(name, expressionManager->declareRationalVariable(exprManagerName), initExpr); + } else { + return std::make_shared(name, expressionManager->declareRationalVariable(exprManagerName)); + } + } else if(constantStructure.at("type") == "bool") { + if(initExpr.isInitialized()) { + return std::make_shared(name, expressionManager->declareBooleanVariable(exprManagerName), initExpr); + } else { + return std::make_shared(name, expressionManager->declareBooleanVariable(exprManagerName)); + } + + } else if(constantStructure.at("type") == "int") { + if(initExpr.isInitialized()) { + return std::make_shared(name, expressionManager->declareIntegerVariable(exprManagerName), initExpr); + } else { + return std::make_shared(name, expressionManager->declareIntegerVariable(exprManagerName)); + } + } else { + // TODO clocks. + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unknown type description " << constantStructure.at("type").dump() << " for constant '" << name << "' (scope: " << scopeDescription << ")"); + } + } + + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unknown type description, " << constantStructure.at("type").dump() << " for Variable '" << name << "' (scope: " << scopeDescription << ")"); } std::shared_ptr JaniParser::parseVariable(json const &variableStructure, std::string const& scopeDescription, bool prefWithScope) { STORM_LOG_THROW(variableStructure.count("name") == 1, storm::exceptions::InvalidJaniException, "Variable (scope: " + scopeDescription + ") must have a name"); - std::string pref = prefWithScope ? scopeDescription + "." : ""; + std::string pref = prefWithScope ? scopeDescription + VARIABLE_AUTOMATON_DELIMITER : ""; std::string name = getString(variableStructure.at("name"), "variable-name in " + scopeDescription + "-scope"); // TODO check existance of name. // TODO store prefix in variable. std::string exprManagerName = pref + name; + bool transientVar = defaultVariableTransient; // Default value for variables. + size_t tvarcount = variableStructure.count("transient"); + STORM_LOG_THROW(tvarcount <= 1, storm::exceptions::InvalidJaniException, "Multiple definitions of transient not allowed in variable '" + name + "' (scope: " + scopeDescription + ") "); + if(tvarcount == 1) { + transientVar = getBoolean(variableStructure.at("transient"), "transient-attribute in variable '" + name + "' (scope: " + scopeDescription + ") "); + } + size_t initvalcount = variableStructure.count("initial-value"); + if(transientVar) { + STORM_LOG_THROW(initvalcount == 1, storm::exceptions::InvalidJaniException, "Initial value must be given once for transient variable '" + name + "' (scope: " + scopeDescription + ") "+ name + "' (scope: " + scopeDescription + ") "); + } else { + STORM_LOG_THROW(initvalcount <= 1, storm::exceptions::InvalidJaniException, "Initial value can be given at most one for variable " + name + "' (scope: " + scopeDescription + ")"); + } STORM_LOG_THROW(variableStructure.count("type") == 1, storm::exceptions::InvalidJaniException, "Variable '" + name + "' (scope: " + scopeDescription + ") must have a (single) type-declaration."); - // TODO DEPRECATED make initial value optional? --- still rpesent in files, so keep it for now - STORM_LOG_THROW(variableStructure.count("initial-value") == 1, storm::exceptions::InvalidJaniException, "Initial value for variable '" + name + "' + (scope: " + scopeDescription + ") must be given once."); - // Read initial value before; that makes creation later on a bit easier, and has as an additional benefit that we do not need to check whether the variable occurs also on the assignment. - storm::expressions::Expression initExpr = parseExpression(variableStructure.at("initial-value"), "Initial value of variable " + name + " (scope: " + scopeDescription + ")"); - assert(initExpr.isInitialized()); + boost::optional initVal; if(variableStructure.at("type").is_string()) { if(variableStructure.at("type") == "real") { - // expressionManager->declareRationalVariable(name); - // TODO something. + if(initvalcount == 1) { + if(variableStructure.at("initial-value").is_null()) { + initVal = expressionManager->rational(defaultRationalInitialValue); + } else { + initVal = parseExpression(variableStructure.at("initial-value"), "Initial value for variable " + name + " (scope: " + scopeDescription + ") "); + STORM_LOG_THROW(initVal.get().hasRationalType(), storm::exceptions::InvalidJaniException, "Initial value for integer variable " + name + "(scope " + scopeDescription + ") should be a rational"); + } + return std::make_shared(name, expressionManager->declareRationalVariable(exprManagerName), initVal.get(), transientVar); + + } + assert(!transientVar); + return std::make_shared(name, expressionManager->declareRationalVariable(exprManagerName)); } else if(variableStructure.at("type") == "bool") { - STORM_LOG_THROW(initExpr.hasBooleanType(), storm::exceptions::InvalidJaniException, "Initial value for Boolean variable " << name << " (scope: " << scopeDescription << ") should have Boolean type."); - // TODO: reenable and put initExpr in the place where it belongs. -// return std::make_shared(name, expressionManager->declareBooleanVariable(exprManagerName), initExpr); + if(initvalcount == 1) { + if(variableStructure.at("initial-value").is_null()) { + initVal = expressionManager->boolean(defaultBooleanInitialValue); + } else { + initVal = parseExpression(variableStructure.at("initial-value"), "Initial value for variable " + name + " (scope: " + scopeDescription + ") "); + STORM_LOG_THROW(initVal.get().hasBooleanType(), storm::exceptions::InvalidJaniException, "Initial value for integer variable " + name + "(scope " + scopeDescription + ") should be a Boolean"); + } + if(transientVar) { + labels.insert(name); + } + return std::make_shared(name, expressionManager->declareBooleanVariable(exprManagerName), initVal.get(), transientVar); + } + assert(!transientVar); + return std::make_shared(name, expressionManager->declareBooleanVariable(exprManagerName)); } else if(variableStructure.at("type") == "int") { - STORM_LOG_THROW(initExpr.hasIntegerType(), storm::exceptions::InvalidJaniException, "Initial value for interger variable " << name << " (scope: " << scopeDescription << ") should have integer type."); - // TODO: reenable and put initExpr in the place where it belongs. -// return std::make_shared(name, expressionManager->declareIntegerVariable(exprManagerName), initExpr); + if(initvalcount == 1) { + if(variableStructure.at("initial-value").is_null()) { + initVal = expressionManager->integer(defaultIntegerInitialValue); + } else { + initVal = parseExpression(variableStructure.at("initial-value"), "Initial value for variable " + name + " (scope: " + scopeDescription + ") "); + STORM_LOG_THROW(initVal.get().hasIntegerType(), storm::exceptions::InvalidJaniException, "Initial value for integer variable " + name + "(scope " + scopeDescription + ") should be an integer"); + } + return std::make_shared(name, expressionManager->declareIntegerVariable(exprManagerName), initVal.get(), transientVar); + } + return std::make_shared(name, expressionManager->declareIntegerVariable(exprManagerName), transientVar); + } else if(variableStructure.at("type") == "clock") { + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unsupported type 'clock' for variable '" << name << "' (scope: " << scopeDescription << ")"); + } else if(variableStructure.at("type") == "continuous") { + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unsupported type 'continuous' for variable ''" << name << "' (scope: " << scopeDescription << ")"); } else { - // TODO clocks. - STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unknown type description " << variableStructure.at("type").dump() << " for Variable '" << name << "' (scope: " << scopeDescription << ")"); + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unknown type description " << variableStructure.at("type").dump() << " for variable '" << name << "' (scope: " << scopeDescription << ")"); } - } - if(variableStructure.at("type").is_object()) { + } else if(variableStructure.at("type").is_object()) { STORM_LOG_THROW(variableStructure.at("type").count("kind") == 1, storm::exceptions::InvalidJaniException, "For complex type as in variable " << name << "(scope: " << scopeDescription << ") kind must be given"); std::string kind = getString(variableStructure.at("type").at("kind"), "kind for complex type as in variable " + name + "(scope: " + scopeDescription + ") "); if(kind == "bounded") { // First do the bounds, that makes the code a bit more streamlined STORM_LOG_THROW(variableStructure.at("type").count("lower-bound") == 1, storm::exceptions::InvalidJaniException, "For bounded type as in variable " << name << "(scope: " << scopeDescription << ") lower-bound must be given"); - storm::expressions::Expression lowerboundExpr = parseExpression(variableStructure.at("type").at("lower-bound"), "Lower bound for variable "+ name + " (scope: " + scopeDescription + ")"); + storm::expressions::Expression lowerboundExpr = parseExpression(variableStructure.at("type").at("lower-bound"), "Lower bound for variable " + name + " (scope: " + scopeDescription + ")"); assert(lowerboundExpr.isInitialized()); STORM_LOG_THROW(variableStructure.at("type").count("upper-bound") == 1, storm::exceptions::InvalidJaniException, "For bounded type as in variable " << name << "(scope: " << scopeDescription << ") upper-bound must be given"); storm::expressions::Expression upperboundExpr = parseExpression(variableStructure.at("type").at("upper-bound"), "Upper bound for variable "+ name + " (scope: " + scopeDescription + ")"); assert(upperboundExpr.isInitialized()); STORM_LOG_THROW(variableStructure.at("type").count("base") == 1, storm::exceptions::InvalidJaniException, "For bounded type as in variable " << name << "(scope: " << scopeDescription << ") base must be given"); + if(initvalcount == 1) { + if(variableStructure.at("initial-value").is_null()) { + initVal = storm::expressions::ite(lowerboundExpr < 0 && upperboundExpr > 0, expressionManager->integer(0), lowerboundExpr); + // TODO as soon as we support half-open intervals, we have to change this. + } else { + initVal = parseExpression(variableStructure.at("initial-value"), "Initial value for variable " + name + " (scope: " + scopeDescription + ") "); + } + } std::string basictype = getString(variableStructure.at("type").at("base"), "base for bounded type as in variable " + name + "(scope: " + scopeDescription + ") "); if(basictype == "int") { + if(initVal) { + STORM_LOG_THROW(initVal.get().hasIntegerType(), storm::exceptions::InvalidJaniException, "Initial value for integer variable " + name + "(scope " + scopeDescription + ") should be an integer"); + } STORM_LOG_THROW(lowerboundExpr.hasIntegerType(), storm::exceptions::InvalidJaniException, "Lower bound for bounded integer variable " << name << "(scope: " << scopeDescription << ") must be integer-typed"); STORM_LOG_THROW(upperboundExpr.hasIntegerType(), storm::exceptions::InvalidJaniException, "Upper bound for bounded integer variable " << name << "(scope: " << scopeDescription << ") must be integer-typed"); - // TODO: reenable and put initExpr in the place where it belongs. -// return std::make_shared(name, expressionManager->declareIntegerVariable(exprManagerName), lowerboundExpr, upperboundExpr, initExpr); + return storm::jani::makeBoundedIntegerVariable(name, expressionManager->declareIntegerVariable(exprManagerName), initVal, transientVar, lowerboundExpr, upperboundExpr); } else { STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unsupported base " << basictype << " for bounded variable " << name << "(scope: " << scopeDescription << ") "); } @@ -140,7 +653,8 @@ namespace storm { STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unsupported kind " << kind << " for complex type of variable " << name << "(scope: " << scopeDescription << ") "); } } - STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unknown type description, " << variableStructure.at("type").dump() << " for Variable '" << name << "' (scope: " << scopeDescription << ")"); + + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unknown type description, " << variableStructure.at("type").dump() << " for variable '" << name << "' (scope: " << scopeDescription << ")"); } /** @@ -149,6 +663,17 @@ namespace storm { void ensureNumberOfArguments(uint64_t expected, uint64_t actual, std::string const& opstring, std::string const& errorInfo) { STORM_LOG_THROW(expected == actual, storm::exceptions::InvalidJaniException, "Operator " << opstring << " expects " << expected << " arguments, but got " << actual << " in " << errorInfo << "."); } + + std::vector JaniParser::parseUnaryExpressionArguments(json const& expressionDecl, std::string const& opstring, std::string const& scopeDescription, std::unordered_map> const& localVars, bool returnNoneInitializedOnUnknownOperator) { + storm::expressions::Expression left = parseExpression(expressionDecl.at("exp"), "Argument of operator " + opstring + " in " + scopeDescription, localVars,returnNoneInitializedOnUnknownOperator); + return {left}; + } + + std::vector JaniParser::parseBinaryExpressionArguments(json const& expressionDecl, std::string const& opstring, std::string const& scopeDescription, std::unordered_map> const& localVars, bool returnNoneInitializedOnUnknownOperator) { + storm::expressions::Expression left = parseExpression(expressionDecl.at("left"), "Left argument of operator " + opstring + " in " + scopeDescription, localVars, returnNoneInitializedOnUnknownOperator); + storm::expressions::Expression right = parseExpression(expressionDecl.at("right"), "Right argument of operator " + opstring + " in " + scopeDescription, localVars, returnNoneInitializedOnUnknownOperator); + return {left, right}; + } /** * Helper for parse expression. */ @@ -163,8 +688,26 @@ namespace storm { STORM_LOG_THROW(expr.hasNumericalType(), storm::exceptions::InvalidJaniException, "Operator " << opstring << " expects argument " + std::to_string(argNr) + " to be numerical in " << errorInfo << "."); } + storm::jani::Variable const& getLValue(std::string const& ident, storm::jani::VariableSet const& globalVars, storm::jani::VariableSet const& localVars, std::string const& scopeDescription) { + if(localVars.hasVariable(ident)) { + return localVars.getVariable(ident); + } else if(globalVars.hasVariable(ident)) { + return globalVars.getVariable(ident); + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unknown identifier '" << ident << "' occurs in " << scopeDescription); + } + } + + storm::expressions::Variable JaniParser::getVariableOrConstantExpression(std::string const &ident,std::string const& scopeDescription, std::unordered_map> const& localVars) { + if(localVars.count(ident) == 1) { + return localVars.at(ident)->getExpressionVariable(); + } else { + STORM_LOG_THROW(expressionManager->hasVariable(ident), storm::exceptions::InvalidJaniException, "Unknown identifier '" << ident << "' occurs in " << scopeDescription); + return expressionManager->getVariable(ident); + } + } - storm::expressions::Expression JaniParser::parseExpression(json const& expressionStructure, std::string const& scopeDescription, std::unordered_map> const& localVars) { + storm::expressions::Expression JaniParser::parseExpression(json const& expressionStructure, std::string const& scopeDescription, std::unordered_map> const& localVars, bool returnNoneInitializedOnUnknownOperator) { if(expressionStructure.is_boolean()) { if(expressionStructure.get()) { return expressionManager->boolean(true); @@ -172,53 +715,69 @@ namespace storm { return expressionManager->boolean(false); } } else if(expressionStructure.is_number_integer()) { - return expressionManager->integer(expressionStructure.get()); + return expressionManager->integer(expressionStructure.get()); } else if(expressionStructure.is_number_float()) { // For now, just take the double. // TODO make this a rational number return expressionManager->rational(expressionStructure.get()); } else if(expressionStructure.is_string()) { std::string ident = expressionStructure.get(); - if(localVars.count(ident) == 1) { - return storm::expressions::Expression(localVars.at(ident)->getExpressionVariable()); - } else { - STORM_LOG_THROW(expressionManager->hasVariable(ident), storm::exceptions::InvalidJaniException, "Unknown identifier '" << ident << "' occurs in " << scopeDescription); - return expressionManager->getVariableExpression(ident); - } + return storm::expressions::Expression(getVariableOrConstantExpression(ident, scopeDescription, localVars)); } else if(expressionStructure.is_object()) { + if(expressionStructure.count("distribution") == 1) { + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Distributions are not supported by storm expressions, cannot import " << expressionStructure.dump() << " in " << scopeDescription << "."); + } if(expressionStructure.count("op") == 1) { std::string opstring = getString(expressionStructure.at("op"), scopeDescription); - STORM_LOG_THROW(expressionStructure.count("args") == 1, storm::exceptions::InvalidJaniException, "Operation arguments are not given in " << expressionStructure.dump() << " in " << scopeDescription << "." ); - std::vector arguments; - unsigned i = 1; - for(json const& argStructure : expressionStructure.at("args")) { - arguments.push_back(parseExpression(argStructure, scopeDescription + "in argument " + std::to_string(i), localVars)); - assert(arguments.back().isInitialized()); - ++i; - } - if(opstring == "?:") { + std::vector arguments = {}; + if(opstring == "ite") { + STORM_LOG_THROW(expressionStructure.count("if") == 1, storm::exceptions::InvalidJaniException, "If operator required"); + STORM_LOG_THROW(expressionStructure.count("else") == 1, storm::exceptions::InvalidJaniException, "Else operator required"); + STORM_LOG_THROW(expressionStructure.count("then") == 1, storm::exceptions::InvalidJaniException, "If operator required"); + arguments.push_back(parseExpression(expressionStructure.at("if"), "if-formula in " + scopeDescription)); + arguments.push_back(parseExpression(expressionStructure.at("then"), "then-formula in " + scopeDescription)); + arguments.push_back(parseExpression(expressionStructure.at("else"), "else-formula in " + scopeDescription)); ensureNumberOfArguments(3, arguments.size(), opstring, scopeDescription); assert(arguments.size() == 3); + ensureBooleanType(arguments[0], opstring, 0, scopeDescription); return storm::expressions::ite(arguments[0], arguments[1], arguments[2]); } else if (opstring == "∨") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars, returnNoneInitializedOnUnknownOperator); + assert(arguments.size() == 2); + if(!arguments[0].isInitialized() || !arguments[1].isInitialized()) { + return storm::expressions::Expression(); + } ensureBooleanType(arguments[0], opstring, 0, scopeDescription); ensureBooleanType(arguments[1], opstring, 1, scopeDescription); - assert(arguments.size() == 2); return arguments[0] || arguments[1]; } else if (opstring == "∧") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars, returnNoneInitializedOnUnknownOperator); + assert(arguments.size() == 2); + if(!arguments[0].isInitialized() || !arguments[1].isInitialized()) { + return storm::expressions::Expression(); + } ensureBooleanType(arguments[0], opstring, 0, scopeDescription); ensureBooleanType(arguments[1], opstring, 1, scopeDescription); - assert(arguments.size() == 2); return arguments[0] && arguments[1]; - } else if (opstring == "!") { - ensureNumberOfArguments(1, arguments.size(), opstring, scopeDescription); + } else if (opstring == "⇒") { + arguments = parseUnaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars, returnNoneInitializedOnUnknownOperator); + assert(arguments.size() == 2); + if(!arguments[0].isInitialized() || !arguments[1].isInitialized()) { + return storm::expressions::Expression(); + } ensureBooleanType(arguments[0], opstring, 0, scopeDescription); + ensureBooleanType(arguments[1], opstring, 1, scopeDescription); + return (!arguments[0]) || arguments[1]; + } else if (opstring == "¬") { + arguments = parseUnaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars, returnNoneInitializedOnUnknownOperator); assert(arguments.size() == 1); + if(!arguments[0].isInitialized()) { + return storm::expressions::Expression(); + } + ensureBooleanType(arguments[0], opstring, 0, scopeDescription); return !arguments[0]; } else if (opstring == "=") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); assert(arguments.size() == 2); if(arguments[0].hasBooleanType()) { ensureBooleanType(arguments[1], opstring, 1, scopeDescription); @@ -228,7 +787,7 @@ namespace storm { return arguments[0] == arguments[1]; } } else if (opstring == "≠") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); assert(arguments.size() == 2); if(arguments[0].hasBooleanType()) { ensureBooleanType(arguments[1], opstring, 1, scopeDescription); @@ -238,109 +797,146 @@ namespace storm { return arguments[0] != arguments[1]; } } else if (opstring == "<") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars, returnNoneInitializedOnUnknownOperator); + assert(arguments.size() == 2); + if(!arguments[0].isInitialized() || !arguments[1].isInitialized()) { + return storm::expressions::Expression(); + } ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); return arguments[0] < arguments[1]; } else if (opstring == "≤") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars, returnNoneInitializedOnUnknownOperator); + assert(arguments.size() == 2); + if(!arguments[0].isInitialized() || !arguments[1].isInitialized()) { + return storm::expressions::Expression(); + } ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); return arguments[0] <= arguments[1]; } else if (opstring == ">") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars, returnNoneInitializedOnUnknownOperator); + assert(arguments.size() == 2); + if(!arguments[0].isInitialized() || !arguments[1].isInitialized()) { + return storm::expressions::Expression(); + } ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); return arguments[0] > arguments[1]; } else if (opstring == "≥") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars, returnNoneInitializedOnUnknownOperator); + assert(arguments.size() == 2); + if(!arguments[0].isInitialized() || !arguments[1].isInitialized()) { + return storm::expressions::Expression(); + } ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); return arguments[0] >= arguments[1]; } else if (opstring == "+") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 2); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); return arguments[0] + arguments[1]; } else if (opstring == "-") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 2); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); return arguments[0] - arguments[1]; - } else if (opstring == "--") { - ensureNumberOfArguments(1, arguments.size(), opstring, scopeDescription); - ensureNumericalType(arguments[0], opstring, 0, scopeDescription); + } else if (opstring == "-") { + arguments = parseUnaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); assert(arguments.size() == 1); + ensureNumericalType(arguments[0], opstring, 0, scopeDescription); return -arguments[0]; } else if (opstring == "*") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 2); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); return arguments[0] * arguments[1]; } else if (opstring == "/") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 2); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); return arguments[0] / arguments[1]; } else if (opstring == "%") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 2); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); // TODO implement STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "modulo operation is not yet implemented"); } else if (opstring == "max") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 2); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); return storm::expressions::maximum(arguments[0],arguments[1]); } else if (opstring == "min") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 2); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); return storm::expressions::minimum(arguments[0],arguments[1]); - } else if (opstring == "⌊⌋") { - ensureNumberOfArguments(1, arguments.size(), opstring, scopeDescription); + } else if (opstring == "floor") { + arguments = parseUnaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 1); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); return storm::expressions::floor(arguments[0]); - } else if (opstring == "⌈⌉") { - ensureNumberOfArguments(1, arguments.size(), opstring, scopeDescription); + } else if (opstring == "ceil") { + arguments = parseUnaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 1); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); return storm::expressions::ceil(arguments[0]); } else if (opstring == "abs") { - ensureNumberOfArguments(1, arguments.size(), opstring, scopeDescription); + arguments = parseUnaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 1); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); return storm::expressions::abs(arguments[0]); } else if (opstring == "sgn") { - ensureNumberOfArguments(1, arguments.size(), opstring, scopeDescription); + arguments = parseUnaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 1); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); return storm::expressions::sign(arguments[0]); } else if (opstring == "trc") { - ensureNumberOfArguments(1, arguments.size(), opstring, scopeDescription); + arguments = parseUnaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 1); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); return storm::expressions::abs(arguments[0]); } else if (opstring == "pow") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 2); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); // TODO implement STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "pow operation is not yet implemented"); } else if (opstring == "exp") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 2); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); // TODO implement STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "exp operation is not yet implemented"); } else if (opstring == "log") { - ensureNumberOfArguments(2, arguments.size(), opstring, scopeDescription); + arguments = parseBinaryExpressionArguments(expressionStructure, opstring, scopeDescription, localVars); + assert(arguments.size() == 2); ensureNumericalType(arguments[0], opstring, 0, scopeDescription); ensureNumericalType(arguments[1], opstring, 1, scopeDescription); // TODO implement STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "log operation is not yet implemented"); - } else { + } else if (unsupportedOpstrings.count(opstring) > 0){ + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Opstring " + opstring + " is not supported by storm"); + + } else { + if(returnNoneInitializedOnUnknownOperator) { + return storm::expressions::Expression(); + } STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Unknown operator " << opstring << " in " << scopeDescription << "."); } } - STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Only standard operators are supported for complex expressions as " << expressionStructure.dump() << " in " << scopeDescription << "."); + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "No supported operator declaration found for complex expressions as " << expressionStructure.dump() << " in " << scopeDescription << "."); } assert(false); @@ -359,27 +955,51 @@ namespace storm { } } - storm::jani::Automaton JaniParser::parseAutomaton(json const &automatonStructure) { + storm::jani::Automaton JaniParser::parseAutomaton(json const &automatonStructure, storm::jani::Model const& parentModel) { STORM_LOG_THROW(automatonStructure.count("name") == 1, storm::exceptions::InvalidJaniException, "Each automaton must have a name"); std::string name = getString(automatonStructure.at("name"), " the name field for automaton"); storm::jani::Automaton automaton(name); STORM_LOG_THROW(automatonStructure.count("locations") > 0, storm::exceptions::InvalidJaniException, "Automaton '" << name << "' does not have locations."); std::unordered_map locIds; for(auto const& locEntry : automatonStructure.at("locations")) { - STORM_LOG_THROW(locEntry.count("name"), storm::exceptions::InvalidJaniException, "Locations for automaton '" << name << "' must have exactly one name"); + STORM_LOG_THROW(locEntry.count("name") == 1, storm::exceptions::InvalidJaniException, "Locations for automaton '" << name << "' must have exactly one name"); std::string locName = getString(locEntry.at("name"), "location of automaton " + name); STORM_LOG_THROW(locIds.count(locName) == 0, storm::exceptions::InvalidJaniException, "Location with name '" + locName + "' already exists in automaton '" + name + "'"); - uint64_t id = automaton.addLocation(storm::jani::Location(locName)); + STORM_LOG_THROW(locEntry.count("invariant") == 0, storm::exceptions::InvalidJaniException, "Invariants in locations as in '" + locName + "' in automaton '" + name + "' are not supported"); + //STORM_LOG_THROW(locEntry.count("invariant") > 0 && !supportsInvariants(parentModel.getModelType()), storm::exceptions::InvalidJaniException, "Invariants are not supported in the model type " + to_string(parentModel.getModelType())); + std::vector transientAssignments; + if(locEntry.count("transient-values") > 0) { + for(auto const& transientValueEntry : locEntry.at("transient-values")) { + STORM_LOG_THROW(transientValueEntry.count("ref") == 1, storm::exceptions::InvalidJaniException, "Transient values in location " << locName << " need exactly one ref that is assigned to"); + STORM_LOG_THROW(transientValueEntry.count("value") == 1, storm::exceptions::InvalidJaniException, "Transient values in location " << locName << " need exactly one assigned value"); + storm::jani::Variable const& lhs = getLValue(transientValueEntry.at("ref"), parentModel.getGlobalVariables(), automaton.getVariables(), "LHS of assignment in location " + locName + " (automaton '" + name + "')"); + STORM_LOG_THROW(lhs.isTransient(), storm::exceptions::InvalidJaniException, "Assigned non-transient variable " + lhs.getName() + " in location " + locName + " (automaton: '" + name + "')"); + storm::expressions::Expression rhs = parseExpression(transientValueEntry.at("value"), "Assignment of variable " + lhs.getName() + " in location " + locName + " (automaton: '" + name + "')"); + transientAssignments.emplace_back(lhs, rhs); + } + } + uint64_t id = automaton.addLocation(storm::jani::Location(locName, transientAssignments)); locIds.emplace(locName, id); } + STORM_LOG_THROW(automatonStructure.count("initial-locations") == 1, storm::exceptions::InvalidJaniException, "Automaton '" << name << "' does not have initial locations."); + for(json const& initLocStruct : automatonStructure.at("initial-locations")) { + automaton.addInitialLocation(getString(initLocStruct, "Initial locations for automaton '" + name + "'.")); + } + STORM_LOG_THROW(automatonStructure.count("restrict-initial") < 2, storm::exceptions::InvalidJaniException, "Automaton '" << name << "' has multiple initial value restrictions"); + storm::expressions::Expression initialValueRestriction = expressionManager->boolean(true); + if(automatonStructure.count("restrict-initial") > 0) { + STORM_LOG_THROW(automatonStructure.at("restrict-initial").count("exp") == 1, storm::exceptions::InvalidJaniException, "Automaton '" << name << "' needs an expression inside the initial restricion"); + initialValueRestriction = parseExpression(automatonStructure.at("restrict-initial").at("exp"), "Initial value restriction for automaton " + name); + } + automaton.setInitialStatesRestriction(initialValueRestriction); uint64_t varDeclCount = automatonStructure.count("variables"); STORM_LOG_THROW(varDeclCount < 2, storm::exceptions::InvalidJaniException, "Automaton '" << name << "' has more than one list of variables"); std::unordered_map> localVars; if(varDeclCount > 0) { for(auto const& varStructure : automatonStructure.at("variables")) { std::shared_ptr var = parseVariable(varStructure, name, true); - std::cout << "Automaton " << name << " variable " << var->getName() << std::endl; assert(localVars.count(var->getName()) == 0); + automaton.addVariable(*var); localVars.emplace(var->getName(), var); } } @@ -403,42 +1023,118 @@ namespace storm { STORM_LOG_THROW(edgeEntry.count("rate") < 2, storm::exceptions::InvalidJaniException, "Edge from '" << sourceLoc << "' in automaton '" << name << "' has multiple rates"); storm::expressions::Expression rateExpr; if(edgeEntry.count("rate") > 0) { - rateExpr = parseExpression(edgeEntry.at("rate"), "rate expression in edge from '" + sourceLoc + "' in automaton '" + name + "'"); + STORM_LOG_THROW(edgeEntry.at("rate").count("exp") == 1, storm::exceptions::InvalidJaniException, "Rate in edge from '" << sourceLoc << "' in automaton '" << name << "' must have a defing expression."); + rateExpr = parseExpression(edgeEntry.at("rate").at("exp"), "rate expression in edge from '" + sourceLoc + "' in automaton '" + name + "'"); STORM_LOG_THROW(rateExpr.hasNumericalType(), storm::exceptions::InvalidJaniException, "Rate '" << rateExpr << "' has not a numerical type"); } // guard - STORM_LOG_THROW(edgeEntry.count("guard") == 1, storm::exceptions::InvalidJaniException, "A single guard must be given in edge from '" << sourceLoc << "' in automaton '" << name << "'"); - storm::expressions::Expression guardExpr = parseExpression(edgeEntry.at("guard"), "guard expression in edge from '" + sourceLoc + "' in automaton '" + name + "'", localVars); - STORM_LOG_THROW(guardExpr.hasBooleanType(), storm::exceptions::InvalidJaniException, "Guard " << guardExpr << " does not have Boolean type."); + STORM_LOG_THROW(edgeEntry.count("guard") <= 1, storm::exceptions::InvalidJaniException, "Guard can be given at most once in edge from '" << sourceLoc << "' in automaton '" << name << "'"); + storm::expressions::Expression guardExpr = expressionManager->boolean(true); + if(edgeEntry.count("guard") == 1) { + STORM_LOG_THROW(edgeEntry.at("guard").count("exp") == 1, storm::exceptions::InvalidJaniException, "Guard in edge from '" + sourceLoc + "' in automaton '" + name + "' must have one expression"); + guardExpr = parseExpression(edgeEntry.at("guard").at("exp"), "guard expression in edge from '" + sourceLoc + "' in automaton '" + name + "'", localVars); + STORM_LOG_THROW(guardExpr.hasBooleanType(), storm::exceptions::InvalidJaniException, "Guard " << guardExpr << " does not have Boolean type."); + } + assert(guardExpr.isInitialized()); STORM_LOG_THROW(edgeEntry.count("destinations") == 1, storm::exceptions::InvalidJaniException, "A single list of destinations must be given in edge from '" << sourceLoc << "' in automaton '" << name << "'"); + std::vector edgeDestinations; for(auto const& destEntry : edgeEntry.at("destinations")) { // target location - STORM_LOG_THROW(edgeEntry.count("location") == 1, storm::exceptions::InvalidJaniException, "Each destination in edge from '" << sourceLoc << "' in automaton '" << name << "' must have a source"); - std::string targetLoc = getString(edgeEntry.at("location"), "target location for edge from '" + sourceLoc + "' in automaton '" + name + "'"); + STORM_LOG_THROW(edgeEntry.count("location") == 1, storm::exceptions::InvalidJaniException, "Each destination in edge from '" << sourceLoc << "' in automaton '" << name << "' must have a target location"); + std::string targetLoc = getString(destEntry.at("location"), "target location for edge from '" + sourceLoc + "' in automaton '" + name + "'"); STORM_LOG_THROW(locIds.count(targetLoc) == 1, storm::exceptions::InvalidJaniException, "Target of edge has unknown location '" << targetLoc << "' in automaton '" << name << "'."); // probability storm::expressions::Expression probExpr; unsigned probDeclCount = destEntry.count("probability"); - STORM_LOG_THROW(probDeclCount, storm::exceptions::InvalidJaniException, "Destination in edge from '" << sourceLoc << "' to '" << targetLoc << "' in automaton '" << name << "' has multiple probabilites"); + STORM_LOG_THROW(probDeclCount < 2, storm::exceptions::InvalidJaniException, "Destination in edge from '" << sourceLoc << "' to '" << targetLoc << "' in automaton '" << name << "' has multiple probabilites"); if(probDeclCount == 0) { probExpr = expressionManager->rational(1.0); } else { - probExpr = parseExpression(destEntry.at("probability"), "probability expression in edge from '" + sourceLoc + "' to '" + targetLoc + "' in automaton '" + name + "'", localVars); + STORM_LOG_THROW(destEntry.at("probability").count("exp") == 1, storm::exceptions::InvalidJaniException, "Destination in edge from '" << sourceLoc << "' to '" << targetLoc << "' in automaton '" << name << "' must have a probability expression."); + probExpr = parseExpression(destEntry.at("probability").at("exp"), "probability expression in edge from '" + sourceLoc + "' to '" + targetLoc + "' in automaton '" + name + "'", localVars); } assert(probExpr.isInitialized()); - STORM_LOG_THROW(probExpr.hasRationalType(), storm::exceptions::InvalidJaniException, "Probability expr " << probExpr << " does not have rational type." ); + STORM_LOG_THROW(probExpr.hasNumericalType(), storm::exceptions::InvalidJaniException, "Probability expression " << probExpr << " does not have a numerical type." ); // assignments - + std::vector assignments; + unsigned assignmentDeclCount = destEntry.count("assignments"); + STORM_LOG_THROW(assignmentDeclCount < 2, storm::exceptions::InvalidJaniException, "Destination in edge from '" << sourceLoc << "' to '" << targetLoc << "' in automaton '" << name << "' has multiple assignment lists"); + if (assignmentDeclCount > 0) { + for (auto const& assignmentEntry : destEntry.at("assignments")) { + // ref + STORM_LOG_THROW(assignmentEntry.count("ref") == 1, storm::exceptions::InvalidJaniException, "Assignment in edge from '" << sourceLoc << "' to '" << targetLoc << "' in automaton '" << name << "' must have one ref field"); + std::string refstring = getString(assignmentEntry.at("ref"), "assignment in edge from '" + sourceLoc + "' to '" + targetLoc + "' in automaton '" + name + "'"); + storm::jani::Variable const& lhs = getLValue(refstring, parentModel.getGlobalVariables(), automaton.getVariables(), "Assignment variable in edge from '" + sourceLoc + "' to '" + targetLoc + "' in automaton '" + name + "'"); + // value + STORM_LOG_THROW(assignmentEntry.count("value") == 1, storm::exceptions::InvalidJaniException, "Assignment in edge from '" << sourceLoc << "' to '" << targetLoc << "' in automaton '" << name << "' must have one value field"); + storm::expressions::Expression assignmentExpr = parseExpression(assignmentEntry.at("value"), "assignment in edge from '" + sourceLoc + "' to '" + targetLoc + "' in automaton '" + name + "'", localVars); + // TODO check types + assignments.emplace_back(lhs, assignmentExpr); + } + } + edgeDestinations.emplace_back(locIds.at(targetLoc), probExpr, assignments); } + automaton.addEdge(storm::jani::Edge(locIds.at(sourceLoc), parentModel.getActionIndex(action), rateExpr.isInitialized() ? boost::optional(rateExpr) : boost::none, guardExpr, edgeDestinations)); } return automaton; } + + std::vector parseSyncVectors(json const& syncVectorStructure) { + std::vector syncVectors; + // TODO add error checks + for (auto const& syncEntry : syncVectorStructure) { + std::vector inputs; + for (auto const& syncInput : syncEntry.at("synchronise")) { + if(syncInput.is_null()) { + inputs.push_back(storm::jani::SynchronizationVector::NO_ACTION_INPUT); + } else { + inputs.push_back(syncInput); + } + } + std::string syncResult = syncEntry.at("result"); + syncVectors.emplace_back(inputs, syncResult); + } + return syncVectors; + } std::shared_ptr JaniParser::parseComposition(json const &compositionStructure) { - + if(compositionStructure.count("automaton")) { + return std::shared_ptr(new storm::jani::AutomatonComposition(compositionStructure.at("automaton").get())); + } + + STORM_LOG_THROW(compositionStructure.count("elements") == 1, storm::exceptions::InvalidJaniException, "Elements of a composition must be given, got " << compositionStructure.dump()); + + if (compositionStructure.at("elements").size() == 1 && compositionStructure.count("syncs") == 0) { + // We might have an automaton. + STORM_LOG_THROW(compositionStructure.at("elements").back().count("automaton") == 1, storm::exceptions::InvalidJaniException, "Automaton must be given in composition"); + if (compositionStructure.at("elements").back().at("automaton").is_string()) { + std::string name = compositionStructure.at("elements").back().at("automaton"); + // TODO check whether name exist? + return std::shared_ptr(new storm::jani::AutomatonComposition(name)); + } + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Trivial nesting parallel composition is not yet supported"); + + } + + std::vector> compositions; + for (auto const& elemDecl : compositionStructure.at("elements")) { + if(!allowRecursion) { + STORM_LOG_THROW(elemDecl.count("automaton") == 1, storm::exceptions::InvalidJaniException, "Automaton must be given in the element"); + } + compositions.push_back(parseComposition(elemDecl)); + } + + STORM_LOG_THROW(compositionStructure.count("syncs") < 2, storm::exceptions::InvalidJaniException, "Sync vectors can be given at most once"); + std::vector syncVectors; + if (compositionStructure.count("syncs") > 0) { + syncVectors = parseSyncVectors(compositionStructure.at("syncs")); + } + + return std::shared_ptr(new storm::jani::ParallelComposition(compositions, syncVectors)); + } } -} \ No newline at end of file +} diff --git a/src/parser/JaniParser.h b/src/parser/JaniParser.h index 90891c759..438cb93d1 100644 --- a/src/parser/JaniParser.h +++ b/src/parser/JaniParser.h @@ -1,9 +1,11 @@ -#ifndef STORM_JANIPARSER_H -#define STORM_JANIPARSER_H - +#pragma once +#include +#include "src/logic/Formula.h" +#include "src/logic/Bound.h" #include "src/exceptions/FileIoException.h" #include "src/storage/expressions/ExpressionManager.h" + // JSON parser #include "json.hpp" @@ -15,39 +17,85 @@ namespace storm { class Automaton; class Variable; class Composition; + class Property; + class PropertyInterval; + } + + namespace logic { + enum class FormulaContext; } namespace parser { + /* + * The JANI format parser. + * Parses Models and Properties + * + * TODO some parts are copy-heavy, a bit of cleaning is good as soon as the format is stable. + */ class JaniParser { - json parsedStructure; - std::shared_ptr expressionManager; - public: + typedef std::vector PropertyVector; + JaniParser() : expressionManager(new storm::expressions::ExpressionManager()) {} - JaniParser(std::string& jsonstring); - static storm::jani::Model parse(std::string const& path); + JaniParser(std::string const& jsonstring); + static std::pair> parse(std::string const& path); + protected: void readFile(std::string const& path); - storm::jani::Model parseModel(); - storm::jani::Automaton parseAutomaton(json const& automatonStructure); + std::pair> parseModel(bool parseProperties = true); + storm::jani::Property parseProperty(json const& propertyStructure); + storm::jani::Automaton parseAutomaton(json const& automatonStructure, storm::jani::Model const& parentModel); std::shared_ptr parseVariable(json const& variableStructure, std::string const& scopeDescription, bool prefWithScope = false); - storm::expressions::Expression parseExpression(json const& expressionStructure, std::string const& scopeDescription, std::unordered_map> const& localVars = std::unordered_map>()); + storm::expressions::Expression parseExpression(json const& expressionStructure, std::string const& scopeDescription, std::unordered_map> const& localVars = std::unordered_map>(), bool returnNoneOnUnknownOpString = false); private: + std::shared_ptr parseConstant(json const& constantStructure, std::string const& scopeDescription = "global"); + /** * Helper for parsing the actions of a model. */ void parseActions(json const& actionStructure, storm::jani::Model& parentModel); + std::shared_ptr parseFormula(json const& propertyStructure, storm::logic::FormulaContext formulaContext, std::string const& context, boost::optional> bound = boost::none); + std::vector parseUnaryExpressionArguments(json const& expressionStructure, std::string const& opstring, std::string const& scopeDescription, std::unordered_map> const& localVars = {}, bool returnNoneOnUnknownOpString = false); + std::vector parseBinaryExpressionArguments(json const& expressionStructure, std::string const& opstring, std::string const& scopeDescription, std::unordered_map> const& localVars = {}, bool returnNoneOnUnknownOpString = false); + std::vector> parseUnaryFormulaArgument(json const& propertyStructure, storm::logic::FormulaContext formulaContext, std::string const& opstring, std::string const& context); + std::vector> parseBinaryFormulaArguments(json const& propertyStructure, storm::logic::FormulaContext formulaContext, std::string const& opstring, std::string const& context); + storm::jani::PropertyInterval parsePropertyInterval(json const& piStructure); + + std::shared_ptr parseComposition(json const& compositionStructure); + storm::expressions::Variable getVariableOrConstantExpression(std::string const& ident, std::string const& scopeDescription, std::unordered_map> const& localVars = {}); + + + /** + * The overall structure currently under inspection. + */ + json parsedStructure; + /** + * The expression manager to be used. + */ + std::shared_ptr expressionManager; + + std::set labels = {}; + + bool allowRecursion = true; + + ////////// + // Default values -- assumptions from JANI. + ////////// + static const bool defaultVariableTransient; + + static const bool defaultBooleanInitialValue; + static const double defaultRationalInitialValue; + static const int64_t defaultIntegerInitialValue; + + static const std::set unsupportedOpstrings; }; } } - - -#endif //STORM_JANIPARSER_H diff --git a/src/parser/KeyValueParser.cpp b/src/parser/KeyValueParser.cpp new file mode 100644 index 000000000..594c8547b --- /dev/null +++ b/src/parser/KeyValueParser.cpp @@ -0,0 +1,32 @@ +#include "KeyValueParser.h" +#include +#include + +#include "src/utility/macros.h" +#include "src/exceptions/InvalidArgumentException.h" + +namespace storm { + namespace parser { + + std::unordered_map parseKeyValueString(std::string const& keyValueString) { + std::unordered_map keyValueMap; + std::vector definitions; + boost::split(definitions, keyValueString, boost::is_any_of(",")); + for (auto& definition : definitions) { + boost::trim(definition); + + // Check whether the token could be a legal constant definition. + std::size_t positionOfAssignmentOperator = definition.find('='); + STORM_LOG_THROW(positionOfAssignmentOperator != std::string::npos, storm::exceptions::InvalidArgumentException, "Illegal key value string: syntax error."); + + // Now extract the variable name and the value from the string. + std::string key = definition.substr(0, positionOfAssignmentOperator); + boost::trim(key); + std::string value = definition.substr(positionOfAssignmentOperator + 1); + boost::trim(value); + keyValueMap.emplace(key, value); + } + return keyValueMap; + } + } +} \ No newline at end of file diff --git a/src/parser/KeyValueParser.h b/src/parser/KeyValueParser.h new file mode 100644 index 000000000..b3005daa5 --- /dev/null +++ b/src/parser/KeyValueParser.h @@ -0,0 +1,11 @@ +#pragma once + +#include +#include + + +namespace storm { + namespace parser { + std::unordered_map parseKeyValueString(std::string const& keyValueString); + } +} \ No newline at end of file diff --git a/src/parser/PgclParser.cpp b/src/parser/PgclParser.cpp new file mode 100755 index 000000000..e65ff912d --- /dev/null +++ b/src/parser/PgclParser.cpp @@ -0,0 +1,345 @@ +#include "src/parser/PgclParser.h" +// If the parser fails due to ill-formed data, this exception is thrown. +#include "src/exceptions/WrongFormatException.h" + +namespace storm { + namespace parser { + storm::pgcl::PgclProgram PgclParser::parse(std::string const& filename) { + // Create empty program. + storm::pgcl::PgclProgram result; + + // Open file and initialize result. + std::ifstream inputFileStream(filename, std::ios::in); + STORM_LOG_THROW(inputFileStream.good(), storm::exceptions::WrongFormatException, "Unable to read from file '" << filename << "'."); + + // Now try to parse the contents of the file. + try { + std::string fileContent((std::istreambuf_iterator(inputFileStream)), (std::istreambuf_iterator())); + result = parseFromString(fileContent, filename); + } catch(std::exception& e) { + // In case of an exception properly close the file before passing exception. + inputFileStream.close(); + throw e; + } + + // Close the stream in case everything went smoothly and return result. + inputFileStream.close(); + return result; + } + + storm::pgcl::PgclProgram PgclParser::parseFromString(std::string const& input, std::string const& filename) { + PositionIteratorType first(input.begin()); + PositionIteratorType iter = first; + PositionIteratorType last(input.end()); + + // Create empty program. + storm::pgcl::PgclProgram result; + + // Create grammar. + storm::parser::PgclParser grammar(filename, first); + try { + // Start the parsing run. + bool succeeded = qi::phrase_parse(iter, last, grammar, boost::spirit::ascii::space | qi::lit("//") >> *(qi::char_ - (qi::eol | qi::eoi)) >> (qi::eol | qi::eoi), result); + STORM_LOG_THROW(succeeded, storm::exceptions::WrongFormatException, "Parsing of PGCL program failed."); + STORM_LOG_DEBUG("Parse of PGCL program finished."); + } catch(qi::expectation_failure const& e) { + // If the parser expected content different than the one provided, display information about the location of the error. + std::size_t lineNumber = boost::spirit::get_line(e.first); + // Now propagate exception. + STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << lineNumber << " of file " << filename << "."); + } + + return result; + } + + PgclParser::PgclParser(std::string const& filename, Iterator first) : + PgclParser::base_type(program, "PGCL grammar"), + annotate(first), + expressionManager(std::shared_ptr(new storm::expressions::ExpressionManager())), + expressionParser(*expressionManager, invalidIdentifiers) + { + this->enableExpressions(); + /* + * PGCL grammar is defined here + */ + // Rough program structure + program = (qi::lit("function ") > programName > qi::lit("(") > -(doubleDeclaration % qi::lit(",")) > qi::lit(")") > qi::lit("{") > + variableDeclarations > + sequenceOfStatements > + qi::lit("}"))[qi::_val = phoenix::bind(&PgclParser::createProgram, phoenix::ref(*this), qi::_1, qi::_2, qi::_3, qi::_4)]; + sequenceOfStatements %= +(statement); + sequenceOfStatements.name("sequence of statements"); + + variableDeclarations %= qi::lit("var") > qi::lit("{") > +(integerDeclaration | booleanDeclaration) > qi::lit("}"); + variableDeclarations.name("variable declarations"); + + // Statements + statement %= simpleStatement | compoundStatement; + simpleStatement %= assignmentStatement | observeStatement; + compoundStatement %= ifElseStatement | loopStatement | branchStatement; + + // Simple statements + doubleDeclaration = (qi::lit("double ") >> variableName)[qi::_val = phoenix::bind(&PgclParser::declareDoubleVariable, phoenix::ref(*this), qi::_1)]; + integerDeclaration = (qi::lit("int ") > variableName > qi::lit(":=") > expression > qi::lit(";"))[qi::_val = phoenix::bind(&PgclParser::createIntegerDeclarationStatement, phoenix::ref(*this), qi::_1, qi::_2)]; + integerDeclaration.name("integer declaration"); + booleanDeclaration = (qi::lit("bool ") > variableName > qi::lit(":=") > expression > qi::lit(";"))[qi::_val = phoenix::bind(&PgclParser::createBooleanDeclarationStatement, phoenix::ref(*this), qi::_1, qi::_2)]; + booleanDeclaration.name("boolean declaration"); + + assignmentStatement = (variableName > qi::lit(":=") > (expression | uniformExpression) > qi::lit(";"))[qi::_val = phoenix::bind(&PgclParser::createAssignmentStatement, phoenix::ref(*this), qi::_1, qi::_2)]; + observeStatement = (qi::lit("observe") > qi::lit("(") >> booleanCondition >> qi::lit(")") > qi::lit(";"))[qi::_val = phoenix::bind(&PgclParser::createObserveStatement, phoenix::ref(*this), qi::_1)]; + + // Compound statements + ifElseStatement = (qi::lit("if") > qi::lit("(") >> booleanCondition >> qi::lit(")") >> qi::lit("{") >> + sequenceOfStatements >> + qi::lit("}") >> -(qi::lit("else") >> qi::lit("{") >> + sequenceOfStatements >> + qi::lit("}"))) + [qi::_val = phoenix::bind(&PgclParser::createIfElseStatement, phoenix::ref(*this), qi::_1, qi::_2, qi::_3)]; + ifElseStatement.name("if/else statement"); + branchStatement = nondeterministicBranch | probabilisticBranch; + loopStatement = (qi::lit("while") > qi::lit("(") > booleanCondition > qi::lit(")") > qi::lit("{") >> + sequenceOfStatements >> + qi::lit("}")) + [qi::_val = phoenix::bind(&PgclParser::createLoopStatement, phoenix::ref(*this), qi::_1, qi::_2)]; + loopStatement.name("loop statement"); + nondeterministicBranch = (qi::lit("{") >> sequenceOfStatements >> qi::lit("}") >> qi::lit("[]") >> qi::lit("{") >> sequenceOfStatements>> qi::lit("}"))[qi::_val = phoenix::bind(&PgclParser::createNondeterministicBranch, phoenix::ref(*this), qi::_1, qi::_2)]; + probabilisticBranch = (qi::lit("{") >> sequenceOfStatements >> qi::lit("}") >> qi::lit("[") >> expression >> qi::lit("]") >> qi::lit("{") >> sequenceOfStatements >> qi::lit("}"))[qi::_val = phoenix::bind(&PgclParser::createProbabilisticBranch, phoenix::ref(*this), qi::_2, qi::_1, qi::_3)]; + + // Expression and condition building, and basic identifiers + expression %= expressionParser; + expression.name("expression"); + booleanCondition = expressionParser[qi::_val = phoenix::bind(&PgclParser::createBooleanExpression, phoenix::ref(*this), qi::_1)]; + uniformExpression = (qi::lit("unif") >> qi::lit("(") >> qi::int_ >> qi::lit(",") >> qi::int_ >> qi::lit(")"))[qi::_val = phoenix::bind(&PgclParser::createUniformExpression, phoenix::ref(*this), qi::_1, qi::_2)]; + variableName %= (+(qi::alnum | qi::lit("_"))) - invalidIdentifiers; + variableName.name("variable name"); + programName %= +(qi::alnum | qi::lit("_")); + programName.name("program name"); + + // Enables location tracking for important entities + auto setLocationInfoFunction = this->annotate(*qi::_val, qi::_1, qi::_3); + qi::on_success(assignmentStatement, setLocationInfoFunction); + qi::on_success(observeStatement, setLocationInfoFunction); + qi::on_success(nondeterministicBranch, setLocationInfoFunction); + qi::on_success(probabilisticBranch, setLocationInfoFunction); + qi::on_success(loopStatement, setLocationInfoFunction); + qi::on_success(ifElseStatement, setLocationInfoFunction); + + // Enable error reporting. + qi::on_error(program, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(variableDeclarations, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(integerDeclaration, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(booleanDeclaration, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + + qi::on_error(assignmentStatement, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(observeStatement, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(ifElseStatement, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(loopStatement, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(branchStatement, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + + + qi::on_error(expression, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(booleanCondition, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + qi::on_error(uniformExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4)); + + // Adds dummy to the 0-th location. + std::shared_ptr dummy(new storm::pgcl::AssignmentStatement()); + this->locationToStatement.insert(this->locationToStatement.begin(), dummy); + } // PgclParser() + + void PgclParser::enableExpressions() { + (this->expressionParser).setIdentifierMapping(&this->identifiers_); + } + + /* + * Creators for various program parts. They all follow the basic scheme + * to retrieve the subparts of the program part and mold them together + * into one new statement. They wrap the statement constructors and + * throw excpetions in case something unexpected was parsed, e.g. + * (x+5) as a boolean expression, or types of assignments don't match. + */ + storm::pgcl::PgclProgram PgclParser::createProgram(std::string const& programName, boost::optional> parameters, std::vector> const& variableDeclarations, std::vector> const& statements) { + // Creates an empty paramter list in case no parameters were given. + std::vector params; + if(parameters != boost::none) { + params = *parameters; + } + std::vector declarations; + for (auto const& decl : variableDeclarations) { + declarations.push_back(*decl); + } + + // Creates the actual program. + std::shared_ptr result( + new storm::pgcl::PgclProgram(declarations, statements, this->locationToStatement, params, this->expressionManager, this->loopCreated, this->nondetCreated, this->observeCreated) + ); + result->back()->setLast(true); + // Sets the current program as a parent to all its direct children statements. + for(storm::pgcl::iterator it = result->begin(); it != result->end(); ++it) { + (*it)->setParentBlock(result.get()); + } + return *result; + } + + storm::expressions::Variable PgclParser::declareDoubleVariable(std::string const& variableName) { + storm::expressions::Variable variable = expressionManager->declareRationalVariable(variableName); + this->identifiers_.add(variableName, variable.getExpression()); + return variable; + } + + std::shared_ptr PgclParser::createAssignmentStatement(std::string const& variableName, boost::variant const& assignedExpression) { + storm::expressions::Variable variable; + if(!(*expressionManager).hasVariable(variableName)) { + variable = (*expressionManager).declareIntegerVariable(variableName); + } else { + variable = (*expressionManager).getVariable(variableName); + // Checks if assignment types match. + if(assignedExpression.which() == 0 && !(variable.getType() == boost::get(assignedExpression).getType())) { + STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Wrong type when assigning to " << variableName << "."); + } + } + std::shared_ptr newAssignment(new storm::pgcl::AssignmentStatement(variable, assignedExpression)); + newAssignment->setLocationNumber(this->currentLocationNumber); + this->locationToStatement.insert(this->locationToStatement.begin() + this->currentLocationNumber, newAssignment); + currentLocationNumber++; + return newAssignment; + } + + std::shared_ptr PgclParser::createIntegerDeclarationStatement(std::string const& variableName, storm::expressions::Expression const& assignedExpression) { + storm::expressions::Variable variable; + if(!(*expressionManager).hasVariable(variableName)) { + variable = (*expressionManager).declareIntegerVariable(variableName); + this->identifiers_.add(variableName, variable.getExpression()); + } else { + // In case that a declaration already happened. + variable = (*expressionManager).getVariable(variableName); + STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Declaration of integer variable " << variableName << " which was already declared previously."); + } + // Todo add some checks + return std::make_shared(variable, assignedExpression); + } + + std::shared_ptr PgclParser::createBooleanDeclarationStatement(std::string const& variableName, storm::expressions::Expression const& assignedExpression) { + storm::expressions::Variable variable; + if(!(*expressionManager).hasVariable(variableName)) { + variable = (*expressionManager).declareBooleanVariable(variableName); + this->identifiers_.add(variableName, variable.getExpression()); + } else { + // In case that a declaration already happened. + variable = (*expressionManager).getVariable(variableName); + STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Declaration of boolean variable " << variableName << " which was already declared previously."); + } + // TODO add some checks. + return std::make_shared(variable, assignedExpression); + } + + std::shared_ptr PgclParser::createObserveStatement(storm::pgcl::BooleanExpression const& condition) { + std::shared_ptr observe(new storm::pgcl::ObserveStatement(condition)); + this->observeCreated = true; + observe->setLocationNumber(this->currentLocationNumber); + this->locationToStatement.insert(this->locationToStatement.begin() + this->currentLocationNumber, observe); + currentLocationNumber++; + return observe; + } + + std::shared_ptr PgclParser::createIfElseStatement(storm::pgcl::BooleanExpression const& condition, std::vector > const& ifBody, boost::optional > > const& elseBody) { + std::shared_ptr ifBodyProgram(new storm::pgcl::PgclBlock(ifBody, this->expressionManager, this->loopCreated, this->nondetCreated, this->observeCreated)); + std::shared_ptr ifElse; + if(elseBody) { + std::shared_ptr elseBodyProgram(new storm::pgcl::PgclBlock(*elseBody, this->expressionManager, this->loopCreated, this->nondetCreated, this->observeCreated)); + ifElse = std::shared_ptr(new storm::pgcl::IfStatement(condition, ifBodyProgram, elseBodyProgram)); + (*(ifElse->getIfBody()->back())).setLast(true); + (*(ifElse->getElseBody()->back())).setLast(true); + // Sets the current program as a parent to all its children statements. + for(storm::pgcl::iterator it = ifElse->getElseBody()->begin(); it != ifElse->getElseBody()->end(); ++it) { + (*it)->setParentBlock(ifElse->getElseBody().get()); + } + for(storm::pgcl::iterator it = ifElse->getIfBody()->begin(); it != ifElse->getIfBody()->end(); ++it) { + (*it)->setParentBlock(ifElse->getIfBody().get()); + } + } else { + ifElse = std::shared_ptr(new storm::pgcl::IfStatement(condition, ifBodyProgram)); + (*(ifElse->getIfBody()->back())).setLast(true); + // Sets the current program as a parent to all its children statements. + for(storm::pgcl::iterator it = ifElse->getIfBody()->begin(); it != ifElse->getIfBody()->end(); ++it) { + (*it)->setParentBlock(ifElse->getIfBody().get()); + } + } + ifElse->setLocationNumber(this->currentLocationNumber); + this->locationToStatement.insert(this->locationToStatement.begin() + this->currentLocationNumber, ifElse); + currentLocationNumber++; + return ifElse; + } + + std::shared_ptr PgclParser::createLoopStatement(storm::pgcl::BooleanExpression const& condition, std::vector > const& body) { + std::shared_ptr bodyProgram(new storm::pgcl::PgclBlock(body, this->expressionManager, this->loopCreated, this->nondetCreated, this->observeCreated)); + std::shared_ptr loop(new storm::pgcl::LoopStatement(condition, bodyProgram)); + this->loopCreated = true; + // Sets the current program as a parent to all its children statements. + for(storm::pgcl::iterator it = loop->getBody()->begin(); it != loop->getBody()->end(); ++it) { + (*it)->setParentBlock(loop->getBody().get()); + } + (*(loop->getBody()->back())).setLast(true); + loop->setLocationNumber(this->currentLocationNumber); + this->locationToStatement.insert(this->locationToStatement.begin() + this->currentLocationNumber, loop); + currentLocationNumber++; + return loop; + } + + std::shared_ptr PgclParser::createNondeterministicBranch(std::vector > const& left, std::vector > const& right) { + std::shared_ptr leftProgram(new storm::pgcl::PgclBlock(left, this->expressionManager, this->loopCreated, this->nondetCreated, this->observeCreated)); + std::shared_ptr rightProgram(new storm::pgcl::PgclBlock(right, this->expressionManager, this->loopCreated, this->nondetCreated, this->observeCreated)); + std::shared_ptr branch(new storm::pgcl::NondeterministicBranch(leftProgram, rightProgram)); + this->nondetCreated = true; + // Sets the left program as a parent to all its children statements. + for(storm::pgcl::iterator it = branch->getLeftBranch()->begin(); it != branch->getLeftBranch()->end(); ++it) { + (*it)->setParentBlock(branch->getLeftBranch().get()); + } + // Sets the right program as a parent to all its children statements. + for(storm::pgcl::iterator it = branch->getRightBranch()->begin(); it != branch->getRightBranch()->end(); ++it) { + (*it)->setParentBlock(branch->getRightBranch().get()); + } + (*(branch->getLeftBranch()->back())).setLast(true); + (*(branch->getRightBranch()->back())).setLast(true); + branch->setLocationNumber(this->currentLocationNumber); + this->locationToStatement.insert(this->locationToStatement.begin() + this->currentLocationNumber, branch); + currentLocationNumber++; + return branch; + } + + std::shared_ptr PgclParser::createProbabilisticBranch(storm::expressions::Expression const& probability, std::vector > const& left, std::vector > const& right) { + std::shared_ptr leftProgram(new storm::pgcl::PgclBlock(left, this->expressionManager, this->loopCreated, this->nondetCreated, this->observeCreated)); + std::shared_ptr rightProgram(new storm::pgcl::PgclBlock(right, this->expressionManager, this->loopCreated, this->nondetCreated, this->observeCreated)); + std::shared_ptr branch(new storm::pgcl::ProbabilisticBranch(probability, leftProgram, rightProgram)); + // Sets the left program as a parent to all its children statements. + for(storm::pgcl::iterator it = branch->getLeftBranch()->begin(); it != branch->getLeftBranch()->end(); ++it) { + (*it)->setParentBlock(branch->getLeftBranch().get()); + } + // Sets the right program as a parent to all its children statements. + for(storm::pgcl::iterator it = branch->getRightBranch()->begin(); it != branch->getRightBranch()->end(); ++it) { + (*it)->setParentBlock(branch->getRightBranch().get()); + } + (*(branch->getLeftBranch()->back())).setLast(true); + (*(branch->getRightBranch()->back())).setLast(true); + branch->setLocationNumber(this->currentLocationNumber); + this->locationToStatement.insert(this->locationToStatement.begin() + this->currentLocationNumber, branch); + currentLocationNumber++; + return branch; + } + + storm::pgcl::BooleanExpression PgclParser::createBooleanExpression(storm::expressions::Expression const& expression) { + if(expression.hasBooleanType()) { + storm::pgcl::BooleanExpression booleanExpression = storm::pgcl::BooleanExpression(expression); + return booleanExpression; + } else { + // In case that a non-boolean expression was used (e.g. (x+5)). + STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Non boolean expression was used in a condition."); + } + } + + storm::pgcl::UniformExpression PgclParser::createUniformExpression(int const& begin, int const& end) { + return storm::pgcl::UniformExpression(begin, end); + } + + } // namespace parser +} // namespace storm + diff --git a/src/parser/PgclParser.h b/src/parser/PgclParser.h new file mode 100755 index 000000000..223079e3b --- /dev/null +++ b/src/parser/PgclParser.h @@ -0,0 +1,158 @@ +#pragma once + +// Includes files for file input. +#include +#include +#include +// Includes files for building and parsing the PGCL program +#include "src/parser/SpiritParserDefinitions.h" +#include "src/parser/SpiritErrorHandler.h" +#include "src/parser/ExpressionParser.h" +#include "src/storage/expressions/ExpressionManager.h" +#include "src/storage/expressions/Expression.h" +#include "src/storage/pgcl/PgclProgram.h" +#include "src/storage/pgcl/AssignmentStatement.h" +#include "src/storage/pgcl/BooleanExpression.h" +#include "src/storage/pgcl/UniformExpression.h" +#include "src/storage/pgcl/IfStatement.h" +#include "src/storage/pgcl/LoopStatement.h" +#include "src/storage/pgcl/NondeterministicBranch.h" +#include "src/storage/pgcl/ObserveStatement.h" +#include "src/storage/pgcl/ProbabilisticBranch.h" +#include "src/storage/pgcl/Statement.h" + +namespace storm { + namespace pgcl { + class IfStatement; + } + + namespace parser { + + class PgclParser : public qi::grammar { + public: + /*! + * Parses the given file into the PGCL storage classes in case it + * complies with the PGCL syntax. + * + * @param filename the name of the file to parse. + * @return The resulting PGCL program. + */ + static storm::pgcl::PgclProgram parse(std::string const& filename); + + /*! + * Parses the given input stream into the PGCL storage classes in + * case it complies with the PGCL syntax. + * + * @param input The input string to parse. + * @param filename Name of the file from which the input was read. + * @return The resulting PGCL program. + */ + static storm::pgcl::PgclProgram parseFromString(std::string const& input, std::string const& filename); + private: + // Internal constructor used by the parseFromString function. + PgclParser(std::string const& filename, Iterator first); + // Nonterminals (and their semantic types) of the PGCL grammar. + qi::rule program; + qi::rule >(), Skipper> sequenceOfStatements; + qi::rule(), Skipper> statement; + qi::rule(), Skipper> simpleStatement; + qi::rule(), Skipper> compoundStatement; + qi::rule(), Skipper> ifElseStatement; + qi::rule(), Skipper> branchStatement; + qi::rule(), Skipper> loopStatement; + qi::rule(), Skipper> nondeterministicBranch; + qi::rule(), Skipper> probabilisticBranch; + qi::rule(), Skipper> assignmentStatement; + qi::rule declaration; + qi::rule(), Skipper> observeStatement; + qi::rule expression; + qi::rule booleanCondition; + qi::rule uniformExpression; + qi::rule variableName; + qi::rule programName; + + qi::rule>(), Skipper> variableDeclarations; + qi::rule(), Skipper> integerDeclaration; + qi::rule(), Skipper> booleanDeclaration; + qi::rule doubleDeclaration; + + // An error handler function. + phoenix::function handler; + + /// Denotes the invalid identifiers, which are later passed to the expression parser. + struct keywordsStruct : qi::symbols { + keywordsStruct() { + add + ("while", 1) + ("if", 2) + ("observe", 3) + ("int", 4) + ("bool", 5) + ("function", 6); + } + }; + + /// Initializes the invalid identifier struct. + keywordsStruct invalidIdentifiers; + /// Is used to store the identifiers of the PGCL program that are found while parsing. + qi::symbols identifiers_; + + /// Functor used for annotating entities with line number information. + class PositionAnnotation { + public: + typedef void result_type; + + PositionAnnotation(Iterator first) : first(first) { + // Intentionally left empty. + } + + template + result_type operator()(Entity& entity, First f, Last l) const { + entity.setLineNumber(get_line(f)); + } + private: + std::string filename; + Iterator const first; + }; + + /// A function used for annotating the entities with their position. + phoenix::function annotate; + + /// Manages the expressions and their parsing externally. + std::shared_ptr expressionManager; + storm::parser::ExpressionParser expressionParser; + + /// Stores a mapping from location numbers to statements. + std::vector > locationToStatement; + + /// Saves whether a loop statements was created. + bool loopCreated = false; + /// Saves whether a nondet statements was created. + bool nondetCreated = false; + /// Saves whether a observe statement was created. + bool observeCreated = false; + + /// Stores the unique identifier of the currently parsed statement, starting at 1. + std::size_t currentLocationNumber = 1; + + /// Sets the expression parser to a mode where it actually generates valid expressions. + void enableExpressions(); + + // Constructors for the single program parts. They just wrap the statement constructors and throw exceptions in case something unexpected was parsed. + storm::pgcl::PgclProgram createProgram(std::string const& programName, boost::optional > parameters, std::vector> const& variableDeclarations, std::vector > const& statements); + storm::expressions::Variable declareDoubleVariable(std::string const& variableName); + std::shared_ptr createAssignmentStatement(std::string const& variableName, boost::variant const& assignedExpression); + std::shared_ptr createIntegerDeclarationStatement(std::string const& variableName, storm::expressions::Expression const& assignedExpression); + std::shared_ptr createBooleanDeclarationStatement(std::string const& variableName, storm::expressions::Expression const& assignedExpression); + std::shared_ptr createObserveStatement(storm::pgcl::BooleanExpression const& condition); + std::shared_ptr createIfElseStatement(storm::pgcl::BooleanExpression const& condition, std::vector > const& if_body, boost::optional > > const& else_body); + std::shared_ptr createLoopStatement(storm::pgcl::BooleanExpression const& condition, std::vector > const& body); + std::shared_ptr createNondeterministicBranch(std::vector > const& left, std::vector > const& right); + std::shared_ptr createProbabilisticBranch(storm::expressions::Expression const& probability, std::vector > const& left, std::vector > const& right); + storm::pgcl::BooleanExpression createBooleanExpression(storm::expressions::Expression const& expression); + storm::pgcl::UniformExpression createUniformExpression(int const& begin, int const& end); + }; + } // namespace parser +} // namespace storm + + diff --git a/src/parser/PnmlParser.cpp b/src/parser/PnmlParser.cpp new file mode 100644 index 000000000..d39f0db55 --- /dev/null +++ b/src/parser/PnmlParser.cpp @@ -0,0 +1,446 @@ + +#include "src/parser/PnmlParser.h" +#ifdef USE_XERCES +#include + +#include "src/adapters/XercesAdapter.h" + +#include "src/exceptions/UnexpectedException.h" +#include "src/exceptions/WrongFormatException.h" +#include "src/utility/macros.h" + +namespace storm { + namespace parser { + storm::gspn::GSPN * PnmlParser::parse(xercesc::DOMElement const* elementRoot ) { + if (storm::adapters::getName(elementRoot) == "pnml") { + traversePnmlElement(elementRoot); + } else { + // If the top-level node is not a "pnml" or "" node, then throw an exception. + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Failed to identify the root element.\n"); + } + return builder.buildGspn(); + } + + void PnmlParser::traversePnmlElement(xercesc::DOMElement const* const element) { + // traverse attributes + for (uint_fast64_t i = 0; i < element->getAttributes()->getLength(); ++i) { + auto attr = element->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown attribute (node=pnml): " + name + "\n"); + } + + // traverse children + for (uint_fast64_t i = 0; i < element->getChildNodes()->getLength(); ++i) { + auto child = element->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (name == "net") { + traverseNetOrPage(child); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=pnml): " + name + "\n"); + } + } + } + + void PnmlParser::traverseNetOrPage(xercesc::DOMNode const* const node) { + // traverse attributes + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + if (name == "id") { + builder.setGspnName(storm::adapters::XMLtoString(attr->getNodeValue())); + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown attribute (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + + // traverse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (name == "place") { + traversePlace(child); + } else if (name == "transition") { + traverseTransition(child); + } else if (name == "arc") { + traverseArc(child); + } else if (name == "page") { + // Some pnml files have a child named page. + // The page node has the same children like the net node (e.g., place, transition, arc) + traverseNetOrPage(child); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=" + storm::adapters::XMLtoString(node->getNodeName()) + "): " + name + "\n"); + } + } + } + + void PnmlParser::traversePlace(xercesc::DOMNode const* const node) { + std::string placeName; + // the first entry is false if the corresponding information was not found in the pnml file + std::pair numberOfInitialTokens(false, defaultNumberOfInitialTokens); + std::pair capacity(false, defaultCapacity); + + // traverse attributes + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + if (name == "id") { + placeName = storm::adapters::XMLtoString(attr->getNodeValue()); + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown attribute (node=place): " + name + "\n"); + } + } + + // traverse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (name == "initialMarking") { + numberOfInitialTokens.first = true; + numberOfInitialTokens.second = traverseInitialMarking(child); + } else if(name == "capacity") { + capacity.first = true; + capacity.second = traverseCapacity(child); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else if (name == "name" || + name == "graphics") { + // ignore these tags + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=place): " + name + "\n"); + } + } + + if (!numberOfInitialTokens.first) { + // no information about the number of initial tokens is found + // use the default number of initial tokens + STORM_PRINT_AND_LOG("unknown numberOfInitialTokens (place=" + placeName + ")\n"); + } + if (!capacity.first) { + // no information about the capacity is found + // use default capacity + STORM_PRINT_AND_LOG("unknown capacity (place=" + placeName + ")\n"); + } + builder.addPlace(capacity.first ? capacity.second : -1, numberOfInitialTokens.first ? numberOfInitialTokens.second : 0, placeName); + } + + void PnmlParser::traverseTransition(xercesc::DOMNode const* const node) { + // the first entry is false if the corresponding information was not found in the pnml file + std::pair timed(false, defaultTransitionType); + std::pair value(false, ""); + std::string id; + uint_fast64_t priority = defaultPriority; + + // parse attributes + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + if (name == "id") { + id = storm::adapters::XMLtoString(attr->getNodeValue()); + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown attribute (node=transition): " + name + "\n"); + } + } + + // traverse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + + if (name == "rate") { + value.first = true; + value.second = traverseTransitionValue(child); + } else if (name == "timed") { + timed.first = true; + timed.second = traverseTransitionType(child); + } else if (name == "priority") { + priority = traversePriority(child); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else if (name == "graphics" || + name == "name" || + name == "orientation") { + // ignore these tags + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=transition): " + name + "\n"); + } + } + + // build transition and add it to the gspn + if (!timed.first) { + // found unknown transition type + // abort parsing + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "unknown transition type (transition=" + id + ")\n"); + return; + } + + if (timed.second) { + if (!value.first) { + // no information about the rate is found + // abort the parsing + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException ,"unknown transition rate (transition=" + id + ")\n"); + } + builder.addTimedTransition(priority, std::stod(value.second), id); + } else { + if (!value.first) { + // no information about the weight is found + // continue with the default weight + STORM_PRINT_AND_LOG("unknown transition weight (transition=" + id + ")\n"); + } + builder.addImmediateTransition(priority, std::stod(value.second), id); + } + } + + void PnmlParser::traverseArc(xercesc::DOMNode const* const node) { + // the first entry is false if the corresponding information was not found in the pnml file + std::pair source(false, ""); + std::pair target(false, ""); + std::pair type(false, defaultArcType); + std::pair multiplicity(false, defaultMultiplicity); + std::string id; + + // parse attributes + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + + if (name == "source") { + source.first = true; + source.second = storm::adapters::XMLtoString(attr->getNodeValue()); + } else if (name == "target") { + target.first = true; + target.second = storm::adapters::XMLtoString(attr->getNodeValue()); + } else if (name == "id") { + id = storm::adapters::XMLtoString(attr->getNodeValue()); + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown attribute (node=arc): " + name + "\n"); + } + } + + // parse children + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + if (name == "type") { + type.first = true; + type.second = traverseArcType(child); + } else if(name == "inscription") { + multiplicity.first = true; + multiplicity.second = traverseMultiplicity(child); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else if (name == "graphics" || name == "arcpath" || name == "tagged") { + // ignore these tags + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=arc): " + name + "\n"); + } + } + + // check if all necessary information where stored in the pnml file + if (!source.first) { + // could not find start of the arc + // abort parsing + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException ,"unknown arc source (arc=" + id + ")\n"); + } + if (!target.first) { + // could not find the target of the arc + // abort parsing + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException ,"unknown arc target (arc=" + id + ")\n"); + } + if (!multiplicity.first) { + // no information about the multiplicity of the arc + // continue and use the default multiplicity + STORM_PRINT_AND_LOG("unknown multiplicity (node=arc): " + id + "\n"); + } + + STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "No arc type specified for arc '" + id + "'"); + if (type.second == "normal") { + builder.addNormalArc(source.second, target.second, multiplicity.second); + } else if (type.second == "inhibition") { + builder.addInhibitionArc(source.second, target.second, multiplicity.second); + } else { + STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Arc type '" << type.second << "' in arc '" << id << "' is unknown."); + } + } + + uint_fast64_t PnmlParser::traverseInitialMarking(xercesc::DOMNode const* const node) { + uint_fast64_t result = defaultNumberOfInitialTokens; + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + if (name == "text") { + result = std::stoull(storm::adapters::getName(child->getFirstChild())); + } else if (name == "value") { + auto value = storm::adapters::getName(child->getFirstChild()); + value = value.substr(std::string("Default,").length()); + result = std::stoull(value); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else if (name == "graphics") { + // ignore these tags + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=initialMarking): " + name + "\n"); + } + } + return result; + } + + int_fast64_t PnmlParser::traverseCapacity(xercesc::DOMNode const* const node) { + int_fast64_t result= defaultCapacity; + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + if (name == "value") { + auto value = storm::adapters::getName(child->getFirstChild()); + if (value.find("Default,") == 0) { + value = value.substr(std::string("Default,").length()); + } + result = std::stoull(value); + } else if (name == "graphics") { + // ignore these nodes + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=capacity): " + name + "\n"); + } + } + return result; + } + + uint_fast64_t PnmlParser::traverseMultiplicity(xercesc::DOMNode const* const node) { + uint_fast64_t result = defaultMultiplicity; + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + if (name == "value") { + auto value = storm::adapters::getName(child->getFirstChild()); + if (value.find("Default,") == 0) { + value = value.substr(std::string("Default,").length()); + } + result = std::stoull(value); + } else if (name == "graphics") { + // ignore these nodes + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=inscription): " + name + "\n"); + } + } + return result; + } + + + std::string PnmlParser::traverseTransitionValue(xercesc::DOMNode const* const node) { + std::string result; + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + if (name == "value") { + result = storm::adapters::getName(child->getFirstChild()); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=rate): " + name + "\n"); + } + } + return result; + } + + bool PnmlParser::traverseTransitionType(xercesc::DOMNode const* const node) { + bool result; + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + if (name == "value") { + result = storm::adapters::getName(child->getFirstChild()) == "true" ? true : false; + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=timed): " + name + "\n"); + } + } + return result; + } + + std::string PnmlParser::traverseArcType(xercesc::DOMNode const* const node) { + for (uint_fast64_t i = 0; i < node->getAttributes()->getLength(); ++i) { + auto attr = node->getAttributes()->item(i); + auto name = storm::adapters::getName(attr); + if (name == "value") { + return storm::adapters::XMLtoString(attr->getNodeValue()); + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=type): " + name + "\n"); + } + } + return defaultArcType; + } + + uint_fast64_t PnmlParser::traversePriority(xercesc::DOMNode const* const node) { + uint_fast64_t result = defaultPriority; + for (uint_fast64_t i = 0; i < node->getChildNodes()->getLength(); ++i) { + auto child = node->getChildNodes()->item(i); + auto name = storm::adapters::getName(child); + if (name == "text") { + result = std::stoull(storm::adapters::getName(child->getFirstChild())); + } else if (name == "value") { + auto value = storm::adapters::getName(child->getFirstChild()); + value = value.substr(std::string("Default,").length()); + result = std::stoull(value); + } else if (std::all_of(name.begin(), name.end(), isspace)) { + // ignore node (contains only whitespace) + } else if (name == "graphics") { + // ignore these tags + } else { + // Found node or attribute which is at the moment nod handled by this parser. + // Notify the user and continue the parsing. + STORM_PRINT_AND_LOG("unknown child (node=priority): " + name + "\n"); + } + } + return result; + } + } +} + +#endif \ No newline at end of file diff --git a/src/parser/PnmlParser.h b/src/parser/PnmlParser.h new file mode 100644 index 000000000..750d28e3d --- /dev/null +++ b/src/parser/PnmlParser.h @@ -0,0 +1,145 @@ +#pragma once + +#include "storm-config.h" +#ifdef USE_XERCES +#include +#include +#include + +#include "src/storage/gspn/GSPN.h" + +#include "src/storage/gspn/GspnBuilder.h" + +namespace storm { + namespace parser { + + /* Parses a pnml-file to a gspn. + IMPORTANT: The names of places, transitions and arcs must differ from each other. + */ + class PnmlParser { + public: + + /*! + * Parses the given file into the GSPN. + * + * @param filename The name of the file to parse. + * @return The resulting GSPN. + */ + storm::gspn::GSPN* parse(xercesc::DOMElement const* elementRoot); + private: + + /*! + * Traverse the root element. + * + * @param element The root element of the DOM object. + */ + void traversePnmlElement(xercesc::DOMElement const* const element); + + /*! + * Traverse a net or page node. + * + * @param node The net or page node. + */ + void traverseNetOrPage(xercesc::DOMNode const* const node); + + /*! + * Traverse a place node. + * + * @param node The place node. + */ + void traversePlace(xercesc::DOMNode const* const node); + + /*! + * Traverse a transition node. + * + * @param node The transition node. + */ + void traverseTransition(xercesc::DOMNode const* const node); + + /*! + * Traverse an arc node. + * + * @param node The arc node. + */ + void traverseArc(xercesc::DOMNode const* const node); + + /*! + * Traverse an initial marking node. + * + * @param node the initial marking node. + * @return The number of initial tokens. + */ + uint_fast64_t traverseInitialMarking(xercesc::DOMNode const* const node); + + /*! + * Traverse a capacity node. + * + * @param node The capacity node. + * @return The capacity for the place. + */ + int_fast64_t traverseCapacity(xercesc::DOMNode const* const node); + + /*! + * Traverse a inscription node. + * + * @param node The inscription node. + * @return The multiplicty for the arc. + */ + uint_fast64_t traverseMultiplicity(xercesc::DOMNode const* const node); + + /*! + * Traverse a rate node. + * + * @param node The rate node. + * @return The rate or weight of the transition. + */ + std::string traverseTransitionValue(xercesc::DOMNode const* const node); + + /*! + * Traverse a timed node. + * + * @param node The timed node. + * @return False if the tranisition is immediate + */ + bool traverseTransitionType(xercesc::DOMNode const* const node); + + /*! + * Traverse a type node. + * + * @param node The type node. + * @return Returns a string with the arc type. + */ + std::string traverseArcType(xercesc::DOMNode const* const node); + + /** + * Traverse a priority node. + * @param node The priority node. + * @return Returns the priority of the transition. + */ + uint_fast64_t traversePriority(xercesc::DOMNode const* const node); + + // the constructed gspn + storm::gspn::GspnBuilder builder; + + // default value for initial tokens + uint_fast64_t defaultNumberOfInitialTokens = 0; + + // default value for capacities + int_fast64_t defaultCapacity = -1; + + // default value for the transition type (false == immediate transition) + bool defaultTransitionType = false; + + // default value for the arc type + std::string defaultArcType = "normal"; + + // default multiplicity for arcs + uint_fast64_t defaultMultiplicity = 1; + + //default priority for transitions + uint_fast64_t defaultPriority = 0; + }; + } +} + +#endif \ No newline at end of file diff --git a/src/parser/PrismParser.cpp b/src/parser/PrismParser.cpp index d3e5191e2..ba7546a6e 100644 --- a/src/parser/PrismParser.cpp +++ b/src/parser/PrismParser.cpp @@ -9,6 +9,10 @@ #include "src/utility/macros.h" #include "src/exceptions/WrongFormatException.h" +#include "src/storage/expressions/ExpressionManager.h" + +#include "src/parser/ExpressionParser.h" + namespace storm { namespace parser { storm::prism::Program PrismParser::parse(std::string const& filename) { @@ -70,7 +74,9 @@ namespace storm { return result; } - PrismParser::PrismParser(std::string const& filename, Iterator first) : PrismParser::base_type(start), secondRun(false), filename(filename), annotate(first), manager(new storm::expressions::ExpressionManager()), expressionParser(*manager, keywords_, false, false) { + PrismParser::PrismParser(std::string const& filename, Iterator first) : PrismParser::base_type(start), secondRun(false), filename(filename), annotate(first), manager(new storm::expressions::ExpressionManager()), expressionParser(new ExpressionParser(*manager, keywords_, false, false)) { + + ExpressionParser& expression_ = *expressionParser; // Parse simple identifier. identifier %= qi::as_string[qi::raw[qi::lexeme[((qi::alpha | qi::char_('_')) >> *(qi::alnum | qi::char_('_')))]]][qi::_pass = phoenix::bind(&PrismParser::isValidIdentifier, phoenix::ref(*this), qi::_1)]; identifier.name("identifier"); @@ -90,25 +96,25 @@ namespace storm { undefinedConstantDefinition = (undefinedBooleanConstantDefinition | undefinedIntegerConstantDefinition | undefinedDoubleConstantDefinition); undefinedConstantDefinition.name("undefined constant definition"); - definedBooleanConstantDefinition = ((qi::lit("const") >> qi::lit("bool") >> identifier >> qi::lit("=")) > expressionParser > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createDefinedBooleanConstant, phoenix::ref(*this), qi::_1, qi::_2)]; + definedBooleanConstantDefinition = ((qi::lit("const") >> qi::lit("bool") >> identifier >> qi::lit("=")) > expression_ > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createDefinedBooleanConstant, phoenix::ref(*this), qi::_1, qi::_2)]; definedBooleanConstantDefinition.name("defined boolean constant declaration"); - definedIntegerConstantDefinition = ((qi::lit("const") >> qi::lit("int") >> identifier >> qi::lit("=")) > expressionParser >> qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createDefinedIntegerConstant, phoenix::ref(*this), qi::_1, qi::_2)]; + definedIntegerConstantDefinition = ((qi::lit("const") >> qi::lit("int") >> identifier >> qi::lit("=")) > expression_ >> qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createDefinedIntegerConstant, phoenix::ref(*this), qi::_1, qi::_2)]; definedIntegerConstantDefinition.name("defined integer constant declaration"); - definedDoubleConstantDefinition = ((qi::lit("const") >> qi::lit("double") >> identifier >> qi::lit("=")) > expressionParser > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createDefinedDoubleConstant, phoenix::ref(*this), qi::_1, qi::_2)]; + definedDoubleConstantDefinition = ((qi::lit("const") >> qi::lit("double") >> identifier >> qi::lit("=")) > expression_ > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createDefinedDoubleConstant, phoenix::ref(*this), qi::_1, qi::_2)]; definedDoubleConstantDefinition.name("defined double constant declaration"); definedConstantDefinition %= (definedBooleanConstantDefinition | definedIntegerConstantDefinition | definedDoubleConstantDefinition); definedConstantDefinition.name("defined constant definition"); - formulaDefinition = (qi::lit("formula") > identifier > qi::lit("=") > expressionParser > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createFormula, phoenix::ref(*this), qi::_1, qi::_2)]; + formulaDefinition = (qi::lit("formula") > identifier > qi::lit("=") > expression_ > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createFormula, phoenix::ref(*this), qi::_1, qi::_2)]; formulaDefinition.name("formula definition"); - booleanVariableDefinition = ((identifier >> qi::lit(":") >> qi::lit("bool")) > -((qi::lit("init") > expressionParser[qi::_a = qi::_1]) | qi::attr(manager->boolean(false))) > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createBooleanVariable, phoenix::ref(*this), qi::_1, qi::_a)]; + booleanVariableDefinition = ((identifier >> qi::lit(":") >> qi::lit("bool")) > -((qi::lit("init") > expression_[qi::_a = qi::_1]) | qi::attr(manager->boolean(false))) > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createBooleanVariable, phoenix::ref(*this), qi::_1, qi::_a)]; booleanVariableDefinition.name("boolean variable definition"); - integerVariableDefinition = ((identifier >> qi::lit(":") >> qi::lit("[")[phoenix::bind(&PrismParser::allowDoubleLiterals, phoenix::ref(*this), false)]) > expressionParser > qi::lit("..") > expressionParser > qi::lit("]")[phoenix::bind(&PrismParser::allowDoubleLiterals, phoenix::ref(*this), true)] > -(qi::lit("init") > expressionParser[qi::_a = qi::_1]) > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createIntegerVariable, phoenix::ref(*this), qi::_1, qi::_2, qi::_3, qi::_a)]; + integerVariableDefinition = ((identifier >> qi::lit(":") >> qi::lit("[")[phoenix::bind(&PrismParser::allowDoubleLiterals, phoenix::ref(*this), false)]) > expression_ > qi::lit("..") > expression_ > qi::lit("]")[phoenix::bind(&PrismParser::allowDoubleLiterals, phoenix::ref(*this), true)] > -(qi::lit("init") > expression_[qi::_a = qi::_1]) > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createIntegerVariable, phoenix::ref(*this), qi::_1, qi::_2, qi::_3, qi::_a)]; integerVariableDefinition.name("integer variable definition"); variableDefinition = (booleanVariableDefinition[phoenix::push_back(qi::_r1, qi::_1)] | integerVariableDefinition[phoenix::push_back(qi::_r2, qi::_1)]); @@ -117,13 +123,13 @@ namespace storm { globalVariableDefinition = (qi::lit("global") > (booleanVariableDefinition[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::globalBooleanVariables, qi::_r1), qi::_1)] | integerVariableDefinition[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::globalIntegerVariables, qi::_r1), qi::_1)])); globalVariableDefinition.name("global variable declaration list"); - stateRewardDefinition = (expressionParser > qi::lit(":") > expressionParser >> qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createStateReward, phoenix::ref(*this), qi::_1, qi::_2)]; + stateRewardDefinition = (expression_ > qi::lit(":") > expression_ >> qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createStateReward, phoenix::ref(*this), qi::_1, qi::_2)]; stateRewardDefinition.name("state reward definition"); - stateActionRewardDefinition = (qi::lit("[") >> -identifier >> qi::lit("]") >> expressionParser >> qi::lit(":") >> expressionParser >> qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createStateActionReward, phoenix::ref(*this), qi::_1, qi::_2, qi::_3, qi::_r1)]; + stateActionRewardDefinition = (qi::lit("[") >> -identifier >> qi::lit("]") >> expression_ >> qi::lit(":") >> expression_ >> qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createStateActionReward, phoenix::ref(*this), qi::_1, qi::_2, qi::_3, qi::_r1)]; stateActionRewardDefinition.name("state action reward definition"); - transitionRewardDefinition = (qi::lit("[") > -identifier > qi::lit("]") > expressionParser > qi::lit("->") > expressionParser > qi::lit(":") > expressionParser > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createTransitionReward, phoenix::ref(*this), qi::_1, qi::_2, qi::_3, qi::_4, qi::_r1)]; + transitionRewardDefinition = (qi::lit("[") > -identifier > qi::lit("]") > expression_ > qi::lit("->") > expression_ > qi::lit(":") > expression_ > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createTransitionReward, phoenix::ref(*this), qi::_1, qi::_2, qi::_3, qi::_4, qi::_r1)]; transitionRewardDefinition.name("transition reward definition"); rewardModelDefinition = (qi::lit("rewards") > -(qi::lit("\"") > identifier[qi::_a = qi::_1] > qi::lit("\"")) @@ -134,7 +140,7 @@ namespace storm { >> qi::lit("endrewards"))[qi::_val = phoenix::bind(&PrismParser::createRewardModel, phoenix::ref(*this), qi::_a, qi::_b, qi::_c, qi::_d)]; rewardModelDefinition.name("reward model definition"); - initialStatesConstruct = (qi::lit("init") > expressionParser > qi::lit("endinit"))[qi::_pass = phoenix::bind(&PrismParser::addInitialStatesConstruct, phoenix::ref(*this), qi::_1, qi::_r1)]; + initialStatesConstruct = (qi::lit("init") > expression_ > qi::lit("endinit"))[qi::_pass = phoenix::bind(&PrismParser::addInitialStatesConstruct, phoenix::ref(*this), qi::_1, qi::_r1)]; initialStatesConstruct.name("initial construct"); systemCompositionConstruct = (qi::lit("system") > parallelComposition > qi::lit("endsystem"))[phoenix::bind(&PrismParser::addSystemCompositionConstruct, phoenix::ref(*this), qi::_1, qi::_r1)]; @@ -176,16 +182,16 @@ namespace storm { moduleComposition = identifier[qi::_val = phoenix::bind(&PrismParser::createModuleComposition, phoenix::ref(*this), qi::_1)]; moduleComposition.name("module composition"); - labelDefinition = (qi::lit("label") > -qi::lit("\"") > identifier > -qi::lit("\"") > qi::lit("=") > expressionParser >> qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createLabel, phoenix::ref(*this), qi::_1, qi::_2)]; + labelDefinition = (qi::lit("label") > -qi::lit("\"") > identifier > -qi::lit("\"") > qi::lit("=") > expression_ >> qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createLabel, phoenix::ref(*this), qi::_1, qi::_2)]; labelDefinition.name("label definition"); - assignmentDefinition = (qi::lit("(") > identifier > qi::lit("'") > qi::lit("=") > expressionParser > qi::lit(")"))[qi::_val = phoenix::bind(&PrismParser::createAssignment, phoenix::ref(*this), qi::_1, qi::_2)]; + assignmentDefinition = (qi::lit("(") > identifier > qi::lit("'") > qi::lit("=") > expression_ > qi::lit(")"))[qi::_val = phoenix::bind(&PrismParser::createAssignment, phoenix::ref(*this), qi::_1, qi::_2)]; assignmentDefinition.name("assignment"); assignmentDefinitionList = (assignmentDefinition % "&")[qi::_val = qi::_1] | (qi::lit("true"))[qi::_val = phoenix::construct>()]; assignmentDefinitionList.name("assignment list"); - updateDefinition = (((expressionParser >> qi::lit(":")) | qi::attr(manager->rational(1))) >> assignmentDefinitionList)[qi::_val = phoenix::bind(&PrismParser::createUpdate, phoenix::ref(*this), qi::_1, qi::_2, qi::_r1)]; + updateDefinition = (((expression_ >> qi::lit(":")) | qi::attr(manager->rational(1))) >> assignmentDefinitionList)[qi::_val = phoenix::bind(&PrismParser::createUpdate, phoenix::ref(*this), qi::_1, qi::_2, qi::_r1)]; updateDefinition.name("update"); updateListDefinition %= +updateDefinition(qi::_r1) % "+"; @@ -254,17 +260,17 @@ namespace storm { commandDefinition = (((qi::lit("[") > -identifier > qi::lit("]")) | (qi::lit("<") > -identifier > qi::lit(">")[qi::_a = true])) - > expressionParser + > *expressionParser > qi::lit("->") > updateListDefinition(qi::_r1) > qi::lit(";"))[qi::_val = phoenix::bind(&PrismParser::createCommand, phoenix::ref(*this), qi::_a, qi::_1, qi::_2, qi::_3, qi::_r1)]; this->secondRun = true; - this->expressionParser.setIdentifierMapping(&this->identifiers_); + this->expressionParser->setIdentifierMapping(&this->identifiers_); } void PrismParser::allowDoubleLiterals(bool flag) { - this->expressionParser.setAcceptDoubleLiterals(flag); + this->expressionParser->setAcceptDoubleLiterals(flag); } std::string const& PrismParser::getFilename() const { diff --git a/src/parser/PrismParser.h b/src/parser/PrismParser.h index 2a83e3193..911dbe479 100644 --- a/src/parser/PrismParser.h +++ b/src/parser/PrismParser.h @@ -7,10 +7,9 @@ #include #include "src/parser/SpiritParserDefinitions.h" -#include "src/parser/ExpressionParser.h" +#include "src/parser/SpiritErrorHandler.h" #include "src/storage/prism/Program.h" #include "src/storage/expressions/Expression.h" -#include "src/storage/expressions/Expressions.h" namespace storm { namespace expressions { @@ -20,6 +19,8 @@ namespace storm { namespace storm { namespace parser { + class ExpressionParser; + // A class that stores information about the parsed program. class GlobalProgramInformation { public: @@ -237,7 +238,8 @@ namespace storm { // Parser and manager used for recognizing expressions. std::shared_ptr manager; - storm::parser::ExpressionParser expressionParser; + // TODO shared? + std::shared_ptr expressionParser; // Helper methods used in the grammar. bool isValidIdentifier(std::string const& identifier); diff --git a/src/parser/SpiritErrorHandler.h b/src/parser/SpiritErrorHandler.h index 949ad9b12..6374ccfba 100644 --- a/src/parser/SpiritErrorHandler.h +++ b/src/parser/SpiritErrorHandler.h @@ -1,5 +1,4 @@ -#ifndef STORM_PARSER_SPIRITERRORHANDLER_H_ -#define STORM_PARSER_SPIRITERRORHANDLER_H_ +#pragma once #include "src/parser/SpiritParserDefinitions.h" @@ -30,5 +29,3 @@ namespace storm { }; } } - -#endif /* STORM_PARSER_SPIRITERRORHANDLER_H_ */ \ No newline at end of file diff --git a/src/settings/SettingsManager.cpp b/src/settings/SettingsManager.cpp index 625637fdd..2aba99492 100644 --- a/src/settings/SettingsManager.cpp +++ b/src/settings/SettingsManager.cpp @@ -33,6 +33,7 @@ #include "src/settings/modules/RegionSettings.h" #include "src/settings/modules/TopologicalValueIterationEquationSolverSettings.h" #include "src/settings/modules/ExplorationSettings.h" +#include "src/settings/modules/JaniExportSettings.h" #include "src/utility/macros.h" #include "src/settings/Option.h" @@ -524,6 +525,7 @@ namespace storm { storm::settings::addModule(); storm::settings::addModule(); storm::settings::addModule(); + storm::settings::addModule(); } } diff --git a/src/settings/modules/CounterexampleGeneratorSettings.cpp b/src/settings/modules/CounterexampleGeneratorSettings.cpp index b2dbb0ddc..540892a44 100644 --- a/src/settings/modules/CounterexampleGeneratorSettings.cpp +++ b/src/settings/modules/CounterexampleGeneratorSettings.cpp @@ -48,7 +48,7 @@ namespace storm { bool CounterexampleGeneratorSettings::check() const { // Ensure that the model was given either symbolically or explicitly. - STORM_LOG_THROW(!isMinimalCommandSetGenerationSet() || storm::settings::getModule().isSymbolicSet(), storm::exceptions::InvalidSettingsException, "For the generation of a minimal command set, the model has to be specified symbolically."); + STORM_LOG_THROW(!isMinimalCommandSetGenerationSet() || storm::settings::getModule().isPrismInputSet(), storm::exceptions::InvalidSettingsException, "For the generation of a minimal command set, the model has to be specified in the PRISM format."); if (isMinimalCommandSetGenerationSet()) { STORM_LOG_WARN_COND(isUseMaxSatBasedMinimalCommandSetGenerationSet() || !isEncodeReachabilitySet(), "Encoding reachability is only available for the MaxSat-based minimal command set generation, so selecting it has no effect."); diff --git a/src/settings/modules/GSPNExportSettings.cpp b/src/settings/modules/GSPNExportSettings.cpp new file mode 100644 index 000000000..17bdb1f1e --- /dev/null +++ b/src/settings/modules/GSPNExportSettings.cpp @@ -0,0 +1,43 @@ +#include "GSPNExportSettings.h" +#include "JaniExportSettings.h" + +#include "src/settings/SettingsManager.h" +#include "src/settings/SettingMemento.h" +#include "src/settings/Option.h" +#include "src/settings/OptionBuilder.h" +#include "src/settings/ArgumentBuilder.h" +#include "src/settings/Argument.h" + +#include "src/exceptions/InvalidSettingsException.h" + +namespace storm { + namespace settings { + namespace modules { + const std::string GSPNExportSettings::moduleName = "exportGspn"; + + const std::string GSPNExportSettings::writeToDotOptionName = "gspn-dot-output"; + //const std::string GSPNExportSettings::janiFileOptionShortName = "dotoutput"; + + + GSPNExportSettings::GSPNExportSettings() : ModuleSettings(moduleName) { + this->addOption(storm::settings::OptionBuilder(moduleName, writeToDotOptionName, false, "Destination for the dot output.").addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "path to file").build()).build()); + } + + bool GSPNExportSettings::isWriteToDotSet() const { + return this->getOption(writeToDotOptionName).getHasOptionBeenSet(); + } + + std::string GSPNExportSettings::getWriteToDotFilename() const { + return this->getOption(writeToDotOptionName).getArgumentByName("filename").getValueAsString(); + } + + void GSPNExportSettings::finalize() { + + } + + bool GSPNExportSettings::check() const { + return true; + } + } + } +} \ No newline at end of file diff --git a/src/settings/modules/GSPNExportSettings.h b/src/settings/modules/GSPNExportSettings.h new file mode 100644 index 000000000..e3c84b291 --- /dev/null +++ b/src/settings/modules/GSPNExportSettings.h @@ -0,0 +1,40 @@ +#pragma once + +#include "storm-config.h" +#include "src/settings/modules/ModuleSettings.h" + + +namespace storm { + namespace settings { + namespace modules { + class GSPNExportSettings : public ModuleSettings { + public: + /*! + * Creates a new JaniExport setting + */ + GSPNExportSettings(); + + /** + * Retrievew whether the pgcl file option was set + */ + bool isWriteToDotSet() const; + + /** + * Retrieves the pgcl file name + */ + std::string getWriteToDotFilename() const; + + + bool check() const override; + void finalize() override; + + static const std::string moduleName; + + private: + static const std::string writeToDotOptionName; + //static const std::string writeToDotOptionShortName; + + }; + } + } +} \ No newline at end of file diff --git a/src/settings/modules/GSPNSettings.cpp b/src/settings/modules/GSPNSettings.cpp new file mode 100644 index 000000000..3dc09e08d --- /dev/null +++ b/src/settings/modules/GSPNSettings.cpp @@ -0,0 +1,68 @@ +#include "GSPNSettings.h" + +#include "src/settings/SettingsManager.h" +#include "src/settings/SettingMemento.h" +#include "src/settings/Option.h" +#include "src/settings/OptionBuilder.h" +#include "src/settings/ArgumentBuilder.h" +#include "src/settings/Argument.h" + +#include "src/exceptions/InvalidSettingsException.h" + +namespace storm { + namespace settings { + namespace modules { + const std::string GSPNSettings::moduleName = "gspn"; + + const std::string GSPNSettings::gspnFileOptionName = "gspnfile"; + const std::string GSPNSettings::gspnFileOptionShortName = "gspn"; + const std::string GSPNSettings::gspnToJaniOptionName = "to-jani"; + const std::string GSPNSettings::gspnToJaniOptionShortName = "tj"; + const std::string GSPNSettings::capacitiesFileOptionName = "capacitiesfile"; + const std::string GSPNSettings::capacitiesFileOptionShortName = "capacities"; + + + GSPNSettings::GSPNSettings() : ModuleSettings(moduleName) { + this->addOption(storm::settings::OptionBuilder(moduleName, gspnFileOptionName, false, "Parses the GSPN.").setShortName(gspnFileOptionShortName).addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "path to file").addValidationFunctionString(storm::settings::ArgumentValidators::existingReadableFileValidator()).build()).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, gspnToJaniOptionName, false, "Transform to JANI.").setShortName(gspnToJaniOptionShortName).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, capacitiesFileOptionName, false, "Capacaties as invariants for places.").setShortName(capacitiesFileOptionShortName).addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "path to file").addValidationFunctionString(storm::settings::ArgumentValidators::existingReadableFileValidator()).build()).build()); + } + + bool GSPNSettings::isGspnFileSet() const { + return this->getOption(gspnFileOptionName).getHasOptionBeenSet(); + } + + std::string GSPNSettings::getGspnFilename() const { + return this->getOption(gspnFileOptionName).getArgumentByName("filename").getValueAsString(); + } + + bool GSPNSettings::isToJaniSet() const { + return this->getOption(gspnToJaniOptionName).getHasOptionBeenSet(); + } + + bool GSPNSettings::isCapacitiesFileSet() const { + return this->getOption(capacitiesFileOptionName).getHasOptionBeenSet(); + } + + std::string GSPNSettings::getCapacitiesFilename() const { + return this->getOption(capacitiesFileOptionName).getArgumentByName("filename").getValueAsString(); + } + + void GSPNSettings::finalize() { + + } + + bool GSPNSettings::check() const { + if(!isGspnFileSet()) { + if(isToJaniSet()) { + return false; + } + if(isCapacitiesFileSet()) { + return false; + } + } + return true; + } + } + } +} \ No newline at end of file diff --git a/src/settings/modules/GSPNSettings.h b/src/settings/modules/GSPNSettings.h new file mode 100644 index 000000000..7d3cb2729 --- /dev/null +++ b/src/settings/modules/GSPNSettings.h @@ -0,0 +1,59 @@ +#pragma once + +#include "storm-config.h" +#include "src/settings/modules/ModuleSettings.h" + + +namespace storm { + namespace settings { + namespace modules { + class GSPNSettings : public ModuleSettings { + public: + /*! + * Creates a new PGCL setting + */ + GSPNSettings(); + + /** + * Retrievew whether the pgcl file option was set + */ + bool isGspnFileSet() const; + + /** + * Retrieves the gspn file name + */ + std::string getGspnFilename() const; + + /** + * Whether the gspn should be transformed to Jani + */ + bool isToJaniSet() const; + + /** + * Retrievew whether the pgcl file option was set + */ + bool isCapacitiesFileSet() const; + + /** + * Retrieves the gspn file name + */ + std::string getCapacitiesFilename() const; + + + bool check() const override; + void finalize() override; + + static const std::string moduleName; + + private: + static const std::string gspnFileOptionName; + static const std::string gspnFileOptionShortName; + static const std::string gspnToJaniOptionName; + static const std::string gspnToJaniOptionShortName; + static const std::string capacitiesFileOptionName; + static const std::string capacitiesFileOptionShortName; + + }; + } + } +} \ No newline at end of file diff --git a/src/settings/modules/IOSettings.cpp b/src/settings/modules/IOSettings.cpp index 80f9b3439..84d9b1238 100644 --- a/src/settings/modules/IOSettings.cpp +++ b/src/settings/modules/IOSettings.cpp @@ -7,6 +7,7 @@ #include "src/settings/ArgumentBuilder.h" #include "src/settings/Argument.h" #include "src/exceptions/InvalidSettingsException.h" +#include "src/parser/CSVParser.h" namespace storm { namespace settings { @@ -14,11 +15,12 @@ namespace storm { const std::string IOSettings::moduleName = "io"; const std::string IOSettings::exportDotOptionName = "exportdot"; - const std::string IOSettings::exportMatOptionName = "exportmat"; + const std::string IOSettings::exportExplicitOptionName = "exportexplicit"; const std::string IOSettings::explicitOptionName = "explicit"; const std::string IOSettings::explicitOptionShortName = "exp"; - const std::string IOSettings::symbolicOptionName = "symbolic"; - const std::string IOSettings::symbolicOptionShortName = "s"; + const std::string IOSettings::prismInputOptionName = "prism"; + const std::string IOSettings::janiInputOptionName = "jani"; + const std::string IOSettings::prismToJaniOptionName = "prism2jani"; const std::string IOSettings::explorationOrderOptionName = "explorder"; const std::string IOSettings::explorationOrderOptionShortName = "eo"; const std::string IOSettings::transitionRewardsOptionName = "transrew"; @@ -28,18 +30,28 @@ namespace storm { const std::string IOSettings::constantsOptionShortName = "const"; const std::string IOSettings::prismCompatibilityOptionName = "prismcompat"; const std::string IOSettings::prismCompatibilityOptionShortName = "pc"; + const std::string IOSettings::noBuildOptionName = "nobuild"; + const std::string IOSettings::fullModelBuildOptionName = "buildfull"; + const std::string IOSettings::janiPropertyOptionName = "janiproperty"; + const std::string IOSettings::janiPropertyOptionShortName = "jprop"; + IOSettings::IOSettings() : ModuleSettings(moduleName) { this->addOption(storm::settings::OptionBuilder(moduleName, prismCompatibilityOptionName, false, "Enables PRISM compatibility. This may be necessary to process some PRISM models.").setShortName(prismCompatibilityOptionShortName).build()); this->addOption(storm::settings::OptionBuilder(moduleName, exportDotOptionName, "", "If given, the loaded model will be written to the specified file in the dot format.") .addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "The name of the file to which the model is to be written.").build()).build()); - this->addOption(storm::settings::OptionBuilder(moduleName, exportMatOptionName, "", "If given, the loaded model will be written to the specified file in the mat format.") + this->addOption(storm::settings::OptionBuilder(moduleName, exportExplicitOptionName, "", "If given, the loaded model will be written to the specified file in the drn format.") .addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "the name of the file to which the model is to be writen.").build()).build()); this->addOption(storm::settings::OptionBuilder(moduleName, explicitOptionName, false, "Parses the model given in an explicit (sparse) representation.").setShortName(explicitOptionShortName) .addArgument(storm::settings::ArgumentBuilder::createStringArgument("transition filename", "The name of the file from which to read the transitions.").addValidationFunctionString(storm::settings::ArgumentValidators::existingReadableFileValidator()).build()) .addArgument(storm::settings::ArgumentBuilder::createStringArgument("labeling filename", "The name of the file from which to read the state labeling.").addValidationFunctionString(storm::settings::ArgumentValidators::existingReadableFileValidator()).build()).build()); - this->addOption(storm::settings::OptionBuilder(moduleName, symbolicOptionName, false, "Parses the model given in a symbolic representation.").setShortName(symbolicOptionShortName) - .addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "The name of the file from which to read the symbolic model.").addValidationFunctionString(storm::settings::ArgumentValidators::existingReadableFileValidator()).build()).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, prismInputOptionName, false, "Parses the model given in the PRISM format.") + .addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "The name of the file from which to read the PRISM input.").addValidationFunctionString(storm::settings::ArgumentValidators::existingReadableFileValidator()).build()).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, janiInputOptionName, false, "Parses the model given in the JANI format.") + .addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "The name of the file from which to read the JANI input.").addValidationFunctionString(storm::settings::ArgumentValidators::existingReadableFileValidator()).build()).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, prismToJaniOptionName, false, "If set, the input PRISM model is transformed to JANI.").build()); + this->addOption(storm::settings::OptionBuilder(moduleName, fullModelBuildOptionName, false, "If set, include all rewards and labels.").build()); + this->addOption(storm::settings::OptionBuilder(moduleName, noBuildOptionName, false, "If set, do not build the model.").build()); std::vector explorationOrders = {"dfs", "bfs"}; this->addOption(storm::settings::OptionBuilder(moduleName, explorationOrderOptionName, false, "Sets which exploration order to use.").setShortName(explorationOrderOptionShortName) @@ -51,8 +63,10 @@ namespace storm { .addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "The file from which to read the state rewards.").addValidationFunctionString(storm::settings::ArgumentValidators::existingReadableFileValidator()).build()).build()); this->addOption(storm::settings::OptionBuilder(moduleName, choiceLabelingOptionName, false, "If given, the choice labels are read from this file and added to the explicit model. Note that this requires the model to be given as an explicit model (i.e., via --" + explicitOptionName + ").") .addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "The file from which to read the choice labels.").addValidationFunctionString(storm::settings::ArgumentValidators::existingReadableFileValidator()).build()).build()); - this->addOption(storm::settings::OptionBuilder(moduleName, constantsOptionName, false, "Specifies the constant replacements to use in symbolic models. Note that Note that this requires the model to be given as an symbolic model (i.e., via --" + symbolicOptionName + ").").setShortName(constantsOptionShortName) + this->addOption(storm::settings::OptionBuilder(moduleName, constantsOptionName, false, "Specifies the constant replacements to use in symbolic models. Note that this requires the model to be given as an symbolic model (i.e., via --" + prismInputOptionName + " or --" + janiInputOptionName + ").").setShortName(constantsOptionShortName) .addArgument(storm::settings::ArgumentBuilder::createStringArgument("values", "A comma separated list of constants and their value, e.g. a=1,b=2,c=3.").setDefaultValueString("").build()).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, janiPropertyOptionName, false, "Specifies the properties from the jani model (given by --" + janiInputOptionName + ") to be checked.").setShortName(janiPropertyOptionShortName) + .addArgument(storm::settings::ArgumentBuilder::createStringArgument("values", "A comma separated list of properties to be checked").setDefaultValueString("").build()).build()); } bool IOSettings::isExportDotSet() const { @@ -62,6 +76,14 @@ namespace storm { std::string IOSettings::getExportDotFilename() const { return this->getOption(exportDotOptionName).getArgumentByName("filename").getValueAsString(); } + + bool IOSettings::isExportExplicitSet() const { + return this->getOption(exportExplicitOptionName).getHasOptionBeenSet(); + } + + std::string IOSettings::getExportExplicitFilename() const { + return this->getOption(exportExplicitOptionName).getArgumentByName("filename").getValueAsString(); + } bool IOSettings::isExplicitSet() const { return this->getOption(explicitOptionName).getHasOptionBeenSet(); @@ -75,14 +97,30 @@ namespace storm { return this->getOption(explicitOptionName).getArgumentByName("labeling filename").getValueAsString(); } - bool IOSettings::isSymbolicSet() const { - return this->getOption(symbolicOptionName).getHasOptionBeenSet(); + bool IOSettings::isPrismInputSet() const { + return this->getOption(prismInputOptionName).getHasOptionBeenSet(); + } + + bool IOSettings::isPrismOrJaniInputSet() const { + return isJaniInputSet() || isPrismInputSet(); } - std::string IOSettings::getSymbolicModelFilename() const { - return this->getOption(symbolicOptionName).getArgumentByName("filename").getValueAsString(); + bool IOSettings::isPrismToJaniSet() const { + return this->getOption(prismToJaniOptionName).getHasOptionBeenSet(); } + std::string IOSettings::getPrismInputFilename() const { + return this->getOption(prismInputOptionName).getArgumentByName("filename").getValueAsString(); + } + + bool IOSettings::isJaniInputSet() const { + return this->getOption(janiInputOptionName).getHasOptionBeenSet(); + } + + std::string IOSettings::getJaniInputFilename() const { + return this->getOption(janiInputOptionName).getArgumentByName("filename").getValueAsString(); + } + bool IOSettings::isExplorationOrderSet() const { return this->getOption(explorationOrderOptionName).getHasOptionBeenSet(); } @@ -133,16 +171,40 @@ namespace storm { return this->getOption(constantsOptionName).getArgumentByName("values").getValueAsString(); } + bool IOSettings::isJaniPropertiesSet() const { + return this->getOption(janiPropertyOptionName).getHasOptionBeenSet(); + } + + std::vector IOSettings::getJaniProperties() const { + return storm::parser::parseCommaSeperatedValues(this->getOption(janiPropertyOptionName).getArgumentByName("values").getValueAsString()); + } + + bool IOSettings::isPrismCompatibilityEnabled() const { return this->getOption(prismCompatibilityOptionName).getHasOptionBeenSet(); } + + bool IOSettings::isBuildFullModelSet() const { + return this->getOption(fullModelBuildOptionName).getHasOptionBeenSet(); + } + + bool IOSettings::isNoBuildModelSet() const { + return this->getOption(noBuildOptionName).getHasOptionBeenSet(); + } void IOSettings::finalize() { } bool IOSettings::check() const { + // Ensure that not two symbolic input models were given. + STORM_LOG_THROW(!isJaniInputSet() || !isPrismInputSet(), storm::exceptions::InvalidSettingsException, "Symbolic model "); + // Ensure that the model was given either symbolically or explicitly. - STORM_LOG_THROW(!isSymbolicSet() || !isExplicitSet(), storm::exceptions::InvalidSettingsException, "The model may be either given in an explicit or a symbolic format, but not both."); + STORM_LOG_THROW(!isJaniInputSet() || !isPrismInputSet() || !isExplicitSet(), storm::exceptions::InvalidSettingsException, "The model may be either given in an explicit or a symbolic format (PRISM or JANI), but not both."); + + // Make sure PRISM-to-JANI conversion is only set if the actual input is in PRISM format. + STORM_LOG_THROW(!isPrismToJaniSet() || isPrismInputSet(), storm::exceptions::InvalidSettingsException, "For the transformation from PRISM to JANI, the input model must be given in the prism format."); + return true; } diff --git a/src/settings/modules/IOSettings.h b/src/settings/modules/IOSettings.h index eb1ced407..d2c2bef58 100644 --- a/src/settings/modules/IOSettings.h +++ b/src/settings/modules/IOSettings.h @@ -35,6 +35,22 @@ namespace storm { */ std::string getExportDotFilename() const; + + /*! + * Retrieves whether the export-to-explicit option was set + * + * @return True if the export-to-explicit option was set + */ + bool isExportExplicitSet() const; + + + /*! + * Retrieves thename in which to write the model in explicit format, if the option was set. + * + * @return The name of the file in which to write the exported mode. + */ + std::string getExportExplicitFilename() const; + /*! * Retrieves whether the explicit option was set. * @@ -59,20 +75,49 @@ namespace storm { std::string getLabelingFilename() const; /*! - * Retrieves whether the symbolic option was set. + * Retrieves whether the PRISM language option was set. + * + * @return True if the PRISM input option was set. + */ + bool isPrismInputSet() const; + + /*! + * Retrieves whether the JANI input option was set. * - * @return True if the symbolic option was set. + * @return True if the JANI input option was set. */ - bool isSymbolicSet() const; + bool isJaniInputSet() const; /*! - * Retrieves the name of the file that contains the symbolic model specification if the model was given - * using the symbolic option. + * Retrieves whether the JANI or PRISM input option was set. + * + * @return True if either of the two options was set. + */ + bool isPrismOrJaniInputSet() const; + + /*! + * Retrieves whether the option to convert PRISM to JANI input was set. * - * @return The name of the file that contains the symbolic model specification. + * @return True if the option was set. */ - std::string getSymbolicModelFilename() const; + bool isPrismToJaniSet() const; + /*! + * Retrieves the name of the file that contains the PRISM model specification if the model was given + * using the PRISM input option. + * + * @return The name of the file that contains the PRISM model specification. + */ + std::string getPrismInputFilename() const; + + /*! + * Retrieves the name of the file that contains the JANI model specification if the model was given + * using the JANI input option. + * + * @return The name of the file that contains the JANI model specification. + */ + std::string getJaniInputFilename() const; + /*! * Retrieves whether the model exploration order was set. * @@ -154,6 +199,10 @@ namespace storm { * @return The string that defines the constants of a symbolic model. */ std::string getConstantDefinitionString() const; + + bool isJaniPropertiesSet() const; + + std::vector getJaniProperties() const; /*! * Retrieves whether the PRISM compatibility mode was enabled. @@ -161,6 +210,18 @@ namespace storm { * @return True iff the PRISM compatibility mode was enabled. */ bool isPrismCompatibilityEnabled() const; + + /** + * Retrieves whether no model should be build at all, in case one just want to translate models or parse a file + */ + bool isNoBuildModelSet() const; + + /*! + * Retrieves whether the full model should be build, that is, the model including all labels and rewards. + * + * @return true iff the full model should be build. + */ + bool isBuildFullModelSet() const; bool check() const override; void finalize() override; @@ -171,11 +232,12 @@ namespace storm { private: // Define the string names of the options as constants. static const std::string exportDotOptionName; - static const std::string exportMatOptionName; + static const std::string exportExplicitOptionName; static const std::string explicitOptionName; static const std::string explicitOptionShortName; - static const std::string symbolicOptionName; - static const std::string symbolicOptionShortName; + static const std::string prismInputOptionName; + static const std::string janiInputOptionName; + static const std::string prismToJaniOptionName; static const std::string explorationOrderOptionName; static const std::string explorationOrderOptionShortName; static const std::string transitionRewardsOptionName; @@ -185,6 +247,10 @@ namespace storm { static const std::string constantsOptionShortName; static const std::string prismCompatibilityOptionName; static const std::string prismCompatibilityOptionShortName; + static const std::string fullModelBuildOptionName; + static const std::string noBuildOptionName; + static const std::string janiPropertyOptionName; + static const std::string janiPropertyOptionShortName; }; } // namespace modules diff --git a/src/settings/modules/JaniExportSettings.cpp b/src/settings/modules/JaniExportSettings.cpp new file mode 100644 index 000000000..a702f6117 --- /dev/null +++ b/src/settings/modules/JaniExportSettings.cpp @@ -0,0 +1,49 @@ +#include "JaniExportSettings.h" + +#include "src/settings/SettingsManager.h" +#include "src/settings/SettingMemento.h" +#include "src/settings/Option.h" +#include "src/settings/OptionBuilder.h" +#include "src/settings/ArgumentBuilder.h" +#include "src/settings/Argument.h" + +#include "src/exceptions/InvalidSettingsException.h" + +namespace storm { + namespace settings { + namespace modules { + const std::string JaniExportSettings::moduleName = "exportJani"; + + const std::string JaniExportSettings::janiFileOptionName = "jani-output"; + const std::string JaniExportSettings::janiFileOptionShortName = "output"; + const std::string JaniExportSettings::standardCompliantOptionName = "standard-compliant"; + const std::string JaniExportSettings::standardCompliantOptionShortName = "standard"; + + + JaniExportSettings::JaniExportSettings() : ModuleSettings(moduleName) { + this->addOption(storm::settings::OptionBuilder(moduleName, janiFileOptionName, false, "Destination for the jani model.").setShortName(janiFileOptionShortName).addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "path to file").build()).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, standardCompliantOptionName, false, "Export in standard compliant variant.").setShortName(standardCompliantOptionShortName).build()); + } + + bool JaniExportSettings::isJaniFileSet() const { + return this->getOption(janiFileOptionName).getHasOptionBeenSet(); + } + + std::string JaniExportSettings::getJaniFilename() const { + return this->getOption(janiFileOptionName).getArgumentByName("filename").getValueAsString(); + } + + bool JaniExportSettings::isExportAsStandardJaniSet() const { + return this->getOption(standardCompliantOptionName).getHasOptionBeenSet(); + } + + void JaniExportSettings::finalize() { + + } + + bool JaniExportSettings::check() const { + return true; + } + } + } +} \ No newline at end of file diff --git a/src/settings/modules/JaniExportSettings.h b/src/settings/modules/JaniExportSettings.h new file mode 100644 index 000000000..83b77d15a --- /dev/null +++ b/src/settings/modules/JaniExportSettings.h @@ -0,0 +1,43 @@ +#pragma once + +#include "storm-config.h" +#include "src/settings/modules/ModuleSettings.h" + + +namespace storm { + namespace settings { + namespace modules { + class JaniExportSettings : public ModuleSettings { + public: + /*! + * Creates a new JaniExport setting + */ + JaniExportSettings(); + + /** + * Retrievew whether the pgcl file option was set + */ + bool isJaniFileSet() const; + + /** + * Retrieves the pgcl file name + */ + std::string getJaniFilename() const; + + bool isExportAsStandardJaniSet() const; + + bool check() const override; + void finalize() override; + + static const std::string moduleName; + + private: + static const std::string janiFileOptionName; + static const std::string janiFileOptionShortName; + static const std::string standardCompliantOptionName; + static const std::string standardCompliantOptionShortName; + + }; + } + } +} \ No newline at end of file diff --git a/src/settings/modules/PGCLSettings.cpp b/src/settings/modules/PGCLSettings.cpp new file mode 100644 index 000000000..e73b9514e --- /dev/null +++ b/src/settings/modules/PGCLSettings.cpp @@ -0,0 +1,71 @@ +#include "src/settings/modules/PGCLSettings.h" + +#include "src/settings/SettingsManager.h" +#include "src/settings/SettingMemento.h" +#include "src/settings/Option.h" +#include "src/settings/OptionBuilder.h" +#include "src/settings/ArgumentBuilder.h" +#include "src/settings/Argument.h" + +#include "src/exceptions/InvalidSettingsException.h" + +namespace storm { + namespace settings { + namespace modules { + const std::string PGCLSettings::moduleName = "pgcl"; + + const std::string PGCLSettings::pgclFileOptionName = "pgclfile"; + const std::string PGCLSettings::pgclFileOptionShortName = "pgcl"; + const std::string PGCLSettings::pgclToJaniOptionName = "to-jani"; + const std::string PGCLSettings::pgclToJaniOptionShortName = "tj"; + const std::string PGCLSettings::programGraphToDotOptionName = "draw-program-graph"; + const std::string PGCLSettings::programGraphToDotShortOptionName = "pg"; + const std::string PGCLSettings::programVariableRestrictionsOptionName = "variable-restrictions"; + const std::string PGCLSettings::programVariableRestrictionShortOptionName = "rvar"; + + + PGCLSettings::PGCLSettings() : ModuleSettings(moduleName) { + this->addOption(storm::settings::OptionBuilder(moduleName, pgclFileOptionName, false, "Parses the pgcl program.").setShortName(pgclFileOptionShortName).addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "path to file").addValidationFunctionString(storm::settings::ArgumentValidators::existingReadableFileValidator()).build()).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, pgclToJaniOptionName, false, "Transform to JANI.").setShortName(pgclToJaniOptionShortName).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, programGraphToDotOptionName, false, "Destination for the program graph dot output.").setShortName(programGraphToDotShortOptionName).addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename", "path to file").build()).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, programVariableRestrictionsOptionName, false, "Restrictions of program variables").setShortName(programVariableRestrictionShortOptionName).addArgument(storm::settings::ArgumentBuilder::createStringArgument("description", "description of the variable restrictions").build()).build()); + } + + bool PGCLSettings::isPgclFileSet() const { + return this->getOption(pgclFileOptionName).getHasOptionBeenSet(); + } + + std::string PGCLSettings::getPgclFilename() const { + return this->getOption(pgclFileOptionName).getArgumentByName("filename").getValueAsString(); + } + + bool PGCLSettings::isToJaniSet() const { + return this->getOption(pgclToJaniOptionName).getHasOptionBeenSet(); + } + + bool PGCLSettings::isProgramGraphToDotSet() const { + return this->getOption(programGraphToDotOptionName).getHasOptionBeenSet(); + } + + std::string PGCLSettings::getProgramGraphDotOutputFilename() const { + return this->getOption(programGraphToDotOptionName).getArgumentByName("filename").getValueAsString(); + } + + bool PGCLSettings::isProgramVariableRestrictionSet() const { + return this->getOption(programVariableRestrictionsOptionName).getHasOptionBeenSet(); + } + + std::string PGCLSettings::getProgramVariableRestrictions() const { + return this->getOption(programVariableRestrictionsOptionName).getArgumentByName("description").getValueAsString(); + } + + void PGCLSettings::finalize() { + + } + + bool PGCLSettings::check() const { + return true; + } + } + } +} \ No newline at end of file diff --git a/src/settings/modules/PGCLSettings.h b/src/settings/modules/PGCLSettings.h new file mode 100644 index 000000000..fe8bb2b17 --- /dev/null +++ b/src/settings/modules/PGCLSettings.h @@ -0,0 +1,71 @@ +#pragma once + +#include "storm-config.h" +#include "src/settings/modules/ModuleSettings.h" + + +namespace storm { + namespace settings { + namespace modules { + class PGCLSettings : public ModuleSettings { + public: + /*! + * Creates a new PGCL setting + */ + PGCLSettings(); + + /** + * Retrievew whether the pgcl file option was set + */ + bool isPgclFileSet() const; + + /** + * Retrieves the pgcl file name + */ + std::string getPgclFilename() const; + + /** + * Whether the pgcl should be transformed to Jani + */ + bool isToJaniSet() const; + + /** + * Whether the program graph should be drawn (dot output) + */ + bool isProgramGraphToDotSet() const; + + /** + * Destination where to write dot output of the program graph. + */ + std::string getProgramGraphDotOutputFilename() const ; + + /** + * Is program variable restriction string given + */ + bool isProgramVariableRestrictionSet() const; + + /** + * String for program variable restrictions + */ + std::string getProgramVariableRestrictions() const; + + + bool check() const override; + void finalize() override; + + static const std::string moduleName; + + private: + static const std::string pgclFileOptionName; + static const std::string pgclFileOptionShortName; + static const std::string pgclToJaniOptionName; + static const std::string pgclToJaniOptionShortName; + static const std::string programGraphToDotOptionName; + static const std::string programGraphToDotShortOptionName; + static const std::string programVariableRestrictionsOptionName; + static const std::string programVariableRestrictionShortOptionName; + + }; + } + } +} \ No newline at end of file diff --git a/src/solver/SmtlibSmtSolver.cpp b/src/solver/SmtlibSmtSolver.cpp index fbc852749..e75f7d08d 100644 --- a/src/solver/SmtlibSmtSolver.cpp +++ b/src/solver/SmtlibSmtSolver.cpp @@ -23,7 +23,7 @@ namespace storm { namespace solver { - SmtlibSmtSolver::SmtlibModelReference::SmtlibModelReference(storm::expressions::ExpressionManager const& manager, storm::adapters::Smt2ExpressionAdapter& expressionAdapter) : ModelReference(manager), expressionAdapter(expressionAdapter){ + SmtlibSmtSolver::SmtlibModelReference::SmtlibModelReference(storm::expressions::ExpressionManager const& manager, storm::adapters::Smt2ExpressionAdapter& expressionAdapter) : ModelReference(manager) { // Intentionally left empty. } diff --git a/src/solver/SmtlibSmtSolver.h b/src/solver/SmtlibSmtSolver.h index 4974aa0c4..1606df41f 100644 --- a/src/solver/SmtlibSmtSolver.h +++ b/src/solver/SmtlibSmtSolver.h @@ -30,7 +30,7 @@ namespace storm { private: // The expression adapter that is used to translate the variable names. - storm::adapters::Smt2ExpressionAdapter& expressionAdapter; + //storm::adapters::Smt2ExpressionAdapter& expressionAdapter; }; public: diff --git a/src/solver/stateelimination/EliminatorBase.cpp b/src/solver/stateelimination/EliminatorBase.cpp index 4a083d5fc..dac54a6f5 100644 --- a/src/solver/stateelimination/EliminatorBase.cpp +++ b/src/solver/stateelimination/EliminatorBase.cpp @@ -49,7 +49,8 @@ namespace storm { } else if (Mode == ScalingMode::DivideOneMinus) { if (hasEntryInColumn) { STORM_LOG_ASSERT(columnValue != storm::utility::one(), "The scaling mode 'divide-one-minus' requires a non-one value in the given column."); - columnValue = storm::utility::simplify(storm::utility::one() / (storm::utility::one() - columnValue)); + columnValue = storm::utility::one() / (storm::utility::one() - columnValue); + columnValue = storm::utility::simplify(columnValue); } } @@ -57,7 +58,8 @@ namespace storm { for (auto entryIt = entriesInRow.begin(), entryIte = entriesInRow.end(); entryIt != entryIte; ++entryIt) { // Only scale the entries in a different column. if (entryIt->getColumn() != column) { - entryIt->setValue(storm::utility::simplify(entryIt->getValue() * columnValue)); + auto tmpVal = entryIt->getValue() * columnValue; + entryIt->setValue(storm::utility::simplify(tmpVal)); } } updateValue(column, columnValue); @@ -145,7 +147,9 @@ namespace storm { *result = *first1; ++first1; } else { - auto probability = storm::utility::simplify(first1->getValue() + storm::utility::simplify(multiplyFactor * first2->getValue())); + ValueType sprod = multiplyFactor * first2->getValue(); + ValueType sum = first1->getValue() + storm::utility::simplify(sprod); + auto probability = storm::utility::simplify(sum); *result = storm::storage::MatrixEntry::index_type, typename storm::storage::FlexibleSparseMatrix::value_type>(first1->getColumn(), probability); newBackwardEntries[successorOffsetInNewBackwardTransitions].emplace_back(predecessor, probability); ++first1; diff --git a/src/storage/BitVector.cpp b/src/storage/BitVector.cpp index d7676c973..c806b29da 100644 --- a/src/storage/BitVector.cpp +++ b/src/storage/BitVector.cpp @@ -253,11 +253,10 @@ namespace storm { } } - void BitVector::enlargeLiberally(uint_fast64_t minimumLength, bool init) { - if(minimumLength > this->size()) { - uint_fast64_t newLength = this->bucketCount(); - newLength = std::max(newLength, static_cast(1u)) << 6; - while(newLength < minimumLength) { + void BitVector::grow(uint_fast64_t minimumLength, bool init) { + if (minimumLength > bitCount) { + uint_fast64_t newLength = bitCount; + while (newLength < minimumLength) { newLength = newLength << 1; } resize(newLength, init); diff --git a/src/storage/BitVector.h b/src/storage/BitVector.h index 6ae966379..ecdd03536 100644 --- a/src/storage/BitVector.h +++ b/src/storage/BitVector.h @@ -243,7 +243,7 @@ namespace storm { * @param minimumLength The minimum number of bits that the bit vector should hold. * @param init The truth value to which to initialize newly created bits. */ - void enlargeLiberally(uint_fast64_t minimumLength, bool init = false); + void grow(uint_fast64_t minimumLength, bool init = false); /*! * Performs a logical "and" with the given bit vector. In case the sizes of the bit vectors do not match, @@ -472,7 +472,7 @@ namespace storm { * value is equal to a call to size(), then there is no bit set after the specified position. * * @param startingIndex The index at which to start the search for the next bit that is set. The - * bit at this index itself is already considered. + * bit at this index itself is included in the search range. * @return The index of the next bit that is set after the given index. */ uint_fast64_t getNextSetIndex(uint_fast64_t startingIndex) const; diff --git a/src/storage/Distribution.cpp b/src/storage/Distribution.cpp index 78e4a477d..4c2816467 100644 --- a/src/storage/Distribution.cpp +++ b/src/storage/Distribution.cpp @@ -19,6 +19,13 @@ namespace storm { // Intentionally left empty. } + template + void Distribution::add(Distribution const& other) { + container_type newDistribution; + std::set_union(this->distribution.begin(), this->distribution.end(), other.distribution.begin(), other.distribution.end(), std::inserter(newDistribution, newDistribution.begin())); + this->distribution = std::move(newDistribution); + } + template bool Distribution::equals(Distribution const& other, storm::utility::ConstantsComparator const& comparator) const { // We need to check equality by ourselves, because we need to account for epsilon differences. diff --git a/src/storage/Distribution.h b/src/storage/Distribution.h index ba61f0fbd..88e008108 100644 --- a/src/storage/Distribution.h +++ b/src/storage/Distribution.h @@ -5,8 +5,6 @@ #include #include -#include "src/utility/OsDetection.h" - #include "src/storage/sparse/StateType.h" namespace storm { @@ -31,11 +29,13 @@ namespace storm { Distribution(Distribution const& other) = default; Distribution& operator=(Distribution const& other) = default; - -#ifndef WINDOWS Distribution(Distribution&& other) = default; Distribution& operator=(Distribution&& other) = default; -#endif + + /*! + * Adds the given distribution to the current one. + */ + void add(Distribution const& other); /*! * Checks whether the two distributions specify the same probabilities to go to the same states. @@ -154,4 +154,4 @@ namespace std { } -#endif /* STORM_STORAGE_DISTRIBUTION_H_ */ \ No newline at end of file +#endif /* STORM_STORAGE_DISTRIBUTION_H_ */ diff --git a/src/storage/IntegerInterval.cpp b/src/storage/IntegerInterval.cpp new file mode 100644 index 000000000..4210cbe4b --- /dev/null +++ b/src/storage/IntegerInterval.cpp @@ -0,0 +1,30 @@ +#include "IntegerInterval.h" + +#include +#include + +#include "src/utility/macros.h" +#include "src/exceptions/InvalidArgumentException.h" + +bool starts_with(const std::string& s1, const std::string& s2) { + return s2.size() <= s1.size() && s1.compare(0, s2.size(), s2) == 0; +} + +namespace storm { + namespace storage { + IntegerInterval parseIntegerInterval(std::string const& stringRepr) { + + + if(starts_with(stringRepr, "[") && stringRepr.at(stringRepr.size()-1) == ']') { + auto split = stringRepr.find(","); + std::string first = stringRepr.substr(1,split-1); + + std::string second = stringRepr.substr(split+1, stringRepr.size() - split - 2); + return IntegerInterval(stoi(first), stoi(second)); + + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Cannot parse " << stringRepr << " as integer interval"); + } + } + } +} \ No newline at end of file diff --git a/src/storage/IntegerInterval.h b/src/storage/IntegerInterval.h new file mode 100644 index 000000000..24b5ed892 --- /dev/null +++ b/src/storage/IntegerInterval.h @@ -0,0 +1,100 @@ +#pragma once + +#include + +namespace storm { + namespace storage { + class IntegerInterval { + + public: + explicit IntegerInterval(int64_t v) : leftBound(v), rightBound(v) { + + } + + IntegerInterval(int64_t lb, int64_t rb) : leftBound(lb), rightBound(rb) { + + } + + bool hasLeftBound() const { + return leftBound != boost::none; + } + + bool hasRightBound() const { + return rightBound != boost::none; + } + + bool contains(int64_t val) const { + if (hasLeftBound()) { + if (val < leftBound.get()) { + return false; + } + } + if (hasRightBound()) { + if (val > rightBound.get()) { + return false; + } + } + return true; + } + + bool contains(IntegerInterval const& i) const { + if (hasLeftBound()) { + if (!i.hasLeftBound()) { + return false; + } + if (leftBound.get() > i.getLeftBound().get()) { + return false; + } + } + if (hasRightBound()) { + if (!i.hasRightBound()) { + return false; + } + if (rightBound.get() < i.getRightBound().get()) { + return false; + } + } + return true; + } + + void extend(int64_t val) { + if (hasLeftBound()) { + if(val < leftBound.get()) { + leftBound = val; + return; + } + } + if (hasRightBound()) { + if(val > rightBound.get()) { + rightBound = val; + } + } + } + + void extend(IntegerInterval const& i) { + if(i.hasLeftBound()) { + extend(i.getLeftBound().get()); + } + if(i.hasRightBound()) { + extend(i.getRightBound().get()); + } + } + + boost::optional getLeftBound() const { + return leftBound; + } + + boost::optional getRightBound() const { + return rightBound; + } + + private: + boost::optional leftBound; + boost::optional rightBound; + + }; + + std::ostream& operator<<(std::ostream& os, IntegerInterval const& i); + IntegerInterval parseIntegerInterval(std::string const& stringRepr); + } +} \ No newline at end of file diff --git a/src/storage/SparseMatrix.cpp b/src/storage/SparseMatrix.cpp index 01ef1439d..0bb4ebe10 100644 --- a/src/storage/SparseMatrix.cpp +++ b/src/storage/SparseMatrix.cpp @@ -633,64 +633,88 @@ namespace storm { template void SparseMatrix::swapRows(index_type const& row1, index_type const& row2) { - if(row1==row2) { + if (row1 == row2) { return; } - // Get the index of the row that has more / less entries than the other + // Get the index of the row that has more / less entries than the other. index_type largerRow = getRow(row1).getNumberOfEntries() > getRow(row2).getNumberOfEntries() ? row1 : row2; index_type smallerRow = largerRow == row1 ? row2 : row1; index_type rowSizeDifference = getRow(largerRow).getNumberOfEntries() - getRow(smallerRow).getNumberOfEntries(); - // Save contents of larger row - std::vector> largerRowContents(getRow(largerRow).begin(), getRow(largerRow).end()); - if(largerRow < smallerRow) { - auto writeIt = getRows(largerRow, smallerRow+1).begin(); - // write smaller row in its new position - for(auto& smallerRowEntry : getRow(smallerRow)) { + // Save contents of larger row. + auto copyRow = getRow(largerRow); + std::vector> largerRowContents(copyRow.begin(), copyRow.end()); + + if (largerRow < smallerRow) { + auto writeIt = getRows(largerRow, smallerRow + 1).begin(); + + // Write smaller row to its new position. + for (auto& smallerRowEntry : getRow(smallerRow)) { *writeIt = std::move(smallerRowEntry); ++writeIt; } - if(!storm::utility::isZero(rowSizeDifference)) { - // write the intermediate rows into their correct position - for(auto& intermediateRowEntry : getRows(largerRow+1, smallerRow)) { + + // Write the intermediate rows into their correct position. + if (!storm::utility::isZero(rowSizeDifference)) { + for (auto& intermediateRowEntry : getRows(largerRow + 1, smallerRow)) { *writeIt = std::move(intermediateRowEntry); ++writeIt; } + } else { + // skip the intermediate rows + writeIt = getRow(smallerRow).begin(); } - // write the larger row - for(auto& largerRowEntry : largerRowContents) { + + // Write the larger row to its new position. + for (auto& largerRowEntry : largerRowContents) { *writeIt = std::move(largerRowEntry); ++writeIt; } - STORM_LOG_ASSERT(writeIt == getRow(smallerRow).end(), "Unexpected position of write iterator"); - //Update row indications - for(index_type row = largerRow +1; row <= smallerRow; ++row) { - rowIndications[row] -= rowSizeDifference; + + STORM_LOG_ASSERT(writeIt == getRow(smallerRow).end(), "Unexpected position of write iterator."); + + // Update the row indications to account for the shift of indices at where the rows now start. + if (!storm::utility::isZero(rowSizeDifference)) { + for (index_type row = largerRow + 1; row <= smallerRow; ++row) { + rowIndications[row] -= rowSizeDifference; + } } } else { - auto writeIt = getRows(smallerRow, largerRow+1).end() -1; - // write smaller row in its new position - for(auto smallerRowEntryIt = getRow(smallerRow).end() -1; smallerRowEntryIt != getRow(smallerRow).begin()-1; --smallerRowEntryIt) { + auto writeIt = getRows(smallerRow, largerRow + 1).end() - 1; + + // Write smaller row to its new position + auto copyRow = getRow(smallerRow); + for (auto smallerRowEntryIt = copyRow.end() - 1; smallerRowEntryIt != copyRow.begin() - 1; --smallerRowEntryIt) { *writeIt = std::move(*smallerRowEntryIt); --writeIt; } - if(!storm::utility::isZero(rowSizeDifference)) { - // write the intermediate rows into their correct position - for(auto intermediateRowEntryIt = getRows(smallerRow+1, largerRow).end() -1; intermediateRowEntryIt != getRows(smallerRow+1, largerRow).begin()-1; --intermediateRowEntryIt) { + + // Write the intermediate rows into their correct position. + if (!storm::utility::isZero(rowSizeDifference)) { + for (auto intermediateRowEntryIt = getRows(smallerRow + 1, largerRow).end() - 1; intermediateRowEntryIt != getRows(smallerRow + 1, largerRow).begin() - 1; --intermediateRowEntryIt) { *writeIt = std::move(*intermediateRowEntryIt); --writeIt; } + } else { + // skip the intermediate rows + writeIt = getRow(smallerRow).end() - 1; } - // write the larger row - for(auto largerRowEntryIt = largerRowContents.rbegin(); largerRowEntryIt != largerRowContents.rend(); ++largerRowEntryIt) { + + // Write the larger row to its new position. + for (auto largerRowEntryIt = largerRowContents.rbegin(); largerRowEntryIt != largerRowContents.rend(); ++largerRowEntryIt) { *writeIt = std::move(*largerRowEntryIt); --writeIt; } - STORM_LOG_ASSERT(writeIt == getRow(smallerRow).begin()-1, "Unexpected position of write iterator"); - //Update row indications - for(index_type row = smallerRow +1; row <= largerRow; ++row) { - rowIndications[row] += rowSizeDifference; + + STORM_LOG_ASSERT(writeIt == getRow(smallerRow).begin() - 1, "Unexpected position of write iterator."); + + // Update row indications. + // Update the row indications to account for the shift of indices at where the rows now start. + if (!storm::utility::isZero(rowSizeDifference)) { + for (index_type row = smallerRow + 1; row <= largerRow; ++row) { + rowIndications[row] += rowSizeDifference; + } } } } diff --git a/src/storage/SymbolicModelDescription.cpp b/src/storage/SymbolicModelDescription.cpp new file mode 100644 index 000000000..62440992d --- /dev/null +++ b/src/storage/SymbolicModelDescription.cpp @@ -0,0 +1,104 @@ +#include "src/storage/SymbolicModelDescription.h" + +#include "src/utility/prism.h" +#include "src/utility/jani.h" + +#include "src/utility/macros.h" +#include "src/exceptions/InvalidOperationException.h" + +namespace storm { + namespace storage { + + SymbolicModelDescription::SymbolicModelDescription(storm::jani::Model const& model) : modelDescription(model) { + // Intentionally left empty. + } + + SymbolicModelDescription::SymbolicModelDescription(storm::prism::Program const& program) : modelDescription(program) { + // Intentionally left empty. + } + + SymbolicModelDescription& SymbolicModelDescription::operator=(storm::jani::Model const& model) { + this->modelDescription = model; + return *this; + } + + SymbolicModelDescription& SymbolicModelDescription::operator=(storm::prism::Program const& program) { + this->modelDescription = program; + return *this; + } + + bool SymbolicModelDescription::hasModel() const { + return static_cast(modelDescription); + } + + bool SymbolicModelDescription::isJaniModel() const { + return modelDescription.get().which() == 0; + } + + bool SymbolicModelDescription::isPrismProgram() const { + return modelDescription.get().which() == 1; + } + + void SymbolicModelDescription::setModel(storm::jani::Model const& model) { + modelDescription = model; + } + + void SymbolicModelDescription::setModel(storm::prism::Program const& program) { + modelDescription = program; + } + + storm::jani::Model const& SymbolicModelDescription::asJaniModel() const { + STORM_LOG_THROW(isJaniModel(), storm::exceptions::InvalidOperationException, "Cannot retrieve JANI model, because the symbolic description has a different type."); + return boost::get(modelDescription.get()); + } + + storm::prism::Program const& SymbolicModelDescription::asPrismProgram() const { + STORM_LOG_THROW(isPrismProgram(), storm::exceptions::InvalidOperationException, "Cannot retrieve JANI model, because the symbolic description has a different type."); + return boost::get(modelDescription.get()); + } + + std::vector SymbolicModelDescription::getParameterNames() const { + std::vector result; + if(isJaniModel()) { + for(auto const& c : asJaniModel().getUndefinedConstants()) { + result.push_back(c.get().getName()); + } + } else { + for(auto const& c : asPrismProgram().getUndefinedConstants()) { + result.push_back(c.get().getName()); + } + } + return result; + } + + SymbolicModelDescription SymbolicModelDescription::toJani(bool makeVariablesGlobal) const { + if (this->isJaniModel()) { + return *this; + } + if (this->isPrismProgram()) { + return SymbolicModelDescription(this->asPrismProgram().toJani(makeVariablesGlobal)); + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot transform model description to the JANI format."); + } + } + + SymbolicModelDescription SymbolicModelDescription::preprocess(std::string const& constantDefinitionString) const { + if (this->isJaniModel()) { + std::map substitution = storm::utility::jani::parseConstantDefinitionString(this->asJaniModel(), constantDefinitionString); + storm::jani::Model preparedModel = this->asJaniModel().defineUndefinedConstants(substitution).substituteConstants(); + if (preparedModel.hasTransientEdgeDestinationAssignments()) { + preparedModel.liftTransientEdgeDestinationAssignments(); + if (preparedModel.hasTransientEdgeDestinationAssignments()) { + STORM_LOG_WARN("JANI model has non-liftable transient edge-destinations assignments, which are currently not supported. Trying to lift these assignments to edges rather than destinations failed."); + } + } + return SymbolicModelDescription(preparedModel); + } else if (this->isPrismProgram()) { + std::map substitution = storm::utility::prism::parseConstantDefinitionString(this->asPrismProgram(), constantDefinitionString); + return SymbolicModelDescription(this->asPrismProgram().defineUndefinedConstants(substitution).substituteConstants()); + } + return *this; + } + + } +} diff --git a/src/storage/SymbolicModelDescription.h b/src/storage/SymbolicModelDescription.h new file mode 100644 index 000000000..730578ac4 --- /dev/null +++ b/src/storage/SymbolicModelDescription.h @@ -0,0 +1,41 @@ +#pragma once + +#include + +#include "src/storage/jani/Model.h" +#include "src/storage/prism/Program.h" + +namespace storm { + namespace storage { + + class SymbolicModelDescription { + public: + SymbolicModelDescription() = default; + SymbolicModelDescription(storm::jani::Model const& model); + SymbolicModelDescription(storm::prism::Program const& program); + + SymbolicModelDescription& operator=(storm::jani::Model const& model); + SymbolicModelDescription& operator=(storm::prism::Program const& program); + + bool hasModel() const; + bool isJaniModel() const; + bool isPrismProgram() const; + + void setModel(storm::jani::Model const& model); + void setModel(storm::prism::Program const& program); + + storm::jani::Model const& asJaniModel() const; + storm::prism::Program const& asPrismProgram() const; + + std::vector getParameterNames() const; + + SymbolicModelDescription toJani(bool makeVariablesGlobal = true) const; + + SymbolicModelDescription preprocess(std::string const& constantDefinitionString = "") const; + + private: + boost::optional> modelDescription; + }; + + } +} \ No newline at end of file diff --git a/src/storage/bisimulation/BisimulationDecomposition.cpp b/src/storage/bisimulation/BisimulationDecomposition.cpp index bce19fd51..2c57a65ed 100644 --- a/src/storage/bisimulation/BisimulationDecomposition.cpp +++ b/src/storage/bisimulation/BisimulationDecomposition.cpp @@ -168,7 +168,7 @@ namespace storm { template BisimulationDecomposition::BisimulationDecomposition(ModelType const& model, storm::storage::SparseMatrix const& backwardTransitions, Options const& options) : model(model), backwardTransitions(backwardTransitions), options(options), partition(), comparator(), quotient(nullptr) { STORM_LOG_THROW(!options.getKeepRewards() || !model.hasRewardModel() || model.hasUniqueRewardModel(), storm::exceptions::IllegalFunctionCallException, "Bisimulation currently only supports models with at most one reward model."); - STORM_LOG_THROW(!options.getKeepRewards() || !model.hasRewardModel() || model.getUniqueRewardModel()->second.hasOnlyStateRewards(), storm::exceptions::IllegalFunctionCallException, "Bisimulation is currently supported for models with state rewards only. Consider converting the transition rewards to state rewards (via suitable function calls)."); + STORM_LOG_THROW(!options.getKeepRewards() || !model.hasRewardModel() || model.getUniqueRewardModel().hasOnlyStateRewards(), storm::exceptions::IllegalFunctionCallException, "Bisimulation is currently supported for models with state rewards only. Consider converting the transition rewards to state rewards (via suitable function calls)."); STORM_LOG_THROW(options.getType() != BisimulationType::Weak || !options.getBounded(), storm::exceptions::IllegalFunctionCallException, "Weak bisimulation cannot preserve bounded properties."); // Fix the respected atomic propositions if they were not explicitly given. @@ -260,7 +260,7 @@ namespace storm { template void BisimulationDecomposition::splitInitialPartitionBasedOnStateRewards() { - std::vector const& stateRewardVector = model.getUniqueRewardModel()->second.getStateRewardVector(); + std::vector const& stateRewardVector = model.getUniqueRewardModel().getStateRewardVector(); partition.split([&stateRewardVector] (storm::storage::sparse::state_type const& a, storm::storage::sparse::state_type const& b) { return stateRewardVector[a] < stateRewardVector[b]; }); } diff --git a/src/storage/bisimulation/DeterministicModelBisimulationDecomposition.cpp b/src/storage/bisimulation/DeterministicModelBisimulationDecomposition.cpp index 725005492..8693aa9aa 100644 --- a/src/storage/bisimulation/DeterministicModelBisimulationDecomposition.cpp +++ b/src/storage/bisimulation/DeterministicModelBisimulationDecomposition.cpp @@ -627,8 +627,7 @@ namespace storm { // If the model has state rewards, we simply copy the state reward of the representative state, because // all states in a block are guaranteed to have the same state reward. if (this->options.getKeepRewards() && this->model.hasRewardModel()) { - typename std::unordered_map::const_iterator nameRewardModelPair = this->model.getUniqueRewardModel(); - stateRewards.get()[blockIndex] = nameRewardModelPair->second.getStateRewardVector()[representativeState]; + stateRewards.get()[blockIndex] = this->model.getUniqueRewardModel().getStateRewardVector()[representativeState]; } } @@ -641,7 +640,8 @@ namespace storm { // Construct the reward model mapping. std::unordered_map rewardModels; if (this->options.getKeepRewards() && this->model.hasRewardModel()) { - typename std::unordered_map::const_iterator nameRewardModelPair = this->model.getUniqueRewardModel(); + STORM_LOG_THROW(this->model.hasUniqueRewardModel(), storm::exceptions::IllegalFunctionCallException, "Cannot preserve more than one reward model."); + typename std::unordered_map::const_iterator nameRewardModelPair = this->model.getRewardModels().begin(); rewardModels.insert(std::make_pair(nameRewardModelPair->first, typename ModelType::RewardModelType(stateRewards))); } diff --git a/src/storage/bisimulation/NondeterministicModelBisimulationDecomposition.cpp b/src/storage/bisimulation/NondeterministicModelBisimulationDecomposition.cpp index 6fc317d3f..1a82e5976 100644 --- a/src/storage/bisimulation/NondeterministicModelBisimulationDecomposition.cpp +++ b/src/storage/bisimulation/NondeterministicModelBisimulationDecomposition.cpp @@ -170,8 +170,7 @@ namespace storm { // If the model has state rewards, we simply copy the state reward of the representative state, because // all states in a block are guaranteed to have the same state reward. if (this->options.getKeepRewards() && this->model.hasRewardModel()) { - typename std::unordered_map::const_iterator nameRewardModelPair = this->model.getUniqueRewardModel(); - stateRewards.get()[blockIndex] = nameRewardModelPair->second.getStateRewardVector()[representativeState]; + stateRewards.get()[blockIndex] = this->model.getUniqueRewardModel().getStateRewardVector()[representativeState]; } } @@ -184,12 +183,13 @@ namespace storm { // Construct the reward model mapping. std::unordered_map rewardModels; if (this->options.getKeepRewards() && this->model.hasRewardModel()) { - typename std::unordered_map::const_iterator nameRewardModelPair = this->model.getUniqueRewardModel(); + STORM_LOG_THROW(this->model.hasUniqueRewardModel(), storm::exceptions::IllegalFunctionCallException, "Cannot preserve more than one reward model."); + typename std::unordered_map::const_iterator nameRewardModelPair = this->model.getRewardModels().begin(); rewardModels.insert(std::make_pair(nameRewardModelPair->first, typename ModelType::RewardModelType(stateRewards))); } // Finally construct the quotient model. - this->quotient = std::shared_ptr(new ModelType(builder.build(), std::move(newLabeling), std::move(rewardModels))); + this->quotient = std::make_shared(builder.build(), std::move(newLabeling), std::move(rewardModels)); } template diff --git a/src/storage/dd/Dd.cpp b/src/storage/dd/Dd.cpp index bae32c108..ded8bb457 100644 --- a/src/storage/dd/Dd.cpp +++ b/src/storage/dd/Dd.cpp @@ -87,4 +87,4 @@ namespace storm { template class Dd; template class Dd; } -} \ No newline at end of file +} diff --git a/src/storage/dd/Dd.h b/src/storage/dd/Dd.h index 18605c259..ae9728263 100644 --- a/src/storage/dd/Dd.h +++ b/src/storage/dd/Dd.h @@ -30,6 +30,8 @@ namespace storm { Dd(Dd&& other) = default; Dd& operator=(Dd&& other) = default; + virtual ~Dd() = default; + /*! * Retrieves the support of the current DD. * @@ -181,4 +183,4 @@ namespace storm { } } -#endif /* STORM_STORAGE_DD_DD_H_ */ \ No newline at end of file +#endif /* STORM_STORAGE_DD_DD_H_ */ diff --git a/src/storage/expressions/BaseExpression.cpp b/src/storage/expressions/BaseExpression.cpp index 9d44215d0..d37b61e50 100644 --- a/src/storage/expressions/BaseExpression.cpp +++ b/src/storage/expressions/BaseExpression.cpp @@ -4,6 +4,8 @@ #include "src/exceptions/InvalidTypeException.h" #include "src/exceptions/InvalidAccessException.h" +#include "src/storage/expressions/Expressions.h" + namespace storm { namespace expressions { BaseExpression::BaseExpression(ExpressionManager const& manager, Type const& type) : manager(manager), type(type) { @@ -94,6 +96,86 @@ namespace storm { return this->shared_from_this(); } + bool BaseExpression::isIfThenElseExpression() const { + return false; + } + + IfThenElseExpression const& BaseExpression::asIfThenElseExpression() const { + return static_cast(*this); + } + + bool BaseExpression::isBinaryBooleanFunctionExpression() const { + return false; + } + + BinaryBooleanFunctionExpression const& BaseExpression::asBinaryBooleanFunctionExpression() const { + return static_cast(*this); + } + + bool BaseExpression::isBinaryNumericalFunctionExpression() const { + return false; + } + + BinaryNumericalFunctionExpression const& BaseExpression::asBinaryNumericalFunctionExpression() const { + return static_cast(*this); + } + + bool BaseExpression::isBinaryRelationExpression() const { + return false; + } + + BinaryRelationExpression const& BaseExpression::asBinaryRelationExpression() const { + return static_cast(*this); + } + + bool BaseExpression::isBooleanLiteralExpression() const { + return false; + } + + BooleanLiteralExpression const& BaseExpression::asBooleanLiteralExpression() const { + return static_cast(*this); + } + + bool BaseExpression::isIntegerLiteralExpression() const { + return false; + } + + IntegerLiteralExpression const& BaseExpression::asIntegerLiteralExpression() const { + return static_cast(*this); + } + + bool BaseExpression::isRationalLiteralExpression() const { + return false; + } + + RationalLiteralExpression const& BaseExpression::asRationalLiteralExpression() const { + return static_cast(*this); + } + + bool BaseExpression::isUnaryBooleanFunctionExpression() const { + return false; + } + + UnaryBooleanFunctionExpression const& BaseExpression::asUnaryBooleanFunctionExpression() const { + return static_cast(*this); + } + + bool BaseExpression::isUnaryNumericalFunctionExpression() const { + return false; + } + + UnaryNumericalFunctionExpression const& BaseExpression::asUnaryNumericalFunctionExpression() const { + return static_cast(*this); + } + + bool BaseExpression::isVariableExpression() const { + return false; + } + + VariableExpression const& BaseExpression::asVariableExpression() const { + return static_cast(*this); + } + std::ostream& operator<<(std::ostream& stream, BaseExpression const& expression) { expression.printToStream(stream); return stream; diff --git a/src/storage/expressions/BaseExpression.h b/src/storage/expressions/BaseExpression.h index f9b2792f4..7b5b2d973 100644 --- a/src/storage/expressions/BaseExpression.h +++ b/src/storage/expressions/BaseExpression.h @@ -13,12 +13,24 @@ namespace storm { namespace expressions { - // Forward-declare expression manager. + // Forward-declare expression classes. class ExpressionManager; class Variable; class Valuation; class ExpressionVisitor; enum struct OperatorType; + + class IfThenElseExpression; + class BinaryBooleanFunctionExpression; + class BinaryNumericalFunctionExpression; + class BinaryRelationExpression; + class BooleanLiteralExpression; + class IntegerLiteralExpression; + class RationalLiteralExpression; + class UnaryBooleanFunctionExpression; + class UnaryNumericalFunctionExpression; + class VariableExpression; + /*! * The base class of all expression classes. */ @@ -164,7 +176,7 @@ namespace storm { * * @param visitor The visitor that is to be accepted. */ - virtual boost::any accept(ExpressionVisitor& visitor) const = 0; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const = 0; /*! * Retrieves whether the expression has a numerical type, i.e., integer or double. @@ -224,6 +236,36 @@ namespace storm { friend std::ostream& operator<<(std::ostream& stream, BaseExpression const& expression); + virtual bool isIfThenElseExpression() const; + IfThenElseExpression const& asIfThenElseExpression() const; + + virtual bool isBinaryBooleanFunctionExpression() const; + BinaryBooleanFunctionExpression const& asBinaryBooleanFunctionExpression() const; + + virtual bool isBinaryNumericalFunctionExpression() const; + BinaryNumericalFunctionExpression const& asBinaryNumericalFunctionExpression() const; + + virtual bool isBinaryRelationExpression() const; + BinaryRelationExpression const& asBinaryRelationExpression() const; + + virtual bool isBooleanLiteralExpression() const; + BooleanLiteralExpression const& asBooleanLiteralExpression() const; + + virtual bool isIntegerLiteralExpression() const; + IntegerLiteralExpression const& asIntegerLiteralExpression() const; + + virtual bool isRationalLiteralExpression() const; + RationalLiteralExpression const& asRationalLiteralExpression() const; + + virtual bool isUnaryBooleanFunctionExpression() const; + UnaryBooleanFunctionExpression const& asUnaryBooleanFunctionExpression() const; + + virtual bool isUnaryNumericalFunctionExpression() const; + UnaryNumericalFunctionExpression const& asUnaryNumericalFunctionExpression() const; + + virtual bool isVariableExpression() const; + VariableExpression const& asVariableExpression() const; + protected: /*! * Prints the expression to the given stream. diff --git a/src/storage/expressions/BinaryBooleanFunctionExpression.cpp b/src/storage/expressions/BinaryBooleanFunctionExpression.cpp index 6cb550609..0b832db09 100644 --- a/src/storage/expressions/BinaryBooleanFunctionExpression.cpp +++ b/src/storage/expressions/BinaryBooleanFunctionExpression.cpp @@ -119,8 +119,8 @@ namespace storm { } } - boost::any BinaryBooleanFunctionExpression::accept(ExpressionVisitor& visitor) const { - return visitor.visit(*this); + boost::any BinaryBooleanFunctionExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return visitor.visit(*this, data); } void BinaryBooleanFunctionExpression::printToStream(std::ostream& stream) const { diff --git a/src/storage/expressions/BinaryBooleanFunctionExpression.h b/src/storage/expressions/BinaryBooleanFunctionExpression.h index d49658c7e..27a035cca 100644 --- a/src/storage/expressions/BinaryBooleanFunctionExpression.h +++ b/src/storage/expressions/BinaryBooleanFunctionExpression.h @@ -37,7 +37,7 @@ namespace storm { virtual storm::expressions::OperatorType getOperator() const override; virtual bool evaluateAsBool(Valuation const* valuation = nullptr) const override; virtual std::shared_ptr simplify() const override; - virtual boost::any accept(ExpressionVisitor& visitor) const override; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const override; /*! * Retrieves the operator associated with the expression. diff --git a/src/storage/expressions/BinaryNumericalFunctionExpression.cpp b/src/storage/expressions/BinaryNumericalFunctionExpression.cpp index 7c4367952..eda2d0377 100644 --- a/src/storage/expressions/BinaryNumericalFunctionExpression.cpp +++ b/src/storage/expressions/BinaryNumericalFunctionExpression.cpp @@ -113,8 +113,8 @@ namespace storm { } } - boost::any BinaryNumericalFunctionExpression::accept(ExpressionVisitor& visitor) const { - return visitor.visit(*this); + boost::any BinaryNumericalFunctionExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return visitor.visit(*this, data); } void BinaryNumericalFunctionExpression::printToStream(std::ostream& stream) const { diff --git a/src/storage/expressions/BinaryNumericalFunctionExpression.h b/src/storage/expressions/BinaryNumericalFunctionExpression.h index e3c7d227a..1320ab56b 100644 --- a/src/storage/expressions/BinaryNumericalFunctionExpression.h +++ b/src/storage/expressions/BinaryNumericalFunctionExpression.h @@ -38,7 +38,7 @@ namespace storm { virtual int_fast64_t evaluateAsInt(Valuation const* valuation = nullptr) const override; virtual double evaluateAsDouble(Valuation const* valuation = nullptr) const override; virtual std::shared_ptr simplify() const override; - virtual boost::any accept(ExpressionVisitor& visitor) const override; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const override; /*! * Retrieves the operator associated with the expression. diff --git a/src/storage/expressions/BinaryRelationExpression.cpp b/src/storage/expressions/BinaryRelationExpression.cpp index 858536d0c..04a8f7895 100644 --- a/src/storage/expressions/BinaryRelationExpression.cpp +++ b/src/storage/expressions/BinaryRelationExpression.cpp @@ -81,8 +81,8 @@ namespace storm { } } - boost::any BinaryRelationExpression::accept(ExpressionVisitor& visitor) const { - return visitor.visit(*this); + boost::any BinaryRelationExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return visitor.visit(*this, data); } BinaryRelationExpression::RelationType BinaryRelationExpression::getRelationType() const { diff --git a/src/storage/expressions/BinaryRelationExpression.h b/src/storage/expressions/BinaryRelationExpression.h index 079a935a6..6dd73179c 100644 --- a/src/storage/expressions/BinaryRelationExpression.h +++ b/src/storage/expressions/BinaryRelationExpression.h @@ -37,7 +37,7 @@ namespace storm { virtual storm::expressions::OperatorType getOperator() const override; virtual bool evaluateAsBool(Valuation const* valuation = nullptr) const override; virtual std::shared_ptr simplify() const override; - virtual boost::any accept(ExpressionVisitor& visitor) const override; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const override; /*! * Retrieves the relation associated with the expression. diff --git a/src/storage/expressions/BooleanLiteralExpression.cpp b/src/storage/expressions/BooleanLiteralExpression.cpp index 9e4986b04..086d22abd 100644 --- a/src/storage/expressions/BooleanLiteralExpression.cpp +++ b/src/storage/expressions/BooleanLiteralExpression.cpp @@ -32,8 +32,8 @@ namespace storm { return this->shared_from_this(); } - boost::any BooleanLiteralExpression::accept(ExpressionVisitor& visitor) const { - return visitor.visit(*this); + boost::any BooleanLiteralExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return visitor.visit(*this, data); } bool BooleanLiteralExpression::getValue() const { diff --git a/src/storage/expressions/BooleanLiteralExpression.h b/src/storage/expressions/BooleanLiteralExpression.h index f5dcb78a1..cea09a295 100644 --- a/src/storage/expressions/BooleanLiteralExpression.h +++ b/src/storage/expressions/BooleanLiteralExpression.h @@ -32,7 +32,7 @@ namespace storm { virtual bool isFalse() const override; virtual void gatherVariables(std::set& variables) const override; virtual std::shared_ptr simplify() const override; - virtual boost::any accept(ExpressionVisitor& visitor) const override; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const override; /*! * Retrieves the value of the boolean literal. diff --git a/src/storage/expressions/Expression.cpp b/src/storage/expressions/Expression.cpp index d3121032c..7493e5ee1 100644 --- a/src/storage/expressions/Expression.cpp +++ b/src/storage/expressions/Expression.cpp @@ -5,6 +5,7 @@ #include "src/storage/expressions/ExpressionManager.h" #include "src/storage/expressions/SubstitutionVisitor.h" #include "src/storage/expressions/LinearityCheckVisitor.h" +#include "src/storage/expressions/SyntacticalEqualityCheckVisitor.h" #include "src/storage/expressions/Expressions.h" #include "src/exceptions/InvalidTypeException.h" #include "src/exceptions/InvalidArgumentException.h" @@ -158,8 +159,8 @@ namespace storm { return this->getBaseExpression().hasBitVectorType(); } - boost::any Expression::accept(ExpressionVisitor& visitor) const { - return this->getBaseExpression().accept(visitor); + boost::any Expression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return this->getBaseExpression().accept(visitor, data); } bool Expression::isInitialized() const { @@ -168,6 +169,14 @@ namespace storm { } return false; } + + bool Expression::isSyntacticallyEqual(storm::expressions::Expression const& other) const { + if (this->getBaseExpressionPointer() == other.getBaseExpressionPointer()) { + return true; + } + SyntacticalEqualityCheckVisitor checker; + return checker.isSyntaticallyEqual(*this, other); + } std::string Expression::toString() const { std::stringstream stream; @@ -185,11 +194,26 @@ namespace storm { return Expression(std::shared_ptr(new BinaryNumericalFunctionExpression(first.getManager(), first.getType().plusMinusTimes(second.getType()), first.getBaseExpressionPointer(), second.getBaseExpressionPointer(), BinaryNumericalFunctionExpression::OperatorType::Plus))); } + Expression operator+(Expression const& first, int64_t second) { + return first + Expression(std::shared_ptr(new IntegerLiteralExpression(first.getBaseExpression().getManager(), second))); + } + + Expression operator+(int64_t first, Expression const& second) { + return second + first; + } + Expression operator-(Expression const& first, Expression const& second) { assertSameManager(first.getBaseExpression(), second.getBaseExpression()); return Expression(std::shared_ptr(new BinaryNumericalFunctionExpression(first.getBaseExpression().getManager(), first.getType().plusMinusTimes(second.getType()), first.getBaseExpressionPointer(), second.getBaseExpressionPointer(), BinaryNumericalFunctionExpression::OperatorType::Minus))); } + Expression operator-(Expression const& first, int64_t second) { + return first - Expression(std::shared_ptr(new IntegerLiteralExpression(first.getBaseExpression().getManager(), second))); + } + + Expression operator-(int64_t first, Expression const& second) { + return Expression(std::shared_ptr(new IntegerLiteralExpression(second.getBaseExpression().getManager(), first))) - second; } + Expression operator-(Expression const& first) { return Expression(std::shared_ptr(new UnaryNumericalFunctionExpression(first.getBaseExpression().getManager(), first.getType().minus(), first.getBaseExpressionPointer(), UnaryNumericalFunctionExpression::OperatorType::Minus))); } @@ -256,6 +280,22 @@ namespace storm { assertSameManager(first.getBaseExpression(), second.getBaseExpression()); return Expression(std::shared_ptr(new BinaryRelationExpression(first.getBaseExpression().getManager(), first.getType().numericalComparison(second.getType()), first.getBaseExpressionPointer(), second.getBaseExpressionPointer(), BinaryRelationExpression::RelationType::LessOrEqual))); } + + Expression operator<(Expression const& first, int64_t second) { + return first < Expression(std::shared_ptr(new IntegerLiteralExpression(first.getBaseExpression().getManager(), second))); + } + + Expression operator>(Expression const& first, int64_t second) { + return first > Expression(std::shared_ptr(new IntegerLiteralExpression(first.getBaseExpression().getManager(), second))); + } + + Expression operator<=(Expression const& first, int64_t second) { + return first <= Expression(std::shared_ptr(new IntegerLiteralExpression(first.getBaseExpression().getManager(), second))); + } + + Expression operator>=(Expression const& first, int64_t second) { + return first >= Expression(std::shared_ptr(new IntegerLiteralExpression(first.getBaseExpression().getManager(), second))); + } Expression minimum(Expression const& first, Expression const& second) { assertSameManager(first.getBaseExpression(), second.getBaseExpression()); @@ -300,19 +340,17 @@ namespace storm { Expression abs(Expression const& first) { STORM_LOG_THROW(first.hasNumericalType(), storm::exceptions::InvalidTypeException, "Abs is only defined for numerical operands"); - return ite(first < first.getManager().integer(0), -first, first); + return ite(first < 0, -first, first); } Expression sign(Expression const& first) { STORM_LOG_THROW(first.hasNumericalType(), storm::exceptions::InvalidTypeException, "Sign is only defined for numerical operands"); - // TODO implement (via Ite?) - STORM_LOG_ERROR("Not yet implemented"); + return ite(first > 0, first.getManager().integer(1), ite(first < 0, first.getManager().integer(0), first.getManager().integer(0))); } Expression truncate(Expression const& first) { STORM_LOG_THROW(first.hasNumericalType(), storm::exceptions::InvalidTypeException, "Truncate is only defined for numerical operands"); - // TODO implement (via Ite?) - STORM_LOG_ERROR("Not yet implemented"); + return ite(first < 0, floor(first), ceil(first)); } Expression disjunction(std::vector const& expressions) { diff --git a/src/storage/expressions/Expression.h b/src/storage/expressions/Expression.h index 11cfb2350..334a4f829 100644 --- a/src/storage/expressions/Expression.h +++ b/src/storage/expressions/Expression.h @@ -23,7 +23,11 @@ namespace storm { template friend class SubstitutionVisitor; friend Expression operator+(Expression const& first, Expression const& second); + friend Expression operator+(Expression const& first, int64_t second); + friend Expression operator+(int64_t first, Expression const& second); friend Expression operator-(Expression const& first, Expression const& second); + friend Expression operator-(Expression const& first, int64_t second); + friend Expression operator-(int64_t first, Expression const& second); friend Expression operator-(Expression const& first); friend Expression operator*(Expression const& first, Expression const& second); friend Expression operator/(Expression const& first, Expression const& second); @@ -37,6 +41,10 @@ namespace storm { friend Expression operator>=(Expression const& first, Expression const& second); friend Expression operator<(Expression const& first, Expression const& second); friend Expression operator<=(Expression const& first, Expression const& second); + friend Expression operator>(Expression const& first, int64_t second); + friend Expression operator>=(Expression const& first, int64_t second); + friend Expression operator<(Expression const& first, int64_t second); + friend Expression operator<=(Expression const& first, int64_t second); friend Expression ite(Expression const& condition, Expression const& thenExpression, Expression const& elseExpression); friend Expression implies(Expression const& first, Expression const& second); friend Expression iff(Expression const& first, Expression const& second); @@ -294,7 +302,7 @@ namespace storm { * * @param visitor The visitor to accept. */ - boost::any accept(ExpressionVisitor& visitor) const; + boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const; /*! * Converts the expression into a string. @@ -303,11 +311,16 @@ namespace storm { */ std::string toString() const; - /** + /*! * Checks whether the object encapsulates a base-expression. */ bool isInitialized() const; + /*! + * Checks whether the two expressions are syntatically the same. + */ + bool isSyntacticallyEqual(storm::expressions::Expression const& other) const; + friend std::ostream& operator<<(std::ostream& stream, Expression const& expression); private: @@ -324,7 +337,11 @@ namespace storm { // Provide operator overloads to conveniently construct new expressions from other expressions. Expression operator+(Expression const& first, Expression const& second); + Expression operator+(Expression const& first, int64_t second); + Expression operator+(int64_t first, Expression const& second); Expression operator-(Expression const& first, Expression const& second); + Expression operator-(Expression const& first, int64_t second); + Expression operator-(int64_t first, Expression const& second); Expression operator-(Expression const& first); Expression operator*(Expression const& first, Expression const& second); Expression operator/(Expression const& first, Expression const& second); @@ -338,6 +355,10 @@ namespace storm { Expression operator>=(Expression const& first, Expression const& second); Expression operator<(Expression const& first, Expression const& second); Expression operator<=(Expression const& first, Expression const& second); + Expression operator>(Expression const& first, int64_t second); + Expression operator>=(Expression const& first, int64_t second); + Expression operator<(Expression const& first, int64_t second); + Expression operator<=(Expression const& first, int64_t second); Expression ite(Expression const& condition, Expression const& thenExpression, Expression const& elseExpression); Expression implies(Expression const& first, Expression const& second); Expression iff(Expression const& first, Expression const& second); diff --git a/src/storage/expressions/ExpressionManager.cpp b/src/storage/expressions/ExpressionManager.cpp index ed51f76ee..deed0e557 100644 --- a/src/storage/expressions/ExpressionManager.cpp +++ b/src/storage/expressions/ExpressionManager.cpp @@ -52,7 +52,7 @@ namespace storm { } } - ExpressionManager::ExpressionManager() : nameToIndexMapping(), indexToNameMapping(), indexToTypeMapping(), numberOfVariables(0), numberOfBooleanVariables(0), numberOfIntegerVariables(0), numberOfBitVectorVariables(0), numberOfRationalVariables(0), numberOfAuxiliaryVariables(0), numberOfAuxiliaryBooleanVariables(0), numberOfAuxiliaryIntegerVariables(0), numberOfAuxiliaryBitVectorVariables(0), numberOfAuxiliaryRationalVariables(0), freshVariableCounter(0), types() { + ExpressionManager::ExpressionManager() : nameToIndexMapping(), indexToNameMapping(), indexToTypeMapping(), numberOfBooleanVariables(0), numberOfIntegerVariables(0), numberOfBitVectorVariables(0), numberOfRationalVariables(0), numberOfAuxiliaryVariables(0), numberOfAuxiliaryBooleanVariables(0), numberOfAuxiliaryIntegerVariables(0), numberOfAuxiliaryBitVectorVariables(0), numberOfAuxiliaryRationalVariables(0), freshVariableCounter(0), types() { // Intentionally left empty. } @@ -236,7 +236,7 @@ namespace storm { } uint_fast64_t ExpressionManager::getNumberOfVariables() const { - return numberOfVariables; + return numberOfBooleanVariables + numberOfIntegerVariables + numberOfBitVectorVariables + numberOfRationalVariables; } uint_fast64_t ExpressionManager::getNumberOfBooleanVariables() const { diff --git a/src/storage/expressions/ExpressionManager.h b/src/storage/expressions/ExpressionManager.h index f3ec7e76b..31cef2942 100644 --- a/src/storage/expressions/ExpressionManager.h +++ b/src/storage/expressions/ExpressionManager.h @@ -414,9 +414,6 @@ namespace storm { // A mapping from all variable indices to their types. std::unordered_map indexToTypeMapping; - // The number of declared variables. - uint_fast64_t numberOfVariables; - // Store counts for variables. uint_fast64_t numberOfBooleanVariables; uint_fast64_t numberOfIntegerVariables; diff --git a/src/storage/expressions/ExpressionVisitor.h b/src/storage/expressions/ExpressionVisitor.h index 1abafc2a6..edbdc5d5a 100644 --- a/src/storage/expressions/ExpressionVisitor.h +++ b/src/storage/expressions/ExpressionVisitor.h @@ -2,6 +2,7 @@ #define STORM_STORAGE_EXPRESSIONS_EXPRESSIONVISITOR_H_ #include +#include namespace storm { namespace expressions { @@ -19,18 +20,18 @@ namespace storm { class ExpressionVisitor { public: - virtual boost::any visit(IfThenElseExpression const& expression) = 0; - virtual boost::any visit(BinaryBooleanFunctionExpression const& expression) = 0; - virtual boost::any visit(BinaryNumericalFunctionExpression const& expression) = 0; - virtual boost::any visit(BinaryRelationExpression const& expression) = 0; - virtual boost::any visit(VariableExpression const& expression) = 0; - virtual boost::any visit(UnaryBooleanFunctionExpression const& expression) = 0; - virtual boost::any visit(UnaryNumericalFunctionExpression const& expression) = 0; - virtual boost::any visit(BooleanLiteralExpression const& expression) = 0; - virtual boost::any visit(IntegerLiteralExpression const& expression) = 0; - virtual boost::any visit(RationalLiteralExpression const& expression) = 0; + virtual boost::any visit(IfThenElseExpression const& expression, boost::any const& data) = 0; + virtual boost::any visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) = 0; + virtual boost::any visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) = 0; + virtual boost::any visit(BinaryRelationExpression const& expression, boost::any const& data) = 0; + virtual boost::any visit(VariableExpression const& expression, boost::any const& data) = 0; + virtual boost::any visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) = 0; + virtual boost::any visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) = 0; + virtual boost::any visit(BooleanLiteralExpression const& expression, boost::any const& data) = 0; + virtual boost::any visit(IntegerLiteralExpression const& expression, boost::any const& data) = 0; + virtual boost::any visit(RationalLiteralExpression const& expression, boost::any const& data) = 0; }; } } -#endif /* STORM_STORAGE_EXPRESSIONS_EXPRESSIONVISITOR_H_ */ \ No newline at end of file +#endif /* STORM_STORAGE_EXPRESSIONS_EXPRESSIONVISITOR_H_ */ diff --git a/src/storage/expressions/ExprtkExpressionEvaluator.cpp b/src/storage/expressions/ExprtkExpressionEvaluator.cpp index d24bc742c..b1cc76c9d 100755 --- a/src/storage/expressions/ExprtkExpressionEvaluator.cpp +++ b/src/storage/expressions/ExprtkExpressionEvaluator.cpp @@ -2,7 +2,9 @@ #include "src/storage/expressions/ExpressionManager.h" #include "src/adapters/CarlAdapter.h" + #include "src/utility/macros.h" +#include "src/exceptions/UnexpectedException.h" namespace storm { namespace expressions { @@ -49,7 +51,7 @@ namespace storm { CompiledExpressionType& compiledExpression = result.first->second; compiledExpression.register_symbol_table(symbolTable); bool parsingOk = parser.compile(ToExprtkStringVisitor().toString(expression), compiledExpression); - STORM_LOG_ASSERT(parsingOk, "Expression was not properly parsed by ExprTk: " << expression); + STORM_LOG_THROW(parsingOk, storm::exceptions::UnexpectedException, "Expression was not properly parsed by ExprTk: " << expression << ". (Returned error: " << parser.error() << ")"); return compiledExpression; } diff --git a/src/storage/expressions/IfThenElseExpression.cpp b/src/storage/expressions/IfThenElseExpression.cpp index adde41a2d..8441fbeb0 100644 --- a/src/storage/expressions/IfThenElseExpression.cpp +++ b/src/storage/expressions/IfThenElseExpression.cpp @@ -88,8 +88,8 @@ namespace storm { } } - boost::any IfThenElseExpression::accept(ExpressionVisitor& visitor) const { - return visitor.visit(*this); + boost::any IfThenElseExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return visitor.visit(*this, data); } std::shared_ptr IfThenElseExpression::getCondition() const { diff --git a/src/storage/expressions/IfThenElseExpression.h b/src/storage/expressions/IfThenElseExpression.h index d2503116b..347feba12 100644 --- a/src/storage/expressions/IfThenElseExpression.h +++ b/src/storage/expressions/IfThenElseExpression.h @@ -38,7 +38,7 @@ namespace storm { virtual double evaluateAsDouble(Valuation const* valuation = nullptr) const override; virtual void gatherVariables(std::set& variables) const override; virtual std::shared_ptr simplify() const override; - virtual boost::any accept(ExpressionVisitor& visitor) const override; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const override; /*! * Retrieves the condition expression of the if-then-else expression. diff --git a/src/storage/expressions/IntegerLiteralExpression.cpp b/src/storage/expressions/IntegerLiteralExpression.cpp index 35ae07ee7..d8b7077b5 100644 --- a/src/storage/expressions/IntegerLiteralExpression.cpp +++ b/src/storage/expressions/IntegerLiteralExpression.cpp @@ -29,8 +29,8 @@ namespace storm { return this->shared_from_this(); } - boost::any IntegerLiteralExpression::accept(ExpressionVisitor& visitor) const { - return visitor.visit(*this); + boost::any IntegerLiteralExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return visitor.visit(*this, data); } int_fast64_t IntegerLiteralExpression::getValue() const { diff --git a/src/storage/expressions/IntegerLiteralExpression.h b/src/storage/expressions/IntegerLiteralExpression.h index b4f732b83..3dc06e4ef 100644 --- a/src/storage/expressions/IntegerLiteralExpression.h +++ b/src/storage/expressions/IntegerLiteralExpression.h @@ -31,7 +31,7 @@ namespace storm { virtual bool isLiteral() const override; virtual void gatherVariables(std::set& variables) const override; virtual std::shared_ptr simplify() const override; - virtual boost::any accept(ExpressionVisitor& visitor) const override; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const override; /*! * Retrieves the value of the integer literal. diff --git a/src/storage/expressions/LinearCoefficientVisitor.cpp b/src/storage/expressions/LinearCoefficientVisitor.cpp index dc9a909f9..6a8701610 100644 --- a/src/storage/expressions/LinearCoefficientVisitor.cpp +++ b/src/storage/expressions/LinearCoefficientVisitor.cpp @@ -85,20 +85,20 @@ namespace storm { } LinearCoefficientVisitor::VariableCoefficients LinearCoefficientVisitor::getLinearCoefficients(Expression const& expression) { - return boost::any_cast(expression.getBaseExpression().accept(*this)); + return boost::any_cast(expression.getBaseExpression().accept(*this, boost::none)); } - boost::any LinearCoefficientVisitor::visit(IfThenElseExpression const& expression) { + boost::any LinearCoefficientVisitor::visit(IfThenElseExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear."); } - boost::any LinearCoefficientVisitor::visit(BinaryBooleanFunctionExpression const& expression) { + boost::any LinearCoefficientVisitor::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear."); } - boost::any LinearCoefficientVisitor::visit(BinaryNumericalFunctionExpression const& expression) { - VariableCoefficients leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this)); - VariableCoefficients rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this)); + boost::any LinearCoefficientVisitor::visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) { + VariableCoefficients leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this, data)); + VariableCoefficients rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this, data)); if (expression.getOperatorType() == BinaryNumericalFunctionExpression::OperatorType::Plus) { leftResult += std::move(rightResult); @@ -114,11 +114,11 @@ namespace storm { return leftResult; } - boost::any LinearCoefficientVisitor::visit(BinaryRelationExpression const& expression) { + boost::any LinearCoefficientVisitor::visit(BinaryRelationExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear."); } - boost::any LinearCoefficientVisitor::visit(VariableExpression const& expression) { + boost::any LinearCoefficientVisitor::visit(VariableExpression const& expression, boost::any const& data) { VariableCoefficients coefficients; if (expression.getType().isNumericalType()) { coefficients.setCoefficient(expression.getVariable(), 1); @@ -128,12 +128,12 @@ namespace storm { return coefficients; } - boost::any LinearCoefficientVisitor::visit(UnaryBooleanFunctionExpression const& expression) { + boost::any LinearCoefficientVisitor::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear."); } - boost::any LinearCoefficientVisitor::visit(UnaryNumericalFunctionExpression const& expression) { - VariableCoefficients childResult = boost::any_cast(expression.getOperand()->accept(*this)); + boost::any LinearCoefficientVisitor::visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) { + VariableCoefficients childResult = boost::any_cast(expression.getOperand()->accept(*this, data)); if (expression.getOperatorType() == UnaryNumericalFunctionExpression::OperatorType::Minus) { childResult.negate(); @@ -143,15 +143,15 @@ namespace storm { } } - boost::any LinearCoefficientVisitor::visit(BooleanLiteralExpression const& expression) { + boost::any LinearCoefficientVisitor::visit(BooleanLiteralExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression is non-linear."); } - boost::any LinearCoefficientVisitor::visit(IntegerLiteralExpression const& expression) { + boost::any LinearCoefficientVisitor::visit(IntegerLiteralExpression const& expression, boost::any const& data) { return VariableCoefficients(static_cast(expression.getValue())); } - boost::any LinearCoefficientVisitor::visit(RationalLiteralExpression const& expression) { + boost::any LinearCoefficientVisitor::visit(RationalLiteralExpression const& expression, boost::any const& data) { return VariableCoefficients(expression.getValueAsDouble()); } } diff --git a/src/storage/expressions/LinearCoefficientVisitor.h b/src/storage/expressions/LinearCoefficientVisitor.h index dea1bfc2e..b0c85a800 100644 --- a/src/storage/expressions/LinearCoefficientVisitor.h +++ b/src/storage/expressions/LinearCoefficientVisitor.h @@ -66,16 +66,16 @@ namespace storm { */ VariableCoefficients getLinearCoefficients(Expression const& expression); - virtual boost::any visit(IfThenElseExpression const& expression) override; - virtual boost::any visit(BinaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(BinaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BinaryRelationExpression const& expression) override; - virtual boost::any visit(VariableExpression const& expression) override; - virtual boost::any visit(UnaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(UnaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BooleanLiteralExpression const& expression) override; - virtual boost::any visit(IntegerLiteralExpression const& expression) override; - virtual boost::any visit(RationalLiteralExpression const& expression) override; + virtual boost::any visit(IfThenElseExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryRelationExpression const& expression, boost::any const& data) override; + virtual boost::any visit(VariableExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BooleanLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(IntegerLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(RationalLiteralExpression const& expression, boost::any const& data) override; }; } } diff --git a/src/storage/expressions/LinearityCheckVisitor.cpp b/src/storage/expressions/LinearityCheckVisitor.cpp index 7a33a501a..b762f9cf1 100644 --- a/src/storage/expressions/LinearityCheckVisitor.cpp +++ b/src/storage/expressions/LinearityCheckVisitor.cpp @@ -12,27 +12,27 @@ namespace storm { } bool LinearityCheckVisitor::check(Expression const& expression) { - LinearityStatus result = boost::any_cast(expression.getBaseExpression().accept(*this)); + LinearityStatus result = boost::any_cast(expression.getBaseExpression().accept(*this, boost::none)); return result == LinearityStatus::LinearWithoutVariables || result == LinearityStatus::LinearContainsVariables; } - boost::any LinearityCheckVisitor::visit(IfThenElseExpression const& expression) { + boost::any LinearityCheckVisitor::visit(IfThenElseExpression const& expression, boost::any const& data) { // An if-then-else expression is never linear. return LinearityStatus::NonLinear; } - boost::any LinearityCheckVisitor::visit(BinaryBooleanFunctionExpression const& expression) { + boost::any LinearityCheckVisitor::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) { // Boolean function applications are not allowed in linear expressions. return LinearityStatus::NonLinear; } - boost::any LinearityCheckVisitor::visit(BinaryNumericalFunctionExpression const& expression) { - LinearityStatus leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this)); + boost::any LinearityCheckVisitor::visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) { + LinearityStatus leftResult = boost::any_cast(expression.getFirstOperand()->accept(*this, data)); if (leftResult == LinearityStatus::NonLinear) { return LinearityStatus::NonLinear; } - LinearityStatus rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this)); + LinearityStatus rightResult = boost::any_cast(expression.getSecondOperand()->accept(*this, data)); if (rightResult == LinearityStatus::NonLinear) { return LinearityStatus::NonLinear; } @@ -55,37 +55,37 @@ namespace storm { STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Illegal binary numerical expression operator."); } - boost::any LinearityCheckVisitor::visit(BinaryRelationExpression const& expression) { + boost::any LinearityCheckVisitor::visit(BinaryRelationExpression const& expression, boost::any const& data) { return LinearityStatus::NonLinear; } - boost::any LinearityCheckVisitor::visit(VariableExpression const& expression) { + boost::any LinearityCheckVisitor::visit(VariableExpression const& expression, boost::any const& data) { return LinearityStatus::LinearContainsVariables; } - boost::any LinearityCheckVisitor::visit(UnaryBooleanFunctionExpression const& expression) { + boost::any LinearityCheckVisitor::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) { // Boolean function applications are not allowed in linear expressions. return LinearityStatus::NonLinear; } - boost::any LinearityCheckVisitor::visit(UnaryNumericalFunctionExpression const& expression) { + boost::any LinearityCheckVisitor::visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) { switch (expression.getOperatorType()) { - case UnaryNumericalFunctionExpression::OperatorType::Minus: return expression.getOperand()->accept(*this); + case UnaryNumericalFunctionExpression::OperatorType::Minus: return expression.getOperand()->accept(*this, data); case UnaryNumericalFunctionExpression::OperatorType::Floor: case UnaryNumericalFunctionExpression::OperatorType::Ceil: return LinearityStatus::NonLinear; } STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Illegal unary numerical expression operator."); } - boost::any LinearityCheckVisitor::visit(BooleanLiteralExpression const& expression) { + boost::any LinearityCheckVisitor::visit(BooleanLiteralExpression const& expression, boost::any const& data) { return LinearityStatus::NonLinear; } - boost::any LinearityCheckVisitor::visit(IntegerLiteralExpression const& expression) { + boost::any LinearityCheckVisitor::visit(IntegerLiteralExpression const& expression, boost::any const& data) { return LinearityStatus::LinearWithoutVariables; } - boost::any LinearityCheckVisitor::visit(RationalLiteralExpression const& expression) { + boost::any LinearityCheckVisitor::visit(RationalLiteralExpression const& expression, boost::any const& data) { return LinearityStatus::LinearWithoutVariables; } } diff --git a/src/storage/expressions/LinearityCheckVisitor.h b/src/storage/expressions/LinearityCheckVisitor.h index 6bb35b7e8..b2a465871 100644 --- a/src/storage/expressions/LinearityCheckVisitor.h +++ b/src/storage/expressions/LinearityCheckVisitor.h @@ -20,16 +20,16 @@ namespace storm { */ bool check(Expression const& expression); - virtual boost::any visit(IfThenElseExpression const& expression) override; - virtual boost::any visit(BinaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(BinaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BinaryRelationExpression const& expression) override; - virtual boost::any visit(VariableExpression const& expression) override; - virtual boost::any visit(UnaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(UnaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BooleanLiteralExpression const& expression) override; - virtual boost::any visit(IntegerLiteralExpression const& expression) override; - virtual boost::any visit(RationalLiteralExpression const& expression) override; + virtual boost::any visit(IfThenElseExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryRelationExpression const& expression, boost::any const& data) override; + virtual boost::any visit(VariableExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BooleanLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(IntegerLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(RationalLiteralExpression const& expression, boost::any const& data) override; private: enum class LinearityStatus { NonLinear, LinearContainsVariables, LinearWithoutVariables }; diff --git a/src/storage/expressions/RationalLiteralExpression.cpp b/src/storage/expressions/RationalLiteralExpression.cpp index 3fa226a8a..6c6ee88ff 100644 --- a/src/storage/expressions/RationalLiteralExpression.cpp +++ b/src/storage/expressions/RationalLiteralExpression.cpp @@ -34,8 +34,8 @@ namespace storm { return this->shared_from_this(); } - boost::any RationalLiteralExpression::accept(ExpressionVisitor& visitor) const { - return visitor.visit(*this); + boost::any RationalLiteralExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return visitor.visit(*this, data); } double RationalLiteralExpression::getValueAsDouble() const { diff --git a/src/storage/expressions/RationalLiteralExpression.h b/src/storage/expressions/RationalLiteralExpression.h index 4eff900b2..e18cf8c43 100644 --- a/src/storage/expressions/RationalLiteralExpression.h +++ b/src/storage/expressions/RationalLiteralExpression.h @@ -48,7 +48,7 @@ namespace storm { virtual bool isLiteral() const override; virtual void gatherVariables(std::set& variables) const override; virtual std::shared_ptr simplify() const override; - virtual boost::any accept(ExpressionVisitor& visitor) const override; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const override; /*! * Retrieves the value of the double literal. diff --git a/src/storage/expressions/SubstitutionVisitor.cpp b/src/storage/expressions/SubstitutionVisitor.cpp index 1490e6f59..c2b4ff419 100644 --- a/src/storage/expressions/SubstitutionVisitor.cpp +++ b/src/storage/expressions/SubstitutionVisitor.cpp @@ -14,14 +14,14 @@ namespace storm { template Expression SubstitutionVisitor::substitute(Expression const& expression) { - return Expression(boost::any_cast>(expression.getBaseExpression().accept(*this))); + return Expression(boost::any_cast>(expression.getBaseExpression().accept(*this, boost::none))); } template - boost::any SubstitutionVisitor::visit(IfThenElseExpression const& expression) { - std::shared_ptr conditionExpression = boost::any_cast>(expression.getCondition()->accept(*this)); - std::shared_ptr thenExpression = boost::any_cast>(expression.getThenExpression()->accept(*this)); - std::shared_ptr elseExpression = boost::any_cast>(expression.getElseExpression()->accept(*this)); + boost::any SubstitutionVisitor::visit(IfThenElseExpression const& expression, boost::any const& data) { + std::shared_ptr conditionExpression = boost::any_cast>(expression.getCondition()->accept(*this, data)); + std::shared_ptr thenExpression = boost::any_cast>(expression.getThenExpression()->accept(*this, data)); + std::shared_ptr elseExpression = boost::any_cast>(expression.getElseExpression()->accept(*this, data)); // If the arguments did not change, we simply push the expression itself. if (conditionExpression.get() == expression.getCondition().get() && thenExpression.get() == expression.getThenExpression().get() && elseExpression.get() == expression.getElseExpression().get()) { @@ -32,9 +32,9 @@ namespace storm { } template - boost::any SubstitutionVisitor::visit(BinaryBooleanFunctionExpression const& expression) { - std::shared_ptr firstExpression = boost::any_cast>(expression.getFirstOperand()->accept(*this)); - std::shared_ptr secondExpression = boost::any_cast>(expression.getSecondOperand()->accept(*this)); + boost::any SubstitutionVisitor::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) { + std::shared_ptr firstExpression = boost::any_cast>(expression.getFirstOperand()->accept(*this, data)); + std::shared_ptr secondExpression = boost::any_cast>(expression.getSecondOperand()->accept(*this, data)); // If the arguments did not change, we simply push the expression itself. if (firstExpression.get() == expression.getFirstOperand().get() && secondExpression.get() == expression.getSecondOperand().get()) { @@ -45,9 +45,9 @@ namespace storm { } template - boost::any SubstitutionVisitor::visit(BinaryNumericalFunctionExpression const& expression) { - std::shared_ptr firstExpression = boost::any_cast>(expression.getFirstOperand()->accept(*this)); - std::shared_ptr secondExpression = boost::any_cast>(expression.getSecondOperand()->accept(*this)); + boost::any SubstitutionVisitor::visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) { + std::shared_ptr firstExpression = boost::any_cast>(expression.getFirstOperand()->accept(*this, data)); + std::shared_ptr secondExpression = boost::any_cast>(expression.getSecondOperand()->accept(*this, data)); // If the arguments did not change, we simply push the expression itself. if (firstExpression.get() == expression.getFirstOperand().get() && secondExpression.get() == expression.getSecondOperand().get()) { @@ -58,9 +58,9 @@ namespace storm { } template - boost::any SubstitutionVisitor::visit(BinaryRelationExpression const& expression) { - std::shared_ptr firstExpression = boost::any_cast>(expression.getFirstOperand()->accept(*this)); - std::shared_ptr secondExpression = boost::any_cast>(expression.getSecondOperand()->accept(*this)); + boost::any SubstitutionVisitor::visit(BinaryRelationExpression const& expression, boost::any const& data) { + std::shared_ptr firstExpression = boost::any_cast>(expression.getFirstOperand()->accept(*this, data)); + std::shared_ptr secondExpression = boost::any_cast>(expression.getSecondOperand()->accept(*this, data)); // If the arguments did not change, we simply push the expression itself. if (firstExpression.get() == expression.getFirstOperand().get() && secondExpression.get() == expression.getSecondOperand().get()) { @@ -71,7 +71,7 @@ namespace storm { } template - boost::any SubstitutionVisitor::visit(VariableExpression const& expression) { + boost::any SubstitutionVisitor::visit(VariableExpression const& expression, boost::any const& data) { // If the variable is in the key set of the substitution, we need to replace it. auto const& nameExpressionPair = this->variableToExpressionMapping.find(expression.getVariable()); if (nameExpressionPair != this->variableToExpressionMapping.end()) { @@ -82,8 +82,8 @@ namespace storm { } template - boost::any SubstitutionVisitor::visit(UnaryBooleanFunctionExpression const& expression) { - std::shared_ptr operandExpression = boost::any_cast>(expression.getOperand()->accept(*this)); + boost::any SubstitutionVisitor::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) { + std::shared_ptr operandExpression = boost::any_cast>(expression.getOperand()->accept(*this, data)); // If the argument did not change, we simply push the expression itself. if (operandExpression.get() == expression.getOperand().get()) { @@ -94,8 +94,8 @@ namespace storm { } template - boost::any SubstitutionVisitor::visit(UnaryNumericalFunctionExpression const& expression) { - std::shared_ptr operandExpression = boost::any_cast>(expression.getOperand()->accept(*this)); + boost::any SubstitutionVisitor::visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) { + std::shared_ptr operandExpression = boost::any_cast>(expression.getOperand()->accept(*this, data)); // If the argument did not change, we simply push the expression itself. if (operandExpression.get() == expression.getOperand().get()) { @@ -106,17 +106,17 @@ namespace storm { } template - boost::any SubstitutionVisitor::visit(BooleanLiteralExpression const& expression) { + boost::any SubstitutionVisitor::visit(BooleanLiteralExpression const& expression, boost::any const& data) { return expression.getSharedPointer(); } template - boost::any SubstitutionVisitor::visit(IntegerLiteralExpression const& expression) { + boost::any SubstitutionVisitor::visit(IntegerLiteralExpression const& expression, boost::any const& data) { return expression.getSharedPointer(); } template - boost::any SubstitutionVisitor::visit(RationalLiteralExpression const& expression) { + boost::any SubstitutionVisitor::visit(RationalLiteralExpression const& expression, boost::any const& data) { return expression.getSharedPointer(); } diff --git a/src/storage/expressions/SubstitutionVisitor.h b/src/storage/expressions/SubstitutionVisitor.h index 5f1a93cb2..2131696c4 100644 --- a/src/storage/expressions/SubstitutionVisitor.h +++ b/src/storage/expressions/SubstitutionVisitor.h @@ -28,16 +28,16 @@ namespace storm { */ Expression substitute(Expression const& expression); - virtual boost::any visit(IfThenElseExpression const& expression) override; - virtual boost::any visit(BinaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(BinaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BinaryRelationExpression const& expression) override; - virtual boost::any visit(VariableExpression const& expression) override; - virtual boost::any visit(UnaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(UnaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BooleanLiteralExpression const& expression) override; - virtual boost::any visit(IntegerLiteralExpression const& expression) override; - virtual boost::any visit(RationalLiteralExpression const& expression) override; + virtual boost::any visit(IfThenElseExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryRelationExpression const& expression, boost::any const& data) override; + virtual boost::any visit(VariableExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BooleanLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(IntegerLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(RationalLiteralExpression const& expression, boost::any const& data) override; private: // A mapping of variables to expressions with which they shall be replaced. diff --git a/src/storage/expressions/SyntacticalEqualityCheckVisitor.cpp b/src/storage/expressions/SyntacticalEqualityCheckVisitor.cpp new file mode 100644 index 000000000..4277a7dbb --- /dev/null +++ b/src/storage/expressions/SyntacticalEqualityCheckVisitor.cpp @@ -0,0 +1,155 @@ +#include "src/storage/expressions/SyntacticalEqualityCheckVisitor.h" + +#include "src/storage/expressions/Expressions.h" + +namespace storm { + namespace expressions { + + bool SyntacticalEqualityCheckVisitor::isSyntaticallyEqual(storm::expressions::Expression const& expression1, storm::expressions::Expression const& expression2) { + return boost::any_cast(expression1.accept(*this, std::ref(expression2.getBaseExpression()))); + } + + boost::any SyntacticalEqualityCheckVisitor::visit(IfThenElseExpression const& expression, boost::any const& data) { + BaseExpression const& otherBaseExpression = boost::any_cast>(data).get(); + if (otherBaseExpression.isIfThenElseExpression()) { + IfThenElseExpression const& otherExpression = otherBaseExpression.asIfThenElseExpression(); + + bool result = boost::any_cast(expression.getCondition()->accept(*this, std::ref(*otherExpression.getCondition()))); + if (result) { + result = boost::any_cast(expression.getThenExpression()->accept(*this, std::ref(*otherExpression.getThenExpression()))); + } + if (result) { + result = boost::any_cast(expression.getElseExpression()->accept(*this, std::ref(*otherExpression.getElseExpression()))); + } + return result; + } else { + return false; + } + } + + boost::any SyntacticalEqualityCheckVisitor::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) { + BaseExpression const& otherBaseExpression = boost::any_cast>(data).get(); + if (otherBaseExpression.isBinaryBooleanFunctionExpression()) { + BinaryBooleanFunctionExpression const& otherExpression = otherBaseExpression.asBinaryBooleanFunctionExpression(); + + bool result = expression.getOperatorType() == otherExpression.getOperatorType(); + if (result) { + result = boost::any_cast(expression.getFirstOperand()->accept(*this, std::ref(*otherExpression.getFirstOperand()))); + } + if (result) { + result = boost::any_cast(expression.getSecondOperand()->accept(*this, std::ref(*otherExpression.getSecondOperand()))); + } + return result; + } else { + return false; + } + } + + boost::any SyntacticalEqualityCheckVisitor::visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) { + BaseExpression const& otherBaseExpression = boost::any_cast>(data).get(); + if (otherBaseExpression.isBinaryNumericalFunctionExpression()) { + BinaryNumericalFunctionExpression const& otherExpression = otherBaseExpression.asBinaryNumericalFunctionExpression(); + + bool result = expression.getOperatorType() == otherExpression.getOperatorType(); + if (result) { + result = boost::any_cast(expression.getFirstOperand()->accept(*this, std::ref(*otherExpression.getFirstOperand()))); + } + if (result) { + result = boost::any_cast(expression.getSecondOperand()->accept(*this, std::ref(*otherExpression.getSecondOperand()))); + } + return result; + } else { + return false; + } + } + + boost::any SyntacticalEqualityCheckVisitor::visit(BinaryRelationExpression const& expression, boost::any const& data) { + BaseExpression const& otherBaseExpression = boost::any_cast>(data).get(); + if (otherBaseExpression.isBinaryRelationExpression()) { + BinaryRelationExpression const& otherExpression = otherBaseExpression.asBinaryRelationExpression(); + + bool result = expression.getRelationType() == otherExpression.getRelationType(); + if (result) { + result = boost::any_cast(expression.getFirstOperand()->accept(*this, std::ref(*otherExpression.getFirstOperand()))); + } + if (result) { + result = boost::any_cast(expression.getSecondOperand()->accept(*this, std::ref(*otherExpression.getSecondOperand()))); + } + return result; + } else { + return false; + } + } + + boost::any SyntacticalEqualityCheckVisitor::visit(VariableExpression const& expression, boost::any const& data) { + BaseExpression const& otherBaseExpression = boost::any_cast>(data).get(); + if (otherBaseExpression.isVariableExpression()) { + VariableExpression const& otherExpression = otherBaseExpression.asVariableExpression(); + return expression.getVariable() == otherExpression.getVariable(); + } else { + return false; + } + } + + boost::any SyntacticalEqualityCheckVisitor::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) { + BaseExpression const& otherBaseExpression = boost::any_cast>(data).get(); + if (otherBaseExpression.isBinaryBooleanFunctionExpression()) { + UnaryBooleanFunctionExpression const& otherExpression = otherBaseExpression.asUnaryBooleanFunctionExpression(); + + bool result = expression.getOperatorType() == otherExpression.getOperatorType(); + if (result) { + result = boost::any_cast(expression.getOperand()->accept(*this, std::ref(*otherExpression.getOperand()))); + } + return result; + } else { + return false; + } + } + + boost::any SyntacticalEqualityCheckVisitor::visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) { + BaseExpression const& otherBaseExpression = boost::any_cast>(data).get(); + if (otherBaseExpression.isBinaryBooleanFunctionExpression()) { + UnaryNumericalFunctionExpression const& otherExpression = otherBaseExpression.asUnaryNumericalFunctionExpression(); + + bool result = expression.getOperatorType() == otherExpression.getOperatorType(); + if (result) { + result = boost::any_cast(expression.getOperand()->accept(*this, std::ref(*otherExpression.getOperand()))); + } + return result; + } else { + return false; + } + } + + boost::any SyntacticalEqualityCheckVisitor::visit(BooleanLiteralExpression const& expression, boost::any const& data) { + BaseExpression const& otherBaseExpression = boost::any_cast>(data).get(); + if (otherBaseExpression.isBooleanLiteralExpression()) { + BooleanLiteralExpression const& otherExpression = otherBaseExpression.asBooleanLiteralExpression(); + return expression.getValue() == otherExpression.getValue(); + } else { + return false; + } + } + + boost::any SyntacticalEqualityCheckVisitor::visit(IntegerLiteralExpression const& expression, boost::any const& data) { + BaseExpression const& otherBaseExpression = boost::any_cast>(data).get(); + if (otherBaseExpression.isIntegerLiteralExpression()) { + IntegerLiteralExpression const& otherExpression = otherBaseExpression.asIntegerLiteralExpression(); + return expression.getValue() == otherExpression.getValue(); + } else { + return false; + } + } + + boost::any SyntacticalEqualityCheckVisitor::visit(RationalLiteralExpression const& expression, boost::any const& data) { + BaseExpression const& otherBaseExpression = boost::any_cast>(data).get(); + if (otherBaseExpression.isRationalLiteralExpression()) { + RationalLiteralExpression const& otherExpression = otherBaseExpression.asRationalLiteralExpression(); + return expression.getValue() == otherExpression.getValue(); + } else { + return false; + } + } + + } +} \ No newline at end of file diff --git a/src/storage/expressions/SyntacticalEqualityCheckVisitor.h b/src/storage/expressions/SyntacticalEqualityCheckVisitor.h new file mode 100644 index 000000000..82366e507 --- /dev/null +++ b/src/storage/expressions/SyntacticalEqualityCheckVisitor.h @@ -0,0 +1,27 @@ +#pragma once + +#include "src/storage/expressions/ExpressionVisitor.h" + +namespace storm { + namespace expressions { + + class Expression; + + class SyntacticalEqualityCheckVisitor : public ExpressionVisitor { + public: + bool isSyntaticallyEqual(storm::expressions::Expression const& expression1, storm::expressions::Expression const& expression2); + + virtual boost::any visit(IfThenElseExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryRelationExpression const& expression, boost::any const& data) override; + virtual boost::any visit(VariableExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BooleanLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(IntegerLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(RationalLiteralExpression const& expression, boost::any const& data) override; + }; + + } +} \ No newline at end of file diff --git a/src/storage/expressions/ToExprtkStringVisitor.cpp b/src/storage/expressions/ToExprtkStringVisitor.cpp index 1492aeae5..88ab1132a 100644 --- a/src/storage/expressions/ToExprtkStringVisitor.cpp +++ b/src/storage/expressions/ToExprtkStringVisitor.cpp @@ -9,210 +9,210 @@ namespace storm { std::string ToExprtkStringVisitor::toString(BaseExpression const* expression) { stream.str(""); stream.clear(); - expression->accept(*this); + expression->accept(*this, boost::none); return stream.str(); } - boost::any ToExprtkStringVisitor::visit(IfThenElseExpression const& expression) { + boost::any ToExprtkStringVisitor::visit(IfThenElseExpression const& expression, boost::any const& data) { stream << "if("; - expression.getCondition()->accept(*this); + expression.getCondition()->accept(*this, data); stream << ","; - expression.getThenExpression()->accept(*this); + expression.getThenExpression()->accept(*this, data); stream << ","; - expression.getElseExpression()->accept(*this); + expression.getElseExpression()->accept(*this, data); stream << ")"; return boost::any(); } - boost::any ToExprtkStringVisitor::visit(BinaryBooleanFunctionExpression const& expression) { + boost::any ToExprtkStringVisitor::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) { switch (expression.getOperatorType()) { case BinaryBooleanFunctionExpression::OperatorType::And: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << " and "; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryBooleanFunctionExpression::OperatorType::Or: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << " or "; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryBooleanFunctionExpression::OperatorType::Xor: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << " xor "; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryBooleanFunctionExpression::OperatorType::Implies: stream << "(not("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << ") or "; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryBooleanFunctionExpression::OperatorType::Iff: - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << "=="; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); break; } return boost::any(); } - boost::any ToExprtkStringVisitor::visit(BinaryNumericalFunctionExpression const& expression) { + boost::any ToExprtkStringVisitor::visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) { switch (expression.getOperatorType()) { case BinaryNumericalFunctionExpression::OperatorType::Plus: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << "+"; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryNumericalFunctionExpression::OperatorType::Minus: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << "-"; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryNumericalFunctionExpression::OperatorType::Times: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << "*"; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryNumericalFunctionExpression::OperatorType::Divide: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << "/"; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryNumericalFunctionExpression::OperatorType::Power: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << "^"; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryNumericalFunctionExpression::OperatorType::Max: stream << "max("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << ","; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryNumericalFunctionExpression::OperatorType::Min: stream << "min("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << ","; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; } return boost::any(); } - boost::any ToExprtkStringVisitor::visit(BinaryRelationExpression const& expression) { + boost::any ToExprtkStringVisitor::visit(BinaryRelationExpression const& expression, boost::any const& data) { switch (expression.getRelationType()) { case BinaryRelationExpression::RelationType::Equal: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << "=="; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryRelationExpression::RelationType::NotEqual: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << "!="; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryRelationExpression::RelationType::Less: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << "<"; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryRelationExpression::RelationType::LessOrEqual: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << "<="; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryRelationExpression::RelationType::Greater: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << ">"; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; case BinaryRelationExpression::RelationType::GreaterOrEqual: stream << "("; - expression.getFirstOperand()->accept(*this); + expression.getFirstOperand()->accept(*this, data); stream << ">="; - expression.getSecondOperand()->accept(*this); + expression.getSecondOperand()->accept(*this, data); stream << ")"; break; } return boost::any(); } - boost::any ToExprtkStringVisitor::visit(VariableExpression const& expression) { + boost::any ToExprtkStringVisitor::visit(VariableExpression const& expression, boost::any const& data) { stream << expression.getVariableName(); return boost::any(); } - boost::any ToExprtkStringVisitor::visit(UnaryBooleanFunctionExpression const& expression) { + boost::any ToExprtkStringVisitor::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) { switch (expression.getOperatorType()) { case UnaryBooleanFunctionExpression::OperatorType::Not: stream << "not("; - expression.getOperand()->accept(*this); + expression.getOperand()->accept(*this, data); stream << ")"; } return boost::any(); } - boost::any ToExprtkStringVisitor::visit(UnaryNumericalFunctionExpression const& expression) { + boost::any ToExprtkStringVisitor::visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) { switch (expression.getOperatorType()) { case UnaryNumericalFunctionExpression::OperatorType::Minus: stream << "-("; - expression.getOperand()->accept(*this); + expression.getOperand()->accept(*this, data); stream << ")"; break; case UnaryNumericalFunctionExpression::OperatorType::Floor: stream << "floor("; - expression.getOperand()->accept(*this); + expression.getOperand()->accept(*this, data); stream << ")"; break; case UnaryNumericalFunctionExpression::OperatorType::Ceil: stream << "ceil("; - expression.getOperand()->accept(*this); + expression.getOperand()->accept(*this, data); stream << ")"; break; } return boost::any(); } - boost::any ToExprtkStringVisitor::visit(BooleanLiteralExpression const& expression) { + boost::any ToExprtkStringVisitor::visit(BooleanLiteralExpression const& expression, boost::any const& data) { stream << expression.getValue(); return boost::any(); } - boost::any ToExprtkStringVisitor::visit(IntegerLiteralExpression const& expression) { + boost::any ToExprtkStringVisitor::visit(IntegerLiteralExpression const& expression, boost::any const& data) { stream << expression.getValue(); return boost::any(); } - boost::any ToExprtkStringVisitor::visit(RationalLiteralExpression const& expression) { + boost::any ToExprtkStringVisitor::visit(RationalLiteralExpression const& expression, boost::any const& data) { stream << expression.getValue(); return boost::any(); } diff --git a/src/storage/expressions/ToExprtkStringVisitor.h b/src/storage/expressions/ToExprtkStringVisitor.h index d68da589d..efab0a176 100644 --- a/src/storage/expressions/ToExprtkStringVisitor.h +++ b/src/storage/expressions/ToExprtkStringVisitor.h @@ -16,16 +16,16 @@ namespace storm { std::string toString(Expression const& expression); std::string toString(BaseExpression const* expression); - virtual boost::any visit(IfThenElseExpression const& expression) override; - virtual boost::any visit(BinaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(BinaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BinaryRelationExpression const& expression) override; - virtual boost::any visit(VariableExpression const& expression) override; - virtual boost::any visit(UnaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(UnaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BooleanLiteralExpression const& expression) override; - virtual boost::any visit(IntegerLiteralExpression const& expression) override; - virtual boost::any visit(RationalLiteralExpression const& expression) override; + virtual boost::any visit(IfThenElseExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryRelationExpression const& expression, boost::any const& data) override; + virtual boost::any visit(VariableExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BooleanLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(IntegerLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(RationalLiteralExpression const& expression, boost::any const& data) override; private: std::stringstream stream; diff --git a/src/storage/expressions/ToRationalFunctionVisitor.cpp b/src/storage/expressions/ToRationalFunctionVisitor.cpp index a219066e4..91a3cdc94 100644 --- a/src/storage/expressions/ToRationalFunctionVisitor.cpp +++ b/src/storage/expressions/ToRationalFunctionVisitor.cpp @@ -17,23 +17,23 @@ namespace storm { template RationalFunctionType ToRationalFunctionVisitor::toRationalFunction(Expression const& expression) { - return boost::any_cast(expression.accept(*this)); + return boost::any_cast(expression.accept(*this, boost::none)); } template - boost::any ToRationalFunctionVisitor::visit(IfThenElseExpression const& expression) { + boost::any ToRationalFunctionVisitor::visit(IfThenElseExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational function."); } template - boost::any ToRationalFunctionVisitor::visit(BinaryBooleanFunctionExpression const& expression) { + boost::any ToRationalFunctionVisitor::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational function."); } template - boost::any ToRationalFunctionVisitor::visit(BinaryNumericalFunctionExpression const& expression) { - RationalFunctionType firstOperandAsRationalFunction = boost::any_cast(expression.getFirstOperand()->accept(*this)); - RationalFunctionType secondOperandAsRationalFunction = boost::any_cast(expression.getSecondOperand()->accept(*this)); + boost::any ToRationalFunctionVisitor::visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) { + RationalFunctionType firstOperandAsRationalFunction = boost::any_cast(expression.getFirstOperand()->accept(*this, data)); + RationalFunctionType secondOperandAsRationalFunction = boost::any_cast(expression.getSecondOperand()->accept(*this, data)); uint_fast64_t exponentAsInteger = 0; switch(expression.getOperatorType()) { case BinaryNumericalFunctionExpression::OperatorType::Plus: @@ -62,12 +62,12 @@ namespace storm { } template - boost::any ToRationalFunctionVisitor::visit(BinaryRelationExpression const& expression) { + boost::any ToRationalFunctionVisitor::visit(BinaryRelationExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational function."); } template - boost::any ToRationalFunctionVisitor::visit(VariableExpression const& expression) { + boost::any ToRationalFunctionVisitor::visit(VariableExpression const& expression, boost::any const& data) { auto variablePair = variableToVariableMap.find(expression.getVariable()); if (variablePair != variableToVariableMap.end()) { return convertVariableToPolynomial(variablePair->second); @@ -79,27 +79,27 @@ namespace storm { } template - boost::any ToRationalFunctionVisitor::visit(UnaryBooleanFunctionExpression const& expression) { + boost::any ToRationalFunctionVisitor::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational function."); } template - boost::any ToRationalFunctionVisitor::visit(UnaryNumericalFunctionExpression const& expression) { + boost::any ToRationalFunctionVisitor::visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational function."); } template - boost::any ToRationalFunctionVisitor::visit(BooleanLiteralExpression const& expression) { + boost::any ToRationalFunctionVisitor::visit(BooleanLiteralExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational function."); } template - boost::any ToRationalFunctionVisitor::visit(IntegerLiteralExpression const& expression) { + boost::any ToRationalFunctionVisitor::visit(IntegerLiteralExpression const& expression, boost::any const& data) { return RationalFunctionType(carl::rationalize(static_cast(expression.getValue()))); } template - boost::any ToRationalFunctionVisitor::visit(RationalLiteralExpression const& expression) { + boost::any ToRationalFunctionVisitor::visit(RationalLiteralExpression const& expression, boost::any const& data) { return storm::utility::convertNumber(expression.getValue()); } diff --git a/src/storage/expressions/ToRationalFunctionVisitor.h b/src/storage/expressions/ToRationalFunctionVisitor.h index 1cda5028f..0a30d7793 100644 --- a/src/storage/expressions/ToRationalFunctionVisitor.h +++ b/src/storage/expressions/ToRationalFunctionVisitor.h @@ -18,16 +18,16 @@ namespace storm { RationalFunctionType toRationalFunction(Expression const& expression); - virtual boost::any visit(IfThenElseExpression const& expression) override; - virtual boost::any visit(BinaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(BinaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BinaryRelationExpression const& expression) override; - virtual boost::any visit(VariableExpression const& expression) override; - virtual boost::any visit(UnaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(UnaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BooleanLiteralExpression const& expression) override; - virtual boost::any visit(IntegerLiteralExpression const& expression) override; - virtual boost::any visit(RationalLiteralExpression const& expression) override; + virtual boost::any visit(IfThenElseExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryRelationExpression const& expression, boost::any const& data) override; + virtual boost::any visit(VariableExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BooleanLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(IntegerLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(RationalLiteralExpression const& expression, boost::any const& data) override; private: template> = carl::dummy> diff --git a/src/storage/expressions/ToRationalNumberVisitor.cpp b/src/storage/expressions/ToRationalNumberVisitor.cpp index 1b7319927..cfe2cbb35 100644 --- a/src/storage/expressions/ToRationalNumberVisitor.cpp +++ b/src/storage/expressions/ToRationalNumberVisitor.cpp @@ -14,23 +14,23 @@ namespace storm { template RationalNumberType ToRationalNumberVisitor::toRationalNumber(Expression const& expression) { - return boost::any_cast(expression.accept(*this)); + return boost::any_cast(expression.accept(*this, boost::none)); } template - boost::any ToRationalNumberVisitor::visit(IfThenElseExpression const& expression) { + boost::any ToRationalNumberVisitor::visit(IfThenElseExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational number."); } template - boost::any ToRationalNumberVisitor::visit(BinaryBooleanFunctionExpression const& expression) { + boost::any ToRationalNumberVisitor::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational number."); } template - boost::any ToRationalNumberVisitor::visit(BinaryNumericalFunctionExpression const& expression) { - RationalNumberType firstOperandAsRationalNumber = boost::any_cast(expression.getFirstOperand()->accept(*this)); - RationalNumberType secondOperandAsRationalNumber = boost::any_cast(expression.getSecondOperand()->accept(*this)); + boost::any ToRationalNumberVisitor::visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) { + RationalNumberType firstOperandAsRationalNumber = boost::any_cast(expression.getFirstOperand()->accept(*this, data)); + RationalNumberType secondOperandAsRationalNumber = boost::any_cast(expression.getSecondOperand()->accept(*this, data)); switch(expression.getOperatorType()) { case BinaryNumericalFunctionExpression::OperatorType::Plus: return firstOperandAsRationalNumber + secondOperandAsRationalNumber; @@ -63,32 +63,32 @@ namespace storm { } template - boost::any ToRationalNumberVisitor::visit(BinaryRelationExpression const& expression) { + boost::any ToRationalNumberVisitor::visit(BinaryRelationExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational number."); } template - boost::any ToRationalNumberVisitor::visit(VariableExpression const& expression) { + boost::any ToRationalNumberVisitor::visit(VariableExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Cannot transform expressions containing variables to a rational number."); } template - boost::any ToRationalNumberVisitor::visit(UnaryBooleanFunctionExpression const& expression) { + boost::any ToRationalNumberVisitor::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational number."); } template - boost::any ToRationalNumberVisitor::visit(UnaryNumericalFunctionExpression const& expression) { + boost::any ToRationalNumberVisitor::visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational number."); } template - boost::any ToRationalNumberVisitor::visit(BooleanLiteralExpression const& expression) { + boost::any ToRationalNumberVisitor::visit(BooleanLiteralExpression const& expression, boost::any const& data) { STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational number."); } template - boost::any ToRationalNumberVisitor::visit(IntegerLiteralExpression const& expression) { + boost::any ToRationalNumberVisitor::visit(IntegerLiteralExpression const& expression, boost::any const& data) { #ifdef STORM_HAVE_CARL return RationalNumberType(carl::rationalize(static_cast(expression.getValue()))); #else @@ -97,7 +97,7 @@ namespace storm { } template - boost::any ToRationalNumberVisitor::visit(RationalLiteralExpression const& expression) { + boost::any ToRationalNumberVisitor::visit(RationalLiteralExpression const& expression, boost::any const& data) { #ifdef STORM_HAVE_CARL return expression.getValue(); #else diff --git a/src/storage/expressions/ToRationalNumberVisitor.h b/src/storage/expressions/ToRationalNumberVisitor.h index 3d53b8a87..da803cf23 100644 --- a/src/storage/expressions/ToRationalNumberVisitor.h +++ b/src/storage/expressions/ToRationalNumberVisitor.h @@ -16,16 +16,16 @@ namespace storm { RationalNumberType toRationalNumber(Expression const& expression); - virtual boost::any visit(IfThenElseExpression const& expression) override; - virtual boost::any visit(BinaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(BinaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BinaryRelationExpression const& expression) override; - virtual boost::any visit(VariableExpression const& expression) override; - virtual boost::any visit(UnaryBooleanFunctionExpression const& expression) override; - virtual boost::any visit(UnaryNumericalFunctionExpression const& expression) override; - virtual boost::any visit(BooleanLiteralExpression const& expression) override; - virtual boost::any visit(IntegerLiteralExpression const& expression) override; - virtual boost::any visit(RationalLiteralExpression const& expression) override; + virtual boost::any visit(IfThenElseExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BinaryRelationExpression const& expression, boost::any const& data) override; + virtual boost::any visit(VariableExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) override; + virtual boost::any visit(BooleanLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(IntegerLiteralExpression const& expression, boost::any const& data) override; + virtual boost::any visit(RationalLiteralExpression const& expression, boost::any const& data) override; }; } } diff --git a/src/storage/expressions/UnaryBooleanFunctionExpression.cpp b/src/storage/expressions/UnaryBooleanFunctionExpression.cpp index 7c45e081d..825d3debc 100644 --- a/src/storage/expressions/UnaryBooleanFunctionExpression.cpp +++ b/src/storage/expressions/UnaryBooleanFunctionExpression.cpp @@ -49,8 +49,8 @@ namespace storm { } } - boost::any UnaryBooleanFunctionExpression::accept(ExpressionVisitor& visitor) const { - return visitor.visit(*this); + boost::any UnaryBooleanFunctionExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return visitor.visit(*this, data); } void UnaryBooleanFunctionExpression::printToStream(std::ostream& stream) const { diff --git a/src/storage/expressions/UnaryBooleanFunctionExpression.h b/src/storage/expressions/UnaryBooleanFunctionExpression.h index d13761c26..1f1974fa1 100644 --- a/src/storage/expressions/UnaryBooleanFunctionExpression.h +++ b/src/storage/expressions/UnaryBooleanFunctionExpression.h @@ -36,7 +36,7 @@ namespace storm { virtual storm::expressions::OperatorType getOperator() const override; virtual bool evaluateAsBool(Valuation const* valuation = nullptr) const override; virtual std::shared_ptr simplify() const override; - virtual boost::any accept(ExpressionVisitor& visitor) const override; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const override; /*! * Retrieves the operator associated with this expression. diff --git a/src/storage/expressions/UnaryExpression.cpp b/src/storage/expressions/UnaryExpression.cpp index 1223368fd..e24a726e0 100644 --- a/src/storage/expressions/UnaryExpression.cpp +++ b/src/storage/expressions/UnaryExpression.cpp @@ -18,7 +18,7 @@ namespace storm { } void UnaryExpression::gatherVariables(std::set& variables) const { - return; + return this->getOperand()->gatherVariables(variables); } std::shared_ptr const& UnaryExpression::getOperand() const { diff --git a/src/storage/expressions/UnaryNumericalFunctionExpression.cpp b/src/storage/expressions/UnaryNumericalFunctionExpression.cpp index f5178fb6f..988b17a12 100644 --- a/src/storage/expressions/UnaryNumericalFunctionExpression.cpp +++ b/src/storage/expressions/UnaryNumericalFunctionExpression.cpp @@ -98,8 +98,8 @@ namespace storm { } } - boost::any UnaryNumericalFunctionExpression::accept(ExpressionVisitor& visitor) const { - return visitor.visit(*this); + boost::any UnaryNumericalFunctionExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return visitor.visit(*this, data); } void UnaryNumericalFunctionExpression::printToStream(std::ostream& stream) const { diff --git a/src/storage/expressions/UnaryNumericalFunctionExpression.h b/src/storage/expressions/UnaryNumericalFunctionExpression.h index f9e2ab148..38d29d142 100644 --- a/src/storage/expressions/UnaryNumericalFunctionExpression.h +++ b/src/storage/expressions/UnaryNumericalFunctionExpression.h @@ -37,7 +37,7 @@ namespace storm { virtual int_fast64_t evaluateAsInt(Valuation const* valuation = nullptr) const override; virtual double evaluateAsDouble(Valuation const* valuation = nullptr) const override; virtual std::shared_ptr simplify() const override; - virtual boost::any accept(ExpressionVisitor& visitor) const override; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const override; /*! * Retrieves the operator associated with this expression. diff --git a/src/storage/expressions/VariableExpression.cpp b/src/storage/expressions/VariableExpression.cpp index 8ac6cb8b2..a3fe0ae38 100644 --- a/src/storage/expressions/VariableExpression.cpp +++ b/src/storage/expressions/VariableExpression.cpp @@ -63,8 +63,8 @@ namespace storm { return this->shared_from_this(); } - boost::any VariableExpression::accept(ExpressionVisitor& visitor) const { - return visitor.visit(*this); + boost::any VariableExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const { + return visitor.visit(*this, data); } void VariableExpression::printToStream(std::ostream& stream) const { diff --git a/src/storage/expressions/VariableExpression.h b/src/storage/expressions/VariableExpression.h index cfc65fd31..f1f5bca16 100644 --- a/src/storage/expressions/VariableExpression.h +++ b/src/storage/expressions/VariableExpression.h @@ -35,7 +35,7 @@ namespace storm { virtual bool isVariable() const override; virtual void gatherVariables(std::set& variables) const override; virtual std::shared_ptr simplify() const override; - virtual boost::any accept(ExpressionVisitor& visitor) const override; + virtual boost::any accept(ExpressionVisitor& visitor, boost::any const& data) const override; /*! * Retrieves the name of the variable associated with this expression. diff --git a/src/storage/gspn/GSPN.cpp b/src/storage/gspn/GSPN.cpp new file mode 100644 index 000000000..7e7ffbe37 --- /dev/null +++ b/src/storage/gspn/GSPN.cpp @@ -0,0 +1,560 @@ +#include "src/storage/gspn/GSPN.h" +#include "src/utility/macros.h" +#include "src/exceptions/InvalidArgumentException.h" + +#include + +#include + +namespace storm { + namespace gspn { + uint64_t GSPN::timedTransitionIdToTransitionId(uint64_t ttId) { + return ttId | (1ull << ((sizeof(ttId) * CHAR_BIT) - 1)); + } + + uint64_t GSPN::immediateTransitionIdToTransitionId(uint64_t itId) { + return itId; + } + + uint64_t GSPN::transitionIdToTimedTransitionId(uint64_t tId) { + return (tId << 1) >> 1; + } + + uint64_t GSPN::transitionIdToImmediateTransitionId(uint64_t tId) { + return tId; + } + + GSPN::GSPN(std::string const& name, std::vector const& places, std::vector> const& itransitions, std::vector> const& ttransitions) + : name(name), places(places), immediateTransitions(itransitions), timedTransitions(ttransitions) + { + + } + + uint_fast64_t GSPN::getNumberOfPlaces() const { + return places.size(); + } + + std::vector> const& GSPN::getTimedTransitions() const { + return this->timedTransitions; + } + + std::vector> const& GSPN::getImmediateTransitions() const { + return this->immediateTransitions; + } + + std::vector const& GSPN::getPlaces() const { + return places; + } + + std::shared_ptr GSPN::getInitialMarking(std::map& numberOfBits, uint_fast64_t const& numberOfTotalBits) const { + auto m = std::make_shared(getNumberOfPlaces(), numberOfBits, numberOfTotalBits); + for (auto& place : getPlaces()) { + m->setNumberOfTokensAt(place.getID(), place.getNumberOfInitialTokens()); + } + return m; + } + + + storm::gspn::Place const* GSPN::getPlace(uint64_t id) const { + if(id < places.size()) { + assert(places.at(id).getID() == id); + return &places.at(id); + } + return nullptr; + } + + + storm::gspn::Place* GSPN::getPlace(uint64_t id) { + if(id < places.size()) { + assert(places.at(id).getID() == id); + return &places.at(id); + } + return nullptr; + } + + + storm::gspn::Place const* GSPN::getPlace(std::string const& name) const { + for (auto& place : places) { + if (place.getName() == name) { + return &place; + } + } + return nullptr; + }; + + storm::gspn::Place* GSPN::getPlace(std::string const& name) { + for (auto& place : places) { + if (place.getName() == name) { + return &place; + } + } + return nullptr; + }; + + storm::gspn::TimedTransition const* GSPN::getTimedTransition(std::string const& name) const { + for (auto& trans : timedTransitions) { + if (name == trans.getName()) { + return &trans; + } + } + return nullptr; + } + + storm::gspn::ImmediateTransition const* GSPN::getImmediateTransition(std::string const& name) const { + for (auto& trans : immediateTransitions) { + if (name == trans.getName()) { + return &trans; + } + } + return nullptr; + } + + + + storm::gspn::Transition const* GSPN::getTransition(std::string const& id) const { + auto trans = getTimedTransition(id); + if (trans != nullptr) { + return trans; + } + + return getImmediateTransition(id); + } + + void GSPN::setCapacities(std::unordered_map const& mapping) { + for(auto const& entry : mapping) { + storm::gspn::Place* place = getPlace(entry.first); + STORM_LOG_THROW(place != nullptr, storm::exceptions::InvalidArgumentException, "No place with name " << entry.first); + place->setCapacity(entry.second); + + } + } + + void GSPN::writeDotToStream(std::ostream& outStream) const { + outStream << "digraph " << this->getName() << " {" << std::endl; + + // print places with initial marking (not printed is the capacity) + outStream << "\t" << "node [shape=ellipse]" << std::endl; + for (auto& place : this->getPlaces()) { + outStream << "\t" << place.getName() << " [label=\"" << place.getName() << "(" << place.getNumberOfInitialTokens(); + outStream << ")"; + if(place.hasRestrictedCapacity()) { + outStream << "c " << place.getCapacity(); + } + + outStream << "\"];" << std::endl; + } + + // print transitions with weight/rate + outStream << "\t" << "node [shape=box]" << std::endl; + for (auto& trans : this->getImmediateTransitions()) { + outStream << "\t" << trans.getName() << " [fontcolor=white, style=filled, fillcolor=black, label=\"" << trans.getName() << "\"];" << std::endl; + } + + for (auto& trans : this->getTimedTransitions()) { + outStream << "\t" << trans.getName() << " [label=\"" << trans.getName(); + outStream << " (" << trans.getRate() << ")\"];" << std::endl; + } + + // print arcs + for (auto& trans : this->getImmediateTransitions()) { + + for (auto &placePtr : trans.getInputPlaces()) { + outStream << "\t" << placePtr->getName() << " -> " << trans.getName() << "[label=\"" << + trans.getInputArcMultiplicity(*placePtr); + outStream << "\"];" << std::endl; + } + + for (auto &placePtr : trans.getInhibitionPlaces()) { + outStream << "\t" << placePtr->getName() << " -> " << trans.getName() << "[arrowhead=\"dot\", label=\"" << + trans.getInhibitionArcMultiplicity(*placePtr); + outStream << "\"];" << std::endl; + } + + for (auto &placePtr : trans.getOutputPlaces()) { + outStream << "\t" << trans.getName() << " -> " << placePtr->getName() << "[label=\"" << + trans.getOutputArcMultiplicity(*placePtr); + outStream << "\"];" << std::endl; + } + } + + for (auto& trans : this->getTimedTransitions()) { + for (auto &placePtr : trans.getInputPlaces()) { + outStream << "\t" << placePtr->getName() << " -> " << trans.getName() << "[label=\"" << + trans.getInputArcMultiplicity(*placePtr); + outStream << "\"];" << std::endl; + } + + for (auto &placePtr : trans.getInhibitionPlaces()) { + outStream << "\t" << placePtr->getName() << " -> " << trans.getName() << "[arrowhead=\"dot\", label=\"" << + trans.getInhibitionArcMultiplicity(*placePtr); + outStream << "\"];" << std::endl; + } + + for (auto &placePtr : trans.getOutputPlaces()) { + outStream << "\t" << trans.getName() << " -> " << placePtr->getName() << "[label=\"" << + trans.getOutputArcMultiplicity(*placePtr); + outStream << "\"];" << std::endl; + } + } + + outStream << "}" << std::endl; + } + + void GSPN::setName(std::string const& name) { + this->name = name; + } + + std::string const& GSPN::getName() const { + return this->name; + } + + bool GSPN::isValid() const { + bool result = true; + result |= testPlaces(); + result |= testTransitions(); + + return result; + } + + bool GSPN::testPlaces() const { + std::vector namesOfPlaces; + std::vector idsOfPlaces; + bool result = true; + + for (auto const& place : this->getPlaces()) { + + if (std::find(namesOfPlaces.begin(), namesOfPlaces.end(), place.getName()) != namesOfPlaces.end()) { + STORM_PRINT_AND_LOG("duplicates states with the name \"" + place.getName() + "\"\n") + result = false; + } + + if (std::find(idsOfPlaces.begin(), idsOfPlaces.end(), place.getID()) != idsOfPlaces.end()) { + STORM_PRINT_AND_LOG("duplicates states with the id \"" + boost::lexical_cast(place.getID()) + "\"\n") + result = false; + } + + if (place.getNumberOfInitialTokens() > place.getNumberOfInitialTokens()) { + STORM_PRINT_AND_LOG("number of initial tokens is greater than the capacity for place \"" + place.getName() + "\"\n") + result = false; + } + } + + return result; + } + + bool GSPN::testTransitions() const { + bool result = true; + + for (auto const& transition : this->getImmediateTransitions()) { + if (transition.getInputPlaces().empty() && + transition.getInhibitionPlaces().empty()) { + STORM_PRINT_AND_LOG("transition \"" + transition.getName() + "\" has no input or inhibition place\n") + result = false; + } + + if (transition.getOutputPlaces().empty()) { + STORM_PRINT_AND_LOG("transition \"" + transition.getName() + "\" has no output place\n") + result = false; + } + } + + for (auto const& transition : this->getTimedTransitions()) { + if (transition.getInputPlaces().empty() && + transition.getInputPlaces().empty()) { + STORM_PRINT_AND_LOG("transition \"" + transition.getName() + "\" has no input or inhibition place\n") + result = false; + } + + if (transition.getOutputPlaces().empty()) { + STORM_PRINT_AND_LOG("transition \"" + transition.getName() + "\" has no output place\n") + result = false; + } + } + + //test if places exists in the gspn + for (auto const& transition : this->getImmediateTransitions()) { + for (auto &placePtr : transition.getInputPlaces()) { + bool foundPlace = false; + for (auto const& place : places) { + if (place.getName() == placePtr->getName()) { + foundPlace = true; + } + } + if (!foundPlace) { + STORM_PRINT_AND_LOG("input place \"" + placePtr->getName() + "\" of transition \"" + transition.getName() + "\" was not found \n") + result = false; + } + } + + for (auto &placePtr : transition.getInhibitionPlaces()) { + bool foundPlace = false; + for (auto const& place : places) { + if (place.getName() == placePtr->getName()) { + foundPlace = true; + } + } + if (!foundPlace) { + STORM_PRINT_AND_LOG("inhibition place \"" + placePtr->getName() + "\" of transition \"" + transition.getName() + "\" was not found \n") + result = false; + } + } + + for (auto &placePtr : transition.getOutputPlaces()) { + bool foundPlace = false; + for (auto const& place : places) { + if (place.getName() == placePtr->getName()) { + foundPlace = true; + } + } + if (!foundPlace) { + STORM_PRINT_AND_LOG("output place \"" + placePtr->getName() + "\" of transition \"" + transition.getName() + "\" was not found \n") + result = false; + } + } + } + + for (auto const& transition : this->getTimedTransitions()) { + for (auto &placePtr : transition.getInputPlaces()) { + bool foundPlace = false; + for (auto const& place : places) { + if (place.getName() == placePtr->getName()) { + foundPlace = true; + } + } + if (!foundPlace) { + STORM_PRINT_AND_LOG("input place \"" + placePtr->getName() + "\" of transition \"" + transition.getName() + "\" was not found \n") + result = false; + } + } + + for (auto &placePtr : transition.getInhibitionPlaces()) { + bool foundPlace = false; + for (auto const& place : places) { + if (place.getName() == placePtr->getName()) { + foundPlace = true; + } + } + if (!foundPlace) { + STORM_PRINT_AND_LOG("inhibition place \"" + placePtr->getName() + "\" of transition \"" + transition.getName() + "\" was not found \n") + result = false; + } + } + + for (auto &placePtr : transition.getOutputPlaces()) { + bool foundPlace = false; + for (auto const& place : places) { + if (place.getName() == placePtr->getName()) { + foundPlace = true; + } + } + if (!foundPlace) { + STORM_PRINT_AND_LOG("output place \"" + placePtr->getName() + "\" of transition \"" + transition.getName() + "\" was not found \n") + result = false; + } + } + } + + + return result; + } + + void GSPN::toPnpro(std::ostream &stream) const { + auto space = " "; + auto space2 = " "; + auto space3 = " "; + auto projectName = "storm-export"; // TODO add to args + stream << "" << std::endl; + stream << space << "" << std::endl; + + u_int32_t x = 1; + stream << space2 << "" << std::endl; + for (auto& place : places) { + stream << space3 << "" << std::endl; + x = x + 3; + } + x = 1; + for (auto& trans : timedTransitions) { + stream << space3 << "" << std::endl; + x = x + 3; + } + for (auto& trans : immediateTransitions) { + stream << space3 << "" << std::endl; + x = x + 3; + } + stream << space2 << "" << std::endl; + + stream << space2 << "" << std::endl; + for (auto& trans : timedTransitions) { + for (auto &placePtr : trans.getInputPlaces()) { + stream << space3 << "getName() << "\" "; + stream << "kind=\"INPUT\" "; + stream << "mult=\"" << trans.getInputArcMultiplicity(*placePtr) << "\" "; + stream << "/>" << std::endl; + } + for (auto &placePtr : trans.getInhibitionPlaces()) { + stream << space3 << "getName() << "\" "; + stream << "kind=\"INHIBITOR\" "; + stream << "mult=\"" << trans.getInhibitionArcMultiplicity(*placePtr) << "\" "; + stream << "/>" << std::endl; + } + for (auto &placePtr : trans.getOutputPlaces()) { + stream << space3 << "getName() << "\" "; + stream << "tail=\"" << trans.getName() << "\" "; + stream << "kind=\"OUTPUT\" "; + stream << "mult=\"" << trans.getOutputArcMultiplicity(*placePtr) << "\" "; + stream << "/>" << std::endl; + } + } + for (auto& trans : immediateTransitions) { + for (auto &placePtr : trans.getInputPlaces()) { + stream << space3 << "getName() << "\" "; + stream << "kind=\"INPUT\" "; + stream << "mult=\"" << trans.getInputArcMultiplicity(*placePtr) << "\" "; + stream << "/>" << std::endl; + } + for (auto &placePtr : trans.getInhibitionPlaces()) { + stream << space3 << "getName() << "\" "; + stream << "kind=\"INHIBITOR\" "; + stream << "mult=\"" << trans.getInhibitionArcMultiplicity(*placePtr) << "\" "; + stream << "/>" << std::endl; + } + for (auto &placePtr : trans.getOutputPlaces()) { + stream << space3 << "getName() << "\" "; + stream << "tail=\"" << trans.getName() << "\" "; + stream << "kind=\"OUTPUT\" "; + stream << "mult=\"" << trans.getOutputArcMultiplicity(*placePtr) << "\" "; + stream << "/>" << std::endl; + } + } + stream << space2 << "" << std::endl; + stream << space << "" << std::endl; + stream << "" << std::endl; + } + + void GSPN::toPnml(std::ostream &stream) const { + std::string space = " "; + std::string space2 = " "; + std::string space3 = " "; + std::string space4 = " "; + + stream << "" << std::endl; + stream << space << "" << std::endl; + + // add places + for (const auto &place : places) { + stream << space2 << "" << std::endl; + stream << space3 << "" << std::endl; + stream << space4 << "Default," << place.getNumberOfInitialTokens() << "" << std::endl; + stream << space3 << "" << std::endl; + stream << space2 << "" << std::endl; + } + + // add immediate transitions + for (const auto &trans : immediateTransitions) { + stream << space2 << "" << std::endl; + stream << space3 << "" << std::endl; + stream << space4 << "" << trans.getWeight() << "" << std::endl; + stream << space3 << "" << std::endl; + stream << space3 << "" << std::endl; + stream << space4 << "false" << std::endl; + stream << space3 << "" << std::endl; + stream << space2 << "" << std::endl; + } + + // add timed transitions + for (const auto &trans : timedTransitions) { + stream << space2 << "" << std::endl; + stream << space3 << "" << std::endl; + stream << space4 << "" << trans.getRate() << "" << std::endl; + stream << space3 << "" << std::endl; + stream << space3 << "" << std::endl; + stream << space4 << "true" << std::endl; + stream << space3 << "" << std::endl; + stream << space2 << "" << std::endl; + } + + uint_fast64_t i = 0; + // add arcs for immediate transitions + for (const auto &trans : immediateTransitions) { + // add input arcs + for (auto &placePtr : trans.getInputPlaces()) { + stream << space2 << "getName() << "\" "; + stream << "target=\"" << trans.getName() << "\" "; + stream << ">" << std::endl; + + stream << space3 << "" << std::endl; + stream << space4 << "Default," << trans.getInputArcMultiplicity(*placePtr) << "" << std::endl; + stream << space3 << "" << std::endl; + + stream << space3 << "" << std::endl; + + stream << space2 << "" << std::endl; + } + + // add inhibition arcs + for (auto &placePtr : trans.getInhibitionPlaces()) { + stream << space2 << "getName() << "\" "; + stream << "target=\"" << trans.getName() << "\" "; + stream << ">" << std::endl; + + stream << space3 << "" << std::endl; + stream << space4 << "Default," << trans.getInputArcMultiplicity(*placePtr) << "" << std::endl; + stream << space3 << "" << std::endl; + + stream << space3 << "" << std::endl; + + stream << space2 << "" << std::endl; + } + + // add output arcs + for (auto &placePtr : trans.getOutputPlaces()) { + stream << space2 << "getName() << "\" "; + stream << ">" << std::endl; + + stream << space3 << "" << std::endl; + stream << space4 << "Default," << trans.getInputArcMultiplicity(*placePtr) << "" << std::endl; + stream << space3 << "" << std::endl; + + stream << space3 << "" << std::endl; + + stream << space2 << "" << std::endl; + } + } + + stream << space << "" << std::endl; + stream << "" << std::endl; + } + } +} + + diff --git a/src/storage/gspn/GSPN.h b/src/storage/gspn/GSPN.h new file mode 100644 index 000000000..9a9a301b7 --- /dev/null +++ b/src/storage/gspn/GSPN.h @@ -0,0 +1,173 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "src/storage/gspn/ImmediateTransition.h" +#include "src/storage/gspn/Marking.h" +#include "src/storage/gspn/Place.h" +#include "src/storage/gspn/TimedTransition.h" + +namespace storm { + namespace gspn { + // Stores a GSPN + class GSPN { + public: + static uint64_t timedTransitionIdToTransitionId(uint64_t); + static uint64_t immediateTransitionIdToTransitionId(uint64_t); + static uint64_t transitionIdToTimedTransitionId(uint64_t); + static uint64_t transitionIdToImmediateTransitionId(uint64_t); + + + // Later, the rates and probabilities type should become a template, for now, let it be doubles. + typedef double RateType; + typedef double WeightType; + + + GSPN(std::string const& name, std::vector const& places, std::vector> const& itransitions, std::vector> const& ttransitions); + + /*! + * Returns the number of places in this gspn. + * + * @return The number of places. + */ + uint_fast64_t getNumberOfPlaces() const; + + /*! + * Returns the vector of timed transitions in this gspn. + * + * @return The vector of timed transitions. + */ + std::vector> const& getTimedTransitions() const; + + /*! + * Returns the vector of immediate transitions in this gspn. + * + * @return The vector of immediate tansitions. + */ + std::vector> const& getImmediateTransitions() const; + + /*! + * Returns the places of this gspn + */ + std::vector const& getPlaces() const; + + /* + * Computes the initial marking of the gspn. + * + * @param map The Map determines the number of bits for each place. + * @return The initial Marking + */ + std::shared_ptr getInitialMarking(std::map& numberOfBits, uint_fast64_t const& numberOfTotalBits) const; + + /*! + * Returns the place with the corresponding id. + * + * @param id The ID of the place. + * @return The first element is true if the place was found. + * If the first element is true, then the second element is the wanted place. + * If the first element is false, then the second element is not defined. + */ + storm::gspn::Place const* getPlace(uint64_t id) const; + storm::gspn::Place const* getPlace(std::string const& name) const; + + /*! + * Returns the timed transition with the corresponding id. + * + * @param id The ID of the timed transition. + */ + storm::gspn::TimedTransition const* getTimedTransition(std::string const& id) const; + + /*! + * Returns the immediate transition with the corresponding id. + * + * @param id The ID of the timed transition. + * If the first element is false, then the second element is the nullptr. + */ + storm::gspn::ImmediateTransition const* getImmediateTransition(std::string const& id) const; + + /*! + * Returns the transition with the corresponding id. + * + */ + storm::gspn::Transition const* getTransition(std::string const& id) const; + + /*! + * Write the gspn in a dot(graphviz) configuration. + * + * @param outStream The stream to which the output is written to. + */ + void writeDotToStream(std::ostream& outStream) const; + + /*! + * Set the name of the gspn to the given name. + * + * @param name The new name. + */ + void setName(std::string const& name); + + /*! + * Returns the name of the gspn. + * + * @return The name. + */ + std::string const& getName() const; + + + /** + * Set Capacities according to name->capacity map. + */ + void setCapacities(std::unordered_map const& mapping); + + /*! + * Performe some checks + * - testPlaces() + * - testTransitions() + * + * @return true if no errors are found + */ + bool isValid() const; + // TODO doc + void toPnpro(std::ostream &stream) const; + // TODO doc + void toPnml(std::ostream &stream) const; + private: + storm::gspn::Place* getPlace(uint64_t id); + storm::gspn::Place* getPlace(std::string const& name); + + /*! + * Test + * - if places are unique (ids and names) + * - if the capacity is greater than the number of initial tokens + * + * @return true if no errors found + */ + bool testPlaces() const; + + /*! + * Test + * - if transition have at least on input/inhibitor and one output place + * + * @return true if no errors found + */ + bool testTransitions() const; + + + // set containing all places + std::vector places; + + // set containing all immediate transitions + std::vector> immediateTransitions; + + // set containing all timed transitions + std::vector> timedTransitions; + + + // name of the gspn + std::string name; + }; + } +} \ No newline at end of file diff --git a/src/storage/gspn/GspnBuilder.cpp b/src/storage/gspn/GspnBuilder.cpp new file mode 100644 index 000000000..6391d4720 --- /dev/null +++ b/src/storage/gspn/GspnBuilder.cpp @@ -0,0 +1,134 @@ +#include +#include "GspnBuilder.h" + +#include "src/utility/macros.h" +#include "src/exceptions/IllegalFunctionCallException.h" +#include "src/exceptions/InvalidArgumentException.h" +#include "Place.h" + +namespace storm { + namespace gspn { + void GspnBuilder::setGspnName(std::string const& name) { + gspnName = name; + } + + uint_fast64_t GspnBuilder::addPlace(int_fast64_t const& capacity, uint_fast64_t const& initialTokens, std::string const& name) { + auto newId = places.size(); + auto place = storm::gspn::Place(newId); + place.setCapacity(capacity); + place.setNumberOfInitialTokens(initialTokens); + places.push_back(place); + return newId; + } + + uint_fast64_t GspnBuilder::addImmediateTransition(uint_fast64_t const& priority, double const& weight, std::string const& name) { + auto trans = storm::gspn::ImmediateTransition(); + auto newId = GSPN::immediateTransitionIdToTransitionId(immediateTransitions.size()); + trans.setName(std::to_string(newId)); + trans.setPriority(priority); + trans.setWeight(weight); + trans.setID(newId); + immediateTransitions.push_back(trans); + return newId; + + } + + uint_fast64_t GspnBuilder::addTimedTransition(uint_fast64_t const &priority, double const &rate, std::string const& name) { + auto trans = storm::gspn::TimedTransition(); + auto newId = GSPN::timedTransitionIdToTransitionId(timedTransitions.size()); + trans.setName(std::to_string(newId)); + trans.setPriority(priority); + trans.setRate(rate); + trans.setID(newId); + timedTransitions.push_back(trans); + return newId; + } + + + void GspnBuilder::addInputArc(uint_fast64_t const &from, uint_fast64_t const &to, + uint_fast64_t const &multiplicity) { + STORM_LOG_THROW(from < places.size(), storm::exceptions::InvalidArgumentException, "No place with id " << from << " known."); + auto place = places.at(from); + getTransition(to).setInputArcMultiplicity(place, multiplicity); + } + + void GspnBuilder::addInputArc(std::string const& from, std::string const& to, uint64_t multiplicity) { + STORM_LOG_THROW(placeNames.count(from) != 0, storm::exceptions::InvalidArgumentException, "Could not find a place with name '" << from << "'"); + STORM_LOG_THROW(transitionNames.count(to) != 0, storm::exceptions::InvalidArgumentException, "Could not find a transition with name << '" << to << "'"); + addInputArc(placeNames.at(from), transitionNames.at(to)); + } + + void GspnBuilder::addInhibitionArc(uint_fast64_t const& from, uint_fast64_t const& to, uint_fast64_t const& multiplicity) { + STORM_LOG_THROW(from < places.size(), storm::exceptions::InvalidArgumentException, "No place with id " << from << " known."); + auto place = places.at(from); + + getTransition(to).setInhibitionArcMultiplicity(place, multiplicity); + } + + void GspnBuilder::addInhibitionArc(std::string const& from, std::string const& to, uint64_t multiplicity) { + STORM_LOG_THROW(placeNames.count(from) != 0, storm::exceptions::InvalidArgumentException, "Could not find a place with name '" << from << "'"); + STORM_LOG_THROW(transitionNames.count(to) != 0, storm::exceptions::InvalidArgumentException, "Could not find a transition with name << '" << to << "'"); + addInhibitionArc(placeNames.at(from), transitionNames.at(to)); + } + + void GspnBuilder::addOutputArc(uint_fast64_t const& from, uint_fast64_t const& to, uint_fast64_t const& multiplicity) { + STORM_LOG_THROW(to < places.size(), storm::exceptions::InvalidArgumentException, "No place with id " << to << " known."); + auto place = places.at(to); + getTransition(from).setOutputArcMultiplicity(place, multiplicity); + } + + void GspnBuilder::addOutputArc(std::string const& from, std::string const& to, uint64_t multiplicity) { + STORM_LOG_THROW(placeNames.count(to) != 0, storm::exceptions::InvalidArgumentException, "Could not find a place with name '" << to << "'"); + STORM_LOG_THROW(transitionNames.count(from) != 0, storm::exceptions::InvalidArgumentException, "Could not find a transition with name << '" << from << "'"); + addOutputArc(transitionNames.at(from), placeNames.at(to)); + } + + Transition& GspnBuilder::getTransition(uint64_t id) { + if (isTimedTransitionId(id)) { + return timedTransitions.at(id); + } else if(isImmediateTransitionId(id)) { + return immediateTransitions.at(id); + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "No transitition with id '" << id << "' known."); + } + } + + void GspnBuilder::addNormalArc(std::string const& from, std::string const& to, uint64_t multiplicity) { + if (placeNames.count(from) > 0 && transitionNames.count(to) > 0) { + addInputArc(placeNames.at(from), transitionNames.at(to), multiplicity); + } else if (transitionNames.count(from) > 0 && placeNames.count(to) > 0) { + addOutputArc(transitionNames.at(from), placeNames.at(to), multiplicity); + } else { + // No suitable combination. Provide error message: + if (placeNames.count(from) > 0) { + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expected a transition with name " << to << " for arc from '" << from << "' to '" << to << "'."); + } + if (transitionNames.count(from) > 0) { + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expected a place named " << to << " for arc from '" << from << "' to '" << to << "'."); + } + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expected a place named " << from << " for arc from '" << from << "' to '" << to << "'."); + + } + } + + bool GspnBuilder::isTimedTransitionId(uint64_t tid) const { + if (tid >> 63) { + return GSPN::transitionIdToTimedTransitionId(tid) < timedTransitions.size(); + } + return false; + } + + bool GspnBuilder::isImmediateTransitionId(uint64_t tid) const { + if (tid >> 63) { + return false; + } + return GSPN::transitionIdToImmediateTransitionId(tid) < immediateTransitions.size(); + } + + + + storm::gspn::GSPN* GspnBuilder::buildGspn() const { + return new GSPN(gspnName, places, immediateTransitions, timedTransitions); + } + } +} \ No newline at end of file diff --git a/src/storage/gspn/GspnBuilder.h b/src/storage/gspn/GspnBuilder.h new file mode 100644 index 000000000..59f098a82 --- /dev/null +++ b/src/storage/gspn/GspnBuilder.h @@ -0,0 +1,116 @@ +#pragma once + +#include +#include +#include + +#include "GSPN.h" + +namespace storm { + namespace gspn { + class GspnBuilder { + public: + typedef double RateType; + typedef double WeightType; + + /** + * Set GSPN name + */ + void setGspnName(std::string const& name); + + /** + * Add a place to the gspn. + * @param id The id must be unique for the gspn. + * @param name The name must be unique for the gspn. + * @param capacity The capacity is the limit of tokens in the place. + * A capacity of -1 indicates an unbounded place. + * @param initialTokens The number of inital tokens in the place. + */ + uint_fast64_t addPlace(int_fast64_t const& capacity = 1, uint_fast64_t const& initialTokens = 0, std::string const& name = ""); + + /** + * Adds an immediate transition to the gspn. + * @param id The id must be unique for the gspn. + * @param priority The priority for the transtion. + * @param weight The weight for the transition. + */ + uint_fast64_t addImmediateTransition(uint_fast64_t const& priority = 0, WeightType const& weight = 0, std::string const& name = ""); + + /** + * Adds an timed transition to the gspn. + * @param id The name id be unique for the gspn. + * @param priority The priority for the transtion. + * @param weight The weight for the transition. + */ + uint_fast64_t addTimedTransition(uint_fast64_t const &priority, RateType const& rate, std::string const& name = ""); + + /** + * Adds an new input arc from a place to an transition. + * @param from The place from which the arc is originating. + * @param to The transtion to which the arc goes to. + * @param multiplicity The multiplicity of the arc. + */ + void addInputArc(uint_fast64_t const &from, uint_fast64_t const &to, uint_fast64_t const &multiplicity = 1); + + void addInputArc(std::string const& from, std::string const& to, uint64_t multiplicity = 1); + /** + * Adds an new input arc from a place to an transition. + * @param from The place from which the arc is originating. + * @param to The transtion to which the arc goes to. + * @param multiplicity The multiplicity of the arc. + */ + void addInhibitionArc(uint_fast64_t const& from, uint_fast64_t const& to, uint_fast64_t const& multiplicity = 1); + + void addInhibitionArc(std::string const& from, std::string const& to, uint64_t multiplicity = 1); + + /** + * Adds an new input arc from a place to an transition. + * @param from The place from which the arc is originating. + * @param to The transtion to which the arc goes to. + * @param multiplicity The multiplicity of the arc. + */ + void addOutputArc(uint_fast64_t const& from, uint_fast64_t const& to, uint_fast64_t const& multiplicity = 1); + + void addOutputArc(std::string const& from, std::string const& to, uint64_t multiplicity = 1); + + + /** + * Adds an arc from a named element to a named element. + * Can be both input or output arc, but not an inhibition arc. + * Convenience function for textual format parsers. + * + * @param from Source element in the GSPN from where this arc starts + * @param to Target element in the GSPN where this arc ends + * @param multiplicity (Optional) multiplicity for the arc, default = 1 + */ + void addNormalArc(std::string const& from, std::string const& to, uint64_t multiplicity = 1); + + + + /** + * + * @return The gspn which is constructed by the builder. + */ + storm::gspn::GSPN* buildGspn() const; + private: + bool isImmediateTransitionId(uint64_t) const; + bool isTimedTransitionId(uint64_t) const; + Transition& getTransition(uint64_t); + + std::map placeNames; + std::map transitionNames; + + std::string gspnName = "_gspn_"; + + // set containing all immediate transitions + std::vector> immediateTransitions; + + // set containing all timed transitions + std::vector> timedTransitions; + + // set containing all places + std::vector places; + }; + } +} + diff --git a/src/storage/gspn/ImmediateTransition.h b/src/storage/gspn/ImmediateTransition.h new file mode 100644 index 000000000..2da05f171 --- /dev/null +++ b/src/storage/gspn/ImmediateTransition.h @@ -0,0 +1,43 @@ +#ifndef STORM_STORAGE_GSPN_IMMEDIATETRANSITION_H_ +#define STORM_STORAGE_GSPN_IMMEDIATETRANSITION_H_ + +#include "src/storage/gspn/Transition.h" +#include "src/utility/constants.h" + +namespace storm { + namespace gspn { + template + class ImmediateTransition : public storm::gspn::Transition { + public: + /*! + * Sets the weight of this transition to the given value. + * + * @param weight The new weight for this transition. + */ + void setWeight(WeightType const& weight) { + this->weight = weight; + } + + /*! + * Retrieves the weight of this transition. + * + * @return The weight of this transition. + */ + WeightType getWeight() const { + return this->weight; + } + + /** + * True iff no weight is attached. + */ + bool noWeightAttached() const { + return storm::utility::isZero(weight); + } + private: + // the weight of the transition. Must be positive, if zero, then no weight is attached. + WeightType weight; + }; + } +} + +#endif //STORM_STORAGE_GSPN_IMMEDIATETRANSITION_H_ diff --git a/src/storage/gspn/Marking.cpp b/src/storage/gspn/Marking.cpp new file mode 100644 index 000000000..7ea71476e --- /dev/null +++ b/src/storage/gspn/Marking.cpp @@ -0,0 +1,59 @@ +#include +#include "src/storage/gspn/Marking.h" + +namespace storm { + namespace gspn { + Marking::Marking(uint_fast64_t const& numberOfPlaces, std::map const& numberOfBits, uint_fast64_t const& numberOfTotalBits) { + this->numberOfPlaces = numberOfPlaces; + this->numberOfBits = numberOfBits; + this->marking = storm::storage::BitVector(numberOfTotalBits); + } + + Marking::Marking(uint_fast64_t const& numberOfPlaces, std::map const& numberOfBits, storm::storage::BitVector const& bitvector) { + this->numberOfPlaces = numberOfPlaces; + this->numberOfBits = numberOfBits; + this->marking = bitvector; + } + + uint_fast64_t Marking::getNumberOfPlaces() const { + return this->numberOfPlaces; + } + + void Marking::setNumberOfTokensAt(uint_fast64_t const& place, uint_fast64_t const& numberOfTokens) { + uint_fast64_t index = 0; + for (uint_fast64_t i=0; i < place; ++i) { + index += numberOfBits[i]; + } + marking.setFromInt(index, numberOfBits[place], numberOfTokens); + } + + uint_fast64_t Marking::getNumberOfTokensAt(uint_fast64_t const& place) const { + uint_fast64_t index = 0; + for (uint_fast64_t i=0; i < place; ++i) { + index += numberOfBits.at(i); + } + return marking.getAsInt(index, numberOfBits.at(place)); + } + + std::shared_ptr Marking::getBitVector() const { + auto result = std::make_shared(); + *result = storm::storage::BitVector(marking); + return result; + } + + bool Marking::operator==(const Marking& other) const { + if (getNumberOfPlaces() != other.getNumberOfPlaces()) { + return false; + } + if (&numberOfBits == &other.numberOfBits) { + return marking == other.marking; + } + for (uint_fast64_t i=0; i < getNumberOfPlaces(); ++i) { + if (getNumberOfTokensAt(i) != other.getNumberOfTokensAt(i)) { + return false; + } + } + return true; + } + } +} \ No newline at end of file diff --git a/src/storage/gspn/Marking.h b/src/storage/gspn/Marking.h new file mode 100644 index 000000000..04d6ac08e --- /dev/null +++ b/src/storage/gspn/Marking.h @@ -0,0 +1,80 @@ +#ifndef STORM_STORAGE_GSPN_MARKING_H_ +#define STORM_STORAGE_GSPN_MARKING_H_ + +#include +#include +#include +#include "src/storage/BitVector.h" + +namespace storm { + namespace gspn { + class Marking { + public: + + /*! + * Creates an empty marking (at all places contain 0 tokens). + * + * @param numberOfPlaces The number of places of the gspn. + * @param numberOfBits The number of bits used to store the number of tokens for each place + * @param numberOfTotalBits The length of the internal bitvector + */ + Marking(uint_fast64_t const& numberOfPlaces, std::map const& numberOfBits, uint_fast64_t const& numberOfTotalBits); + + /*! + * Create the marking described by the bitvector. + * + * @param numberOfPlaces The number of places of the gspn. + * @param numberOfBits The number of bits used to store the number of tokens for each place + * @param bitvector The bitvector encoding the marking. + */ + Marking(uint_fast64_t const&numberOfPlaces, std::map const& numberOfBits, storm::storage::BitVector const& bitvector); + + /*! + * Retrieves the number of places for which the tokens are stored. + * + * @return The number of places. + */ + uint_fast64_t getNumberOfPlaces() const; + + /*! + * Set the number of tokens for the given place to the given amount. + * + * @param place Place must be a valid place for which the number of tokens is changed. + * @param numberOfTokens The new number of tokens at the place. + */ + void setNumberOfTokensAt(uint_fast64_t const& place, uint_fast64_t const& numberOfTokens); + + /*! + * Get the number of tokens for the given place. + * + * @param place The place from which the tokens are counted. + * @return The number of tokens at the place. + */ + uint_fast64_t getNumberOfTokensAt(uint_fast64_t const& place) const; + + /*! + * Returns a copy of the bitvector + * + * @return The bitvector which encodes the marking + */ + std::shared_ptr getBitVector() const; + + /*! + * Overload equality operator + */ + bool operator==(const Marking& other) const; + private: + // the maximal number of places in the gspn + uint_fast64_t numberOfPlaces; + + // number of bits for each place + std::map numberOfBits; + + // contains the information of the marking + storm::storage::BitVector marking; + }; + } +} + + +#endif //STORM_STORAGE_GSPN_MARKING_H_ diff --git a/src/storage/gspn/Place.cpp b/src/storage/gspn/Place.cpp new file mode 100644 index 000000000..84f426231 --- /dev/null +++ b/src/storage/gspn/Place.cpp @@ -0,0 +1,44 @@ +#include "Place.h" + +#include "src/exceptions/IllegalArgumentValueException.h" +#include "src/utility/macros.h" + +namespace storm { + namespace gspn { + Place::Place(uint64_t id) : id(id) { + + } + + void Place::setName(std::string const& name) { + this->name = name; + } + + std::string Place::getName() const { + return this->name; + } + + uint64_t Place::getID() const { + return this->id; + } + + void Place::setNumberOfInitialTokens(uint64_t tokens) { + this->numberOfInitialTokens = tokens; + } + + uint64_t Place::getNumberOfInitialTokens() const { + return this->numberOfInitialTokens; + } + + void Place::setCapacity(uint64_t cap) { + this->capacity = cap; + } + + uint64_t Place::getCapacity() const { + return capacity.get(); + } + + bool Place::hasRestrictedCapacity() const { + return capacity != boost::none; + } + } +} \ No newline at end of file diff --git a/src/storage/gspn/Place.h b/src/storage/gspn/Place.h new file mode 100644 index 000000000..e995f6a93 --- /dev/null +++ b/src/storage/gspn/Place.h @@ -0,0 +1,90 @@ +#ifndef STORM_STORAGE_GSPN_PLACE_H_ +#define STORM_STORAGE_GSPN_PLACE_H_ + +#include +#include "boost/optional.hpp" + +namespace storm { + namespace gspn { + /*! + * This class provides methods to store and retrieve data for a place in a gspn. + */ + class Place { + public: + Place(uint64_t id); + + /*! + * Sets the name of this place. The name is not used to identify a place (and therefore do not have to be unique). + * Some input and output formats use the name to identify a place. If you want to use the export or import + * features make sure that the names a unique if necessary. + * + * @param name The new name for the place. + */ + void setName(std::string const& name); + + /*! + * Returns the name of this place. + * + * @return The name of this place. + */ + std::string getName() const; + + /*! + * Returns the id of this place. + * + * @return The id of this place. + */ + uint64_t getID() const; + + /*! + * Sets the number of initial tokens of this place. + * + * @param tokens The number of initial tokens. + */ + void setNumberOfInitialTokens(uint64_t tokens); + + /*! + * Returns the number of initial tokens of this place. + * + * @return The number of initial tokens of this place. + */ + uint64_t getNumberOfInitialTokens() const; + + /*! + * Sets the capacity of tokens of this place. + * + * @param capacity The capacity of this place. A non-negative number represents the capacity. + * The value -1 indicates that the capacity is not set. + */ + void setCapacity(uint64_t capacity); + + /*! + * Returns the capacity of tokens of this place. + * + * @return The capacity of the place. Only valid if the capacity is restricted. + */ + uint64_t getCapacity() const; + + /*! + * + */ + bool hasRestrictedCapacity() const; + private: + // contains the number of initial tokens of this place + uint64_t numberOfInitialTokens = 0; + + // unique id (is used to refer to a specific place in a bitvector) + uint64_t id = 0; + + // name which is used in pnml file + std::string name; + + // capacity of this place + // -1 indicates that the capacity is not set + // other non-negative values represents the capacity + boost::optional capacity = boost::none; + }; + } +} + +#endif //STORM_STORAGE_GSPN_PLACE_H_ diff --git a/src/storage/gspn/TimedTransition.h b/src/storage/gspn/TimedTransition.h new file mode 100644 index 000000000..886fa2e2d --- /dev/null +++ b/src/storage/gspn/TimedTransition.h @@ -0,0 +1,36 @@ +#ifndef STORM_STORAGE_GSPN_TIMEDTRANSITION_H_ +#define STORM_STORAGE_GSPN_TIMEDTRANSITION_H_ + +#include "src/storage/gspn/Transition.h" + +namespace storm { + namespace gspn { + template + class TimedTransition : public storm::gspn::Transition { + public: + /*! + * Sets the rate of this transition to the given value. + * + * @param rate The new rate for this transition. + */ + void setRate(RateType const& rate) { + this->rate = rate; + } + + /*! + * Retrieves the rate of this transition. + * + * @return The rate of this transition. + */ + RateType getRate() const { + return this->rate; + } + + private: + // the rate of the transition + RateType rate; + }; + } +} + +#endif //STORM_STORAGE_GSPN_TIMEDTRANSITION_H_ diff --git a/src/storage/gspn/Transition.cpp b/src/storage/gspn/Transition.cpp new file mode 100644 index 000000000..c9f2fb823 --- /dev/null +++ b/src/storage/gspn/Transition.cpp @@ -0,0 +1,180 @@ +#include "src/storage/gspn/Transition.h" + +#include "src/utility/macros.h" + +namespace storm { + namespace gspn { + + void Transition::setInputArcMultiplicity(storm::gspn::Place const& place, uint_fast64_t multiplicity) { + auto ptr = std::make_shared(place); + inputMultiplicities[ptr->getID()] = multiplicity; + inputPlaces.push_back(ptr); + } + + bool Transition::removeInputArc(storm::gspn::Place const& place) { + if (existsInputArc(place)) { + auto ptr = std::make_shared(place); + inputMultiplicities.erase(ptr->getID()); + inputPlaces.erase(std::find(inputPlaces.begin(), inputPlaces.end(), ptr)); + return true; + } else { + return false; + } + } + + bool Transition::existsInputArc(storm::gspn::Place const& place) const { + auto ptr = std::make_shared(place); + return inputMultiplicities.end() != inputMultiplicities.find(ptr->getID()); + } + + void Transition::setOutputArcMultiplicity(storm::gspn::Place const& place, uint_fast64_t multiplicity) { + auto ptr = std::make_shared(place); + outputMultiplicities[ptr->getID()] = multiplicity; + outputPlaces.push_back(ptr); + } + + bool Transition::removeOutputArc(storm::gspn::Place const& place) { + if (existsOutputArc(place)) { + auto ptr = std::make_shared(place); + outputMultiplicities.erase(ptr->getID()); + outputPlaces.erase(std::find(outputPlaces.begin(), outputPlaces.end(), ptr)); + return true; + } else { + return false; + } + } + + bool Transition::existsOutputArc(storm::gspn::Place const& place) const { + auto ptr = std::make_shared(place); + return outputMultiplicities.end() != outputMultiplicities.find(ptr->getID()); + } + + void Transition::setInhibitionArcMultiplicity(storm::gspn::Place const& place, + uint_fast64_t multiplicity) { + auto ptr = std::make_shared(place); + inhibitionMultiplicities[ptr->getID()] = multiplicity; + inhibitionPlaces.push_back(ptr); + } + + bool Transition::removeInhibitionArc(storm::gspn::Place const& place) { + if (existsInhibitionArc(place)) { + auto ptr = std::make_shared(place); + inhibitionMultiplicities.erase(ptr->getID()); + inhibitionPlaces.erase(std::find(inhibitionPlaces.begin(), inhibitionPlaces.end(), ptr)); + return true; + } else { + return false; + } + } + + bool Transition::existsInhibitionArc(storm::gspn::Place const& place) const { + auto ptr = std::make_shared(place); + return inhibitionMultiplicities.end() != inhibitionMultiplicities.find(ptr->getID()); + } + + bool Transition::isEnabled(storm::gspn::Marking const& marking) const { + auto inputIterator = inputMultiplicities.cbegin(); + while (inputIterator != inputMultiplicities.cend()) { + if (marking.getNumberOfTokensAt(inputIterator->first) < inputIterator->second) { + return false; + } + + ++inputIterator; + } + + auto inhibitionIterator = inhibitionMultiplicities.cbegin(); + while (inhibitionIterator != inhibitionMultiplicities.cend()) { + if (marking.getNumberOfTokensAt(inhibitionIterator->first) >= inhibitionIterator->second) { + return false; + } + + ++inhibitionIterator; + } + + for (auto &placePtr : getOutputPlaces()) { + if (placePtr->hasRestrictedCapacity()) { + if (marking.getNumberOfTokensAt(placePtr->getID()) + getOutputArcMultiplicity(*placePtr) > placePtr->getCapacity()) { + return false; + } + } + } + + return true; + } + + storm::gspn::Marking Transition::fire(storm::gspn::Marking const& marking) const { + storm::gspn::Marking newMarking(marking); + + auto inputIterator = inputMultiplicities.cbegin(); + while (inputIterator != inputMultiplicities.cend()) { + newMarking.setNumberOfTokensAt(inputIterator->first, + newMarking.getNumberOfTokensAt(inputIterator->first) - inputIterator->second); + ++inputIterator; + } + + auto outputIterator = outputMultiplicities.cbegin(); + while (outputIterator != outputMultiplicities.cend()) { + newMarking.setNumberOfTokensAt(outputIterator->first, + newMarking.getNumberOfTokensAt(outputIterator->first) + outputIterator->second); + ++outputIterator; + } + + return newMarking; + } + + void Transition::setName(std::string const& name) { + this->name = name; + } + + std::string const& Transition::getName() const { + return this->name; + } + + const std::vector> &Transition::getInputPlaces() const { + return inputPlaces; + } + + const std::vector> &Transition::getOutputPlaces() const { + return outputPlaces; + } + + const std::vector> &Transition::getInhibitionPlaces() const { + return inhibitionPlaces; + } + + uint_fast64_t Transition::getInputArcMultiplicity(storm::gspn::Place const& place) const { + if (existsInputArc(place)) { + auto ptr = std::make_shared(place); + return inputMultiplicities.at(ptr->getID()); + } else { + return 0; + } + } + + uint_fast64_t Transition::getInhibitionArcMultiplicity(storm::gspn::Place const& place) const { + if (existsInhibitionArc(place)) { + auto ptr = std::make_shared(place); + return inhibitionMultiplicities.at(ptr->getID()); + } else { + return 0; + } + } + + uint_fast64_t Transition::getOutputArcMultiplicity(storm::gspn::Place const& place) const { + if (existsOutputArc(place)) { + auto ptr = std::make_shared(place); + return outputMultiplicities.at(ptr->getID()); + } else { + return 0; + } + } + + void Transition::setPriority(uint_fast64_t const& priority) { + this->priority = priority; + } + + uint_fast64_t Transition::getPriority() const { + return this->priority; + } + } +} diff --git a/src/storage/gspn/Transition.h b/src/storage/gspn/Transition.h new file mode 100644 index 000000000..fb1247e0e --- /dev/null +++ b/src/storage/gspn/Transition.h @@ -0,0 +1,222 @@ +#ifndef STORM_STORAGE_GSPN_TRANSITION_H_ +#define STORM_STORAGE_GSPN_TRANSITION_H_ + +#include +#include +#include "src/storage/gspn/Marking.h" +#include "src/storage/gspn/Place.h" + +namespace storm { + namespace gspn { + /*! + * This class represents a transition in a gspn. + */ + class Transition { + public: + /*! + * Set the multiplicity of the input arc originating from the place. + * If the arc already exists, the former multiplicity is overwritten. + * If the arc does not yet exists, it is created. + * + * @param place The place connected by an input arc. + * @param multiplicity The multiplicity of the specified arc. + */ + void setInputArcMultiplicity(storm::gspn::Place const& place, uint_fast64_t multiplicity); + + /*! + * Removes an input arc connected to a given place. + * + * @param place The place from which the input arc is originating. + * @return True if the arc existed. + */ + bool removeInputArc(storm::gspn::Place const& place); + + /*! + * Checks whether the given place is connected to this transition via an input arc. + * + * @param place The place which is going to be checked. + * @return True if the place is connected via an input arc. + */ + bool existsInputArc(storm::gspn::Place const& place) const; + + /*! + * Set the multiplicity of the output arc going to the place. + * If the arc already exists, the former multiplicity is overwritten. + * If the arc does not yet exists, it is created. + * + * @param place The place connected by an output arc. + * @param multiplicity The multiplicity of the specified arc. + */ + void setOutputArcMultiplicity(storm::gspn::Place const& place, uint_fast64_t multiplicity); + + /*! + * Removes an output arc connected to a given place. + * + * @param place The place from which the output arc is leading to. + * @return True if the arc existed. + */ + bool removeOutputArc(storm::gspn::Place const& place); + + /*! + * Checks whether the given place is connected to this transition via an output arc. + * + * @param place The place which is going to be checked. + * @return True if the place is connected via an output arc. + */ + bool existsOutputArc(storm::gspn::Place const& place) const; + + /*! + * Set the multiplicity of the inhibition arc originating from the place. + * If the arc already exists, the former multiplicity is overwritten. + * If the arc does not yet exists, it is created. + * + * @param place The place connected by an inhibition arc. + * @param multiplicity The multiplicity of the specified arc. + */ + void setInhibitionArcMultiplicity(storm::gspn::Place const& place, uint_fast64_t multiplicity); + + /*! + * Removes an inhibition arc connected to a given place. + * + * @param place The place from which the inhibition arc is originating. + * @return True if the arc existed. + */ + bool removeInhibitionArc(storm::gspn::Place const& place); + + /*! + * Checks whether the given place is connected to this transition via an inhibition arc. + * + * @param place The place which is going to be checked. + * @return True if the place is connected via an inhibition arc. + */ + bool existsInhibitionArc(storm::gspn::Place const& place) const; + + /*! + * Checks if the given marking enables the transition. + * + * @return True if the transition is enabled. + */ + bool isEnabled(storm::gspn::Marking const& marking) const; + + /*! + * Fire the transition if possible. + * + * @param marking The current marking before the transition is fired. + * @return The marking after the transition was fired. + */ + storm::gspn::Marking fire(storm::gspn::Marking const& marking) const; + + /*! + * Set the name of the transition. + * + * @param name New name of the transition. + */ + void setName(std::string const& name); + + /*! + * Returns the name of the transition. + * + * @return The name of the transition. + */ + std::string const& getName() const; + + /*! + * Returns a list of places which are connected via a input arc. + * @return + */ + std::vector> const& getInputPlaces() const; + + /*! + * Returns a list of places which are connected via a output arc. + * @return + */ + std::vector> const& getOutputPlaces() const; + + /*! + * Returns a list of places which are connected via a inhibition arc. + * @return + */ + std::vector> const& getInhibitionPlaces() const; + + /*! + * Returns the corresponding multiplicity. + * + * @param place connected to this transition by an input arc + * @return cardinality or 0 if the arc does not exists + */ + uint_fast64_t getInputArcMultiplicity(storm::gspn::Place const& place) const; + + /*! + * Returns the corresponding multiplicity. + * + * @param place connected to this transition by an inhibition arc + * @return cardinality or 0 if the arc does not exists + */ + uint_fast64_t getInhibitionArcMultiplicity(storm::gspn::Place const& place) const; + + /*! + * Returns the corresponding multiplicity. + * + * @param place connected to this transition by an output arc + * @return cardinality or 0 if the arc does not exists + */ + uint_fast64_t getOutputArcMultiplicity(storm::gspn::Place const& place) const; + + /*! + * Sets the priority of this transtion. + * + * @param priority The new priority. + */ + void setPriority(uint_fast64_t const& priority); + + /*! + * Returns the priority of this transition. + * + * @return The priority. + */ + uint_fast64_t getPriority() const; + + void setID(uint_fast64_t const& id) { + this->id = id; + } + private: + /*! + * Comparator which defines an total order on places. + * A place is less than another place if the id is less than the id from the other place. + */ + struct PlaceComparator { + bool operator()(uint_fast64_t const& lhs, uint_fast64_t const& rhs) const { + return lhs < rhs; + } + }; + + // maps place ids connected to this transition with an input arc to the corresponding multiplicity + std::map inputMultiplicities; + + // maps place ids connected to this transition with an output arc to the corresponding multiplicities + std::map outputMultiplicities; + + // maps place ids connected to this transition with an inhibition arc to the corresponding multiplicity + std::map inhibitionMultiplicities; + + // name of the transition + std::string name; + + // list of all places connected to this transition via an input arc + std::vector> inputPlaces; + + // list of all places connected to this transition via an output arc + std::vector> outputPlaces; + + // list of all places connected to this transition via an inhibition arc + std::vector> inhibitionPlaces; + + // priority of this transition + uint_fast64_t priority = 0; + + uint_fast64_t id; + }; + } +} + +#endif //STORM_STORAGE_GSPN_TRANSITION_H_ \ No newline at end of file diff --git a/src/storage/jani/Action.cpp b/src/storage/jani/Action.cpp index 818a11a84..da1d652eb 100644 --- a/src/storage/jani/Action.cpp +++ b/src/storage/jani/Action.cpp @@ -9,6 +9,5 @@ namespace storm { std::string const& Action::getName() const { return this->name; } - } } \ No newline at end of file diff --git a/src/storage/jani/Action.h b/src/storage/jani/Action.h index 5b9b2567f..aa264c4b5 100644 --- a/src/storage/jani/Action.h +++ b/src/storage/jani/Action.h @@ -15,7 +15,6 @@ namespace storm { * Returns the name of the location. */ std::string const& getName() const; - private: /// The name of the action. std::string name; diff --git a/src/storage/jani/Assignment.cpp b/src/storage/jani/Assignment.cpp index cea88f23e..ddf65afe4 100644 --- a/src/storage/jani/Assignment.cpp +++ b/src/storage/jani/Assignment.cpp @@ -1,14 +1,26 @@ #include "src/storage/jani/Assignment.h" +#include "src/utility/macros.h" +#include "src/exceptions/NotImplementedException.h" + namespace storm { namespace jani { - Assignment::Assignment(storm::expressions::Variable const& variable, storm::expressions::Expression const& expression) : variable(variable), expression(expression) { - // Intentionally left empty. + Assignment::Assignment(storm::jani::Variable const& variable, storm::expressions::Expression const& expression, uint64_t level) : variable(variable), expression(expression), level(level) { + STORM_LOG_THROW(level == 0, storm::exceptions::NotImplementedException, "Assignment levels other than 0 are currently not supported."); + } + + bool Assignment::operator==(Assignment const& other) const { + // FIXME: the level is currently ignored as we do not support it + return this->isTransient() == other.isTransient() && this->getExpressionVariable() == other.getExpressionVariable() && this->getAssignedExpression().isSyntacticallyEqual(other.getAssignedExpression()); + } + + storm::jani::Variable const& Assignment::getVariable() const { + return variable.get(); } storm::expressions::Variable const& Assignment::getExpressionVariable() const { - return variable; + return variable.get().getExpressionVariable(); } storm::expressions::Expression const& Assignment::getAssignedExpression() const { @@ -19,10 +31,37 @@ namespace storm { this->expression = expression; } + bool Assignment::isTransient() const { + return this->variable.get().isTransient(); + } + + void Assignment::substitute(std::map const& substitution) { + this->setAssignedExpression(this->getAssignedExpression().substitute(substitution)); + } + + uint64_t Assignment::getLevel() const { + return level; + } + std::ostream& operator<<(std::ostream& stream, Assignment const& assignment) { - stream << assignment.getExpressionVariable().getName() << " := " << assignment.getAssignedExpression(); + stream << assignment.getVariable().getName() << " := " << assignment.getAssignedExpression(); return stream; } + bool AssignmentPartialOrderByVariable::operator()(Assignment const& left, Assignment const& right) const { + return left.getExpressionVariable() < right.getExpressionVariable(); + } + + bool AssignmentPartialOrderByVariable::operator()(Assignment const& left, std::shared_ptr const& right) const { + return left.getExpressionVariable() < right->getExpressionVariable(); + } + + bool AssignmentPartialOrderByVariable::operator()(std::shared_ptr const& left, std::shared_ptr const& right) const { + return left->getExpressionVariable() < right->getExpressionVariable(); + } + + bool AssignmentPartialOrderByVariable::operator()(std::shared_ptr const& left, Assignment const& right) const { + return left->getExpressionVariable() < right.getExpressionVariable(); + } } } \ No newline at end of file diff --git a/src/storage/jani/Assignment.h b/src/storage/jani/Assignment.h index 58c078d20..030c1f68f 100644 --- a/src/storage/jani/Assignment.h +++ b/src/storage/jani/Assignment.h @@ -1,6 +1,8 @@ #pragma once -#include "src/storage/expressions/Variable.h" +#include + +#include "src/storage/jani/Variable.h" #include "src/storage/expressions/Expression.h" namespace storm { @@ -11,8 +13,15 @@ namespace storm { /*! * Creates an assignment of the given expression to the given variable. */ - Assignment(storm::expressions::Variable const& variable, storm::expressions::Expression const& expression); + Assignment(storm::jani::Variable const& variable, storm::expressions::Expression const& expression, uint64_t index = 0); + + bool operator==(Assignment const& other) const; + /*! + * Retrieves the expression variable that is written in this assignment. + */ + storm::jani::Variable const& getVariable() const; + /*! * Retrieves the expression variable that is written in this assignment. */ @@ -28,15 +37,43 @@ namespace storm { */ void setAssignedExpression(storm::expressions::Expression const& expression); + /*! + * Substitutes all variables in all expressions according to the given substitution. + */ + void substitute(std::map const& substitution); + + /** + * Retrieves whether the assignment assigns to a transient variable. + */ + bool isTransient() const; + + /*! + * Retrieves the level of the assignment. + */ + uint64_t getLevel() const; + friend std::ostream& operator<<(std::ostream& stream, Assignment const& assignment); private: // The variable being assigned. - storm::expressions::Variable variable; + std::reference_wrapper variable; // The expression that is being assigned to the variable. storm::expressions::Expression expression; + + // The level of the assignment. + uint64_t level; }; + /*! + * This functor enables ordering the assignments by variable. Note that this is a partial order. + */ + struct AssignmentPartialOrderByVariable { + bool operator()(Assignment const& left, Assignment const& right) const; + bool operator()(Assignment const& left, std::shared_ptr const& right) const; + bool operator()(std::shared_ptr const& left, std::shared_ptr const& right) const; + bool operator()(std::shared_ptr const& left, Assignment const& right) const; + }; + } } \ No newline at end of file diff --git a/src/storage/jani/Automaton.cpp b/src/storage/jani/Automaton.cpp index 0165351be..8ed71acbc 100644 --- a/src/storage/jani/Automaton.cpp +++ b/src/storage/jani/Automaton.cpp @@ -3,6 +3,7 @@ #include "src/utility/macros.h" #include "src/exceptions/WrongFormatException.h" #include "src/exceptions/InvalidArgumentException.h" +#include "src/exceptions/InvalidTypeException.h" namespace storm { namespace jani { @@ -57,17 +58,35 @@ namespace storm { std::string const& Automaton::getName() const { return name; } + + Variable const& Automaton::addVariable(Variable const &variable) { + if (variable.isBooleanVariable()) { + return addVariable(variable.asBooleanVariable()); + } else if (variable.isBoundedIntegerVariable()) { + return addVariable(variable.asBoundedIntegerVariable()); + } else if (variable.isUnboundedIntegerVariable()) { + return addVariable(variable.asUnboundedIntegerVariable()); + } else if (variable.isRealVariable()) { + return addVariable(variable.asRealVariable()); + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidTypeException, "Variable has invalid type."); + } + } - void Automaton::addBooleanVariable(BooleanVariable const& variable) { - variables.addBooleanVariable(variable); + BooleanVariable const& Automaton::addVariable(BooleanVariable const& variable) { + return variables.addVariable(variable); } - void Automaton::addBoundedIntegerVariable(BoundedIntegerVariable const& variable) { - variables.addBoundedIntegerVariable(variable); + BoundedIntegerVariable const& Automaton::addVariable(BoundedIntegerVariable const& variable) { + return variables.addVariable(variable); + } + + UnboundedIntegerVariable const& Automaton::addVariable(UnboundedIntegerVariable const& variable) { + return variables.addVariable(variable); } - void Automaton::addUnboundedIntegerVariable(UnboundedIntegerVariable const& variable) { - variables.addUnboundedIntegerVariable(variable); + RealVariable const& Automaton::addVariable(RealVariable const& variable) { + return variables.addVariable(variable); } VariableSet& Automaton::getVariables() { @@ -78,6 +97,10 @@ namespace storm { return variables; } + bool Automaton::hasTransientVariable() const { + return variables.hasTransientVariable(); + } + bool Automaton::hasLocation(std::string const& name) const { return locationToIndex.find(name) != locationToIndex.end(); } @@ -85,11 +108,19 @@ namespace storm { std::vector const& Automaton::getLocations() const { return locations; } - + + std::vector& Automaton::getLocations() { + return locations; + } + Location const& Automaton::getLocation(uint64_t index) const { return locations[index]; } - + + Location& Automaton::getLocation(uint64_t index) { + return locations[index]; + } + uint64_t Automaton::addLocation(Location const& location) { STORM_LOG_THROW(!this->hasLocation(location.getName()), storm::exceptions::WrongFormatException, "Cannot add location with name '" << location.getName() << "', because a location with this name already exists."); locationToIndex.emplace(location.getName(), locations.size()); @@ -117,6 +148,16 @@ namespace storm { std::set const& Automaton::getInitialLocationIndices() const { return initialLocationIndices; } + + std::map Automaton::buildIdToLocationNameMap() const { + std::map mapping; + uint64_t i = 0; + for(auto const& loc : locations) { + mapping[i] = loc.getName(); + ++i; + } + return mapping; + } Automaton::Edges Automaton::getEdgesFromLocation(std::string const& name) { auto it = locationToIndex.find(name); @@ -268,6 +309,7 @@ namespace storm { actionIndices.insert(edge.getActionIndex()); } + std::vector& Automaton::getEdges() { return edges; } @@ -291,17 +333,55 @@ namespace storm { uint64_t Automaton::getNumberOfEdges() const { return edges.size(); } + + bool Automaton::hasRestrictedInitialStates() const { + if (!hasInitialStatesRestriction()) { + return false; + } + if (getInitialStatesExpression().containsVariables()) { + return true; + } else { + return !getInitialStatesExpression().evaluateAsBool(); + } + } - bool Automaton::hasInitialStatesExpression() const { - return initialStatesExpression.isInitialized(); + bool Automaton::hasInitialStatesRestriction() const { + return initialStatesRestriction.isInitialized(); } - storm::expressions::Expression const& Automaton::getInitialStatesExpression() const { - return initialStatesExpression; + storm::expressions::Expression const& Automaton::getInitialStatesRestriction() const { + return initialStatesRestriction; } - void Automaton::setInitialStatesExpression(storm::expressions::Expression const& initialStatesExpression) { - this->initialStatesExpression = initialStatesExpression; + void Automaton::setInitialStatesRestriction(storm::expressions::Expression const& initialStatesRestriction) { + this->initialStatesRestriction = initialStatesRestriction; + } + + storm::expressions::Expression Automaton::getInitialStatesExpression() const { + storm::expressions::Expression result; + + // Add initial state restriction if there is one. + if (this->hasInitialStatesRestriction()) { + result = this->getInitialStatesRestriction(); + } + + // Add the expressions for all non-transient variables that have initial expressions. + for (auto const& variable : this->getVariables()) { + if (variable.isTransient()) { + continue; + } + + if (variable.hasInitExpression()) { + storm::expressions::Expression newInitExpression = variable.isBooleanVariable() ? storm::expressions::iff(variable.getExpressionVariable(), variable.getInitExpression()) : variable.getExpressionVariable() == variable.getInitExpression(); + if (result.isInitialized()) { + result = result && newInitExpression; + } else { + result = newInitExpression; + } + } + } + + return result; } bool Automaton::hasEdgeLabeledWithActionIndex(uint64_t actionIndex) const { @@ -316,11 +396,70 @@ namespace storm { return result; } + void Automaton::substitute(std::map const& substitution) { + for (auto& variable : this->getVariables().getBoundedIntegerVariables()) { + variable.substitute(substitution); + } + + for (auto& location : this->getLocations()) { + location.substitute(substitution); + } + + this->setInitialStatesRestriction(this->getInitialStatesRestriction().substitute(substitution)); + + for (auto& edge : this->getEdges()) { + edge.substitute(substitution); + } + } + void Automaton::finalize(Model const& containingModel) { for (auto& edge : edges) { edge.finalize(containingModel); } } - + + bool Automaton::containsVariablesOnlyInProbabilitiesOrTransientAssignments(std::set const& variables) const { + // Check initial states restriction expression. + if (this->hasInitialStatesRestriction()) { + if (this->getInitialStatesRestriction().containsVariable(variables)) { + return false; + } + } + + // Check global variable definitions. + if (this->getVariables().containsVariablesInBoundExpressionsOrInitialValues(variables)) { + return false; + } + + // Check edges. + for (auto const& edge : edges) { + if (edge.usesVariablesInNonTransientAssignments(variables)) { + return false; + } + } + + return true; + } + + void Automaton::pushEdgeAssignmentsToDestinations() { + for (auto& edge : edges) { + edge.pushAssignmentsToDestinations(); + } + } + + bool Automaton::hasTransientEdgeDestinationAssignments() const { + for (auto const& edge : this->getEdges()) { + if (edge.hasTransientEdgeDestinationAssignments()) { + return true; + } + } + return false; + } + + void Automaton::liftTransientEdgeDestinationAssignments() { + for (auto& edge : this->getEdges()) { + edge.liftTransientDestinationAssignments(); + } + } } -} \ No newline at end of file +} diff --git a/src/storage/jani/Automaton.h b/src/storage/jani/Automaton.h index 49b5464eb..5ae609853 100644 --- a/src/storage/jani/Automaton.h +++ b/src/storage/jani/Automaton.h @@ -101,19 +101,29 @@ namespace storm { std::string const& getName() const; /*! - * Adds the given boolean variable to this automaton. + * Adds the given variable to this automaton */ - void addBooleanVariable(BooleanVariable const& variable); + Variable const& addVariable(Variable const& variable); + + /*! + * Adds the given Boolean variable to this automaton. + */ + BooleanVariable const& addVariable(BooleanVariable const& variable); /*! * Adds the given bounded integer variable to this automaton. */ - void addBoundedIntegerVariable(BoundedIntegerVariable const& variable); + BoundedIntegerVariable const& addVariable(BoundedIntegerVariable const& variable); /*! * Adds the given unbounded integer variable to this automaton. */ - void addUnboundedIntegerVariable(UnboundedIntegerVariable const& variable); + UnboundedIntegerVariable const& addVariable(UnboundedIntegerVariable const& variable); + + /*! + * Adds the given real variable to this automaton. + */ + RealVariable const& addVariable(RealVariable const& variable); /*! * Retrieves the variables of this automaton. @@ -125,6 +135,11 @@ namespace storm { */ VariableSet const& getVariables() const; + /*! + * Retrieves whether this automaton has a transient variable. + */ + bool hasTransientVariable() const; + /*! * Retrieves whether the automaton has a location with the given name. */ @@ -142,12 +157,22 @@ namespace storm { * Retrieves the locations of the automaton. */ std::vector const& getLocations() const; - + + /*! + * Retrieves the locations of the automaton. + */ + std::vector& getLocations(); + /*! * Retrieves the location with the given index. */ Location const& getLocation(uint64_t index) const; + /*! + * Retrieves the location with the given index. + */ + Location& getLocation(uint64_t index); + /*! * Adds the given location to the automaton. */ @@ -168,6 +193,11 @@ namespace storm { */ std::set const& getInitialLocationIndices() const; + /*! + * Builds a map from ID to Location Name. + */ + std::map buildIdToLocationNameMap() const; + /*! * Retrieves the edges of the location with the given name. */ @@ -227,21 +257,31 @@ namespace storm { * Retrieves the number of edges. */ uint64_t getNumberOfEdges() const; - + /*! - * Retrieves whether there is an expression defining the legal initial values of the automaton's variables. + * Retrieves whether the initial restriction is set and unequal to true */ - bool hasInitialStatesExpression() const; + bool hasRestrictedInitialStates() const; /*! - * Retrieves the expression defining the legal initial values of the automaton's variables. + * Retrieves whether this automaton has an initial states restriction. + */ + bool hasInitialStatesRestriction() const; + + /*! + * Gets the expression restricting the legal initial values of the automaton's variables. + */ + storm::expressions::Expression const& getInitialStatesRestriction() const; + + /*! + * Sets the expression restricting the legal initial values of the automaton's variables. */ - storm::expressions::Expression const& getInitialStatesExpression() const; + void setInitialStatesRestriction(storm::expressions::Expression const& initialStatesRestriction); /*! - * Sets the expression defining the legal initial values of the automaton's variables. + * Retrieves the expression defining the legal initial values of the automaton's variables. */ - void setInitialStatesExpression(storm::expressions::Expression const& initialStatesExpression); + storm::expressions::Expression getInitialStatesExpression() const; /*! * Retrieves whether there is an edge labeled with the action with the given index in this automaton. @@ -253,12 +293,40 @@ namespace storm { */ std::vector getAllRangeExpressions() const; + /*! + * Substitutes all variables in all expressions according to the given substitution. + */ + void substitute(std::map const& substitution); + /*! * Finalizes the building of this automaton. Subsequent changes to the automaton require another call to this * method. Note that this method is invoked by a call to finalize to the containing model. */ void finalize(Model const& containingModel); + /*! + * Retrieves the action indices appearing at some edge of the automaton. + */ + std::set getUsedActionIndices() const; + + /*! + * Checks whether the provided variables only appear in the probability expressions or the expressions being + * assigned in transient assignments. + */ + bool containsVariablesOnlyInProbabilitiesOrTransientAssignments(std::set const& variables) const; + + void pushEdgeAssignmentsToDestinations(); + + /*! + * Retrieves whether there is any transient edge destination assignment in the automaton. + */ + bool hasTransientEdgeDestinationAssignments() const; + + /*! + * Lifts the common edge destination assignments to edge assignments. + */ + void liftTransientEdgeDestinationAssignments(); + private: /// The name of the automaton. std::string name; @@ -282,12 +350,12 @@ namespace storm { /// The indices of the initial locations. std::set initialLocationIndices; - /// The expression characterizing the legal initial values of the variables of the automaton. - storm::expressions::Expression initialStatesExpression; + /// The expression restricting the legal initial values of the variables of the automaton. + storm::expressions::Expression initialStatesRestriction; /// The set of action indices that label some action in this automaton. std::set actionIndices; }; } -} \ No newline at end of file +} diff --git a/src/storage/jani/AutomatonComposition.cpp b/src/storage/jani/AutomatonComposition.cpp index f8ca57212..ae1fe999e 100644 --- a/src/storage/jani/AutomatonComposition.cpp +++ b/src/storage/jani/AutomatonComposition.cpp @@ -3,7 +3,7 @@ namespace storm { namespace jani { - AutomatonComposition::AutomatonComposition(std::string const& name) : name(name) { + AutomatonComposition::AutomatonComposition(std::string const& name, std::set const& inputEnabledActions) : name(name), inputEnabledActions(inputEnabledActions) { // Intentionally left empty. } @@ -15,6 +15,14 @@ namespace storm { return name; } + std::set const& AutomatonComposition::getInputEnabledActions() const { + return inputEnabledActions; + } + + bool AutomatonComposition::isAutomaton() const { + return true; + } + void AutomatonComposition::write(std::ostream& stream) const { stream << name; } diff --git a/src/storage/jani/AutomatonComposition.h b/src/storage/jani/AutomatonComposition.h index 497a85e8e..d1e7604ba 100644 --- a/src/storage/jani/AutomatonComposition.h +++ b/src/storage/jani/AutomatonComposition.h @@ -1,5 +1,7 @@ #pragma once +#include + #include "src/storage/jani/Composition.h" namespace storm { @@ -10,7 +12,7 @@ namespace storm { /*! * Creates a reference to an automaton to be used in a composition. */ - AutomatonComposition(std::string const& name); + AutomatonComposition(std::string const& name, std::set const& inputEnabledActions = {}); /*! * Retrieves the name of the automaton this composition element refers to. @@ -21,10 +23,17 @@ namespace storm { virtual void write(std::ostream& stream) const override; + std::set const& getInputEnabledActions() const; + + bool isAutomaton() const override; + private: - // The name of the automaton this composition element refers to. + /// The name of the automaton this composition element refers to. std::string name; + + /// The names of the actions for which to make this automaton input-enabled. + std::set inputEnabledActions; }; } -} \ No newline at end of file +} diff --git a/src/storage/jani/BooleanVariable.cpp b/src/storage/jani/BooleanVariable.cpp index 8f4f6f106..ca2934f93 100644 --- a/src/storage/jani/BooleanVariable.cpp +++ b/src/storage/jani/BooleanVariable.cpp @@ -7,9 +7,22 @@ namespace storm { // Intentionally left empty. } + BooleanVariable::BooleanVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& initValue, bool transient) : Variable(name, variable, initValue, transient) { + // Intentionally left empty. + } + bool BooleanVariable::isBooleanVariable() const { return true; } + std::shared_ptr makeBooleanVariable(std::string const& name, storm::expressions::Variable const& variable, boost::optional initValue, bool transient) { + if (initValue) { + return std::make_shared(name, variable, initValue.get(), transient); + } else { + assert(!transient); + return std::make_shared(name, variable); + } + } + } } \ No newline at end of file diff --git a/src/storage/jani/BooleanVariable.h b/src/storage/jani/BooleanVariable.h index eacff6fb4..7eeea85fd 100644 --- a/src/storage/jani/BooleanVariable.h +++ b/src/storage/jani/BooleanVariable.h @@ -7,13 +7,24 @@ namespace storm { class BooleanVariable : public Variable { public: + /*! - * Creates a boolean variable. + * Creates a Boolean variable with initial value */ BooleanVariable(std::string const& name, storm::expressions::Variable const& variable); + /*! + * Creates a Boolean variable with initial value + */ + BooleanVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& initialValue, bool transient=false); + virtual bool isBooleanVariable() const override; }; + /** + * Convenience function to call the appropriate constructor and return a shared pointer to the variable. + */ + std::shared_ptr makeBooleanVariable(std::string const& name, storm::expressions::Variable const& variable, boost::optional initValue, bool transient); + } } \ No newline at end of file diff --git a/src/storage/jani/BoundedIntegerVariable.cpp b/src/storage/jani/BoundedIntegerVariable.cpp index 7ef1774fc..1d04c8166 100644 --- a/src/storage/jani/BoundedIntegerVariable.cpp +++ b/src/storage/jani/BoundedIntegerVariable.cpp @@ -1,12 +1,22 @@ #include "src/storage/jani/BoundedIntegerVariable.h" +#include "src/exceptions/NotImplementedException.h" +#include "src/utility/macros.h" namespace storm { namespace jani { - BoundedIntegerVariable::BoundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& lowerBound, storm::expressions::Expression const& upperBound) : Variable(name, variable), lowerBound(lowerBound), upperBound(upperBound) { + BoundedIntegerVariable::BoundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& initValue, bool transient, storm::expressions::Expression const& lowerBound, storm::expressions::Expression const& upperBound) : Variable(name, variable, initValue, transient), lowerBound(lowerBound), upperBound(upperBound) { // Intentionally left empty. } + BoundedIntegerVariable::BoundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& initValue, storm::expressions::Expression const& lowerBound, storm::expressions::Expression const& upperBound) : Variable(name, variable, initValue), lowerBound(lowerBound), upperBound(upperBound) { + // Intentionally left empty. + } + + BoundedIntegerVariable::BoundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& lowerBound, storm::expressions::Expression const& upperBound) : Variable(name, variable), lowerBound(lowerBound), upperBound(upperBound) { + // Intentionally left empty. + } + storm::expressions::Expression const& BoundedIntegerVariable::getLowerBound() const { return lowerBound; } @@ -31,5 +41,20 @@ namespace storm { return true; } + void BoundedIntegerVariable::substitute(std::map const& substitution) { + Variable::substitute(substitution); + this->setLowerBound(this->getLowerBound().substitute(substitution)); + this->setUpperBound(this->getUpperBound().substitute(substitution)); + } + + std::shared_ptr makeBoundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, boost::optional initValue, bool transient, boost::optional lowerBound, boost::optional upperBound) { + STORM_LOG_THROW(lowerBound && upperBound, storm::exceptions::NotImplementedException, "Jani Bounded Integer variables (for now) have to be bounded from both sides"); + if (initValue) { + return std::make_shared(name, variable, initValue.get(), transient, lowerBound.get(), upperBound.get()); + } else { + assert(!transient); + return std::make_shared(name, variable, lowerBound.get(), upperBound.get()); + } + } } } \ No newline at end of file diff --git a/src/storage/jani/BoundedIntegerVariable.h b/src/storage/jani/BoundedIntegerVariable.h index bc2298d05..9b5350d0e 100644 --- a/src/storage/jani/BoundedIntegerVariable.h +++ b/src/storage/jani/BoundedIntegerVariable.h @@ -9,10 +9,18 @@ namespace storm { class BoundedIntegerVariable : public Variable { public: /*! - * Creates a bounded integer variable. + * Creates a bounded integer variable with initial value. + */ + BoundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& initValue, bool transient, storm::expressions::Expression const& lowerBound, storm::expressions::Expression const& upperBound); + /*! + * Creates a bounded integer variable with transient set to false and an initial value. + */ + BoundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& initValue, storm::expressions::Expression const& lowerBound, storm::expressions::Expression const& upperBound); + /*! + * Creates a bounded integer variable with transient set to false and no initial value. */ BoundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& lowerBound, storm::expressions::Expression const& upperBound); - + /*! * Retrieves the expression defining the lower bound of the variable. */ @@ -40,6 +48,11 @@ namespace storm { virtual bool isBoundedIntegerVariable() const override; + /*! + * Substitutes all variables in all expressions according to the given substitution. + */ + virtual void substitute(std::map const& substitution) override; + private: // The expression defining the lower bound of the variable. storm::expressions::Expression lowerBound; @@ -48,5 +61,9 @@ namespace storm { storm::expressions::Expression upperBound; }; + /** + * Convenience function to call the appropriate constructor and return a shared pointer to the variable. + */ + std::shared_ptr makeBoundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, boost::optional initValue, bool transient, boost::optional lowerBound, boost::optional upperBound); } } \ No newline at end of file diff --git a/src/storage/jani/Composition.cpp b/src/storage/jani/Composition.cpp index 7059c7c85..7ba39eaba 100644 --- a/src/storage/jani/Composition.cpp +++ b/src/storage/jani/Composition.cpp @@ -9,4 +9,4 @@ namespace storm { } } -} \ No newline at end of file +} diff --git a/src/storage/jani/Composition.h b/src/storage/jani/Composition.h index e1f1f85b6..0e5c10bbe 100644 --- a/src/storage/jani/Composition.h +++ b/src/storage/jani/Composition.h @@ -9,12 +9,14 @@ namespace storm { class Composition { public: + virtual bool isAutomaton() const { return false; } + virtual boost::any accept(CompositionVisitor& visitor, boost::any const& data) const = 0; virtual void write(std::ostream& stream) const = 0; friend std::ostream& operator<<(std::ostream& stream, Composition const& composition); }; - + } -} \ No newline at end of file +} diff --git a/src/storage/jani/CompositionInformationVisitor.cpp b/src/storage/jani/CompositionInformationVisitor.cpp index d6b661b53..d2635c882 100644 --- a/src/storage/jani/CompositionInformationVisitor.cpp +++ b/src/storage/jani/CompositionInformationVisitor.cpp @@ -3,76 +3,100 @@ #include "src/storage/jani/Model.h" #include "src/storage/jani/Compositions.h" +#include "src/utility/macros.h" +#include "src/exceptions/WrongFormatException.h" + namespace storm { namespace jani { - CompositionInformation::CompositionInformation() : automatonNameToMultiplicity(), nonsilentActions(), renameComposition(false), restrictedParallelComposition(false) { - // Intentionally left empty. - } - - CompositionInformation::CompositionInformation(std::map const& automatonNameToMultiplicity, std::set const& nonsilentActions, bool containsRenameComposition, bool containsRestrictedParallelComposition) : automatonNameToMultiplicity(automatonNameToMultiplicity), nonsilentActions(nonsilentActions), renameComposition(containsRenameComposition), restrictedParallelComposition(containsRestrictedParallelComposition) { + CompositionInformation::CompositionInformation() : nonStandardParallelComposition(false) { // Intentionally left empty. } void CompositionInformation::increaseAutomatonMultiplicity(std::string const& automatonName, uint64_t count) { automatonNameToMultiplicity[automatonName] += count; } + + std::map const& CompositionInformation::getAutomatonToMultiplicityMap() const { + return automatonNameToMultiplicity; + } + + void CompositionInformation::addMultiplicityMap(std::map const& multiplicityMap) { + automatonNameToMultiplicity = joinMultiplicityMaps(automatonNameToMultiplicity, multiplicityMap); + } - void CompositionInformation::addNonsilentAction(std::string const& actionName) { - nonsilentActions.insert(actionName); + std::map CompositionInformation::joinMultiplicityMaps(std::map const& first, std::map const& second) { + std::map result = first; + for (auto const& element : second) { + result[element.first] += element.second; + } + return result; } - std::set const& CompositionInformation::getNonsilentActions() const { - return nonsilentActions; + void CompositionInformation::setContainsNonStandardParallelComposition(bool value) { + nonStandardParallelComposition = value; } - std::set CompositionInformation::renameNonsilentActions(std::set const& nonsilentActions, std::map> const& renaming) { - std::set newNonsilentActions; - for (auto const& entry : nonsilentActions) { - auto it = renaming.find(entry); - if (it != renaming.end()) { - if (it->second) { - newNonsilentActions.insert(it->second.get()); - } - } else { - newNonsilentActions.insert(entry); - } - } - return newNonsilentActions; + bool CompositionInformation::containsNonStandardParallelComposition() const { + return nonStandardParallelComposition; } - void CompositionInformation::setContainsRenameComposition() { - renameComposition = true; + std::string const& CompositionInformation::getActionName(uint64_t index) const { + return indexToNameMap.at(index); } - bool CompositionInformation::containsRenameComposition() const { - return renameComposition; + uint64_t CompositionInformation::getActionIndex(std::string const& name) const { + return nameToIndexMap.at(name); } - void CompositionInformation::setContainsRestrictedParallelComposition() { - restrictedParallelComposition = true; + void CompositionInformation::addNonSilentActionIndex(uint64_t index) { + nonSilentActionIndices.insert(index); } - bool CompositionInformation::containsRestrictedParallelComposition() const { - return restrictedParallelComposition; + void CompositionInformation::addNonSilentActionIndices(std::set const& indices) { + nonSilentActionIndices.insert(indices.begin(), indices.end()); } - std::map CompositionInformation::joinMultiplicityMaps(std::map const& first, std::map const& second) { - std::map result = first; - for (auto const& element : second) { - result[element.first] += element.second; - } - return result; + bool CompositionInformation::hasNonSilentActionIndex(uint64_t index) { + return nonSilentActionIndices.find(index) != nonSilentActionIndices.end(); } - std::map const& CompositionInformation::getAutomatonToMultiplicityMap() const { - return automatonNameToMultiplicity; + void CompositionInformation::addInputEnabledActionIndex(uint64_t index) { + inputEnabledActionIndices.insert(index); + } + + std::set const& CompositionInformation::getNonSilentActionIndices() const { + return nonSilentActionIndices; + } + + std::set const& CompositionInformation::getInputEnabledActionIndices() const { + return inputEnabledActionIndices; + } + + void CompositionInformation::setMappings(std::map const& indexToNameMap, std::map const& nameToIndexMap) { + this->indexToNameMap = indexToNameMap; + this->nameToIndexMap = nameToIndexMap; } - CompositionInformation CompositionInformationVisitor::getInformation(Composition const& composition, Model const& model) { - return boost::any_cast(composition.accept(*this, model)); + CompositionInformationVisitor::CompositionInformationVisitor(Model const& model, Composition const& composition) : model(model), composition(composition), nextFreeActionIndex(0) { + // Determine the next free index we can give out to a new action. + for (auto const& action : model.getActions()) { + uint64_t actionIndex = model.getActionIndex(action.getName()); + + nameToIndexMap[action.getName()] = model.getActionIndex(action.getName()); + indexToNameMap[actionIndex] = action.getName(); + + nextFreeActionIndex = std::max(nextFreeActionIndex, model.getActionIndex(action.getName())); + } + ++nextFreeActionIndex; } + CompositionInformation CompositionInformationVisitor::getInformation() { + CompositionInformation result = boost::any_cast(composition.accept(*this, model)); + result.setMappings(indexToNameMap, nameToIndexMap); + return result; + } + boost::any CompositionInformationVisitor::visit(AutomatonComposition const& composition, boost::any const& data) { Model const& model = boost::any_cast(data); Automaton const& automaton = model.getAutomaton(composition.getAutomatonName()); @@ -80,41 +104,134 @@ namespace storm { CompositionInformation result; result.increaseAutomatonMultiplicity(composition.getAutomatonName()); for (auto const& actionIndex : automaton.getActionIndices()) { - if (actionIndex != model.getSilentActionIndex()) { - result.addNonsilentAction(model.getAction(actionIndex).getName()); + if (actionIndex != storm::jani::Model::SILENT_ACTION_INDEX) { + result.addNonSilentActionIndex(actionIndex); } } + for (auto const& action : composition.getInputEnabledActions()) { + auto it = nameToIndexMap.find(action); + STORM_LOG_THROW(it != nameToIndexMap.end(), storm::exceptions::WrongFormatException, "Illegal action name '" << action << "' in when input-enabling automaton '" << composition.getAutomatonName() << "'."); + uint64_t actionIndex = it->second; + STORM_LOG_THROW(result.hasNonSilentActionIndex(actionIndex), storm::exceptions::WrongFormatException, "Cannot make automaton '" << composition.getAutomatonName() << "' input enabled for action " << action << ", because it has no such action."); + result.addInputEnabledActionIndex(actionIndex); + } return result; } - boost::any CompositionInformationVisitor::visit(RenameComposition const& composition, boost::any const& data) { - CompositionInformation subresult = boost::any_cast(composition.getSubcomposition().accept(*this, data)); - std::set nonsilentActions = CompositionInformation::renameNonsilentActions(subresult.getNonsilentActions(), composition.getRenaming()); - return CompositionInformation(subresult.getAutomatonToMultiplicityMap(), nonsilentActions, true, subresult.containsRestrictedParallelComposition()); - } - boost::any CompositionInformationVisitor::visit(ParallelComposition const& composition, boost::any const& data) { - CompositionInformation left = boost::any_cast(composition.getLeftSubcomposition().accept(*this, data)); - CompositionInformation right = boost::any_cast(composition.getRightSubcomposition().accept(*this, data)); + CompositionInformation result; - // Join the information from both sides. - bool containsRenameComposition = left.containsRenameComposition() || right.containsRenameComposition(); - bool containsRestrictedParallelComposition = left.containsRestrictedParallelComposition() || right.containsRestrictedParallelComposition(); - std::map joinedAutomatonToMultiplicity = CompositionInformation::joinMultiplicityMaps(left.getAutomatonToMultiplicityMap(), right.getAutomatonToMultiplicityMap()); + std::vector subinformation; + + std::set nonsilentSubActionIndices; + for (auto const& subcomposition : composition.getSubcompositions()) { + subinformation.push_back(boost::any_cast(subcomposition->accept(*this, data))); + nonsilentSubActionIndices.insert(subinformation.back().getNonSilentActionIndices().begin(), subinformation.back().getNonSilentActionIndices().end()); + } - std::set nonsilentActions; - std::set_union(left.getNonsilentActions().begin(), left.getNonsilentActions().end(), right.getNonsilentActions().begin(), right.getNonsilentActions().end(), std::inserter(nonsilentActions, nonsilentActions.begin())); + bool containsNonStandardParallelComposition = false; - // If there was no restricted parallel composition yet, maybe the current composition is one, so check it. - if (!containsRestrictedParallelComposition) { - std::set commonNonsilentActions; - std::set_intersection(left.getNonsilentActions().begin(), left.getNonsilentActions().end(), right.getNonsilentActions().begin(), right.getNonsilentActions().end(), std::inserter(commonNonsilentActions, commonNonsilentActions.begin())); - bool allCommonActionsIncluded = std::includes(commonNonsilentActions.begin(), commonNonsilentActions.end(), composition.getSynchronizationAlphabet().begin(), composition.getSynchronizationAlphabet().end()); - containsRestrictedParallelComposition = !allCommonActionsIncluded; + for (auto const& subinfo : subinformation) { + containsNonStandardParallelComposition |= subinfo.containsNonStandardParallelComposition(); + result.addMultiplicityMap(subinfo.getAutomatonToMultiplicityMap()); } - return CompositionInformation(joinedAutomatonToMultiplicity, nonsilentActions, containsRenameComposition, containsRestrictedParallelComposition); + // Keep track of the synchronization vectors that are effective, meaning that the subcompositions all have + // the non-silent actions that are referred to. + std::set effectiveSynchVectors; + for (uint64_t synchVectorIndex = 0; synchVectorIndex < composition.getNumberOfSynchronizationVectors(); ++synchVectorIndex) { + effectiveSynchVectors.insert(synchVectorIndex); + } + + // Now compute non-silent actions. + std::set nonSilentActionIndices; + for (uint_fast64_t infoIndex = 0; infoIndex < subinformation.size(); ++infoIndex) { + auto const& subinfo = subinformation[infoIndex]; + + std::set enabledSynchVectors; + std::set actionsInSynch; + for (uint64_t synchVectorIndex = 0; synchVectorIndex < composition.getNumberOfSynchronizationVectors(); ++synchVectorIndex) { + auto const& synchVector = composition.getSynchronizationVector(synchVectorIndex); + if (synchVector.getInput(infoIndex) != SynchronizationVector::NO_ACTION_INPUT) { + for (auto const& nonSilentActionIndex : subinfo.getNonSilentActionIndices()) { + std::string const& nonSilentAction = indexToNameMap.at(nonSilentActionIndex); + if (synchVector.getInput(infoIndex) == nonSilentAction) { + enabledSynchVectors.insert(synchVectorIndex); + actionsInSynch.insert(nonSilentActionIndex); + } + } + } else { + enabledSynchVectors.insert(synchVectorIndex); + } + } + + std::set_difference(subinfo.getNonSilentActionIndices().begin(), subinfo.getNonSilentActionIndices().end(), actionsInSynch.begin(), actionsInSynch.end(), std::inserter(nonSilentActionIndices, nonSilentActionIndices.begin())); + + std::set newEffectiveSynchVectors; + std::set_intersection(effectiveSynchVectors.begin(), effectiveSynchVectors.end(), enabledSynchVectors.begin(), enabledSynchVectors.end(), std::inserter(newEffectiveSynchVectors, newEffectiveSynchVectors.begin())); + effectiveSynchVectors = std::move(newEffectiveSynchVectors); + } + + // Now add all outputs of effective synchronization vectors. + for (auto const& synchVectorIndex : effectiveSynchVectors) { + auto const& synchVector = composition.getSynchronizationVector(synchVectorIndex); + if (synchVector.getOutput() != storm::jani::Model::SILENT_ACTION_NAME) { + nonSilentActionIndices.insert(addOrGetActionIndex(synchVector.getOutput())); + } + } + + // Finally check whether it's a non-standard parallel composition. We do that by first constructing a set of + // all effective synchronization vectors and then checking whether this set is fully contained within the + // set of expected synchronization vectors. + + std::set synchVectorSet; + for (auto synchVectorIndex : effectiveSynchVectors) { + synchVectorSet.insert(composition.getSynchronizationVector(synchVectorIndex)); + } + + // Construct the set of expected synchronization vectors. + std::set expectedSynchVectorSetUnderApprox; + std::set expectedSynchVectorSetOverApprox; + for (auto actionIndex : nonsilentSubActionIndices) { + std::string const& actionName = indexToNameMap.at(actionIndex); + std::vector input; + uint64_t numberOfParticipatingAutomata = 0; + for (auto const& subcomposition : subinformation) { + if (subcomposition.getNonSilentActionIndices().find(actionIndex) != subcomposition.getNonSilentActionIndices().end()) { + input.push_back(actionName); + ++numberOfParticipatingAutomata; + } else { + input.push_back(SynchronizationVector::NO_ACTION_INPUT); + } + } + + storm::jani::SynchronizationVector newSynchVector(input, actionName); + expectedSynchVectorSetOverApprox.insert(newSynchVector); + if (numberOfParticipatingAutomata > 1) { + expectedSynchVectorSetUnderApprox.insert(newSynchVector); + } + } + + containsNonStandardParallelComposition |= !std::includes(expectedSynchVectorSetOverApprox.begin(), expectedSynchVectorSetOverApprox.end(), synchVectorSet.begin(), synchVectorSet.end(), SynchronizationVectorLexicographicalLess()); + + containsNonStandardParallelComposition |= !std::includes(synchVectorSet.begin(), synchVectorSet.end(), expectedSynchVectorSetUnderApprox.begin(), expectedSynchVectorSetUnderApprox.end(), SynchronizationVectorLexicographicalLess()); + + result.setContainsNonStandardParallelComposition(containsNonStandardParallelComposition); + + result.addNonSilentActionIndices(nonSilentActionIndices); + return result; + } + + uint64_t CompositionInformationVisitor::addOrGetActionIndex(std::string const& name) { + auto it = nameToIndexMap.find(name); + if (it != nameToIndexMap.end()) { + return it->second; + } else { + nameToIndexMap[name] = nextFreeActionIndex; + indexToNameMap[nextFreeActionIndex] = name; + return nextFreeActionIndex++; + } } } -} \ No newline at end of file +} diff --git a/src/storage/jani/CompositionInformationVisitor.h b/src/storage/jani/CompositionInformationVisitor.h index 59a422a41..7dfcb5a56 100644 --- a/src/storage/jani/CompositionInformationVisitor.h +++ b/src/storage/jani/CompositionInformationVisitor.h @@ -16,47 +16,66 @@ namespace storm { class CompositionInformation { public: CompositionInformation(); - CompositionInformation(std::map const& automatonNameToMultiplicity, std::set const& nonsilentActions, bool containsRenaming, bool containsRestrictedParallelComposition); void increaseAutomatonMultiplicity(std::string const& automatonName, uint64_t count = 1); + std::map const& getAutomatonToMultiplicityMap() const; + static std::map joinMultiplicityMaps(std::map const& first, std::map const& second); + void addMultiplicityMap(std::map const& multiplicityMap); - void addNonsilentAction(std::string const& actionName); - std::set const& getNonsilentActions() const; - static std::set renameNonsilentActions(std::set const& nonsilentActions, std::map> const& renaming); - - void setContainsRenameComposition(); - bool containsRenameComposition() const; + void setContainsNonStandardParallelComposition(bool value); + bool containsNonStandardParallelComposition() const; - void setContainsRestrictedParallelComposition(); - bool containsRestrictedParallelComposition() const; + std::string const& getActionName(uint64_t index) const; + uint64_t getActionIndex(std::string const& name) const; + + void addNonSilentActionIndex(uint64_t index); + void addNonSilentActionIndices(std::set const& indices); + bool hasNonSilentActionIndex(uint64_t index); + void addInputEnabledActionIndex(uint64_t index); + + std::set const& getNonSilentActionIndices() const; + std::set const& getInputEnabledActionIndices() const; - static std::map joinMultiplicityMaps(std::map const& first, std::map const& second); - std::map const& getAutomatonToMultiplicityMap() const; + void setMappings(std::map const& indexToNameMap, std::map const& nameToIndexMap); private: - /// A mapping from the automata's names to the amount of times they occur in the composition. - std::map automatonNameToMultiplicity; + /// The indices of the non-silent actions appearing in the topmost element of the composition. + std::set nonSilentActionIndices; + + /// The set of indices of actions for which the topmost element of the composition is input-enabled. + std::set inputEnabledActionIndices; - /// The set of non-silent actions contained in the composition. - std::set nonsilentActions; + /// A mapping from action indices to names. Since the composition may introduce new action names, this may + /// extend the one from the underlying model. + std::map indexToNameMap; - /// A flag indicating whether the composition contains a renaming composition. - bool renameComposition; + /// A mapping from action names to their indices. + std::map nameToIndexMap; + + /// A mapping from the automata's names to the amount of times they occur in the composition. + std::map automatonNameToMultiplicity; - /// A flag indicating whether the composition contains - bool restrictedParallelComposition; + /// A flag indicating whether the composition contains any non-standard parallel composition. + bool nonStandardParallelComposition; }; class CompositionInformationVisitor : public CompositionVisitor { public: - CompositionInformationVisitor() = default; - - CompositionInformation getInformation(Composition const& composition, Model const& model); - + CompositionInformationVisitor(Model const& model, Composition const& composition); + CompositionInformation getInformation(); + virtual boost::any visit(AutomatonComposition const& composition, boost::any const& data) override; - virtual boost::any visit(RenameComposition const& composition, boost::any const& data) override; virtual boost::any visit(ParallelComposition const& composition, boost::any const& data) override; + + private: + uint64_t addOrGetActionIndex(std::string const& name); + + storm::jani::Model const& model; + Composition const& composition; + uint64_t nextFreeActionIndex; + std::map nameToIndexMap; + std::map indexToNameMap; }; } -} \ No newline at end of file +} diff --git a/src/storage/jani/CompositionVisitor.h b/src/storage/jani/CompositionVisitor.h index d8c62a788..c346826e2 100644 --- a/src/storage/jani/CompositionVisitor.h +++ b/src/storage/jani/CompositionVisitor.h @@ -7,15 +7,13 @@ namespace storm { class Composition; class AutomatonComposition; - class RenameComposition; class ParallelComposition; class CompositionVisitor { public: virtual boost::any visit(AutomatonComposition const& composition, boost::any const& data) = 0; - virtual boost::any visit(RenameComposition const& composition, boost::any const& data) = 0; virtual boost::any visit(ParallelComposition const& composition, boost::any const& data) = 0; }; } -} \ No newline at end of file +} diff --git a/src/storage/jani/Compositions.h b/src/storage/jani/Compositions.h index ea74f3ac4..b32464d91 100644 --- a/src/storage/jani/Compositions.h +++ b/src/storage/jani/Compositions.h @@ -1,3 +1,2 @@ #include "src/storage/jani/AutomatonComposition.h" -#include "src/storage/jani/RenameComposition.h" #include "src/storage/jani/ParallelComposition.h" diff --git a/src/storage/jani/Edge.cpp b/src/storage/jani/Edge.cpp index 347140b1b..69c85db59 100644 --- a/src/storage/jani/Edge.cpp +++ b/src/storage/jani/Edge.cpp @@ -2,10 +2,13 @@ #include "src/storage/jani/Model.h" +#include "src/utility/macros.h" +#include "src/exceptions/InvalidArgumentException.h" + namespace storm { namespace jani { - Edge::Edge(uint64_t sourceLocationIndex, uint64_t actionIndex, boost::optional const& rate, storm::expressions::Expression const& guard, std::vector destinations) : sourceLocationIndex(sourceLocationIndex), actionIndex(actionIndex), rate(rate), guard(guard), destinations(destinations) { + Edge::Edge(uint64_t sourceLocationIndex, uint64_t actionIndex, boost::optional const& rate, storm::expressions::Expression const& guard, std::vector destinations) : sourceLocationIndex(sourceLocationIndex), actionIndex(actionIndex), rate(rate), guard(guard), destinations(destinations), assignments(), writtenGlobalVariables() { // Intentionally left empty. } @@ -49,9 +52,26 @@ namespace storm { destinations.push_back(destination); } + OrderedAssignments const& Edge::getAssignments() const { + return assignments; + } + + void Edge::substitute(std::map const& substitution) { + this->setGuard(this->getGuard().substitute(substitution)); + if (this->hasRate()) { + this->setRate(this->getRate().substitute(substitution)); + } + for (auto& assignment : this->getAssignments()) { + assignment.substitute(substitution); + } + for (auto& destination : this->getDestinations()) { + destination.substitute(substitution); + } + } + void Edge::finalize(Model const& containingModel) { for (auto const& destination : getDestinations()) { - for (auto const& assignment : destination.getAssignments()) { + for (auto const& assignment : destination.getOrderedAssignments().getAllAssignments()) { if (containingModel.getGlobalVariables().hasVariable(assignment.getExpressionVariable())) { writtenGlobalVariables.insert(assignment.getExpressionVariable()); } @@ -59,8 +79,72 @@ namespace storm { } } + bool Edge::hasSilentAction() const { + return actionIndex == Model::SILENT_ACTION_INDEX; + } + + bool Edge::addTransientAssignment(Assignment const& assignment) { + STORM_LOG_THROW(assignment.isTransient(), storm::exceptions::InvalidArgumentException, "Must not add non-transient assignment to location."); + return assignments.add(assignment); + } + + void Edge::liftTransientDestinationAssignments() { + if (!destinations.empty()) { + auto const& destination = *destinations.begin(); + + for (auto const& assignment : destination.getOrderedAssignments().getTransientAssignments()) { + // Check if we can lift the assignment to the edge. + bool canBeLifted = true; + for (auto const& destination : destinations) { + if (!destination.hasAssignment(assignment)) { + canBeLifted = false; + break; + } + } + + // If so, remove the assignment from all destinations. + if (canBeLifted) { + this->addTransientAssignment(assignment); + for (auto& destination : destinations) { + destination.removeAssignment(assignment); + } + } + } + } + } + + void Edge::pushAssignmentsToDestinations() { + assert(!destinations.empty()); + for (auto const& assignment : this->getAssignments()) { + for (auto& destination : destinations) { + destination.addAssignment(assignment); + } + } + assignments = OrderedAssignments(); + } + boost::container::flat_set const& Edge::getWrittenGlobalVariables() const { return writtenGlobalVariables; } + + bool Edge::usesVariablesInNonTransientAssignments(std::set const& variables) const { + for (auto const& destination : destinations) { + for (auto const& assignment : destination.getOrderedAssignments().getNonTransientAssignments()) { + if (assignment.getAssignedExpression().containsVariable(variables)) { + return true; + } + } + } + return false; + } + + bool Edge::hasTransientEdgeDestinationAssignments() const { + for (auto const& destination : this->getDestinations()) { + if (destination.hasTransientAssignment()) { + return true; + } + } + return false; + } } -} \ No newline at end of file +} diff --git a/src/storage/jani/Edge.h b/src/storage/jani/Edge.h index cb872ebbe..de4becb3e 100644 --- a/src/storage/jani/Edge.h +++ b/src/storage/jani/Edge.h @@ -4,6 +4,7 @@ #include #include "src/storage/jani/EdgeDestination.h" +#include "src/storage/jani/OrderedAssignments.h" namespace storm { namespace jani { @@ -24,6 +25,11 @@ namespace storm { */ uint64_t getActionIndex() const; + /*! + * Returns whether it contains the silent action. + */ + bool hasSilentAction() const; + /*! * Retrieves whether this edge has an associated rate. */ @@ -64,6 +70,11 @@ namespace storm { */ void addDestination(EdgeDestination const& destination); + /*! + * Substitutes all variables in all expressions according to the given substitution. + */ + void substitute(std::map const& substitution); + /*! * Finalizes the building of this edge. Subsequent changes to the edge require another call to this * method. Note that this method is invoked by a call to finalize to the containing model. @@ -75,6 +86,40 @@ namespace storm { * that prior to calling this, the edge has to be finalized. */ boost::container::flat_set const& getWrittenGlobalVariables() const; + + /*! + * Adds a transient assignment to this edge. + * + * @param assignment The transient assignment to add. + * @return True if the assignment was added. + */ + bool addTransientAssignment(Assignment const& assignment); + + /*! + * Retrieves the assignments of this edge. + */ + OrderedAssignments const& getAssignments() const; + + /*! + * Finds the transient assignments common to all destinations and lifts them to the edge. Afterwards, these + * assignments are no longer contained in the destination. + */ + void liftTransientDestinationAssignments(); + + /** + * Shifts the assingments from the edges to the destinations. + */ + void pushAssignmentsToDestinations(); + + /*! + * Checks whether the provided variables appear on the right-hand side of non-transient assignments. + */ + bool usesVariablesInNonTransientAssignments(std::set const& variables) const; + + /*! + * Retrieves whether there is any transient edge destination assignment in the edge. + */ + bool hasTransientEdgeDestinationAssignments() const; private: /// The index of the source location. @@ -93,10 +138,13 @@ namespace storm { /// The destinations of this edge. std::vector destinations; + /// The assignments made when taking this edge. + OrderedAssignments assignments; + /// A set of global variables that is written by at least one of the edge's destinations. This set is /// initialized by the call to finalize. boost::container::flat_set writtenGlobalVariables; }; } -} \ No newline at end of file +} diff --git a/src/storage/jani/EdgeDestination.cpp b/src/storage/jani/EdgeDestination.cpp index 1166488e3..b5c785c05 100644 --- a/src/storage/jani/EdgeDestination.cpp +++ b/src/storage/jani/EdgeDestination.cpp @@ -6,21 +6,20 @@ namespace storm { namespace jani { - EdgeDestination::EdgeDestination(uint64_t locationIndex, storm::expressions::Expression const& probability, std::vector const& assignments, std::vector const& rewardIncrements) : locationIndex(locationIndex), probability(probability), assignments(assignments), rewardIncrements(rewardIncrements) { - sortAssignments(); + EdgeDestination::EdgeDestination(uint64_t locationIndex, storm::expressions::Expression const& probability, OrderedAssignments const& assignments) : locationIndex(locationIndex), probability(probability), assignments(assignments) { + // Intentionally left empty. } - - void EdgeDestination::addAssignment(Assignment const& assignment) { - // We make sure that there are no two assignments to the same variable. - for (auto const& oldAssignment : assignments) { - STORM_LOG_THROW(oldAssignment.getExpressionVariable() != assignment.getExpressionVariable(), storm::exceptions::WrongFormatException, "Cannot add assignment '" << assignment << "', because another assignment '" << assignment << "' writes to the same target variable."); - } - assignments.push_back(assignment); - sortAssignments(); + + EdgeDestination::EdgeDestination(uint64_t locationIndex, storm::expressions::Expression const& probability, Assignment const& assignments) : locationIndex(locationIndex), probability(probability), assignments(assignments) { + // Intentionally left empty. + } + + EdgeDestination::EdgeDestination(uint64_t locationIndex, storm::expressions::Expression const& probability, std::vector const& assignments) : locationIndex(locationIndex), probability(probability), assignments(assignments) { + // Intentionally left empty. } - void EdgeDestination::addRewardIncrement(RewardIncrement const& rewardIncrement) { - rewardIncrements.push_back(rewardIncrement); + void EdgeDestination::addAssignment(Assignment const& assignment) { + assignments.add(assignment); } uint64_t EdgeDestination::getLocationIndex() const { @@ -35,28 +34,26 @@ namespace storm { this->probability = probability; } - std::vector& EdgeDestination::getAssignments() { + OrderedAssignments const& EdgeDestination::getOrderedAssignments() const { return assignments; } - std::vector const& EdgeDestination::getAssignments() const { - return assignments; + void EdgeDestination::substitute(std::map const& substitution) { + this->setProbability(this->getProbability().substitute(substitution)); + assignments.substitute(substitution); } - std::vector const& EdgeDestination::getRewardIncrements() const { - return rewardIncrements; + bool EdgeDestination::hasAssignment(Assignment const& assignment) const { + return assignments.contains(assignment); } - void EdgeDestination::sortAssignments() { - std::sort(this->assignments.begin(), this->assignments.end(), [] (storm::jani::Assignment const& assignment1, storm::jani::Assignment const& assignment2) { - bool smaller = assignment1.getExpressionVariable().getType().isBooleanType() && !assignment2.getExpressionVariable().getType().isBooleanType(); - if (!smaller) { - smaller = assignment1.getExpressionVariable() < assignment2.getExpressionVariable(); - } - return smaller; - }); - + bool EdgeDestination::removeAssignment(Assignment const& assignment) { + return assignments.remove(assignment); + } + + bool EdgeDestination::hasTransientAssignment() const { + return !assignments.getTransientAssignments().empty(); } } -} \ No newline at end of file +} diff --git a/src/storage/jani/EdgeDestination.h b/src/storage/jani/EdgeDestination.h index eb33bb7fc..c9e5e5e64 100644 --- a/src/storage/jani/EdgeDestination.h +++ b/src/storage/jani/EdgeDestination.h @@ -4,8 +4,7 @@ #include "src/storage/expressions/Expression.h" -#include "src/storage/jani/Assignment.h" -#include "src/storage/jani/RewardIncrement.h" +#include "src/storage/jani/OrderedAssignments.h" namespace storm { namespace jani { @@ -15,17 +14,15 @@ namespace storm { /*! * Creates a new edge destination. */ - EdgeDestination(uint64_t locationIndex, storm::expressions::Expression const& probability, std::vector const& assignments = {}, std::vector const& rewardIncrements = {}); + EdgeDestination(uint64_t locationIndex, storm::expressions::Expression const& probability, OrderedAssignments const& assignments); + + EdgeDestination(uint64_t locationIndex, storm::expressions::Expression const& probability, Assignment const& assignment); + EdgeDestination(uint64_t locationIndex, storm::expressions::Expression const& probability, std::vector const& assignments = {}); /*! * Additionally performs the given assignment when choosing this destination. */ void addAssignment(Assignment const& assignment); - - /*! - * Additionally performs the given reward increment when choosing this destination. - */ - void addRewardIncrement(RewardIncrement const& rewardIncrement); /*! * Retrieves the id of the destination location. @@ -45,37 +42,32 @@ namespace storm { /*! * Retrieves the assignments to make when choosing this destination. */ - std::vector& getAssignments(); - - /*! - * Retrieves the assignments to make when choosing this destination. - */ - std::vector const& getAssignments() const; + OrderedAssignments const& getOrderedAssignments() const; /*! - * Retrieves the reward increments to make when choosing this destination. + * Substitutes all variables in all expressions according to the given substitution. */ - std::vector const& getRewardIncrements() const; + void substitute(std::map const& substitution); + + // Convenience methods to access the assignments. + bool hasAssignment(Assignment const& assignment) const; + bool removeAssignment(Assignment const& assignment); - private: /*! - * Sorts the assignments to make all assignments to boolean variables precede all others and order the - * assignments within one variable group by the expression variables. + * Retrieves whether this destination has transient assignments. */ - void sortAssignments(); + bool hasTransientAssignment() const; + private: // The index of the destination location. uint64_t locationIndex; // The probability to go to the destination. storm::expressions::Expression probability; - // The assignments to make when choosing this destination. - std::vector assignments; - - // The increments to rewards to make when choosing this destination. - std::vector rewardIncrements; + // The (ordered) assignments to make when choosing this destination. + OrderedAssignments assignments; }; } -} \ No newline at end of file +} diff --git a/src/storage/jani/Exporter.cpp b/src/storage/jani/Exporter.cpp deleted file mode 100644 index 55b5d068f..000000000 --- a/src/storage/jani/Exporter.cpp +++ /dev/null @@ -1,440 +0,0 @@ -#include "src/storage/jani/Exporter.h" - -#include - -namespace storm { - namespace jani { - - void appendIndent(std::stringstream& out, uint64_t indent) { - for (uint64_t i = 0; i < indent; ++i) { - out << "\t"; - } - } - - void appendField(std::stringstream& out, std::string const& name) { - out << "\"" << name << "\": "; - } - - void appendValue(std::stringstream& out, std::string const& value) { - out << "\"" << value << "\""; - } - - void clearLine(std::stringstream& out) { - out << std::endl; - } - - std::string expressionToString(storm::expressions::Expression const& expression) { - std::stringstream s; - s << expression; - return s.str(); - } - - void Exporter::appendVersion(std::stringstream& out, uint64_t janiVersion, uint64_t indent) const { - appendIndent(out, indent); - appendField(out, "jani-version"); - } - - void Exporter::appendModelName(std::stringstream& out, std::string const& name, uint64_t indent) const { - appendIndent(out, indent); - appendField(out, "name"); - appendValue(out, name); - } - - void Exporter::appendModelType(std::stringstream& out, storm::jani::ModelType const& modelType, uint64_t indent) const { - appendIndent(out, indent); - appendField(out, "type"); - } - - void Exporter::appendAction(std::stringstream& out, storm::jani::Action const& action, uint64_t indent) const { - appendIndent(out, indent); - out << "{" << std::endl; - appendIndent(out, indent + 1); - appendField(out, "name"); - appendValue(out, action.getName()); - clearLine(out); - appendIndent(out, indent); - out << "}"; - } - - void Exporter::appendActions(std::stringstream& out, storm::jani::Model const& model, uint64_t indent) const { - appendIndent(out, indent); - appendField(out, "actions"); - out << " [" << std::endl; - - for (uint64_t index = 0; index < model.actions.size(); ++index) { - appendAction(out, model.actions[index], indent + 1); - if (index < model.actions.size() - 1) { - out << ","; - } - clearLine(out); - } - - appendIndent(out, indent); - out << "]"; - } - - void Exporter::appendVariable(std::stringstream& out, storm::jani::BooleanVariable const& variable, uint64_t indent) const { - appendIndent(out, indent); - out << "{"; - clearLine(out); - appendIndent(out, indent + 1); - appendField(out, "name"); - appendValue(out, variable.getName()); - out << ","; - clearLine(out); - appendIndent(out, indent + 1); - appendField(out, "type"); - appendValue(out, "bool"); - out << ","; - clearLine(out); - appendIndent(out, indent); - out << "}"; - } - - void Exporter::appendBoundedIntegerVariableType(std::stringstream& out, storm::jani::BoundedIntegerVariable const& variable, uint64_t indent) const { - out << " {"; - clearLine(out); - - appendIndent(out, indent); - appendField(out, "kind"); - appendValue(out, "bounded"); - clearLine(out); - - appendIndent(out, indent); - appendField(out, "base"); - appendValue(out, "int"); - clearLine(out); - - appendIndent(out, indent); - appendField(out, "lower-bound"); - appendValue(out, expressionToString(variable.getLowerBound())); - clearLine(out); - - appendIndent(out, indent); - appendField(out, "upper-bound"); - appendValue(out, expressionToString(variable.getLowerBound())); - clearLine(out); - - appendIndent(out, indent - 1); - out << "}"; - } - - void Exporter::appendVariable(std::stringstream& out, storm::jani::BoundedIntegerVariable const& variable, uint64_t indent) const { - appendIndent(out, indent); - out << "{"; - clearLine(out); - appendIndent(out, indent + 1); - appendField(out, "name"); - appendValue(out, variable.getName()); - out << ","; - clearLine(out); - appendIndent(out, indent + 1); - appendField(out, "type"); - appendBoundedIntegerVariableType(out, variable, indent + 2); - out << ","; - clearLine(out); - appendIndent(out, indent); - out << "}"; - } - - void Exporter::appendVariable(std::stringstream& out, storm::jani::UnboundedIntegerVariable const& variable, uint64_t indent) const { - appendIndent(out, indent); - out << "{"; - clearLine(out); - appendIndent(out, indent + 1); - appendField(out, "name"); - appendValue(out, variable.getName()); - out << ","; - clearLine(out); - appendIndent(out, indent + 1); - appendField(out, "type"); - appendValue(out, "int"); - out << ","; - clearLine(out); - appendIndent(out, indent); - out << "}"; - } - - void Exporter::appendVariables(std::stringstream& out, storm::jani::VariableSet const& variables, uint64_t indent) const { - appendIndent(out, indent); - appendField(out, "variables"); - out << " ["; - clearLine(out); - - for (auto const& variable : variables.getBooleanVariables()) { - appendVariable(out, variable, indent + 1); - clearLine(out); - } - for (auto const& variable : variables.getBoundedIntegerVariables()) { - appendVariable(out, variable, indent + 1); - clearLine(out); - } - for (auto const& variable : variables.getUnboundedIntegerVariables()) { - appendVariable(out, variable, indent + 1); - clearLine(out); - } - - appendIndent(out, indent); - out << "]"; - } - - void Exporter::appendLocation(std::stringstream& out, storm::jani::Location const& location, uint64_t indent) const { - appendIndent(out, indent); - out << "{"; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "name"); - appendValue(out, location.getName()); - clearLine(out); - - appendIndent(out, indent); - out << "}"; - } - - void Exporter::appendLocations(std::stringstream& out, storm::jani::Automaton const& automaton, uint64_t indent) const { - appendIndent(out, indent); - appendField(out, "locations"); - out << " ["; - clearLine(out); - - for (auto const& location : automaton.getLocations()) { - appendLocation(out, location, indent + 1); - out << ","; - clearLine(out); - } - - appendIndent(out, indent); - out << "]"; - } - - void Exporter::appendAssignment(std::stringstream& out, storm::jani::Model const& model, storm::jani::Automaton const& automaton, storm::jani::Assignment const& assignment, uint64_t indent) const { - appendIndent(out, indent); - out << "{"; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "ref"); - storm::jani::Variable const& variable = model.getGlobalVariables().hasVariable(assignment.getExpressionVariable()) ? model.getGlobalVariables().getVariable(assignment.getExpressionVariable()) : automaton.getVariables().getVariable(assignment.getExpressionVariable()); - appendValue(out, variable.getName()); - out << ","; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "value"); - appendValue(out, expressionToString(assignment.getAssignedExpression())); - clearLine(out); - - appendIndent(out, indent); - out << "}"; - } - - void Exporter::appendEdgeDestination(std::stringstream& out, storm::jani::Model const& model, storm::jani::Automaton const& automaton, storm::jani::EdgeDestination const& destination, uint64_t indent) const { - appendIndent(out, indent); - out << "{"; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "probability"); - appendValue(out, expressionToString(destination.getProbability())); - out << ","; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "location"); - appendValue(out, automaton.getLocation(destination.getLocationIndex()).getName()); - out << ","; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "assignments"); - out << " ["; - clearLine(out); - - for (uint64_t index = 0; index < destination.getAssignments().size(); ++index) { - appendAssignment(out, model, automaton, destination.getAssignments()[index], indent + 2); - if (index < destination.getAssignments().size() - 1) { - out << ","; - } - clearLine(out); - } - - appendIndent(out, indent + 1); - out << "]"; - clearLine(out); - - appendIndent(out, indent); - out << "}"; - clearLine(out); - } - - void Exporter::appendEdge(std::stringstream& out, storm::jani::Model const& model, storm::jani::Automaton const& automaton, storm::jani::Edge const& edge, uint64_t indent) const { - appendIndent(out, indent); - out << "{"; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "location"); - appendValue(out, automaton.getLocation(edge.getSourceLocationIndex()).getName()); - out << ","; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "action"); - appendValue(out, model.getAction(edge.getActionIndex()).getName()); - out << ","; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "guard"); - appendValue(out, expressionToString(edge.getGuard())); - out << ","; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "destinations"); - out << " ["; - clearLine(out); - - for (auto const& destination : edge.getDestinations()) { - appendEdgeDestination(out, model, automaton, destination, indent + 2); - } - - appendIndent(out, indent + 1); - out << "]"; - clearLine(out); - - appendIndent(out, indent); - out << "}"; - } - - void Exporter::appendEdges(std::stringstream& out, storm::jani::Model const& model, storm::jani::Automaton const& automaton, uint64_t indent) const { - appendIndent(out, indent); - appendField(out, "edges"); - out << " ["; - clearLine(out); - - for (uint64_t location = 0; location < automaton.getNumberOfLocations(); ++location) { - for (auto const& edge : automaton.getEdgesFromLocation(location)) { - appendEdge(out, model, automaton, edge, indent + 1); - out << ","; - clearLine(out); - } - } - - appendIndent(out, indent); - out << "]"; - clearLine(out); - } - - void Exporter::appendAutomaton(std::stringstream& out, storm::jani::Model const& model, storm::jani::Automaton const& automaton, uint64_t indent) const { - appendIndent(out, indent); - out << "{"; - clearLine(out); - - appendIndent(out, indent + 1); - appendField(out, "name"); - appendValue(out, automaton.getName()); - clearLine(out); - appendVariables(out, automaton.getVariables(), indent + 1); - out << ","; - clearLine(out); - - appendLocations(out, automaton, indent + 1); - out << ","; - clearLine(out); - appendIndent(out, indent + 1); - appendField(out, "initial-locations"); - out << " ["; - clearLine(out); - for (auto const& index : automaton.getInitialLocationIndices()) { - appendIndent(out, indent + 2); - appendValue(out, automaton.getLocation(index).getName()); - clearLine(out); - } - appendIndent(out, indent + 1); - out << "]"; - clearLine(out); - if (automaton.hasInitialStatesExpression()) { - appendIndent(out, indent + 1); - appendField(out, "initial-states"); - clearLine(out); - appendIndent(out, indent + 2); - out << "{"; - clearLine(out); - appendIndent(out, indent + 3); - appendField(out, "exp"); - appendValue(out, expressionToString(automaton.getInitialStatesExpression())); - clearLine(out); - appendIndent(out, indent + 2); - out << "}"; - clearLine(out); - } - - appendEdges(out, model, automaton, indent + 1); - - appendIndent(out, indent); - out << "}"; - } - - void Exporter::appendAutomata(std::stringstream& out, storm::jani::Model const& model, uint64_t indent) const { - appendIndent(out, indent); - appendField(out, "automata"); - out << " ["; - clearLine(out); - - for (uint64_t index = 0; index < model.automata.size(); ++index) { - appendAutomaton(out, model, model.automata[index], indent + 1); - if (index < model.automata.size() - 1) { - out << ","; - } - clearLine(out); - } - - appendIndent(out, indent); - out << "]"; - } - - std::string Exporter::toJaniString(storm::jani::Model const& model) const { - std::stringstream out; - - out << "{" << std::endl; - appendVersion(out, model.getJaniVersion(), 1); - out << ","; - clearLine(out); - appendModelName(out, model.getName(), 1); - out << ","; - clearLine(out); - appendModelType(out, model.getModelType(), 1); - out << ","; - clearLine(out); - appendActions(out, model, 1); - clearLine(out); - appendVariables(out, model.getGlobalVariables(), 1); - clearLine(out); - - if (model.hasInitialStatesExpression()) { - appendIndent(out, 1); - appendField(out, "initial-states"); - clearLine(out); - appendIndent(out, 2); - out << "{"; - clearLine(out); - appendIndent(out, 3); - appendField(out, "exp"); - appendValue(out, expressionToString(model.getInitialStatesExpression())); - clearLine(out); - appendIndent(out, 2); - out << "}"; - clearLine(out); - } - - appendAutomata(out, model, 1); - clearLine(out); - out << "}" << std::endl; - - return out.str(); - } - - } -} \ No newline at end of file diff --git a/src/storage/jani/Exporter.h b/src/storage/jani/Exporter.h deleted file mode 100644 index 7b0a1990b..000000000 --- a/src/storage/jani/Exporter.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include -#include - -#include "src/storage/jani/Model.h" - -namespace storm { - namespace jani { - - class Exporter { - public: - Exporter() = default; - - std::string toJaniString(storm::jani::Model const& model) const; - - private: - void appendVersion(std::stringstream& out, uint64_t janiVersion, uint64_t indent) const; - - void appendModelName(std::stringstream& out, std::string const& name, uint64_t indent) const; - - void appendModelType(std::stringstream& out, storm::jani::ModelType const& modelType, uint64_t indent) const; - - void appendAction(std::stringstream& out, storm::jani::Action const& action, uint64_t indent) const; - - void appendActions(std::stringstream& out, storm::jani::Model const& model, uint64_t indent) const; - - void appendVariables(std::stringstream& out, storm::jani::VariableSet const& variables, uint64_t indent) const; - - void appendVariable(std::stringstream& out, storm::jani::BooleanVariable const& variable, uint64_t indent) const; - void appendVariable(std::stringstream& out, storm::jani::BoundedIntegerVariable const& variable, uint64_t indent) const; - void appendBoundedIntegerVariableType(std::stringstream& out, storm::jani::BoundedIntegerVariable const& variable, uint64_t indent) const; - void appendVariable(std::stringstream& out, storm::jani::UnboundedIntegerVariable const& variable, uint64_t indent) const; - - void appendAutomata(std::stringstream& out, storm::jani::Model const& model, uint64_t indent) const; - void appendAutomaton(std::stringstream& out, storm::jani::Model const& model, storm::jani::Automaton const& automaton, uint64_t indent) const; - - void appendLocation(std::stringstream& out, storm::jani::Location const& location, uint64_t indent) const; - void appendLocations(std::stringstream& out, storm::jani::Automaton const& automaton, uint64_t indent) const; - - void appendAssignment(std::stringstream& out, storm::jani::Model const& model, storm::jani::Automaton const& automaton, storm::jani::Assignment const& assignment, uint64_t indent) const; - void appendEdgeDestination(std::stringstream& out, storm::jani::Model const& model, storm::jani::Automaton const& automaton, storm::jani::EdgeDestination const& destination, uint64_t indent) const; - void appendEdge(std::stringstream& out, storm::jani::Model const& model, storm::jani::Automaton const& automaton, storm::jani::Edge const& edge, uint64_t indent) const; - void appendEdges(std::stringstream& out, storm::jani::Model const& model, storm::jani::Automaton const& automaton, uint64_t indent) const; - }; - - } -} \ No newline at end of file diff --git a/src/storage/jani/JSONExporter.cpp b/src/storage/jani/JSONExporter.cpp new file mode 100644 index 000000000..e0c37fabc --- /dev/null +++ b/src/storage/jani/JSONExporter.cpp @@ -0,0 +1,762 @@ +#include "JSONExporter.h" + +#include +#include +#include + +#include "src/utility/macros.h" +#include "src/exceptions/FileIoException.h" +#include "src/exceptions/NotSupportedException.h" + +#include "src/exceptions/InvalidJaniException.h" +#include "src/exceptions/NotImplementedException.h" + +#include "src/storage/expressions/RationalLiteralExpression.h" +#include "src/storage/expressions/IntegerLiteralExpression.h" +#include "src/storage/expressions/BooleanLiteralExpression.h" +#include "src/storage/expressions/UnaryBooleanFunctionExpression.h" +#include "src/storage/expressions/UnaryNumericalFunctionExpression.h" +#include "src/storage/expressions/BinaryBooleanFunctionExpression.h" +#include "src/storage/expressions/BinaryNumericalFunctionExpression.h" +#include "src/storage/expressions/IfThenElseExpression.h" +#include "src/storage/expressions/BinaryRelationExpression.h" +#include "src/storage/expressions/VariableExpression.h" + +#include "src/logic/Formulas.h" + +#include "src/storage/jani/AutomatonComposition.h" +#include "src/storage/jani/ParallelComposition.h" +#include "src/storage/jani/Property.h" + +namespace storm { + namespace jani { + + + class CompositionJsonExporter : public CompositionVisitor { + public: + CompositionJsonExporter(bool allowRecursion) : allowRecursion(allowRecursion){ + + } + + static modernjson::json translate(storm::jani::Composition const& comp, bool allowRecursion = true) { + CompositionJsonExporter visitor(allowRecursion); + return boost::any_cast(comp.accept(visitor, boost::none)); + } + + virtual boost::any visit(AutomatonComposition const& composition, boost::any const& data) { + modernjson::json compDecl; + modernjson::json autDecl; + autDecl["automaton"] = composition.getAutomatonName(); + std::vector elements; + elements.push_back(autDecl); + compDecl["elements"] = elements; + return compDecl; + } + + virtual boost::any visit(ParallelComposition const& composition, boost::any const& data) { + modernjson::json compDecl; + + std::vector elems; + for (auto const& subcomp : composition.getSubcompositions()) { + modernjson::json elemDecl; + if (subcomp->isAutomaton()) { + elemDecl["automaton"] = std::static_pointer_cast(subcomp)->getAutomatonName(); + } else { + STORM_LOG_THROW(allowRecursion, storm::exceptions::InvalidJaniException, "Nesting composition " << *subcomp << " is not supported by JANI."); + elemDecl = boost::any_cast(subcomp->accept(*this, boost::none)); + } + elems.push_back(elemDecl); + } + compDecl["elements"] = elems; + std::vector synElems; + for (auto const& syncs : composition.getSynchronizationVectors()) { + modernjson::json syncDecl; + syncDecl["synchronise"] = std::vector(); + for (auto const& syncIn : syncs.getInput()) { + if (syncIn == SynchronizationVector::NO_ACTION_INPUT) { + syncDecl["synchronise"].push_back(nullptr); + } else { + syncDecl["synchronise"].push_back(syncIn); + } + } + syncDecl["result"] = syncs.getOutput(); + synElems.push_back(syncDecl); + } + if (!synElems.empty()) { + compDecl["syncs"] = synElems; + } + + return compDecl; + } + + private: + bool allowRecursion; + }; + + std::string comparisonTypeToJani(storm::logic::ComparisonType ct) { + switch(ct) { + case storm::logic::ComparisonType::Less: + return "<"; + case storm::logic::ComparisonType::LessEqual: + return "≤"; + case storm::logic::ComparisonType::Greater: + return ">"; + case storm::logic::ComparisonType::GreaterEqual: + return "≥"; + default: + assert(false); + } + } + + modernjson::json numberToJson(storm::RationalNumber rn) { + modernjson::json numDecl; + numDecl = storm::utility::convertNumber(rn); +// if(carl::isOne(carl::getDenom(rn))) { +// numDecl = modernjson::json(carl::toString(carl::getNum(rn))); +// } else { +// numDecl["op"] = "/"; +// // TODO set json lib to work with arbitrary precision ints. +// assert(carl::toInt(carl::getNum(rn)) == carl::getNum(rn)); +// assert(carl::toInt(carl::getDenom(rn)) == carl::getDenom(rn)); +// numDecl["left"] = carl::toInt(carl::getNum(rn)); +// numDecl["right"] = carl::toInt(carl::getDenom(rn)); +// } + return numDecl; + } + + + modernjson::json constructPropertyInterval(uint64_t lower, uint64_t upper) { + modernjson::json iDecl; + iDecl["lower"] = lower; + iDecl["upper"] = upper; + return iDecl; + } + + modernjson::json constructPropertyInterval(double lower, double upper) { + modernjson::json iDecl; + iDecl["lower"] = lower; + iDecl["upper"] = upper; + return iDecl; + } + + modernjson::json FormulaToJaniJson::translate(storm::logic::Formula const& formula, storm::jani::Model const& model) { + FormulaToJaniJson translator(model); + return boost::any_cast(formula.accept(translator)); + } + + boost::any FormulaToJaniJson::visit(storm::logic::AtomicExpressionFormula const& f, boost::any const& data) const { + return ExpressionToJson::translate(f.getExpression()); + } + + boost::any FormulaToJaniJson::visit(storm::logic::AtomicLabelFormula const& f, boost::any const& data) const { + modernjson::json opDecl(f.getLabel()); + return opDecl; + } + boost::any FormulaToJaniJson::visit(storm::logic::BinaryBooleanStateFormula const& f, boost::any const& data) const{ + modernjson::json opDecl; + storm::logic::BinaryBooleanStateFormula::OperatorType op = f.getOperator(); + opDecl["op"] = op == storm::logic::BinaryBooleanStateFormula::OperatorType::And ? "∧" : "∨"; + opDecl["left"] = boost::any_cast(f.getLeftSubformula().accept(*this, boost::none)); + opDecl["right"] = boost::any_cast(f.getRightSubformula().accept(*this, boost::none)); + return opDecl; + } + boost::any FormulaToJaniJson::visit(storm::logic::BooleanLiteralFormula const& f, boost::any const& data) const { + modernjson::json opDecl(f.isTrueFormula() ? true : false); + return opDecl; + } + boost::any FormulaToJaniJson::visit(storm::logic::BoundedUntilFormula const& f, boost::any const& data) const { + modernjson::json opDecl; + opDecl["op"] = "U"; + opDecl["left"] = boost::any_cast(f.getLeftSubformula().accept(*this, boost::none)); + opDecl["right"] = boost::any_cast(f.getRightSubformula().accept(*this, boost::none)); + if(f.hasDiscreteTimeBound()) { + opDecl["step-bounds"] = constructPropertyInterval(0, f.getDiscreteTimeBound()); + } else { + opDecl["time-bounds"] = constructPropertyInterval(f.getIntervalBounds().first, f.getIntervalBounds().second); + } + return opDecl; + } + + boost::any FormulaToJaniJson::visit(storm::logic::ConditionalFormula const& f, boost::any const& data) const { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Jani currently does not support conditional formulae"); + } + + boost::any FormulaToJaniJson::visit(storm::logic::CumulativeRewardFormula const& f, boost::any const& data) const { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Storm currently does not support translating cummulative reward formulae"); + } + + boost::any FormulaToJaniJson::visit(storm::logic::EventuallyFormula const& f, boost::any const& data) const { + modernjson::json opDecl; + opDecl["op"] = "U"; + opDecl["left"] = boost::any_cast(f.getTrueFormula()->accept(*this, boost::none)); + opDecl["right"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + return opDecl; + } + + boost::any FormulaToJaniJson::visit(storm::logic::TimeOperatorFormula const& f, boost::any const& data) const { + modernjson::json opDecl; + std::vector tvec; + tvec.push_back("time"); + if(f.hasBound()) { + auto bound = f.getBound(); + opDecl["op"] = comparisonTypeToJani(bound.comparisonType); + if(f.hasOptimalityType()) { + opDecl["left"]["op"] = f.getOptimalityType() == storm::solver::OptimizationDirection::Minimize ? "Emin" : "Emax"; + opDecl["left"]["reach"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + } else { + opDecl["left"]["op"] = (bound.comparisonType == storm::logic::ComparisonType::Less || bound.comparisonType == storm::logic::ComparisonType::LessEqual) ? "Emax" : "Emin"; + opDecl["left"]["reach"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + } + opDecl["left"]["exp"] = modernjson::json(1); + opDecl["left"]["accumulate"] = modernjson::json(tvec); + opDecl["right"] = numberToJson(bound.threshold); + } else { + if(f.hasOptimalityType()) { + opDecl["op"] = f.getOptimalityType() == storm::solver::OptimizationDirection::Minimize ? "Emin" : "Emax"; + opDecl["reach"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + + } else { + // TODO add checks + opDecl["op"] = "Emin"; + opDecl["reach"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + } + opDecl["exp"] = modernjson::json(1); + opDecl["accumulate"] = modernjson::json(tvec); + } + return opDecl; + } + + boost::any FormulaToJaniJson::visit(storm::logic::GloballyFormula const& f, boost::any const& data) const { + STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Jani currently does not support conversion of a globally formulae"); + } + + boost::any FormulaToJaniJson::visit(storm::logic::InstantaneousRewardFormula const& f, boost::any const& data) const { + STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Jani currently does not support conversion of an instanteneous reward formula"); + } + + boost::any FormulaToJaniJson::visit(storm::logic::LongRunAverageOperatorFormula const& f, boost::any const& data) const { + modernjson::json opDecl; + if(f.hasBound()) { + auto bound = f.getBound(); + opDecl["op"] = comparisonTypeToJani(bound.comparisonType); + if(f.hasOptimalityType()) { + opDecl["left"]["op"] = f.getOptimalityType() == storm::solver::OptimizationDirection::Minimize ? "Smin" : "Smax"; + opDecl["left"]["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + } else { + opDecl["left"]["op"] = (bound.comparisonType == storm::logic::ComparisonType::Less || bound.comparisonType == storm::logic::ComparisonType::LessEqual) ? "Smax" : "Smin"; + opDecl["left"]["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + } + opDecl["right"] = numberToJson(bound.threshold); + } else { + if(f.hasOptimalityType()) { + opDecl["op"] = f.getOptimalityType() == storm::solver::OptimizationDirection::Minimize ? "Smin" : "Smax"; + opDecl["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + + } else { + // TODO add checks + opDecl["op"] = "Pmin"; + opDecl["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + } + } + return opDecl; + + } + + boost::any FormulaToJaniJson::visit(storm::logic::LongRunAverageRewardFormula const& f, boost::any const& data) const { +// modernjson::json opDecl; +// if(f.()) { +// auto bound = f.getBound(); +// opDecl["op"] = comparisonTypeToJani(bound.comparisonType); +// if(f.hasOptimalityType()) { +// opDecl["left"]["op"] = f.getOptimalityType() == storm::solver::OptimizationDirection::Minimize ? "Smin" : "Smax"; +// opDecl["left"]["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); +// } else { +// opDecl["left"]["op"] = (bound.comparisonType == storm::logic::ComparisonType::Less || bound.comparisonType == storm::logic::ComparisonType::LessEqual) ? "Smax" : "Smin"; +// opDecl["left"]["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); +// } +// opDecl["right"] = numberToJson(bound.threshold); +// } else { +// if(f.hasOptimalityType()) { +// opDecl["op"] = f.getOptimalityType() == storm::solver::OptimizationDirection::Minimize ? "Smin" : "Smax"; +// opDecl["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); +// +// } else { +// // TODO add checks +// opDecl["op"] = "Pmin"; +// opDecl["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); +// } +// } +// return opDecl; + + STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Jani currently does not support conversion of an LRA reward formula"); + } + + boost::any FormulaToJaniJson::visit(storm::logic::NextFormula const& f, boost::any const& data) const { + modernjson::json opDecl; + opDecl["op"] = "U"; + opDecl["left"] = boost::any_cast(f.getTrueFormula()->accept(*this, boost::none)); + opDecl["right"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + opDecl["step-bounds"] = constructPropertyInterval((uint64_t)1, (uint64_t)1); + return opDecl; + } + + + + + boost::any FormulaToJaniJson::visit(storm::logic::ProbabilityOperatorFormula const& f, boost::any const& data) const { + modernjson::json opDecl; + + if(f.hasBound()) { + auto bound = f.getBound(); + opDecl["op"] = comparisonTypeToJani(bound.comparisonType); + if(f.hasOptimalityType()) { + opDecl["left"]["op"] = f.getOptimalityType() == storm::solver::OptimizationDirection::Minimize ? "Pmin" : "Pmax"; + opDecl["left"]["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + } else { + opDecl["left"]["op"] = (bound.comparisonType == storm::logic::ComparisonType::Less || bound.comparisonType == storm::logic::ComparisonType::LessEqual) ? "Pmax" : "Pmin"; + opDecl["left"]["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + } + opDecl["right"] = numberToJson(bound.threshold); + } else { + if(f.hasOptimalityType()) { + opDecl["op"] = f.getOptimalityType() == storm::solver::OptimizationDirection::Minimize ? "Pmin" : "Pmax"; + opDecl["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + + } else { + // TODO add checks + opDecl["op"] = "Pmin"; + opDecl["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + } + } + return opDecl; + } + + boost::any FormulaToJaniJson::visit(storm::logic::RewardOperatorFormula const& f, boost::any const& data) const { + modernjson::json opDecl; + std::vector accvec; + if(model.isDiscreteTimeModel()) { + accvec.push_back("steps"); + } else { + accvec.push_back("time"); + } + if(f.hasBound()) { + auto bound = f.getBound(); + opDecl["op"] = comparisonTypeToJani(bound.comparisonType); + if(f.hasOptimalityType()) { + opDecl["left"]["op"] = f.getOptimalityType() == storm::solver::OptimizationDirection::Minimize ? "Emin" : "Emax"; + opDecl["left"]["reach"] = boost::any_cast(f.getSubformula().asEventuallyFormula().getSubformula().accept(*this, boost::none)); + } else { + opDecl["left"]["op"] = (bound.comparisonType == storm::logic::ComparisonType::Less || bound.comparisonType == storm::logic::ComparisonType::LessEqual) ? "Emax" : "Emin"; + opDecl["left"]["reach"] = boost::any_cast(f.getSubformula().asEventuallyFormula().getSubformula().accept(*this, boost::none)); + } + STORM_LOG_THROW(f.hasRewardModelName(), storm::exceptions::NotSupportedException, "Reward name has to be specified for Jani-conversion"); + opDecl["left"]["exp"] = f.getRewardModelName(); + opDecl["left"]["accumulate"] = modernjson::json(accvec); + opDecl["right"] = numberToJson(bound.threshold); + } else { + if(f.hasOptimalityType()) { + opDecl["op"] = f.getOptimalityType() == storm::solver::OptimizationDirection::Minimize ? "Emin" : "Emax"; + opDecl["reach"] = boost::any_cast(f.getSubformula().asEventuallyFormula().getSubformula().accept(*this, boost::none)); + + } else { + // TODO add checks + opDecl["op"] = "Emin"; + opDecl["reach"] = boost::any_cast(f.getSubformula().asEventuallyFormula().getSubformula().accept(*this, boost::none)); + } + STORM_LOG_THROW(f.hasRewardModelName(), storm::exceptions::NotSupportedException, "Reward name has to be specified for Jani-conversion"); + opDecl["exp"] = f.getRewardModelName(); + opDecl["accumulate"] = modernjson::json(accvec); + } + return opDecl; + } + + boost::any FormulaToJaniJson::visit(storm::logic::UnaryBooleanStateFormula const& f, boost::any const& data) const { + modernjson::json opDecl; + storm::logic::UnaryBooleanStateFormula::OperatorType op = f.getOperator(); + assert(op == storm::logic::UnaryBooleanStateFormula::OperatorType::Not); + opDecl["op"] = "¬"; + opDecl["exp"] = boost::any_cast(f.getSubformula().accept(*this, boost::none)); + return opDecl; + } + + boost::any FormulaToJaniJson::visit(storm::logic::UntilFormula const& f, boost::any const& data) const { + modernjson::json opDecl; + opDecl["op"] = "U"; + opDecl["left"] = boost::any_cast(f.getLeftSubformula().accept(*this, boost::none)); + opDecl["right"] = boost::any_cast(f.getRightSubformula().accept(*this, boost::none)); + return opDecl; + } + + std::string operatorTypeToJaniString(storm::expressions::OperatorType optype) { + + using OpType = storm::expressions::OperatorType; + switch(optype) { + case OpType::And: + return "∧"; + case OpType::Or: + return "∨"; + case OpType::Xor: + return "≠"; + case OpType::Implies: + return "⇒"; + case OpType::Iff: + return "="; + case OpType::Plus: + return "+"; + case OpType::Minus: + return "-"; + case OpType::Times: + return "*"; + case OpType::Divide: + return "/"; + case OpType::Min: + return "min"; + case OpType::Max: + return "max"; + case OpType::Power: + return "pow"; + case OpType::Equal: + return "="; + case OpType::NotEqual: + return "≠"; + case OpType::Less: + return "<"; + case OpType::LessOrEqual: + return "≤"; + case OpType::Greater: + return ">"; + case OpType::GreaterOrEqual: + return "≥"; + case OpType::Not: + return "¬"; + case OpType::Floor: + return "floor"; + case OpType::Ceil: + return "ceil"; + case OpType::Ite: + return "ite"; + default: + STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Operator not supported by Jani"); + } + } + + modernjson::json ExpressionToJson::translate(storm::expressions::Expression const& expr) { + ExpressionToJson visitor; + return boost::any_cast(expr.accept(visitor, boost::none)); + } + + + boost::any ExpressionToJson::visit(storm::expressions::IfThenElseExpression const& expression, boost::any const& data) { + modernjson::json opDecl; + opDecl["op"] = "ite"; + opDecl["if"] = boost::any_cast(expression.getCondition()->accept(*this, boost::none)); + opDecl["then"] = boost::any_cast(expression.getThenExpression()->accept(*this, boost::none)); + opDecl["else"] = boost::any_cast(expression.getElseExpression()->accept(*this, boost::none)); + return opDecl; + } + boost::any ExpressionToJson::visit(storm::expressions::BinaryBooleanFunctionExpression const& expression, boost::any const& data) { + modernjson::json opDecl; + opDecl["op"] = operatorTypeToJaniString(expression.getOperator()); + opDecl["left"] = boost::any_cast(expression.getOperand(0)->accept(*this, boost::none)); + opDecl["right"] = boost::any_cast(expression.getOperand(1)->accept(*this, boost::none)); + return opDecl; + } + boost::any ExpressionToJson::visit(storm::expressions::BinaryNumericalFunctionExpression const& expression, boost::any const& data) { + modernjson::json opDecl; + opDecl["op"] = operatorTypeToJaniString(expression.getOperator()); + opDecl["left"] = boost::any_cast(expression.getOperand(0)->accept(*this, boost::none)); + opDecl["right"] = boost::any_cast(expression.getOperand(1)->accept(*this, boost::none)); + return opDecl; + } + boost::any ExpressionToJson::visit(storm::expressions::BinaryRelationExpression const& expression, boost::any const& data) { + modernjson::json opDecl; + opDecl["op"] = operatorTypeToJaniString(expression.getOperator()); + opDecl["left"] = boost::any_cast(expression.getOperand(0)->accept(*this, boost::none)); + opDecl["right"] = boost::any_cast(expression.getOperand(1)->accept(*this, boost::none)); + return opDecl; + } + boost::any ExpressionToJson::visit(storm::expressions::VariableExpression const& expression, boost::any const& data) { + return modernjson::json(expression.getVariableName()); + } + boost::any ExpressionToJson::visit(storm::expressions::UnaryBooleanFunctionExpression const& expression, boost::any const& data) { + modernjson::json opDecl; + opDecl["op"] = operatorTypeToJaniString(expression.getOperator()); + opDecl["exp"] = boost::any_cast(expression.getOperand()->accept(*this, boost::none)); + return opDecl; + } + boost::any ExpressionToJson::visit(storm::expressions::UnaryNumericalFunctionExpression const& expression, boost::any const& data) { + modernjson::json opDecl; + opDecl["op"] = operatorTypeToJaniString(expression.getOperator()); + opDecl["exp"] = boost::any_cast(expression.getOperand()->accept(*this, boost::none)); + return opDecl; + } + boost::any ExpressionToJson::visit(storm::expressions::BooleanLiteralExpression const& expression, boost::any const& data) { + return modernjson::json(expression.getValue()); + } + boost::any ExpressionToJson::visit(storm::expressions::IntegerLiteralExpression const& expression, boost::any const& data) { + return modernjson::json(expression.getValue()); + } + boost::any ExpressionToJson::visit(storm::expressions::RationalLiteralExpression const& expression, boost::any const& data) { + return modernjson::json(expression.getValueAsDouble()); + } + + + + + + + + void JsonExporter::toFile(storm::jani::Model const& janiModel, std::vector> const& formulas, std::string const& filepath, bool checkValid) { + std::ofstream ofs; + ofs.open (filepath, std::ofstream::out ); + if(ofs.is_open()) { + toStream(janiModel, formulas, ofs, checkValid); + } else { + STORM_LOG_THROW(false, storm::exceptions::FileIoException, "Cannot open " << filepath); + } + } + + void JsonExporter::toStream(storm::jani::Model const& janiModel, std::vector> const& formulas, std::ostream& os, bool checkValid) { + if(checkValid) { + janiModel.checkValid(); + } + JsonExporter exporter; + exporter.convertModel(janiModel); + exporter.convertProperties(formulas, janiModel); + os << exporter.finalize().dump(4) << std::endl; + } + + modernjson::json buildActionArray(std::vector const& actions) { + std::vector actionReprs; + uint64_t actIndex = 0; + for(auto const& act : actions) { + if(actIndex == storm::jani::Model::SILENT_ACTION_INDEX) { + actIndex++; + continue; + } + actIndex++; + modernjson::json actEntry; + actEntry["name"] = act.getName(); + actionReprs.push_back(actEntry); + } + + return modernjson::json(actionReprs); + + } + + + modernjson::json buildExpression(storm::expressions::Expression const& exp) { + return ExpressionToJson::translate(exp); + } + + + modernjson::json buildConstantsArray(std::vector const& constants) { + std::vector constantDeclarations; + for(auto const& constant : constants) { + modernjson::json constantEntry; + constantEntry["name"] = constant.getName(); + modernjson::json typeDesc; + if(constant.isBooleanConstant()) { + typeDesc = "bool"; + } else if(constant.isRealConstant()) { + typeDesc = "real"; + } else { + assert(constant.isIntegerConstant()); + typeDesc = "int"; + } + constantEntry["type"] = typeDesc; + if(constant.isDefined()) { + constantEntry["value"] = buildExpression(constant.getExpression()); + } + constantDeclarations.push_back(constantEntry); + } + return modernjson::json(constantDeclarations); + } + + modernjson::json buildVariablesArray(storm::jani::VariableSet const& varSet) { + std::vector variableDeclarations; + for(auto const& variable : varSet) { + modernjson::json varEntry; + varEntry["name"] = variable.getName(); + varEntry["transient"] = variable.isTransient(); + modernjson::json typeDesc; + if(variable.isBooleanVariable()) { + typeDesc = "bool"; + } else if(variable.isRealVariable()) { + typeDesc = "real"; + } else if(variable.isUnboundedIntegerVariable()) { + typeDesc = "int"; + } else { + assert(variable.isBoundedIntegerVariable()); + typeDesc["kind"] = "bounded"; + typeDesc["base"] = "int"; + typeDesc["lower-bound"] = buildExpression(variable.asBoundedIntegerVariable().getLowerBound()); + typeDesc["upper-bound"] = buildExpression(variable.asBoundedIntegerVariable().getUpperBound()); + } + + varEntry["type"] = typeDesc; + if(variable.hasInitExpression()) { + varEntry["initial-value"] = buildExpression(variable.getInitExpression()); + } + variableDeclarations.push_back(varEntry); + } + return modernjson::json(variableDeclarations); + + } + + modernjson::json buildAssignmentArray(storm::jani::OrderedAssignments const& orderedAssignments) { + std::vector assignmentDeclarations; + bool addIndex = orderedAssignments.hasMultipleLevels(); + for(auto const& assignment : orderedAssignments) { + modernjson::json assignmentEntry; + assignmentEntry["ref"] = assignment.getVariable().getName(); + assignmentEntry["value"] = buildExpression(assignment.getAssignedExpression()); + if(addIndex) { + assignmentEntry["index"] = assignment.getLevel(); + } + assignmentDeclarations.push_back(assignmentEntry); + } + return modernjson::json(assignmentDeclarations); + } + + modernjson::json buildLocationsArray(std::vector const& locations) { + std::vector locationDeclarations; + for(auto const& location : locations) { + modernjson::json locEntry; + locEntry["name"] = location.getName(); + // TODO support invariants? + locEntry["transient-values"] = buildAssignmentArray(location.getAssignments()); + locationDeclarations.push_back(locEntry); + } + return modernjson::json(locationDeclarations); + } + + modernjson::json buildInitialLocations(storm::jani::Automaton const& automaton) { + std::vector names; + for(auto const& initLocIndex : automaton.getInitialLocationIndices()) { + names.push_back(automaton.getLocation(initLocIndex).getName()); + } + return modernjson::json(names); + } + + modernjson::json buildDestinations(std::vector const& destinations, std::map const& locationNames) { + std::vector destDeclarations; + for(auto const& destination : destinations) { + modernjson::json destEntry; + destEntry["location"] = locationNames.at(destination.getLocationIndex()); + destEntry["probability"]["exp"] = buildExpression(destination.getProbability()); + destEntry["assignments"] = buildAssignmentArray(destination.getOrderedAssignments()); + destDeclarations.push_back(destEntry); + } + return modernjson::json(destDeclarations); + } + + modernjson::json buildEdges(std::vector const& edges , std::map const& actionNames, std::map const& locationNames) { + std::vector edgeDeclarations; + for(auto const& edge : edges) { + modernjson::json edgeEntry; + edgeEntry["location"] = locationNames.at(edge.getSourceLocationIndex()); + if(!edge.hasSilentAction()) { + edgeEntry["action"] = actionNames.at(edge.getActionIndex()); + } + if(edge.hasRate()) { + edgeEntry["rate"]["exp"] = buildExpression(edge.getRate()); + } + edgeEntry["guard"]["exp"] = buildExpression(edge.getGuard()); + edgeEntry["destinations"] = buildDestinations(edge.getDestinations(), locationNames); + + edgeDeclarations.push_back(edgeEntry); + } + return modernjson::json(edgeDeclarations); + } + + modernjson::json buildAutomataArray(std::vector const& automata, std::map const& actionNames) { + std::vector automataDeclarations; + for(auto const& automaton : automata) { + modernjson::json autoEntry; + autoEntry["name"] = automaton.getName(); + autoEntry["variables"] = buildVariablesArray(automaton.getVariables()); + if(automaton.hasRestrictedInitialStates()) { + autoEntry["restrict-initial"]["exp"] = buildExpression(automaton.getInitialStatesRestriction()); + } + autoEntry["locations"] = buildLocationsArray(automaton.getLocations()); + autoEntry["initial-locations"] = buildInitialLocations(automaton); + autoEntry["edges"] = buildEdges(automaton.getEdges(), actionNames, automaton.buildIdToLocationNameMap()); + automataDeclarations.push_back(autoEntry); + } + return modernjson::json(automataDeclarations); + } + + + void JsonExporter::convertModel(storm::jani::Model const& janiModel) { + jsonStruct["jani-version"] = janiModel.getJaniVersion(); + jsonStruct["name"] = janiModel.getName(); + jsonStruct["type"] = to_string(janiModel.getModelType()); + jsonStruct["actions"] = buildActionArray(janiModel.getActions()); + jsonStruct["constants"] = buildConstantsArray(janiModel.getConstants()); + jsonStruct["variables"] = buildVariablesArray(janiModel.getGlobalVariables()); + jsonStruct["restrict-initial"]["exp"] = buildExpression(janiModel.getInitialStatesRestriction()); + jsonStruct["automata"] = buildAutomataArray(janiModel.getAutomata(), janiModel.getActionIndexToNameMap()); + jsonStruct["system"] = CompositionJsonExporter::translate(janiModel.getSystemComposition()); + std::vector standardFeatureVector = {"derived-operators"}; + jsonStruct["features"] = standardFeatureVector; + + } + + + + + std::string janiFilterTypeString(storm::modelchecker::FilterType const& ft) { + switch(ft) { + case storm::modelchecker::FilterType::MIN: + return "min"; + case storm::modelchecker::FilterType::MAX: + return "max"; + case storm::modelchecker::FilterType::SUM: + return "sum"; + case storm::modelchecker::FilterType::AVG: + return "avg"; + case storm::modelchecker::FilterType::COUNT: + return "count"; + case storm::modelchecker::FilterType::EXISTS: + return "∃"; + case storm::modelchecker::FilterType::FORALL: + return "∀"; + case storm::modelchecker::FilterType::ARGMIN: + return "argmin"; + case storm::modelchecker::FilterType::ARGMAX: + return "argmax"; + case storm::modelchecker::FilterType::VALUES: + return "values"; + default: + assert(false); + + } + } + + modernjson::json convertFilterExpression(storm::jani::FilterExpression const& fe, storm::jani::Model const& model) { + modernjson::json propDecl; + propDecl["states"]["op"] = "initial"; + propDecl["op"] = "filter"; + propDecl["fun"] = janiFilterTypeString(fe.getFilterType()); + propDecl["values"] = FormulaToJaniJson::translate(*fe.getFormula(), model); + return propDecl; + } + + + void JsonExporter::convertProperties( std::vector> const& formulas, storm::jani::Model const& model) { + std::vector properties; + uint64_t index = 0; + for(auto const& f : formulas) { + modernjson::json propDecl; + propDecl["name"] = "prop" + std::to_string(index); + propDecl["expression"] = convertFilterExpression(storm::jani::FilterExpression(f), model); + ++index; + properties.push_back(propDecl); + } + jsonStruct["properties"] = properties; + } + + + } +} diff --git a/src/storage/jani/JSONExporter.h b/src/storage/jani/JSONExporter.h new file mode 100644 index 000000000..3f82984be --- /dev/null +++ b/src/storage/jani/JSONExporter.h @@ -0,0 +1,84 @@ +#pragma once + + +#include "src/storage/expressions/ExpressionVisitor.h" +#include "src/logic/FormulaVisitor.h" +#include "Model.h" +#include "src/adapters/NumberAdapter.h" +// JSON parser +#include "json.hpp" +namespace modernjson { + using json = nlohmann::basic_json; +} + +namespace storm { + namespace jani { + + class ExpressionToJson : public storm::expressions::ExpressionVisitor { + + public: + static modernjson::json translate(storm::expressions::Expression const& expr); + + virtual boost::any visit(storm::expressions::IfThenElseExpression const& expression, boost::any const& data); + virtual boost::any visit(storm::expressions::BinaryBooleanFunctionExpression const& expression, boost::any const& data); + virtual boost::any visit(storm::expressions::BinaryNumericalFunctionExpression const& expression, boost::any const& data); + virtual boost::any visit(storm::expressions::BinaryRelationExpression const& expression, boost::any const& data); + virtual boost::any visit(storm::expressions::VariableExpression const& expression, boost::any const& data); + virtual boost::any visit(storm::expressions::UnaryBooleanFunctionExpression const& expression, boost::any const& data); + virtual boost::any visit(storm::expressions::UnaryNumericalFunctionExpression const& expression, boost::any const& data); + virtual boost::any visit(storm::expressions::BooleanLiteralExpression const& expression, boost::any const& data); + virtual boost::any visit(storm::expressions::IntegerLiteralExpression const& expression, boost::any const& data); + virtual boost::any visit(storm::expressions::RationalLiteralExpression const& expression, boost::any const& data); + + }; + + class FormulaToJaniJson : public storm::logic::FormulaVisitor { + + public: + static modernjson::json translate(storm::logic::Formula const& formula, storm::jani::Model const& modeln); + virtual boost::any visit(storm::logic::AtomicExpressionFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::AtomicLabelFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::BinaryBooleanStateFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::BooleanLiteralFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::BoundedUntilFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::ConditionalFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::CumulativeRewardFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::EventuallyFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::TimeOperatorFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::GloballyFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::InstantaneousRewardFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::LongRunAverageOperatorFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::LongRunAverageRewardFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::NextFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::ProbabilityOperatorFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::RewardOperatorFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::UnaryBooleanStateFormula const& f, boost::any const& data) const; + virtual boost::any visit(storm::logic::UntilFormula const& f, boost::any const& data) const; + + private: + FormulaToJaniJson(storm::jani::Model const& model) : model(model) { } + storm::jani::Model const& model; + }; + + class JsonExporter { + JsonExporter() = default; + + public: + static void toFile(storm::jani::Model const& janiModel, std::vector> const& formulas, std::string const& filepath, bool checkValid = true); + static void toStream(storm::jani::Model const& janiModel, std::vector> const& formulas, std::ostream& ostream, bool checkValid = false); + + private: + void convertModel(storm::jani::Model const& model); + void convertProperties(std::vector> const& formulas, storm::jani::Model const& model); + void appendVariableDeclaration(storm::jani::Variable const& variable); + + modernjson::json finalize() { + return jsonStruct; + } + + modernjson::json jsonStruct; + + + }; + } +} diff --git a/src/storage/jani/Location.cpp b/src/storage/jani/Location.cpp index 84b45ebaf..05a22d4e5 100644 --- a/src/storage/jani/Location.cpp +++ b/src/storage/jani/Location.cpp @@ -1,9 +1,13 @@ #include "src/storage/jani/Location.h" +#include "src/utility/macros.h" +#include "src/exceptions/InvalidJaniException.h" +#include "src/exceptions/InvalidArgumentException.h" + namespace storm { namespace jani { - Location::Location(std::string const& name) : name(name) { + Location::Location(std::string const& name, std::vector const& transientAssignments) : name(name), assignments(transientAssignments) { // Intentionally left empty. } @@ -11,5 +15,24 @@ namespace storm { return name; } + OrderedAssignments const& Location::getAssignments() const { + return assignments; + } + + void Location::addTransientAssignment(storm::jani::Assignment const& assignment) { + STORM_LOG_THROW(assignment.isTransient(), storm::exceptions::InvalidArgumentException, "Must not add non-transient assignment to location."); + assignments.add(assignment); + } + + void Location::substitute(std::map const& substitution) { + for (auto& assignment : assignments) { + assignment.substitute(substitution); + } + } + + void Location::checkValid() const { + // Intentionally left empty. + } + } } \ No newline at end of file diff --git a/src/storage/jani/Location.h b/src/storage/jani/Location.h index 56a08ab2c..a2328cb22 100644 --- a/src/storage/jani/Location.h +++ b/src/storage/jani/Location.h @@ -2,24 +2,54 @@ #include +#include "src/storage/jani/OrderedAssignments.h" + namespace storm { namespace jani { + /** + * Jani Location: + * + * Whereas Jani Locations also support invariants, we do not have support for them (as we do not support any of the allowed model types) + */ class Location { public: /*! * Creates a new location. */ - Location(std::string const& name); + Location(std::string const& name, std::vector const& transientAssignments = {}); /*! * Retrieves the name of the location. */ std::string const& getName() const; + /*! + * Retrieves the assignments of this location. + */ + OrderedAssignments const& getAssignments() const; + + /*! + * Adds the given transient assignment to this location. + */ + void addTransientAssignment(storm::jani::Assignment const& assignment); + + /*! + * Substitutes all variables in all expressions according to the given substitution. + */ + void substitute(std::map const& substitution); + + /*! + * Checks whether the location is valid, that is, whether the assignments are indeed all transient assignments. + */ + void checkValid() const; + private: - // The name of the location. + /// The name of the location. std::string name; + + /// The transient assignments made in this location. + OrderedAssignments assignments; }; } diff --git a/src/storage/jani/Model.cpp b/src/storage/jani/Model.cpp index ed4d4aa68..ee2317df8 100644 --- a/src/storage/jani/Model.cpp +++ b/src/storage/jani/Model.cpp @@ -7,12 +7,15 @@ #include "src/utility/macros.h" #include "src/exceptions/WrongFormatException.h" +#include "src/exceptions/InvalidArgumentException.h" #include "src/exceptions/InvalidOperationException.h" +#include "src/exceptions/InvalidTypeException.h" namespace storm { namespace jani { - static const std::string SILENT_ACTION_NAME = ""; + const std::string Model::SILENT_ACTION_NAME = ""; + const uint64_t Model::SILENT_ACTION_INDEX = 0; Model::Model() { // Intentionally left empty. @@ -26,8 +29,16 @@ namespace storm { this->expressionManager = std::make_shared(); } + // Create an initial restriction. + initialStatesRestriction = this->expressionManager->boolean(true); + // Add a prefined action that represents the silent action. - silentActionIndex = addAction(storm::jani::Action(SILENT_ACTION_NAME)); + uint64_t actionIndex = addAction(storm::jani::Action(SILENT_ACTION_NAME)); + STORM_LOG_ASSERT(actionIndex == SILENT_ACTION_INDEX, "Illegal silent action index."); + } + + storm::expressions::ExpressionManager& Model::getManager() const { + return *expressionManager; } uint64_t Model::getJaniVersion() const { @@ -67,6 +78,10 @@ namespace storm { return it->second; } + std::unordered_map const& Model::getActionToIndexMap() const { + return actionToIndex; + } + std::vector const& Model::getActions() const { return actions; } @@ -100,17 +115,35 @@ namespace storm { std::vector& Model::getConstants() { return constants; } + + Variable const& Model::addVariable(Variable const& variable) { + if (variable.isBooleanVariable()) { + return addVariable(variable.asBooleanVariable()); + } else if (variable.isBoundedIntegerVariable()) { + return addVariable(variable.asBoundedIntegerVariable()); + } else if (variable.isUnboundedIntegerVariable()) { + return addVariable(variable.asUnboundedIntegerVariable()); + } else if (variable.isRealVariable()) { + return addVariable(variable.asRealVariable()); + } else { + STORM_LOG_THROW(false, storm::exceptions::InvalidTypeException, "Variable has invalid type."); + } + } - void Model::addBooleanVariable(BooleanVariable const& variable) { - globalVariables.addBooleanVariable(variable); + BooleanVariable const& Model::addVariable(BooleanVariable const& variable) { + return globalVariables.addVariable(variable); } - void Model::addBoundedIntegerVariable(BoundedIntegerVariable const& variable) { - globalVariables.addBoundedIntegerVariable(variable); + BoundedIntegerVariable const& Model::addVariable(BoundedIntegerVariable const& variable) { + return globalVariables.addVariable(variable); } - void Model::addUnboundedIntegerVariable(UnboundedIntegerVariable const& variable) { - globalVariables.addUnboundedIntegerVariable(variable); + UnboundedIntegerVariable const& Model::addVariable(UnboundedIntegerVariable const& variable) { + return globalVariables.addVariable(variable); + } + + RealVariable const& Model::addVariable(RealVariable const& variable) { + return globalVariables.addVariable(variable); } VariableSet& Model::getGlobalVariables() { @@ -121,6 +154,23 @@ namespace storm { return globalVariables; } + bool Model::hasGlobalVariable(std::string const& name) const { + return globalVariables.hasVariable(name); + } + + Variable const& Model::getGlobalVariable(std::string const& name) const { + return globalVariables.getVariable(name); + } + + bool Model::hasNonGlobalTransientVariable() const { + for (auto const& automaton : automata) { + if (automaton.hasTransientVariable()) { + return true; + } + } + return false; + } + storm::expressions::ExpressionManager& Model::getExpressionManager() { return *expressionManager; } @@ -157,40 +207,58 @@ namespace storm { return automata[it->second]; } + uint64_t Model::getAutomatonIndex(std::string const& name) const { + auto it = automatonToIndex.find(name); + STORM_LOG_THROW(it != automatonToIndex.end(), storm::exceptions::InvalidOperationException, "Unable to retrieve unknown automaton '" << name << "'."); + return it->second; + } + std::size_t Model::getNumberOfAutomata() const { return automata.size(); } std::shared_ptr Model::getStandardSystemComposition() const { - std::shared_ptr current; - current = std::make_shared(this->automata.front().getName()); - std::set leftHandActionIndices = this->automata.front().getActionIndices(); + // If there's just one automaton, we must not use the parallel composition operator. + if (this->getNumberOfAutomata() == 1) { + return std::make_shared(this->getAutomata().front().getName()); + } - for (uint64_t index = 1; index < automata.size(); ++index) { - std::set newActionIndices = automata[index].getActionIndices(); - - // Compute the intersection of actions of the left- and right-hand side. - std::set intersectionActions; - std::set_intersection(leftHandActionIndices.begin(), leftHandActionIndices.end(), newActionIndices.begin(), newActionIndices.end(), std::inserter(intersectionActions, intersectionActions.begin())); - - // If the silent action is in the intersection, we remove it since we cannot synchronize over it. - auto it = intersectionActions.find(this->getSilentActionIndex()); - if (it != intersectionActions.end()) { - intersectionActions.erase(it); + // Determine the action indices used by each of the automata and create the standard subcompositions. + std::set allActionIndices; + std::vector> automatonActionIndices; + std::vector> subcompositions; + for (auto const& automaton : automata) { + automatonActionIndices.push_back(automaton.getActionIndices()); + automatonActionIndices.back().erase(SILENT_ACTION_INDEX); + allActionIndices.insert(automatonActionIndices.back().begin(), automatonActionIndices.back().end()); + subcompositions.push_back(std::make_shared(automaton.getName())); + } + + // Create the standard synchronization vectors: every automaton with that action participates in the + // synchronization. + std::vector synchVectors; + for (auto actionIndex : allActionIndices) { + std::string const& actionName = this->getAction(actionIndex).getName(); + std::vector synchVectorInputs; + uint64_t numberOfParticipatingAutomata = 0; + int i = 0; + for (auto const& actionIndices : automatonActionIndices) { + if (actionIndices.find(actionIndex) != actionIndices.end()) { + ++numberOfParticipatingAutomata; + synchVectorInputs.push_back(actionName); + } else { + synchVectorInputs.push_back(storm::jani::SynchronizationVector::NO_ACTION_INPUT); + } + ++i; } - // Then join the actions to reflect the actions of the new left-hand side. - leftHandActionIndices.insert(newActionIndices.begin(), newActionIndices.end()); - - // Create the set of strings that represents the actions over which to synchronize. - std::set intersectionActionNames; - for (auto const& actionIndex : intersectionActions) { - intersectionActionNames.insert(this->getAction(actionIndex).getName()); + // Only add the synchronization vector if there is more than one participating automaton. + if (numberOfParticipatingAutomata > 1) { + synchVectors.push_back(storm::jani::SynchronizationVector(synchVectorInputs, actionName)); } - - current = std::make_shared(current, std::make_shared(automata[index].getName()), intersectionActionNames); } - return current; + + return std::make_shared(subcompositions, synchVectors); } Composition const& Model::getSystemComposition() const { @@ -201,22 +269,28 @@ namespace storm { this->composition = composition; } + void Model::setStandardSystemComposition() { + setSystemComposition(getStandardSystemComposition()); + } + std::set Model::getActionNames(bool includeSilent) const { std::set result; for (auto const& entry : actionToIndex) { - if (includeSilent || entry.second != silentActionIndex) { + if (includeSilent || entry.second != SILENT_ACTION_INDEX) { result.insert(entry.first); } } return result; } - - std::string const& Model::getSilentActionName() const { - return actions[silentActionIndex].getName(); - } - - uint64_t Model::getSilentActionIndex() const { - return silentActionIndex; + + std::map Model::getActionIndexToNameMap() const { + std::map mapping; + uint64_t i = 0; + for(auto const& act : actions) { + mapping[i] = act.getName(); + ++i; + } + return mapping; } Model Model::defineUndefinedConstants(std::map const& constantDefinitions) const { @@ -288,38 +362,15 @@ namespace storm { // Substitute constants in all global variables. for (auto& variable : result.getGlobalVariables().getBoundedIntegerVariables()) { - variable.setLowerBound(variable.getLowerBound().substitute(constantSubstitution)); - variable.setUpperBound(variable.getUpperBound().substitute(constantSubstitution)); + variable.substitute(constantSubstitution); } // Substitute constants in initial states expression. - if (this->hasInitialStatesExpression()) { - result.setInitialStatesExpression(this->getInitialStatesExpression().substitute(constantSubstitution)); - } + result.setInitialStatesRestriction(this->getInitialStatesRestriction().substitute(constantSubstitution)); // Substitute constants in variables of automata and their edges. for (auto& automaton : result.getAutomata()) { - for (auto& variable : automaton.getVariables().getBoundedIntegerVariables()) { - variable.setLowerBound(variable.getLowerBound().substitute(constantSubstitution)); - variable.setUpperBound(variable.getUpperBound().substitute(constantSubstitution)); - } - - if (automaton.hasInitialStatesExpression()) { - automaton.setInitialStatesExpression(automaton.getInitialStatesExpression().substitute(constantSubstitution)); - } - - for (auto& edge : automaton.getEdges()) { - edge.setGuard(edge.getGuard().substitute(constantSubstitution)); - if (edge.hasRate()) { - edge.setRate(edge.getRate().substitute(constantSubstitution)); - } - for (auto& destination : edge.getDestinations()) { - destination.setProbability(destination.getProbability().substitute(constantSubstitution)); - for (auto& assignment : destination.getAssignments()) { - assignment.setAssignedExpression(assignment.getAssignedExpression().substitute(constantSubstitution)); - } - } - } + automaton.substitute(constantSubstitution); } return result; @@ -337,28 +388,43 @@ namespace storm { return result; } - bool Model::hasInitialStatesExpression() const { - return initialStatesExpression.isInitialized(); + void Model::setInitialStatesRestriction(storm::expressions::Expression const& initialStatesRestriction) { + this->initialStatesRestriction = initialStatesRestriction; } - + + storm::expressions::Expression const& Model::getInitialStatesRestriction() const { + return initialStatesRestriction; + } + storm::expressions::Expression Model::getInitialStatesExpression(bool includeAutomataInitialStatesExpressions) const { - STORM_LOG_THROW(globalVariables.empty() || this->hasInitialStatesExpression(), storm::exceptions::InvalidOperationException, "Cannot retrieve global initial states expression, because there is none."); - storm::expressions::Expression result = this->hasInitialStatesExpression() ? initialStatesExpression : expressionManager->boolean(true); + // Start with the restriction of variables. + storm::expressions::Expression result = initialStatesRestriction; + + // Then add initial values for those non-transient variables that have one. + for (auto const& variable : globalVariables) { + if (variable.isTransient()) { + continue; + } + + if (variable.hasInitExpression()) { + result = result && (variable.isBooleanVariable() ? storm::expressions::iff(variable.getExpressionVariable(), variable.getInitExpression()) : variable.getExpressionVariable() == variable.getInitExpression()); + } + } + + // If we are to include the expressions for the automata, do so now. if (includeAutomataInitialStatesExpressions) { for (auto const& automaton : automata) { - STORM_LOG_THROW(automaton.getVariables().empty() || automaton.hasInitialStatesExpression(), storm::exceptions::InvalidOperationException, "Cannot retrieve initial states expression from automaton '" << automaton.getName() << "', because there is none."); if (!automaton.getVariables().empty()) { - result = result && automaton.getInitialStatesExpression(); + storm::expressions::Expression automatonInitialStatesExpression = automaton.getInitialStatesExpression(); + if (automatonInitialStatesExpression.isInitialized() && !automatonInitialStatesExpression.isTrue()) { + result = result && automatonInitialStatesExpression; + } } } } return result; } - void Model::setInitialStatesExpression(storm::expressions::Expression const& initialStatesExpression) { - this->initialStatesExpression = initialStatesExpression; - } - bool Model::isDeterministicModel() const { return this->getModelType() == ModelType::DTMC || this->getModelType() == ModelType::CTMC; } @@ -386,32 +452,50 @@ namespace storm { } } - bool Model::checkValidity(bool logdbg) const { + void Model::checkValid() const { // TODO switch to exception based return value. + STORM_LOG_ASSERT(getModelType() != storm::jani::ModelType::UNDEFINED, "Model type not set"); + STORM_LOG_ASSERT(!automata.empty(), "No automata set"); + STORM_LOG_ASSERT(composition != nullptr, "Composition is not set"); + } + + storm::expressions::Expression Model::getLabelExpression(BooleanVariable const& transientVariable, std::map const& automatonToLocationVariableMap) const { + STORM_LOG_THROW(transientVariable.isTransient(), storm::exceptions::InvalidArgumentException, "Expected transient variable."); - if (version == 0) { - if(logdbg) STORM_LOG_DEBUG("Jani version is unspecified"); - return false; - } + storm::expressions::Expression result; + bool negate = transientVariable.getInitExpression().isTrue(); - if(modelType == ModelType::UNDEFINED) { - if(logdbg) STORM_LOG_DEBUG("Model type is unspecified"); - return false; + for (auto const& automaton : this->getAutomata()) { + storm::expressions::Variable const& locationVariable = automatonToLocationVariableMap.at(automaton.getName()); + for (auto const& location : automaton.getLocations()) { + for (auto const& assignment : location.getAssignments().getTransientAssignments()) { + if (assignment.getExpressionVariable() == transientVariable.getExpressionVariable()) { + auto newExpression = (locationVariable == this->getManager().integer(automaton.getLocationIndex(location.getName()))) && (negate ? !assignment.getAssignedExpression() : assignment.getAssignedExpression()); + if (result.isInitialized()) { + result = result || newExpression; + } else { + result = newExpression; + } + } + } + } } - if(automata.empty()) { - if(logdbg) STORM_LOG_DEBUG("No automata specified"); - return false; + if (result.isInitialized()) { + if (negate) { + result = !result; + } + } else { + result = this->getManager().boolean(negate); } - // All checks passed. - return true; + return result; } - bool Model::hasDefaultComposition() const { - CompositionInformationVisitor visitor; - CompositionInformation info = visitor.getInformation(this->getSystemComposition(), *this); - if (info.containsRestrictedParallelComposition() || info.containsRenameComposition()) { + bool Model::hasStandardComposition() const { + CompositionInformationVisitor visitor(*this, this->getSystemComposition()); + CompositionInformation info = visitor.getInformation(); + if (info.containsNonStandardParallelComposition()) { return false; } for (auto const& multiplicity : info.getAutomatonToMultiplicityMap()) { @@ -422,5 +506,67 @@ namespace storm { return true; } + bool Model::undefinedConstantsAreGraphPreserving() const { + if (!this->hasUndefinedConstants()) { + return true; + } + + // Gather the variables of all undefined constants. + std::set undefinedConstantVariables; + for (auto const& constant : this->getConstants()) { + if (!constant.isDefined()) { + undefinedConstantVariables.insert(constant.getExpressionVariable()); + } + } + + // Start by checking the defining expressions of all defined constants. If it contains a currently undefined + // constant, we need to mark the target constant as undefined as well. + for (auto const& constant : this->getConstants()) { + if (constant.isDefined()) { + if (constant.getExpression().containsVariable(undefinedConstantVariables)) { + undefinedConstantVariables.insert(constant.getExpressionVariable()); + } + } + } + + // Check global variable definitions. + if (this->getGlobalVariables().containsVariablesInBoundExpressionsOrInitialValues(undefinedConstantVariables)) { + return false; + } + + // Check the automata. + for (auto const& automaton : this->getAutomata()) { + if (!automaton.containsVariablesOnlyInProbabilitiesOrTransientAssignments(undefinedConstantVariables)) { + return false; + } + } + + // Check initial states restriction. + if (initialStatesRestriction.containsVariable(undefinedConstantVariables)) { + return false; + } + return true; + } + + void Model::makeStandardJaniCompliant() { + for (auto& automaton : automata) { + automaton.pushEdgeAssignmentsToDestinations(); + } + } + + void Model::liftTransientEdgeDestinationAssignments() { + for (auto& automaton : this->getAutomata()) { + automaton.liftTransientEdgeDestinationAssignments(); + } + } + + bool Model::hasTransientEdgeDestinationAssignments() const { + for (auto const& automaton : this->getAutomata()) { + if (automaton.hasTransientEdgeDestinationAssignments()) { + return true; + } + } + return false; + } } -} \ No newline at end of file +} diff --git a/src/storage/jani/Model.h b/src/storage/jani/Model.h index be779083c..35a74ead0 100644 --- a/src/storage/jani/Model.h +++ b/src/storage/jani/Model.h @@ -30,6 +30,11 @@ namespace storm { * Creates an empty model with the given type. */ Model(std::string const& name, ModelType const& modelType, uint64_t version = 1, boost::optional> const& expressionManager = boost::none); + + /*! + * Retrieves the expression manager responsible for the expressions in the model. + */ + storm::expressions::ExpressionManager& getManager() const; /*! * Retrieves the JANI-version of the model. @@ -60,6 +65,11 @@ namespace storm { */ uint64_t getActionIndex(std::string const& name) const; + /*! + * Retrieves the mapping from action names to their indices. + */ + std::unordered_map const& getActionToIndexMap() const; + /** * Adds an action to the model. * @@ -76,6 +86,11 @@ namespace storm { * Retrieves the actions of the model. */ std::vector const& getActions() const; + + /*! + * Builds a map with action indices mapped to their names + */ + std::map getActionIndexToNameMap() const; /*! * Retrieves all non-silent action indices of the model. @@ -107,20 +122,30 @@ namespace storm { */ Constant const& getConstant(std::string const& name) const; + /*! + * Adds the given variable to this model. + */ + Variable const& addVariable(Variable const& variable); + /*! * Adds the given boolean variable to this model. */ - void addBooleanVariable(BooleanVariable const& variable); + BooleanVariable const& addVariable(BooleanVariable const& variable); /*! * Adds the given bounded integer variable to this model. */ - void addBoundedIntegerVariable(BoundedIntegerVariable const& variable); + BoundedIntegerVariable const& addVariable(BoundedIntegerVariable const& variable); /*! * Adds the given unbounded integer variable to this model. */ - void addUnboundedIntegerVariable(UnboundedIntegerVariable const& variable); + UnboundedIntegerVariable const& addVariable(UnboundedIntegerVariable const& variable); + + /*! + * Adds the given real variable to this model. + */ + RealVariable const& addVariable(RealVariable const& variable); /*! * Retrieves the variables of this automaton. @@ -131,6 +156,21 @@ namespace storm { * Retrieves the variables of this automaton. */ VariableSet const& getGlobalVariables() const; + + /*! + * Retrieves whether this model has a global variable with the given name. + */ + bool hasGlobalVariable(std::string const& name) const; + + /*! + * Retrieves the global variable with the given name if one exists. + */ + Variable const& getGlobalVariable(std::string const& name) const; + + /*! + * Retrieves whether this model has a non-global transient variable. + */ + bool hasNonGlobalTransientVariable() const; /*! * Retrieves the manager responsible for the expressions in the JANI model. @@ -166,6 +206,11 @@ namespace storm { * Retrieves the automaton with the given name. */ Automaton const& getAutomaton(std::string const& name) const; + + /*! + * Retrieves the index of the given automaton. + */ + uint64_t getAutomatonIndex(std::string const& name) const; /*! * Retrieves the number of automata in this model. @@ -177,6 +222,11 @@ namespace storm { */ void setSystemComposition(std::shared_ptr const& composition); + /*! + * Sets the system composition to be the fully-synchronizing parallel composition of all automat + * @see getStandardSystemComposition + */ + void setStandardSystemComposition(); /*! * Gets the system composition as the standard, fully-synchronizing parallel composition. */ @@ -192,16 +242,6 @@ namespace storm { */ std::set getActionNames(bool includeSilent = true) const; - /*! - * Retrieves the name of the silent action. - */ - std::string const& getSilentActionName() const; - - /*! - * Retrieves the index of the silent action. - */ - uint64_t getSilentActionIndex() const; - /*! * Defines the undefined constants of the model by the given expressions. The original model is not modified, * but instead a new model is created. @@ -231,9 +271,19 @@ namespace storm { std::map getConstantsSubstitution() const; /*! - * Retrieves whether there is an expression defining the legal initial values of the global variables. + * Retrieves whether there is an expression restricting the legal initial values of the global variables. + */ + bool hasInitialStatesRestriction() const; + + /*! + * Sets the expression restricting the legal initial values of the global variables. + */ + void setInitialStatesRestriction(storm::expressions::Expression const& initialStatesRestriction); + + /*! + * Gets the expression restricting the legal initial values of the global variables. */ - bool hasInitialStatesExpression() const; + storm::expressions::Expression const& getInitialStatesRestriction() const; /*! * Retrieves the expression defining the legal initial values of the variables. @@ -243,11 +293,6 @@ namespace storm { */ storm::expressions::Expression getInitialStatesExpression(bool includeAutomataInitialStatesExpressions = false) const; - /*! - * Sets the expression defining the legal initial values of the global variables. - */ - void setInitialStatesExpression(storm::expressions::Expression const& initialStatesExpression); - /*! * Determines whether this model is a deterministic one in the sense that each state only has one choice. */ @@ -264,10 +309,10 @@ namespace storm { std::vector getAllRangeExpressions() const; /*! - * Retrieves whether this model has the default composition, that is it composes all automata in parallel + * Retrieves whether this model has the standard composition, that is it composes all automata in parallel * and synchronizes over all common actions. */ - bool hasDefaultComposition() const; + bool hasStandardComposition() const; /*! * After adding all components to the model, this method has to be called. It recursively calls @@ -279,7 +324,38 @@ namespace storm { /*! * Checks if the model is valid JANI, which should be verified before any further operations are applied to a model. */ - bool checkValidity(bool logdbg = true) const; + void checkValid() const; + + /*! + * Creates the expression that characterizes all states in which the provided transient boolean variable is + * true. The provided location variables are used to encode the location of the automata. + */ + storm::expressions::Expression getLabelExpression(BooleanVariable const& transientVariable, std::map const& automatonToLocationVariableMap) const; + + /*! + * Checks that undefined constants (parameters) of the model preserve the graph of the underlying model. + * That is, undefined constants may only appear in the probability expressions of edge destinations as well + * as on the right-hand sides of transient assignments. + */ + bool undefinedConstantsAreGraphPreserving() const; + + /*! + * Lifts the common edge destination assignments to edge assignments. + */ + void liftTransientEdgeDestinationAssignments(); + + /*! + * Retrieves whether there is any transient edge destination assignment in the model. + */ + bool hasTransientEdgeDestinationAssignments() const; + + void makeStandardJaniCompliant(); + + /// The name of the silent action. + static const std::string SILENT_ACTION_NAME; + + /// The index of the silent action. + static const uint64_t SILENT_ACTION_INDEX; private: /// The model name. @@ -303,9 +379,6 @@ namespace storm { /// The set of non-silent action indices. boost::container::flat_set nonsilentActionIndices; - /// The index of the silent action. - uint64_t silentActionIndex; - /// The constants defined by the model. std::vector constants; @@ -324,8 +397,8 @@ namespace storm { /// An expression describing how the system is composed of the automata. std::shared_ptr composition; - // The expression characterizing the legal initial values of the global variables. - storm::expressions::Expression initialStatesExpression; + // The expression restricting the legal initial values of the global variables. + storm::expressions::Expression initialStatesRestriction; }; } } diff --git a/src/storage/jani/ModelType.cpp b/src/storage/jani/ModelType.cpp index 68f974786..460145340 100644 --- a/src/storage/jani/ModelType.cpp +++ b/src/storage/jani/ModelType.cpp @@ -4,36 +4,44 @@ namespace storm { namespace jani { std::ostream& operator<<(std::ostream& stream, ModelType const& type) { + return stream << to_string(type); + } + + std::string to_string(ModelType const& type) { switch (type) { case ModelType::UNDEFINED: - stream << "undefined"; - break; + return "undefined"; + case ModelType::LTS: + return "lts"; case ModelType::DTMC: - stream << "dtmc"; - break; + return "dtmc"; case ModelType::CTMC: - stream << "ctmc"; - break; + return "ctmc"; case ModelType::MDP: - stream << "mdp"; - break; + return "mdp"; case ModelType::CTMDP: - stream << "ctmdp"; - break; + return "ctmdp"; case ModelType::MA: - stream << "ma"; - break; + return "ma"; + case ModelType::TA: + return "ta"; case ModelType::PTA: - stream << "pta"; - break; + return "pta"; case ModelType::STA: - stream << "sta"; - break; + return "sta"; + case ModelType::HA: + return "ha"; + case ModelType::PHA: + return "pha"; + case ModelType::SHA: + return "sha"; } - return stream; } ModelType getModelType(std::string const& input) { + if (input == "lts") { + return ModelType::LTS; + } if (input == "dtmc") { return ModelType::DTMC; } @@ -49,12 +57,24 @@ namespace storm { if (input == "ma") { return ModelType::MA; } + if (input == "ta") { + return ModelType::TA; + } if (input == "pta") { return ModelType::PTA; } if (input == "sta") { return ModelType::STA; } + if (input == "ha") { + return ModelType::HA; + } + if (input == "pha") { + return ModelType::PHA; + } + if (input == "sha") { + return ModelType::SHA; + } return ModelType::UNDEFINED; } diff --git a/src/storage/jani/ModelType.h b/src/storage/jani/ModelType.h index b6bebae32..c8a906d6c 100644 --- a/src/storage/jani/ModelType.h +++ b/src/storage/jani/ModelType.h @@ -5,9 +5,12 @@ namespace storm { namespace jani { - enum class ModelType {UNDEFINED = 0, DTMC = 1, CTMC = 2, MDP = 3, CTMDP = 4, MA = 5, PTA = 6, STA = 7}; + enum class ModelType {UNDEFINED = 0, LTS=1, DTMC = 2, CTMC = 3, MDP = 4, + CTMDP = 5, MA = 6, TA = 7, PTA = 8, STA = 9, + HA = 10, PHA = 11, SHA = 12}; ModelType getModelType(std::string const& input); + std::string to_string(ModelType const& type); std::ostream& operator<<(std::ostream& stream, ModelType const& type); } diff --git a/src/storage/jani/OrderedAssignments.cpp b/src/storage/jani/OrderedAssignments.cpp new file mode 100644 index 000000000..933054100 --- /dev/null +++ b/src/storage/jani/OrderedAssignments.cpp @@ -0,0 +1,133 @@ +#include "src/storage/jani/OrderedAssignments.h" + +#include "src/utility/macros.h" +#include "src/exceptions/InvalidArgumentException.h" + +namespace storm { + namespace jani { + + OrderedAssignments::OrderedAssignments(std::vector const& assignments) { + for (auto const& assignment : assignments) { + add(assignment); + } + } + + OrderedAssignments::OrderedAssignments(Assignment const& assignment) { + add(assignment); + } + + bool OrderedAssignments::add(Assignment const& assignment) { + // If the element is contained in this set of assignment, nothing needs to be added. + if (this->contains(assignment)) { + return false; + } + + // Otherwise, we find the spot to insert it. + auto it = lowerBound(assignment, allAssignments); + + if (it != allAssignments.end()) { + STORM_LOG_THROW(assignment.getExpressionVariable() != (*it)->getExpressionVariable(), storm::exceptions::InvalidArgumentException, "Cannot add assignment as an assignment to this variable already exists."); + } + + // Finally, insert the new element in the correct vectors. + auto elementToInsert = std::make_shared(assignment); + allAssignments.emplace(it, elementToInsert); + if (assignment.isTransient()) { + auto transientIt = lowerBound(assignment, transientAssignments); + transientAssignments.emplace(transientIt, elementToInsert); + } else { + auto nonTransientIt = lowerBound(assignment, nonTransientAssignments); + nonTransientAssignments.emplace(nonTransientIt, elementToInsert); + } + + return true; + } + + bool OrderedAssignments::remove(Assignment const& assignment) { + // If the element is contained in this set of assignment, nothing needs to be removed. + if (!this->contains(assignment)) { + return false; + } + + // Otherwise, we find the element to delete. + auto it = lowerBound(assignment, allAssignments); + STORM_LOG_ASSERT(it != allAssignments.end(), "Invalid iterator, expected existing element."); + STORM_LOG_ASSERT(assignment == **it, "Wrong iterator position."); + allAssignments.erase(it); + + if (assignment.isTransient()) { + auto transientIt = lowerBound(assignment, transientAssignments); + STORM_LOG_ASSERT(transientIt != transientAssignments.end(), "Invalid iterator, expected existing element."); + STORM_LOG_ASSERT(assignment == **transientIt, "Wrong iterator position."); + transientAssignments.erase(transientIt); + } else { + auto nonTransientIt = lowerBound(assignment, nonTransientAssignments); + STORM_LOG_ASSERT(nonTransientIt != nonTransientAssignments.end(), "Invalid iterator, expected existing element."); + STORM_LOG_ASSERT(assignment == **nonTransientIt, "Wrong iterator position."); + nonTransientAssignments.erase(nonTransientIt); + } + return true; + } + + bool OrderedAssignments::hasMultipleLevels() const { + if(allAssignments.empty()) { + return false; + } + uint64_t firstLevel = allAssignments.front()->getLevel(); + for(auto const& assignment : allAssignments) { + if(assignment->getLevel() != firstLevel) { + return true; + } + } + return false; + } + + bool OrderedAssignments::contains(Assignment const& assignment) const { + auto it = lowerBound(assignment, allAssignments); + if (it != allAssignments.end() && assignment == **it) { + return true; + } else { + return false; + } + } + + detail::ConstAssignments OrderedAssignments::getAllAssignments() const { + return detail::ConstAssignments(allAssignments.begin(), allAssignments.end()); + } + + detail::ConstAssignments OrderedAssignments::getTransientAssignments() const { + return detail::ConstAssignments(transientAssignments.begin(), transientAssignments.end()); + } + + detail::ConstAssignments OrderedAssignments::getNonTransientAssignments() const { + return detail::ConstAssignments(nonTransientAssignments.begin(), nonTransientAssignments.end()); + } + + detail::Assignments::iterator OrderedAssignments::begin() { + return detail::Assignments::make_iterator(allAssignments.begin()); + } + + detail::ConstAssignments::iterator OrderedAssignments::begin() const { + return detail::ConstAssignments::make_iterator(allAssignments.begin()); + } + + detail::Assignments::iterator OrderedAssignments::end() { + return detail::Assignments::make_iterator(allAssignments.end()); + } + + detail::ConstAssignments::iterator OrderedAssignments::end() const { + return detail::ConstAssignments::make_iterator(allAssignments.end()); + } + + void OrderedAssignments::substitute(std::map const& substitution) { + for (auto& assignment : allAssignments) { + assignment->substitute(substitution); + } + } + + std::vector>::const_iterator OrderedAssignments::lowerBound(Assignment const& assignment, std::vector> const& assignments) { + return std::lower_bound(assignments.begin(), assignments.end(), assignment, storm::jani::AssignmentPartialOrderByVariable()); + } + + } +} \ No newline at end of file diff --git a/src/storage/jani/OrderedAssignments.h b/src/storage/jani/OrderedAssignments.h new file mode 100644 index 000000000..afbf66cad --- /dev/null +++ b/src/storage/jani/OrderedAssignments.h @@ -0,0 +1,100 @@ +#pragma once + +#include "src/adapters/DereferenceIteratorAdapter.h" + +#include "src/storage/jani/Assignment.h" + +namespace storm { + namespace jani { + + namespace detail { + using Assignments = storm::adapters::DereferenceIteratorAdapter>>; + using ConstAssignments = storm::adapters::DereferenceIteratorAdapter> const>; + } + + class OrderedAssignments { + public: + /*! + * Creates an ordered set of assignments. + */ + OrderedAssignments(std::vector const& assignments = std::vector()); + + explicit OrderedAssignments(Assignment const& assignment); + + /*! + * Adds the given assignment to the set of assignments. + * + * @return True iff the assignment was added. + */ + bool add(Assignment const& assignment); + + /*! + * Removes the given assignment from this set of assignments. + * + * @return True if the assignment was found and removed. + */ + bool remove(Assignment const& assignment); + + /*! + * Checks whether the assignments have several levels. + * + * @return True if more than one level occurs in the assignment set. + */ + bool hasMultipleLevels() const; + + /*! + * Retrieves whether the given assignment is contained in this set of assignments. + */ + bool contains(Assignment const& assignment) const; + + /*! + * Returns all assignments in this set of assignments. + */ + detail::ConstAssignments getAllAssignments() const; + + /*! + * Returns all transient assignments in this set of assignments. + */ + detail::ConstAssignments getTransientAssignments() const; + + /*! + * Returns all non-transient assignments in this set of assignments. + */ + detail::ConstAssignments getNonTransientAssignments() const; + + /*! + * Returns an iterator to the assignments. + */ + detail::Assignments::iterator begin(); + + /*! + * Returns an iterator to the assignments. + */ + detail::ConstAssignments::iterator begin() const; + + /*! + * Returns an iterator past the end of the assignments. + */ + detail::Assignments::iterator end(); + + /*! + * Returns an iterator past the end of the assignments. + */ + detail::ConstAssignments::iterator end() const; + + /*! + * Substitutes all variables in all expressions according to the given substitution. + */ + void substitute(std::map const& substitution); + + private: + static std::vector>::const_iterator lowerBound(Assignment const& assignment, std::vector> const& assignments); + + // The vectors to store the assignments. These need to be ordered at all times. + std::vector> allAssignments; + std::vector> transientAssignments; + std::vector> nonTransientAssignments; + }; + + } +} \ No newline at end of file diff --git a/src/storage/jani/ParallelComposition.cpp b/src/storage/jani/ParallelComposition.cpp index f767e32cc..aad0e2d3d 100644 --- a/src/storage/jani/ParallelComposition.cpp +++ b/src/storage/jani/ParallelComposition.cpp @@ -1,33 +1,232 @@ #include "src/storage/jani/ParallelComposition.h" +#include + #include +#include "src/utility/macros.h" +#include "src/exceptions/WrongFormatException.h" +#include "src/storage/jani/Model.h" + namespace storm { namespace jani { - ParallelComposition::ParallelComposition(std::shared_ptr const& leftSubcomposition, std::shared_ptr const& rightSubcomposition, std::set const& alphabet) : leftSubcomposition(leftSubcomposition), rightSubcomposition(rightSubcomposition), alphabet(alphabet) { + const std::string SynchronizationVector::NO_ACTION_INPUT = "-"; + + SynchronizationVector::SynchronizationVector(std::vector const& input, std::string const& output) : input(input), output(output) { // Intentionally left empty. } - Composition const& ParallelComposition::getLeftSubcomposition() const { - return *leftSubcomposition; + SynchronizationVector::SynchronizationVector(std::vector const& input) : input(input), output(storm::jani::Model::SILENT_ACTION_NAME) { + + } + + std::size_t SynchronizationVector::size() const { + return input.size(); + } + + std::vector const& SynchronizationVector::getInput() const { + return input; + } + + std::string const& SynchronizationVector::getInput(uint64_t index) const { + return input[index]; + } + std::string const& SynchronizationVector::getOutput() const { + return output; + } + + boost::optional SynchronizationVector::getPrecedingParticipatingAction(uint64_t index) const { + boost::optional position = getPositionOfPrecedingParticipatingAction(index); + if (position) { + return getInput(position.get()); + } else { + return boost::none; + } + } + + boost::optional SynchronizationVector::getPositionOfPrecedingParticipatingAction(uint64_t index) const { + if (index == 0) { + return boost::none; + } + + uint64_t i = index - 1; + for (; i > 0; --i) { + if (this->getInput(i) != NO_ACTION_INPUT) { + return boost::make_optional(i); + } + } + + // Check the 0-index. + if (this->getInput(i) != NO_ACTION_INPUT) { + return boost::make_optional(i); + } + + return boost::none; + } + + uint64_t SynchronizationVector::getPositionOfFirstParticipatingAction() const { + for (uint64_t result = 0; result < this->size(); ++result) { + if (this->getInput(result) != NO_ACTION_INPUT) { + return result; + } + } + STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Synchronization vector must have at least one participating action."); + } + + bool SynchronizationVector::isNoActionInput(std::string const& action) { + return action == NO_ACTION_INPUT; + } + + std::ostream& operator<<(std::ostream& stream, SynchronizationVector const& synchronizationVector) { + bool first = true; + stream << "("; + for (auto const& element : synchronizationVector.getInput()) { + if (!first) { + stream << ", "; + } + stream << element; + first = false; + } + stream << ") -> " << synchronizationVector.getOutput(); + return stream; + } + + bool operator==(SynchronizationVector const& vector1, SynchronizationVector const& vector2) { + if (vector1.getOutput() != vector2.getOutput()) { + return false; + } + if (vector1.getInput() != vector1.getInput()) { + return false; + } + return true; + } + + bool operator!=(SynchronizationVector const& vector1, SynchronizationVector const& vector2) { + return !(vector1 == vector2); + } + + bool SynchronizationVectorLexicographicalLess::operator()(SynchronizationVector const& vector1, SynchronizationVector const& vector2) { + STORM_LOG_THROW(vector1.size() == vector2.size(), storm::exceptions::WrongFormatException, "Cannot compare synchronization vectors of different size."); + for (uint64_t i = 0; i < vector1.size(); ++i) { + if (vector1.getInput(i) < vector2.getInput(i)) { + return true; + } else if (vector1.getInput(i) > vector2.getInput(i)) { + return false; + } + } + if (vector1.getOutput() < vector2.getOutput()) { + return true; + } else if (vector1.getOutput() > vector2.getOutput()) { + return false; + } + return false; } - Composition const& ParallelComposition::getRightSubcomposition() const { - return *rightSubcomposition; + ParallelComposition::ParallelComposition(std::shared_ptr const& subcomposition, std::vector const& synchronizationVectors) : ParallelComposition(std::vector>{subcomposition}, synchronizationVectors) { + // Intentionally left empty. } - std::set const& ParallelComposition::getSynchronizationAlphabet() const { - return alphabet; + ParallelComposition::ParallelComposition(std::vector> const& subcompositions, std::vector const& synchronizationVectors) : subcompositions(subcompositions), synchronizationVectors(synchronizationVectors) { + STORM_LOG_THROW(!subcompositions.empty(), storm::exceptions::WrongFormatException, "At least one automaton required for parallel composition."); + this->checkSynchronizationVectors(); } + + ParallelComposition::ParallelComposition(std::vector> const& subcompositions, std::set const& synchronizationAlphabet) : subcompositions(subcompositions), synchronizationVectors() { + STORM_LOG_THROW(!subcompositions.empty(), storm::exceptions::WrongFormatException, "At least one automaton required for parallel composition."); + // Manually construct the synchronization vectors for all elements of the synchronization alphabet. + for (auto const& action : synchronizationAlphabet) { + synchronizationVectors.emplace_back(std::vector(this->subcompositions.size(), action), action); + } + } + + ParallelComposition::ParallelComposition(std::shared_ptr const& leftSubcomposition, std::shared_ptr const& rightSubcomposition, std::set const& synchronizationAlphabet) { + subcompositions.push_back(leftSubcomposition); + subcompositions.push_back(rightSubcomposition); + + // Manually construct the synchronization vectors for all elements of the synchronization alphabet. + for (auto const& action : synchronizationAlphabet) { + synchronizationVectors.emplace_back(std::vector(this->subcompositions.size(), action), action); + } + } + + Composition const& ParallelComposition::getSubcomposition(uint64_t index) const { + return *subcompositions[index]; + } + + std::vector> const& ParallelComposition::getSubcompositions() const { + return subcompositions; + } + + uint64_t ParallelComposition::getNumberOfSubcompositions() const { + return subcompositions.size(); + } + + SynchronizationVector const& ParallelComposition::getSynchronizationVector(uint64_t index) const { + return synchronizationVectors[index]; + } + + std::vector const& ParallelComposition::getSynchronizationVectors() const { + return synchronizationVectors; + } + + std::size_t ParallelComposition::getNumberOfSynchronizationVectors() const { + return synchronizationVectors.size(); + } + + void ParallelComposition::checkSynchronizationVectors() const { + for (uint_fast64_t inputIndex = 0; inputIndex < subcompositions.size(); ++ inputIndex) { + std::set actions; + for (auto const& vector : synchronizationVectors) { + STORM_LOG_THROW(vector.size() == this->subcompositions.size(), storm::exceptions::WrongFormatException, "Synchronization vectors must match parallel composition size."); + std::string const& action = vector.getInput(inputIndex); + if (action != SynchronizationVector::NO_ACTION_INPUT) { + STORM_LOG_THROW(actions.find(action) == actions.end(), storm::exceptions::WrongFormatException, "Cannot use the same action ('" << action << "') multiple times as input for index " << inputIndex << " in synchronization vectors."); + actions.insert(action); + } + } + } + + for (auto const& vector : synchronizationVectors) { + bool hasInput = false; + for (auto const& input : vector.getInput()) { + if (input != SynchronizationVector::NO_ACTION_INPUT) { + hasInput = true; + break; + } + } + STORM_LOG_THROW(hasInput, storm::exceptions::WrongFormatException, "Synchronization vector must have at least one proper input."); + } + } + boost::any ParallelComposition::accept(CompositionVisitor& visitor, boost::any const& data) const { return visitor.visit(*this, data); } void ParallelComposition::write(std::ostream& stream) const { - stream << this->getLeftSubcomposition() << " |[" << boost::algorithm::join(alphabet, ", ") << "]| " << this->getRightSubcomposition(); + std::vector synchronizationVectorsAsStrings; + for (auto const& synchronizationVector : synchronizationVectors) { + std::stringstream tmpStream; + tmpStream << synchronizationVector; + synchronizationVectorsAsStrings.push_back(tmpStream.str()); + } + + bool first = true; + bool hasSynchVectors = !synchronizationVectors.empty(); + stream << "("; + for (auto const& subcomposition : subcompositions) { + if (!first) { + stream << (hasSynchVectors ? " || " : " ||| "); + } + stream << *subcomposition; + first = false; + } + stream << ")"; + if (hasSynchVectors) { + stream << "[" << boost::algorithm::join(synchronizationVectorsAsStrings, ", ") << "]"; + } } } -} \ No newline at end of file +} diff --git a/src/storage/jani/ParallelComposition.h b/src/storage/jani/ParallelComposition.h index 4b7ff69be..b6ae63fdd 100644 --- a/src/storage/jani/ParallelComposition.h +++ b/src/storage/jani/ParallelComposition.h @@ -2,48 +2,135 @@ #include #include +#include +#include + +#include #include "src/storage/jani/Composition.h" namespace storm { namespace jani { - class ParallelComposition : public Composition { + class SynchronizationVector { public: + SynchronizationVector(std::vector const& input, std::string const& output); + SynchronizationVector(std::vector const& input); + + std::size_t size() const; + std::vector const& getInput() const; + std::string const& getInput(uint64_t index) const; + std::string const& getOutput() const; + + static bool isNoActionInput(std::string const& action); + + /*! + * Retrieves the action name that is the last participating action before the given input index. If there is + * no such action none is returned. + */ + boost::optional getPrecedingParticipatingAction(uint64_t index) const; + + /*! + * Retrieves the position of the last participating action before the given input index. If there is + * no such action none is returned. + */ + boost::optional getPositionOfPrecedingParticipatingAction(uint64_t index) const; + /*! - * Creates a parallel composition of the two subcompositions. + * Retrieves the position of the first participating action. */ - ParallelComposition(std::shared_ptr const& leftSubcomposition, std::shared_ptr const& rightSubcomposition, std::set const& alphabet = {}); + uint64_t getPositionOfFirstParticipatingAction() const; + + // A marker that can be used as one of the inputs. The semantics is that no action of the corresponding + // automaton takes part in the synchronization. + static const std::string NO_ACTION_INPUT; + private: + + /// The input to the synchronization. + std::vector input; + + /// The output of the synchronization. + std::string output; + }; + + bool operator==(SynchronizationVector const& vector1, SynchronizationVector const& vector2); + bool operator!=(SynchronizationVector const& vector1, SynchronizationVector const& vector2); + + struct SynchronizationVectorLexicographicalLess { + bool operator()(SynchronizationVector const& vector1, SynchronizationVector const& vector2); + }; + + std::ostream& operator<<(std::ostream& stream, SynchronizationVector const& synchronizationVector); + + class ParallelComposition : public Composition { + public: /*! - * Retrieves the left subcomposition. + * Creates a parallel composition of the subcomposition and the provided synchronization vectors. */ - Composition const& getLeftSubcomposition() const; + ParallelComposition(std::shared_ptr const& subcomposition, std::vector const& synchronizationVectors); /*! - * Retrieves the right subcomposition. + * Creates a parallel composition of the subcompositions and the provided synchronization vectors. */ - Composition const& getRightSubcomposition() const; + ParallelComposition(std::vector> const& subcompositions, std::vector const& synchronizationVectors); /*! - * Retrieves the alphabet of actions over which to synchronize the automata. + * Creates a parallel composition of the subcompositions over the provided synchronization alphabet. */ - std::set const& getSynchronizationAlphabet() const; + ParallelComposition(std::vector> const& subcompositions, std::set const& synchronizationAlphabet); + + /*! + * Creates a parallel composition of the subcompositions over the provided synchronization alphabet. + */ + ParallelComposition(std::shared_ptr const& leftSubcomposition, std::shared_ptr const& rightSubcomposition, std::set const& synchronizationAlphabet); + + /*! + * Retrieves the subcomposition with the given index. + */ + Composition const& getSubcomposition(uint64_t index) const; + + /*! + * Retrieves the subcompositions of the parallel composition. + */ + std::vector> const& getSubcompositions() const; + + /*! + * Retrieves the number of subcompositions of this parallel composition. + */ + uint64_t getNumberOfSubcompositions() const; + + /*! + * Retrieves the synchronization vector with the given index. + */ + SynchronizationVector const& getSynchronizationVector(uint64_t index) const; + + /*! + * Retrieves the synchronization vectors of the parallel composition. + */ + std::vector const& getSynchronizationVectors() const; + + /*! + * Retrieves the number of synchronization vectors. + */ + std::size_t getNumberOfSynchronizationVectors() const; virtual boost::any accept(CompositionVisitor& visitor, boost::any const& data) const override; virtual void write(std::ostream& stream) const override; private: - // The left subcomposition. - std::shared_ptr leftSubcomposition; + /*! + * Checks the synchronization vectors for validity. + */ + void checkSynchronizationVectors() const; - // The right subcomposition. - std::shared_ptr rightSubcomposition; + /// The subcompositions. + std::vector> subcompositions; - // The alphabet of actions over which to synchronize. - std::set alphabet; + /// The synchronization vectors of the parallel composition. + std::vector synchronizationVectors; }; } -} \ No newline at end of file +} diff --git a/src/storage/jani/Property.cpp b/src/storage/jani/Property.cpp new file mode 100644 index 000000000..3e4243a3d --- /dev/null +++ b/src/storage/jani/Property.cpp @@ -0,0 +1,41 @@ +#include "Property.h" +namespace storm { + namespace jani { + + + + std::ostream& operator<<(std::ostream& os, FilterExpression const& fe) { + return os << "Obtain " << toString(fe.getFilterType()) << " the 'initial'-states with values described by '" << *fe.getFormula() << "'"; + } + + Property::Property(std::string const& name, std::shared_ptr const& formula, std::string const& comment) + : name(name), comment(comment), filterExpression(FilterExpression(formula)) + { + + } + + Property::Property(std::string const& name, FilterExpression const& fe, std::string const& comment) + : name(name), comment(comment), filterExpression(fe) + { + + } + + std::string const& Property::getName() const { + return this->name; + } + + std::string const& Property::getComment() const { + return this->comment; + } + + FilterExpression const& Property::getFilter() const { + return this->filterExpression; + } + + std::ostream& operator<<(std::ostream& os, Property const& p) { + return os << "(" << p.getName() << ") : " << p.getFilter(); + } + + + } +} \ No newline at end of file diff --git a/src/storage/jani/Property.h b/src/storage/jani/Property.h new file mode 100644 index 000000000..d4baa9d94 --- /dev/null +++ b/src/storage/jani/Property.h @@ -0,0 +1,90 @@ +#pragma once + +#include "src/modelchecker/results/FilterType.h" +#include "src/logic/Formulas.h" + +namespace storm { + namespace jani { + + /** + * Property intervals as per Jani Specification. + * Currently mainly used to help parsing. + */ + struct PropertyInterval { + storm::expressions::Expression lowerBound; + bool lowerBoundStrict = false; + storm::expressions::Expression upperBound; + bool upperBoundStrict = false; + + bool hasLowerBound() { + return lowerBound.isInitialized(); + } + + bool hasUpperBound() { + return upperBound.isInitialized(); + } + }; + + + class FilterExpression { + public: + explicit FilterExpression(std::shared_ptr formula, storm::modelchecker::FilterType ft = storm::modelchecker::FilterType::VALUES) : values(formula), ft(ft) {} + + + std::shared_ptr const& getFormula() const { + return values; + } + + storm::modelchecker::FilterType getFilterType() const { + return ft; + } + private: + // For now, we assume that the states are always the initial states. + std::shared_ptr values; + storm::modelchecker::FilterType ft; + }; + + + std::ostream& operator<<(std::ostream& os, FilterExpression const& fe); + + + + class Property { + public: + /** + * Constructs the property + * @param name the name + * @param formula the formula representation + * @param comment An optional comment + */ + Property(std::string const& name, std::shared_ptr const& formula, std::string const& comment = ""); + /** + * Constructs the property + * @param name the name + * @param formula the formula representation + * @param comment An optional comment + */ + Property(std::string const& name, FilterExpression const& fe, std::string const& comment = ""); + /** + * Get the provided name + * @return the name + */ + std::string const& getName() const; + /** + * Get the provided comment, if any + * @return the comment + */ + std::string const& getComment() const; + + FilterExpression const& getFilter() const; + private: + std::string name; + std::string comment; + FilterExpression filterExpression; + }; + + + std::ostream& operator<<(std::ostream& os, Property const& p); + } +} + diff --git a/src/storage/jani/RealVariable.cpp b/src/storage/jani/RealVariable.cpp new file mode 100644 index 000000000..f06e87a5c --- /dev/null +++ b/src/storage/jani/RealVariable.cpp @@ -0,0 +1,19 @@ +#include "src/storage/jani/RealVariable.h" + +namespace storm { + namespace jani { + + RealVariable::RealVariable(std::string const& name, storm::expressions::Variable const& variable) : storm::jani::Variable(name, variable) { + // Intentionally left empty. + } + + RealVariable::RealVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& initValue, bool transient) : storm::jani::Variable(name, variable, initValue, transient) { + // Intentionally left empty. + } + + bool RealVariable::isRealVariable() const { + return true; + } + + } +} \ No newline at end of file diff --git a/src/storage/jani/RealVariable.h b/src/storage/jani/RealVariable.h new file mode 100644 index 000000000..1783b6fbf --- /dev/null +++ b/src/storage/jani/RealVariable.h @@ -0,0 +1,25 @@ +#pragma once + +#include "src/storage/jani/Variable.h" + +namespace storm { + namespace jani { + + class RealVariable : public Variable { + public: + /*! + * Creates a real variable without initial value. + */ + RealVariable(std::string const& name, storm::expressions::Variable const& variable); + + /*! + * Creates a real variable with initial value. + */ + RealVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& initValue, bool transient=false); + + virtual bool isRealVariable() const override; + }; + + + } +} \ No newline at end of file diff --git a/src/storage/jani/RenameComposition.cpp b/src/storage/jani/RenameComposition.cpp deleted file mode 100644 index 77ab94f5c..000000000 --- a/src/storage/jani/RenameComposition.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "src/storage/jani/RenameComposition.h" - -#include -#include - -#include - -namespace storm { - namespace jani { - - RenameComposition::RenameComposition(std::shared_ptr const& subcomposition, std::map> const& renaming) : subcomposition(subcomposition), renaming(renaming) { - // Intentionally left empty. - } - - Composition const& RenameComposition::getSubcomposition() const { - return *subcomposition; - } - - boost::any RenameComposition::accept(CompositionVisitor& visitor, boost::any const& data) const { - return visitor.visit(*this, data); - } - - std::map> const& RenameComposition::getRenaming() const { - return renaming; - } - - void RenameComposition::write(std::ostream& stream) const { - std::vector renamingStrings; - - for (auto const& entry : renaming) { - std::stringstream stream; - stream << entry.first << " -> "; - if (entry.second) { - stream << entry.second.get(); - } else { - stream << "tau"; - } - } - - stream << "(" << subcomposition << ") / {" << boost::join(renamingStrings, ", ") << "}"; - } - - - } -} \ No newline at end of file diff --git a/src/storage/jani/RenameComposition.h b/src/storage/jani/RenameComposition.h deleted file mode 100644 index 169a8d738..000000000 --- a/src/storage/jani/RenameComposition.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include -#include - -#include - -#include "src/storage/jani/Composition.h" - -namespace storm { - namespace jani { - - class RenameComposition : public Composition { - public: - RenameComposition(std::shared_ptr const& subcomposition, std::map> const& renaming = {}); - - /*! - * Retrieves the subcomposition of this rename composition. - */ - Composition const& getSubcomposition() const; - - /*! - * Retrieves the renaming of actions. If some action name is mapped to none, this indicates the action is to - * be renamed to the silent action. - */ - std::map> const& getRenaming() const; - - virtual boost::any accept(CompositionVisitor& visitor, boost::any const& data) const override; - - virtual void write(std::ostream& stream) const override; - - private: - // The subcomposition. - std::shared_ptr subcomposition; - - // The renaming to perform. If one cation is mapped to none, this means that the action is to be renamed to - // the silent action. - std::map> renaming; - }; - - } -} \ No newline at end of file diff --git a/src/storage/jani/RewardIncrement.cpp b/src/storage/jani/RewardIncrement.cpp deleted file mode 100644 index b82743d45..000000000 --- a/src/storage/jani/RewardIncrement.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "src/storage/jani/RewardIncrement.h" - -namespace storm { - namespace jani { - - RewardIncrement::RewardIncrement(uint64_t rewardIndex, storm::expressions::Expression const& value) : rewardIndex(rewardIndex), value(value) { - // Intentionally left empty. - } - - uint64_t RewardIncrement::getRewardIndex() const { - return rewardIndex; - } - - storm::expressions::Expression const& RewardIncrement::getValue() const { - return value; - } - - } -} \ No newline at end of file diff --git a/src/storage/jani/RewardIncrement.h b/src/storage/jani/RewardIncrement.h deleted file mode 100644 index 383ce9fe0..000000000 --- a/src/storage/jani/RewardIncrement.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include - -#include "src/storage/expressions/Expression.h" - -namespace storm { - namespace jani { - - class RewardIncrement { - public: - /*! - * Creates an increment of a reward (given by its index) by the given expression. - * - * @param rewardIndex The index of the reward to increment. - * @param value The expression defining the amount the reward is the incremented. - */ - RewardIncrement(uint64_t rewardIndex, storm::expressions::Expression const& value); - - /*! - * Retrieves the index of the reward to increment. - */ - uint64_t getRewardIndex() const; - - /*! - * Retrieves the expression defining the amount by which the reward is to be incremented. - */ - storm::expressions::Expression const& getValue() const; - - private: - // The index of the reward that is to be incremented. - uint64_t rewardIndex; - - // The expression defining the amount the reward is to be incremented. - storm::expressions::Expression value; - }; - - } -} \ No newline at end of file diff --git a/src/storage/jani/UnboundedIntegerVariable.cpp b/src/storage/jani/UnboundedIntegerVariable.cpp index bf8f7615f..6b541054e 100644 --- a/src/storage/jani/UnboundedIntegerVariable.cpp +++ b/src/storage/jani/UnboundedIntegerVariable.cpp @@ -3,7 +3,11 @@ namespace storm { namespace jani { - UnboundedIntegerVariable::UnboundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable) : Variable(name, variable) { + UnboundedIntegerVariable::UnboundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& initValue, bool transient) : Variable(name, variable, initValue, transient) { + // Intentionally left empty. + } + + UnboundedIntegerVariable::UnboundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, bool transient) : Variable(name, variable) { // Intentionally left empty. } diff --git a/src/storage/jani/UnboundedIntegerVariable.h b/src/storage/jani/UnboundedIntegerVariable.h index 585b953d4..17f81d334 100644 --- a/src/storage/jani/UnboundedIntegerVariable.h +++ b/src/storage/jani/UnboundedIntegerVariable.h @@ -8,9 +8,13 @@ namespace storm { class UnboundedIntegerVariable : public Variable { public: /*! - * Creates an unbounded integer variable. + * Creates an unbounded integer variable without initial value. */ - UnboundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable); + UnboundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, bool transient=false); + /*! + * Creates an unbounded integer variable with initial value. + */ + UnboundedIntegerVariable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const&, bool transient=false); virtual bool isUnboundedIntegerVariable() const override; }; diff --git a/src/storage/jani/Variable.cpp b/src/storage/jani/Variable.cpp index 3bcb8fcd0..f2c7217ff 100644 --- a/src/storage/jani/Variable.cpp +++ b/src/storage/jani/Variable.cpp @@ -3,11 +3,20 @@ #include "src/storage/jani/BooleanVariable.h" #include "src/storage/jani/BoundedIntegerVariable.h" #include "src/storage/jani/UnboundedIntegerVariable.h" +#include "src/storage/jani/RealVariable.h" namespace storm { namespace jani { - - Variable::Variable(std::string const& name, storm::expressions::Variable const& variable) : name(name), variable(variable) { + + Variable::Variable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& init, bool transient) : name(name), variable(variable), transient(transient), init(init) { + // Intentionally left empty. + } + + Variable::Variable(std::string const& name, storm::expressions::Variable const& variable) : name(name), variable(variable), transient(false), init() { + // Intentionally left empty. + } + + Variable::~Variable() { // Intentionally left empty. } @@ -30,30 +39,64 @@ namespace storm { bool Variable::isUnboundedIntegerVariable() const { return false; } + + bool Variable::isRealVariable() const { + return false; + } + + bool Variable::isTransient() const { + return transient; + } + + bool Variable::hasInitExpression() const { + return static_cast(init); + } + + storm::expressions::Expression const& Variable::getInitExpression() const { + return this->init.get(); + } + + void Variable::setInitExpression(storm::expressions::Expression const& initialExpression) { + this->init = initialExpression; + } BooleanVariable& Variable::asBooleanVariable() { - return dynamic_cast(*this); + return static_cast(*this); } BooleanVariable const& Variable::asBooleanVariable() const { - return dynamic_cast(*this); + return static_cast(*this); } BoundedIntegerVariable& Variable::asBoundedIntegerVariable() { - return dynamic_cast(*this); + return static_cast(*this); } BoundedIntegerVariable const& Variable::asBoundedIntegerVariable() const { - return dynamic_cast(*this); + return static_cast(*this); } UnboundedIntegerVariable& Variable::asUnboundedIntegerVariable() { - return dynamic_cast(*this); + return static_cast(*this); } UnboundedIntegerVariable const& Variable::asUnboundedIntegerVariable() const { - return dynamic_cast(*this); + return static_cast(*this); + } + + RealVariable& Variable::asRealVariable() { + return static_cast(*this); + } + + RealVariable const& Variable::asRealVariable() const { + return static_cast(*this); + } + + void Variable::substitute(std::map const& substitution) { + if (this->hasInitExpression()) { + this->setInitExpression(this->getInitExpression().substitute(substitution)); + } } } -} \ No newline at end of file +} diff --git a/src/storage/jani/Variable.h b/src/storage/jani/Variable.h index 2ef15321b..2eea79679 100644 --- a/src/storage/jani/Variable.h +++ b/src/storage/jani/Variable.h @@ -2,6 +2,7 @@ #include #include +#include #include "src/storage/expressions/Variable.h" #include "src/storage/expressions/Expression.h" @@ -12,14 +13,22 @@ namespace storm { class BooleanVariable; class BoundedIntegerVariable; class UnboundedIntegerVariable; + class RealVariable; class Variable { public: /*! - * Creates a new variable. + * Creates a new variable with initial value construct + */ + Variable(std::string const& name, storm::expressions::Variable const& variable, storm::expressions::Expression const& init, bool transient = false); + + /*! + * Creates a new variable without initial value construct. */ Variable(std::string const& name, storm::expressions::Variable const& variable); + virtual ~Variable(); + /*! * Retrieves the associated expression variable */ @@ -29,11 +38,32 @@ namespace storm { * Retrieves the name of the variable. */ std::string const& getName() const; - + + /*! + * Retrieves whether an initial expression is set. + */ + bool hasInitExpression() const; + + /*! + * Retrieves the initial expression + * Should only be called if an initial expression is set for this variable. + * + * @see hasInitExpression() + */ + storm::expressions::Expression const& getInitExpression() const; + + /*! + * Sets the initial expression for this variable. + */ + void setInitExpression(storm::expressions::Expression const& initialExpression); + // Methods to determine the type of the variable. virtual bool isBooleanVariable() const; virtual bool isBoundedIntegerVariable() const; virtual bool isUnboundedIntegerVariable() const; + virtual bool isRealVariable() const; + + virtual bool isTransient() const; // Methods to get the variable as a different type. BooleanVariable& asBooleanVariable(); @@ -42,6 +72,13 @@ namespace storm { BoundedIntegerVariable const& asBoundedIntegerVariable() const; UnboundedIntegerVariable& asUnboundedIntegerVariable(); UnboundedIntegerVariable const& asUnboundedIntegerVariable() const; + RealVariable& asRealVariable(); + RealVariable const& asRealVariable() const; + + /*! + * Substitutes all variables in all expressions according to the given substitution. + */ + virtual void substitute(std::map const& substitution); private: // The name of the variable. @@ -49,7 +86,13 @@ namespace storm { // The expression variable associated with this variable. storm::expressions::Variable variable; + + /// Whether this is a transient variable. + bool transient; + + /// Expression for initial values + boost::optional init; }; } -} \ No newline at end of file +} diff --git a/src/storage/jani/VariableSet.cpp b/src/storage/jani/VariableSet.cpp index 78cfab2cc..582fee73b 100644 --- a/src/storage/jani/VariableSet.cpp +++ b/src/storage/jani/VariableSet.cpp @@ -6,46 +6,7 @@ namespace storm { namespace jani { - - namespace detail { - - template - VariableType& Dereferencer::operator()(std::shared_ptr const& d) const { - return *d; - } - - template - Variables::Variables(input_iterator it, input_iterator ite) : it(it), ite(ite) { - // Intentionally left empty. - } - template - typename Variables::iterator Variables::begin() { - return boost::make_transform_iterator(it, Dereferencer()); - } - - template - typename Variables::iterator Variables::end() { - return boost::make_transform_iterator(ite, Dereferencer()); - } - - template - ConstVariables::ConstVariables(const_input_iterator it, const_input_iterator ite) : it(it), ite(ite) { - // Intentionally left empty. - } - - template - typename ConstVariables::const_iterator ConstVariables::begin() { - return boost::make_transform_iterator(it, Dereferencer()); - } - - template - typename ConstVariables::const_iterator ConstVariables::end() { - return boost::make_transform_iterator(ite, Dereferencer()); - } - - } - VariableSet::VariableSet() { // Intentionally left empty. } @@ -74,31 +35,52 @@ namespace storm { return detail::ConstVariables(unboundedIntegerVariables.begin(), unboundedIntegerVariables.end()); } - void VariableSet::addBooleanVariable(BooleanVariable const& variable) { + detail::Variables VariableSet::getRealVariables() { + return detail::Variables(realVariables.begin(), realVariables.end()); + } + + detail::ConstVariables VariableSet::getRealVariables() const { + return detail::ConstVariables(realVariables.begin(), realVariables.end()); + } + + BooleanVariable const& VariableSet::addVariable(BooleanVariable const& variable) { STORM_LOG_THROW(!this->hasVariable(variable.getName()), storm::exceptions::WrongFormatException, "Cannot add variable with name '" << variable.getName() << "', because a variable with that name already exists."); std::shared_ptr newVariable = std::make_shared(variable); variables.push_back(newVariable); booleanVariables.push_back(newVariable); nameToVariable.emplace(variable.getName(), variable.getExpressionVariable()); variableToVariable.emplace(variable.getExpressionVariable(), newVariable); + return *newVariable; } - void VariableSet::addBoundedIntegerVariable(BoundedIntegerVariable const& variable) { + BoundedIntegerVariable const& VariableSet::addVariable(BoundedIntegerVariable const& variable) { STORM_LOG_THROW(!this->hasVariable(variable.getName()), storm::exceptions::WrongFormatException, "Cannot add variable with name '" << variable.getName() << "', because a variable with that name already exists."); std::shared_ptr newVariable = std::make_shared(variable); variables.push_back(newVariable); boundedIntegerVariables.push_back(newVariable); nameToVariable.emplace(variable.getName(), variable.getExpressionVariable()); variableToVariable.emplace(variable.getExpressionVariable(), newVariable); + return *newVariable; } - void VariableSet::addUnboundedIntegerVariable(UnboundedIntegerVariable const& variable) { + UnboundedIntegerVariable const& VariableSet::addVariable(UnboundedIntegerVariable const& variable) { STORM_LOG_THROW(!this->hasVariable(variable.getName()), storm::exceptions::WrongFormatException, "Cannot add variable with name '" << variable.getName() << "', because a variable with that name already exists."); std::shared_ptr newVariable = std::make_shared(variable); variables.push_back(newVariable); unboundedIntegerVariables.push_back(newVariable); nameToVariable.emplace(variable.getName(), variable.getExpressionVariable()); variableToVariable.emplace(variable.getExpressionVariable(), newVariable); + return *newVariable; + } + + RealVariable const& VariableSet::addVariable(RealVariable const& variable) { + STORM_LOG_THROW(!this->hasVariable(variable.getName()), storm::exceptions::WrongFormatException, "Cannot add variable with name '" << variable.getName() << "', because a variable with that name already exists."); + std::shared_ptr newVariable = std::make_shared(variable); + variables.push_back(newVariable); + realVariables.push_back(newVariable); + nameToVariable.emplace(variable.getName(), variable.getExpressionVariable()); + variableToVariable.emplace(variable.getExpressionVariable(), newVariable); + return *newVariable; } bool VariableSet::hasVariable(std::string const& name) const { @@ -111,20 +93,20 @@ namespace storm { return getVariable(it->second); } - VariableSet::iterator VariableSet::begin() { - return boost::make_transform_iterator(variables.begin(), detail::Dereferencer()); + typename detail::Variables::iterator VariableSet::begin() { + return detail::Variables::make_iterator(variables.begin()); } - VariableSet::const_iterator VariableSet::begin() const { - return boost::make_transform_iterator(variables.begin(), detail::Dereferencer()); + typename detail::ConstVariables::iterator VariableSet::begin() const { + return detail::ConstVariables::make_iterator(variables.begin()); } - VariableSet::iterator VariableSet::end() { - return boost::make_transform_iterator(variables.end(), detail::Dereferencer()); + typename detail::Variables::iterator VariableSet::end() { + return detail::Variables::make_iterator(variables.end()); } - VariableSet::const_iterator VariableSet::end() const { - return boost::make_transform_iterator(variables.end(), detail::Dereferencer()); + detail::ConstVariables::iterator VariableSet::end() const { + return detail::ConstVariables::make_iterator(variables.end()); } Variable const& VariableSet::getVariable(storm::expressions::Variable const& variable) const { @@ -137,6 +119,15 @@ namespace storm { return variableToVariable.find(variable) != variableToVariable.end(); } + bool VariableSet::hasTransientVariable() const { + for (auto const& variable : variables) { + if (variable->isTransient()) { + return true; + } + } + return false; + } + bool VariableSet::containsBooleanVariable() const { return !booleanVariables.empty(); } @@ -149,24 +140,95 @@ namespace storm { return !unboundedIntegerVariables.empty(); } + bool VariableSet::containsRealVariables() const { + return !realVariables.empty(); + } + + bool VariableSet::containsNonTransientRealVariables() const { + for (auto const& variable : realVariables) { + if (!variable->isTransient()) { + return true; + } + } + return false; + } + + bool VariableSet::containsNonTransientUnboundedIntegerVariables() const { + for (auto const& variable : unboundedIntegerVariables) { + if (!variable->isTransient()) { + return true; + } + } + return false; + } + bool VariableSet::empty() const { return !(containsBooleanVariable() || containsBoundedIntegerVariable() || containsUnboundedIntegerVariables()); } - template class detail::Dereferencer; - template class detail::Dereferencer; - template class detail::Dereferencer; - template class detail::Dereferencer; - template class detail::Dereferencer; - template class detail::Dereferencer; - template class detail::Dereferencer; - template class detail::Dereferencer; - template class detail::Variables; - template class detail::Variables; - template class detail::Variables; - template class detail::ConstVariables; - template class detail::ConstVariables; - template class detail::ConstVariables; - + uint_fast64_t VariableSet::getNumberOfTransientVariables() const { + uint_fast64_t result = 0; + for (auto const& variable : variables) { + if (variable->isTransient()) { + ++result; + } + } + return result; + } + + uint_fast64_t VariableSet::getNumberOfRealTransientVariables() const { + uint_fast64_t result = 0; + for (auto const& variable : variables) { + if (variable->isTransient() && variable->isRealVariable()) { + ++result; + } + } + return result; + } + + uint_fast64_t VariableSet::getNumberOfUnboundedIntegerTransientVariables() const { + uint_fast64_t result = 0; + for (auto const& variable : variables) { + if (variable->isTransient() && variable->isUnboundedIntegerVariable()) { + ++result; + } + } + return result; + } + + std::vector> VariableSet::getTransientVariables() const { + std::vector> result; + for (auto const& variable : variables) { + if (variable->isTransient()) { + result.push_back(variable); + } + } + return result; + } + + bool VariableSet::containsVariablesInBoundExpressionsOrInitialValues(std::set const& variables) const { + for (auto const& booleanVariable : this->getBooleanVariables()) { + if (booleanVariable.hasInitExpression()) { + if (booleanVariable.getInitExpression().containsVariable(variables)) { + return true; + } + } + } + for (auto const& integerVariable : this->getBoundedIntegerVariables()) { + if (integerVariable.hasInitExpression()) { + if (integerVariable.getInitExpression().containsVariable(variables)) { + return true; + } + } + if (integerVariable.getLowerBound().containsVariable(variables)) { + return true; + } + if (integerVariable.getUpperBound().containsVariable(variables)) { + return true; + } + } + return false; + } + } } diff --git a/src/storage/jani/VariableSet.h b/src/storage/jani/VariableSet.h index 2dc5105e3..031d56652 100644 --- a/src/storage/jani/VariableSet.h +++ b/src/storage/jani/VariableSet.h @@ -3,65 +3,26 @@ #include #include -#include +#include "src/adapters/DereferenceIteratorAdapter.h" #include "src/storage/jani/BooleanVariable.h" #include "src/storage/jani/UnboundedIntegerVariable.h" #include "src/storage/jani/BoundedIntegerVariable.h" +#include "src/storage/jani/RealVariable.h" namespace storm { namespace jani { - - class VariableSet; - - namespace detail { - - template - class Dereferencer { - public: - VariableType& operator()(std::shared_ptr const& d) const; - }; - - template - class Variables { - public: - typedef typename std::vector>::iterator input_iterator; - typedef boost::transform_iterator, input_iterator> iterator; - - Variables(input_iterator it, input_iterator ite); - - iterator begin(); - iterator end(); - - private: - input_iterator it; - input_iterator ite; - }; - - template - class ConstVariables { - public: - typedef typename std::vector>::const_iterator const_input_iterator; - typedef boost::transform_iterator, const_input_iterator> const_iterator; - ConstVariables(const_input_iterator it, const_input_iterator ite); - - const_iterator begin(); - const_iterator end(); - - private: - const_input_iterator it; - const_input_iterator ite; - }; + namespace detail { + template + using Variables = storm::adapters::DereferenceIteratorAdapter>>; + + template + using ConstVariables = storm::adapters::DereferenceIteratorAdapter> const>; } class VariableSet { public: - typedef typename std::vector>::iterator input_iterator; - typedef typename std::vector>::const_iterator const_input_iterator; - typedef boost::transform_iterator, input_iterator> iterator; - typedef boost::transform_iterator, const_input_iterator> const_iterator; - /*! * Creates an empty variable set. */ @@ -97,20 +58,35 @@ namespace storm { */ detail::ConstVariables getUnboundedIntegerVariables() const; + /*! + * Retrieves the real variables in this set. + */ + detail::Variables getRealVariables(); + + /*! + * Retrieves the real variables in this set. + */ + detail::ConstVariables getRealVariables() const; + /*! * Adds the given boolean variable to this set. */ - void addBooleanVariable(BooleanVariable const& variable); + BooleanVariable const& addVariable(BooleanVariable const& variable); /*! * Adds the given bounded integer variable to this set. */ - void addBoundedIntegerVariable(BoundedIntegerVariable const& variable); + BoundedIntegerVariable const& addVariable(BoundedIntegerVariable const& variable); /*! * Adds the given unbounded integer variable to this set. */ - void addUnboundedIntegerVariable(UnboundedIntegerVariable const& variable); + UnboundedIntegerVariable const& addVariable(UnboundedIntegerVariable const& variable); + + /*! + * Adds the given real variable to this set. + */ + RealVariable const& addVariable(RealVariable const& variable); /*! * Retrieves whether this variable set contains a variable with the given name. @@ -132,25 +108,30 @@ namespace storm { */ Variable const& getVariable(storm::expressions::Variable const& variable) const; + /*! + * Retrieves whether this variable set contains a transient variable. + */ + bool hasTransientVariable() const; + /*! * Retrieves an iterator to the variables in this set. */ - iterator begin(); + typename detail::Variables::iterator begin(); /*! * Retrieves an iterator to the variables in this set. */ - const_iterator begin() const; + typename detail::ConstVariables::iterator begin() const; /*! * Retrieves the end iterator to the variables in this set. */ - iterator end(); + typename detail::Variables::iterator end(); /*! * Retrieves the end iterator to the variables in this set. */ - const_iterator end() const; + typename detail::ConstVariables::iterator end() const; /*! * Retrieves whether the set of variables contains a boolean variable. @@ -167,11 +148,52 @@ namespace storm { */ bool containsUnboundedIntegerVariables() const; + /*! + * Retrieves whether the set of variables contains a real variable. + */ + bool containsRealVariables() const; + + /*! + * Retrieves whether the set of variables contains a non-transient real variable. + */ + bool containsNonTransientRealVariables() const; + + /*! + * Retrieves whether the set of variables contains a non-transient unbounded integer variable. + */ + bool containsNonTransientUnboundedIntegerVariables() const; + /*! * Retrieves whether this variable set is empty. */ bool empty() const; + /*! + * Retrieves the number of transient variables in this variable set. + */ + uint_fast64_t getNumberOfTransientVariables() const; + + /*! + * Retrieves the number of real transient variables in this variable set. + */ + uint_fast64_t getNumberOfRealTransientVariables() const; + + /*! + * Retrieves the number of unbounded integer transient variables in this variable set. + */ + uint_fast64_t getNumberOfUnboundedIntegerTransientVariables() const; + + /*! + * Retrieves a vector of transient variables in this variable set. + */ + std::vector> getTransientVariables() const; + + /*! + * Checks whether any of the provided variables appears in bound expressions or initial values of the + * variables contained in this variable set. + */ + bool containsVariablesInBoundExpressionsOrInitialValues(std::set const& variables) const; + private: /// The vector of all variables. std::vector> variables; @@ -185,6 +207,9 @@ namespace storm { /// The unbounded integer variables in this set. std::vector> unboundedIntegerVariables; + /// The real variables in this set. + std::vector> realVariables; + /// A set of all variable names currently in use. std::map nameToVariable; diff --git a/src/storage/pgcl/AbstractStatementVisitor.h b/src/storage/pgcl/AbstractStatementVisitor.h new file mode 100755 index 000000000..75cb54186 --- /dev/null +++ b/src/storage/pgcl/AbstractStatementVisitor.h @@ -0,0 +1,27 @@ +#pragma once + +namespace storm { + namespace pgcl { + /** + * This class implements the visitor part of the visitor pattern. Every + * statement accepts such a visitor which then again calls the + * corresponding visit method of the visitor object. In such a way + * double dynamic dispatching can be realized. Every structure or + * function that requires to differentiate between concrete statement + * instantiations (such as if statements, assignments statements, ...) + * should be handled by a concrete visitor implementation. + */ + class AbstractStatementVisitor { + public: + // Those functions need to be implemented for every possible + // statement instantiation. + virtual void visit(class AssignmentStatement const&) = 0; + virtual void visit(class ObserveStatement const&) = 0; + virtual void visit(class IfStatement const&) = 0; + virtual void visit(class LoopStatement const&) = 0; + virtual void visit(class NondeterministicBranch const&) = 0; + virtual void visit(class ProbabilisticBranch const&) = 0; + }; + } +} + diff --git a/src/storage/pgcl/AssignmentStatement.cpp b/src/storage/pgcl/AssignmentStatement.cpp new file mode 100755 index 000000000..17f55ba21 --- /dev/null +++ b/src/storage/pgcl/AssignmentStatement.cpp @@ -0,0 +1,26 @@ +#include "src/storage/pgcl/AssignmentStatement.h" + +namespace storm { + namespace pgcl { + AssignmentStatement::AssignmentStatement(storm::expressions::Variable const& variable, boost::variant const& expression) : + variable(variable), expression(expression) { + } + + bool AssignmentStatement::isDeterministic() const { + return expression.which() == 0; + } + + boost::variant const& AssignmentStatement::getExpression() const { + return this->expression; + } + + storm::expressions::Variable const& AssignmentStatement::getVariable() const { + return this->variable; + } + + void AssignmentStatement::accept(storm::pgcl::AbstractStatementVisitor& visitor) { + visitor.visit(*this); + } + } +} + diff --git a/src/storage/pgcl/AssignmentStatement.h b/src/storage/pgcl/AssignmentStatement.h new file mode 100755 index 000000000..37e7e6174 --- /dev/null +++ b/src/storage/pgcl/AssignmentStatement.h @@ -0,0 +1,49 @@ +#pragma once + +#include "src/storage/pgcl/SimpleStatement.h" +#include "src/storage/pgcl/UniformExpression.h" +#include "src/storage/expressions/Expression.h" +#include "src/storage/expressions/Variable.h" +#include +#include + +namespace storm { + namespace pgcl { + /** + * This class represents a simple assignment statement of the form + * identifier := expression; where the expression is either handled by + * the expression manager or is a uniform distribution expression. + */ + class AssignmentStatement : public Statement { + public: + AssignmentStatement() = default; + /** + * Constructs an assignment statement with the variable as the left + * side and the expression as the right side of the assignment. + * @param variable The left hand variable of the assignment. + * @param expression The right hand expression of the assignment. + */ + AssignmentStatement(storm::expressions::Variable const& variable, boost::variant const& expression); + AssignmentStatement(const AssignmentStatement& orig) = default; + virtual ~AssignmentStatement() = default; + void accept(AbstractStatementVisitor&); + /** + * Returns the right hand expression of the assignemnt. + * @return The expression of the assignment. + */ + boost::variant const& getExpression() const; + + bool isDeterministic() const; + /** + * Returns the left hand variable of the assignemnt. + * @return The variable to which the expression is assigned. + */ + storm::expressions::Variable const& getVariable() const; + private: + /// Represents the variable of our assignment statement. + storm::expressions::Variable variable; + /// Represents the right hand side of our assignment statement. + boost::variant expression; + }; + } +} diff --git a/src/storage/pgcl/Block.cpp b/src/storage/pgcl/Block.cpp new file mode 100644 index 000000000..453fa7745 --- /dev/null +++ b/src/storage/pgcl/Block.cpp @@ -0,0 +1,92 @@ +#include "Block.h" +#include "StatementPrinterVisitor.h" +#include + +namespace storm { + namespace pgcl { + + + PgclBlock::PgclBlock(vector const &statements, std::shared_ptr expressions, bool hasLoop, bool hasNondet, bool hasObserve) + : sequenceOfStatements(statements), + expressions(expressions), + loop(hasLoop), + nondet(hasNondet), + observe(hasObserve) + { + + } + + iterator PgclBlock::begin() { + return this->sequenceOfStatements.begin(); + } + + const_iterator PgclBlock::begin() const { + return this->sequenceOfStatements.begin(); + } + + iterator PgclBlock::end() { + return this->sequenceOfStatements.end(); + } + + const_iterator PgclBlock::end() const { + return this->sequenceOfStatements.end(); + } + + bool PgclBlock::empty() { + return this->sequenceOfStatements.empty(); + } + + element PgclBlock::front() { + return this->sequenceOfStatements.front(); + } + + element PgclBlock::back() { + return this->sequenceOfStatements.back(); + } + + unsigned long PgclBlock::size() { + return this->sequenceOfStatements.size(); + } + + element PgclBlock::at(size_type n) { + return this->sequenceOfStatements.at(n); + } + + iterator PgclBlock::insert(iterator position, const element& statement) { + return this->sequenceOfStatements.insert(position, statement); + } + + void PgclBlock::clear() { + this->sequenceOfStatements.clear(); + } + + std::shared_ptr const& PgclBlock::getExpressionManager() const { + return this->expressions; + } + + std::vector PgclBlock::getParameters() { + return this->parameters; + } + + bool PgclBlock::hasParameters() const { + return !(this->parameters.empty()); + } + + bool PgclBlock::hasObserve() const { + return this->observe; + } + + bool PgclBlock::hasNondet() const { + return this->nondet; + } + + bool PgclBlock::hasLoop() const { + return this->loop; + } + + iterator PgclBlock::find(element &statement) { + return std::find(this->sequenceOfStatements.begin(), this->sequenceOfStatements.end(), statement); + } + + } +} \ No newline at end of file diff --git a/src/storage/pgcl/Block.h b/src/storage/pgcl/Block.h new file mode 100644 index 000000000..44f73c922 --- /dev/null +++ b/src/storage/pgcl/Block.h @@ -0,0 +1,121 @@ +#pragma once + +#include +#include "src/storage/pgcl/Statement.h" +#include "src/storage/pgcl/StatementPrinterVisitor.h" +#include "src/storage/expressions/ExpressionManager.h" + +namespace storm { + namespace pgcl { + + typedef std::shared_ptr element; + typedef std::vector vector; + typedef std::vector::iterator iterator; + typedef std::vector::const_iterator const_iterator; + typedef std::vector::size_type size_type; + + /** + * This class represents a complete and functional PGCL program. It + * contains an expression manager which keeps track of the current + * identifiers and variable valuations. Other than that, it basically + * wraps a std::vector of program statements and is intended to be used + * as such. + */ + class PgclBlock { + public: + PgclBlock() = default; + /** + * Does the same as the beforementioned constructor, but sets the + * location to statement vector to the empty vector. This + * constructor should be used for sub-programs, for which the + * location to statement relation doesn't make much sense. + * @param statements The sequence of statements representing the + * program. + * @param expressions The manager responsible for the expressions + * and variables of the program. + * @param hasLoop Whether the program contains a loop + * @param hasNondet Whether the program contains a nondeterministic + * statement. + * @param hasParam Whether the program is parameterized. + */ + PgclBlock(vector const& statements, std::shared_ptr expressions, bool hasLoop, bool hasNondet, bool hasObserve); + PgclBlock(const PgclBlock & orig) = default; + PgclBlock & operator=(PgclBlock const& other) = default; + iterator begin(); + const_iterator begin() const; + iterator end(); + const_iterator end() const; + element front(); + element back(); + unsigned long size(); + element at(size_type n); + iterator insert(iterator position, const element& statement); + iterator find(element& statement); + void clear(); + bool empty(); + + /** + * Returns the list of parameters of the PGCL program. + */ + std::vector getParameters(); + /** + * Returns the expression manager of the PGCL program, which is + * responsible for managing all expressions and variables of the + * the program and all its subprograms. + * @return The expression manager of the program. + */ + std::shared_ptr const& getExpressionManager() const; + + /** + * Returns true if the program contains a loop statement. + * @return True if the program has a loop. + */ + bool hasLoop() const; + /** + * Returns true if the program contains a nondeterministic + * statement. + * @return True if the program has a nondeterministic statement. + */ + bool hasNondet() const; + /** + * Returns true if the program contains an observe statement. + * @return True if the program has an observe statement. + */ + bool hasObserve() const; + /** + * Returns true if the program is parameterized. + * @return True if the program has at least one parameter. + */ + bool hasParameters() const; + + protected: + /** + * We are basically wrapping a std::vector which represents the + * ordered single statements of the program. + */ + vector sequenceOfStatements; + /** + * Stores the parameters a.k.a. free variables of the PGCL program. + */ + std::vector parameters; + /** + * Handles the expressions and variables for the whole program. + * The expressions of every subprogram are also handled by this + * manager. We are using a shared pointer since all subprograms + * are referring to that expression manager, too. + */ + std::shared_ptr expressions; + /** + * Boolean variables to save some properties of the PGCL program. + * They are later on used by the model builder to possibly + * construct simpler models (e.g. if no loops, params and nondets + * are used, a DTMC suffices). + * The values are set to true if the PGCL parser hits a loop resp. + * nondet resp. observe resp. parameter statement. + */ + bool loop = false; + bool nondet = false; + bool observe = false; + }; + } +} diff --git a/src/storage/pgcl/BooleanExpression.cpp b/src/storage/pgcl/BooleanExpression.cpp new file mode 100755 index 000000000..63ef05fd9 --- /dev/null +++ b/src/storage/pgcl/BooleanExpression.cpp @@ -0,0 +1,15 @@ +#include "src/storage/pgcl/BooleanExpression.h" +#include "src/storage/expressions/ExpressionManager.h" + +namespace storm { + namespace pgcl { + BooleanExpression::BooleanExpression(storm::expressions::Expression const& booleanExpression) : + booleanExpression(booleanExpression) { + } + + storm::expressions::Expression const& BooleanExpression::getBooleanExpression() const { + return this->booleanExpression; + } + } +} + diff --git a/src/storage/pgcl/BooleanExpression.h b/src/storage/pgcl/BooleanExpression.h new file mode 100755 index 000000000..968201877 --- /dev/null +++ b/src/storage/pgcl/BooleanExpression.h @@ -0,0 +1,31 @@ +#pragma once + +#include "src/storage/expressions/Expression.h" + +namespace storm { + namespace pgcl { + /** + * This class wraps an ordinary expression but allows only for boolean + * expressions to be handled, e.g. expressions of the form (x < 4) or + * (x != y), but not (x + 5). + */ + class BooleanExpression { + public: + BooleanExpression() = default; + /** + * Constructs a boolean expression if the given expression is of a + * boolean type. Note that it is not checked whether the expression + * has a boolean type. + * @param booleanExpression The expression of a boolean type. + */ + BooleanExpression(storm::expressions::Expression const& booleanExpression); + /** + * Returns the expression. + * @return The expression of boolean type. + */ + storm::expressions::Expression const& getBooleanExpression() const; + private: + storm::expressions::Expression booleanExpression; + }; + } +} \ No newline at end of file diff --git a/src/storage/pgcl/BranchStatement.cpp b/src/storage/pgcl/BranchStatement.cpp new file mode 100755 index 000000000..bd7b624cd --- /dev/null +++ b/src/storage/pgcl/BranchStatement.cpp @@ -0,0 +1,15 @@ +#include "src/storage/pgcl/BranchStatement.h" +#include "src/storage/pgcl/AbstractStatementVisitor.h" + +namespace storm { + namespace pgcl { + std::shared_ptr const& BranchStatement::getLeftBranch() const { + return this->leftBranch; + } + + std::shared_ptr const& BranchStatement::getRightBranch() const { + return this->rightBranch; + } + + } +} \ No newline at end of file diff --git a/src/storage/pgcl/BranchStatement.h b/src/storage/pgcl/BranchStatement.h new file mode 100755 index 000000000..f5d3493ae --- /dev/null +++ b/src/storage/pgcl/BranchStatement.h @@ -0,0 +1,35 @@ +#pragma once + +#include "src/storage/pgcl/PgclProgram.h" +#include "src/storage/pgcl/CompoundStatement.h" + +namespace storm { + namespace pgcl { + /** + * This abstract class handles the branching statements. Every branch + * statement has a right and a left branch. Since branch statements are + * compound statements, every branch is again a complete PGCL program + * itself. + */ + class BranchStatement : public Statement { + public: + BranchStatement() = default; + BranchStatement(const BranchStatement& orig) = default; + virtual ~BranchStatement() = default; + virtual void accept(class AbstractStatementVisitor&) = 0; + /** + * Returns the left branch of the statement. + * @return The left branch PGCL program. + */ + std::shared_ptr const& getLeftBranch() const; + /** + * Returns the right branch of the statement. + * @return The right branch PGCL program. + */ + std::shared_ptr const& getRightBranch() const; + protected: + std::shared_ptr leftBranch; + std::shared_ptr rightBranch; + }; + } +} diff --git a/src/storage/pgcl/CompoundStatement.cpp b/src/storage/pgcl/CompoundStatement.cpp new file mode 100755 index 000000000..c9ea40a4e --- /dev/null +++ b/src/storage/pgcl/CompoundStatement.cpp @@ -0,0 +1,15 @@ +/* + * File: CompoundStatement.cpp + * Author: Lukas Westhofen + * + * Created on 11. April 2015, 17:41 + */ + +#include "src/storage/pgcl/CompoundStatement.h" + +namespace storm { + namespace pgcl { + + } +} + diff --git a/src/storage/pgcl/CompoundStatement.h b/src/storage/pgcl/CompoundStatement.h new file mode 100755 index 000000000..0dd51a5d4 --- /dev/null +++ b/src/storage/pgcl/CompoundStatement.h @@ -0,0 +1,21 @@ +#pragma once + +#include "src/storage/pgcl/Statement.h" + +namespace storm { + namespace pgcl { + /** + * This abstract class represents compound statements. A compound + * statement is a statement which has again a PGCL program as a child. + * Examples are if and loop statements. + */ + class CompoundStatement : public Statement { + public: + CompoundStatement() = default; + CompoundStatement(const CompoundStatement& orig) = default; + virtual ~CompoundStatement() = default; + virtual void accept(class AbstractStatementVisitor&) = 0; + private: + }; + } +} diff --git a/src/storage/pgcl/IfStatement.cpp b/src/storage/pgcl/IfStatement.cpp new file mode 100755 index 000000000..40891213c --- /dev/null +++ b/src/storage/pgcl/IfStatement.cpp @@ -0,0 +1,37 @@ +#include "IfStatement.h" +#include "src/storage/pgcl/AbstractStatementVisitor.h" + +namespace storm { + namespace pgcl { + IfStatement::IfStatement(storm::pgcl::BooleanExpression const& condition, std::shared_ptr const& body) : + ifBody(body), condition(condition) { + } + + IfStatement::IfStatement(storm::pgcl::BooleanExpression const& condition, std::shared_ptr const& ifBody, std::shared_ptr const& elseBody) : + ifBody(ifBody), elseBody(elseBody), condition(condition) { + this->hasElseBody = true; + } + + std::shared_ptr const& IfStatement::getIfBody() const { + return this->ifBody; + } + + std::shared_ptr const& IfStatement::getElseBody() const { + assert(hasElse()); + return this->elseBody; + } + + bool IfStatement::hasElse() const{ + return this->hasElseBody; + } + + storm::pgcl::BooleanExpression const& IfStatement::getCondition() const { + return this->condition; + } + + void IfStatement::accept(storm::pgcl::AbstractStatementVisitor& visitor) { + visitor.visit(*this); + } + + } +} \ No newline at end of file diff --git a/src/storage/pgcl/IfStatement.h b/src/storage/pgcl/IfStatement.h new file mode 100755 index 000000000..cb0d923fa --- /dev/null +++ b/src/storage/pgcl/IfStatement.h @@ -0,0 +1,67 @@ +#pragma once + +#include "src/storage/pgcl/CompoundStatement.h" +#include "src/storage/pgcl/BooleanExpression.h" +#include "src/storage/pgcl/PgclProgram.h" + +namespace storm { + namespace pgcl { + /** + * This class represents if statements. Any if statement has a condition + * which is saved as a boolean expression, and a statement body which is + * again a PGCL program. Thus, an if statement is a compound statement. + * It is possibly for if statements to have one else body, but not + * mandatory. + */ + class IfStatement : public Statement { + public: + IfStatement() = default; + /** + * Creates an if statement which saves only an if body. + * @param condition The guard of the statement body. + * @param body The if body. + */ + IfStatement(storm::pgcl::BooleanExpression const& condition, std::shared_ptr const& body); + /** + * Creates an if statement with an if and an else body. + * @param condition The guard of the if body. + * @param ifBody The if body. + * @param elseBody The else body. + */ + IfStatement(storm::pgcl::BooleanExpression const& condition, std::shared_ptr const& ifBody, std::shared_ptr const& elseBody); + IfStatement(const IfStatement& orig) = default; + virtual ~IfStatement() = default; + void accept(class AbstractStatementVisitor&); + /** + * Returns the if body of the if statement. + * @return The if body. + */ + std::shared_ptr const& getIfBody() const; + /** + * Returns the else body of the if statement, if present. Otherwise + * it throws an excpetion. + * @return The else body. + */ + std::shared_ptr const& getElseBody() const; + /** + * Returns true iff the if statement has an else body. + */ + bool hasElse() const; + /** + * Returns the guard of the if statement. + * @return The condition. + */ + storm::pgcl::BooleanExpression const& getCondition() const; + private: + /// The if body is again a PGCL program. + std::shared_ptr ifBody; + /// The else body is again a PGCL program. + std::shared_ptr elseBody; + /// Memorizes if an else body was set. Set to false by default. + bool hasElseBody = false; + /// Saves the guard of the if statement. + storm::pgcl::BooleanExpression condition; + }; + } +} + diff --git a/src/storage/pgcl/LoopStatement.cpp b/src/storage/pgcl/LoopStatement.cpp new file mode 100755 index 000000000..e7b3e3568 --- /dev/null +++ b/src/storage/pgcl/LoopStatement.cpp @@ -0,0 +1,24 @@ + +#include "src/storage/pgcl/LoopStatement.h" +#include "src/storage/pgcl/AbstractStatementVisitor.h" + +namespace storm { + namespace pgcl { + LoopStatement::LoopStatement(storm::pgcl::BooleanExpression const& condition, std::shared_ptr const& body) : + body(body), condition(condition) { + } + + std::shared_ptr const& LoopStatement::getBody() const { + return this->body; + } + + storm::pgcl::BooleanExpression const& LoopStatement::getCondition() const{ + return this->condition; + } + + void LoopStatement::accept(storm::pgcl::AbstractStatementVisitor& visitor) { + visitor.visit(*this); + } + } +} + diff --git a/src/storage/pgcl/LoopStatement.h b/src/storage/pgcl/LoopStatement.h new file mode 100755 index 000000000..616e2c3d3 --- /dev/null +++ b/src/storage/pgcl/LoopStatement.h @@ -0,0 +1,54 @@ +/* + * File: LoopStatement.h + * Author: Lukas Westhofen + * + * Created on 11. April 2015, 17:42 + */ + +#ifndef LOOPSTATEMENT_H +#define LOOPSTATEMENT_H + +#include "src/storage/pgcl/PgclProgram.h" +#include "src/storage/pgcl/CompoundStatement.h" +#include "src/storage/pgcl/BooleanExpression.h" + +namespace storm { + namespace pgcl { + /** + * This class represents a guarded loop statement. The guard is saved as + * a boolean expression. The body of the loop is again a PGCL program. + */ + class LoopStatement : public Statement { + public: + LoopStatement() = default; + /** + * Constructs a loop statement initialized with the given condition + * and loop body program. + * @param condition The guard of the loop. + * @param body The body of the loop. + */ + LoopStatement(storm::pgcl::BooleanExpression const& condition, std::shared_ptr const& body); + LoopStatement(const LoopStatement& orig) = default; + virtual ~LoopStatement() = default; + void accept(class AbstractStatementVisitor&); + /** + * Returns the loop body program. + * @return The loop body program. + */ + std::shared_ptr const& getBody() const; + /** + * Returns the guard of the loop. + * @return The boolean condition of the loop. + */ + storm::pgcl::BooleanExpression const& getCondition() const; + private: + /// Represents the loop body. + std::shared_ptr body; + /// Represents the loop guard. + storm::pgcl::BooleanExpression condition; + }; + } +} + +#endif /* LOOPSTATEMENT_H */ + diff --git a/src/storage/pgcl/NondeterministicBranch.cpp b/src/storage/pgcl/NondeterministicBranch.cpp new file mode 100755 index 000000000..a6faa637e --- /dev/null +++ b/src/storage/pgcl/NondeterministicBranch.cpp @@ -0,0 +1,20 @@ +#include "src/storage/pgcl/NondeterministicBranch.h" +#include "src/storage/pgcl/AbstractStatementVisitor.h" + +namespace storm { + namespace pgcl { + NondeterministicBranch::NondeterministicBranch(std::shared_ptr const& left, std::shared_ptr const& right) { + leftBranch = left; + rightBranch = right; + } + + void NondeterministicBranch::accept(storm::pgcl::AbstractStatementVisitor& visitor) { + visitor.visit(*this); + } + + bool NondeterministicBranch::isNondet() const { + return true; + } + } +} + diff --git a/src/storage/pgcl/NondeterministicBranch.h b/src/storage/pgcl/NondeterministicBranch.h new file mode 100755 index 000000000..b96892408 --- /dev/null +++ b/src/storage/pgcl/NondeterministicBranch.h @@ -0,0 +1,39 @@ +/* + * File: NondeterministicBranch.h + * Author: Lukas Westhofen + * + * Created on 11. April 2015, 17:44 + */ + +#ifndef NONDETERMINISTICBRANCH_H +#define NONDETERMINISTICBRANCH_H + +#include "src/storage/pgcl/BranchStatement.h" + +namespace storm { + namespace pgcl { + /** + * This class represents a nondeterministic branch that allows for a + * nondeterministic path-taking between two subprograms. + */ + class NondeterministicBranch : public BranchStatement { + public: + NondeterministicBranch() = default; + /** + * Constructs a nondeterministic branch initialized with the given + * left and right subprograms. + * @param left The left (first) subprogram of the branch. + * @param right The right (second) subprogram of the branch. + */ + NondeterministicBranch(std::shared_ptr const& left, std::shared_ptr const& right); + NondeterministicBranch(const NondeterministicBranch& orig) = default; + virtual ~NondeterministicBranch() = default; + void accept(class AbstractStatementVisitor&); + bool isNondet() const; + private: + }; + } +} + +#endif /* NONDETERMINISTICBRANCH_H */ + diff --git a/src/storage/pgcl/ObserveStatement.cpp b/src/storage/pgcl/ObserveStatement.cpp new file mode 100755 index 000000000..42f3f0afe --- /dev/null +++ b/src/storage/pgcl/ObserveStatement.cpp @@ -0,0 +1,19 @@ +#include "src/storage/pgcl/ObserveStatement.h" +#include "src/storage/pgcl/AbstractStatementVisitor.h" + +namespace storm { + namespace pgcl { + ObserveStatement::ObserveStatement(storm::pgcl::BooleanExpression const& condition) : condition(condition) { + } + + void ObserveStatement::accept(storm::pgcl::AbstractStatementVisitor& visitor) { + visitor.visit(*this); + } + + storm::pgcl::BooleanExpression const& ObserveStatement::getCondition() const { + return this->condition; + } + + } +} + diff --git a/src/storage/pgcl/ObserveStatement.h b/src/storage/pgcl/ObserveStatement.h new file mode 100755 index 000000000..8954ccc7f --- /dev/null +++ b/src/storage/pgcl/ObserveStatement.h @@ -0,0 +1,35 @@ +#pragma once + +#include "src/storage/pgcl/SimpleStatement.h" +#include "src/storage/pgcl/BooleanExpression.h" + +namespace storm { + namespace pgcl { + /** + * This class represents an observe statement. Observe statements + * include a condition. If this condition doesn't hold, the program + * stops at that point in its execution. + */ + class ObserveStatement : public Statement { + public: + ObserveStatement() = default; + /** + * Constructs an observe statement initialized with the given + * condition. + * @param condition The condition of the observe statement. + */ + ObserveStatement(storm::pgcl::BooleanExpression const& condition); + ObserveStatement(const ObserveStatement& orig) = default; + virtual ~ObserveStatement() = default; + /** + * Returns the condition of the observe statement. + * @return The boolean expression of the observe statement. + */ + storm::pgcl::BooleanExpression const& getCondition() const; + void accept(class AbstractStatementVisitor&); + private: + /// Represents the assigned condition. + storm::pgcl::BooleanExpression condition; + }; + } +} diff --git a/src/storage/pgcl/PgclProgram.cpp b/src/storage/pgcl/PgclProgram.cpp new file mode 100755 index 000000000..d0bba935e --- /dev/null +++ b/src/storage/pgcl/PgclProgram.cpp @@ -0,0 +1,41 @@ +#include "PgclProgram.h" +#include "StatementPrinterVisitor.h" +#include + +namespace storm { + namespace pgcl { + PgclProgram::PgclProgram(std::vector variables, vector const& statements, vector const& locationToStatement, std::vector const& parameters, std::shared_ptr expressions, bool hasLoop, bool hasNondet, bool hasObserve) : + PgclBlock(statements, + expressions, hasLoop, hasNondet, hasObserve), + locationToStatement(locationToStatement),variables(variables) + { + // Intentionally left empty. + } + + + vector PgclProgram::getLocationToStatementVector() { + return this->locationToStatement; + } + + std::vector PgclProgram::getVariables() const { + std::vector vars; + for(auto const& v : *(this->getExpressionManager())) { + vars.push_back(v.first); + } + + return vars; + } + + std::vector const& PgclProgram::getVariableDeclarations() const { + return variables; + } + + std::ostream& operator<<(std::ostream& stream, PgclProgram& program) { + storm::pgcl::StatementPrinterVisitor printer(stream); + for(iterator statement = program.begin(); statement != program.end(); statement++) { + (*statement)->accept(printer); + } + return stream; + } + } +} \ No newline at end of file diff --git a/src/storage/pgcl/PgclProgram.h b/src/storage/pgcl/PgclProgram.h new file mode 100755 index 000000000..79d755a66 --- /dev/null +++ b/src/storage/pgcl/PgclProgram.h @@ -0,0 +1,75 @@ +#pragma once + +#include +#include "Block.h" +#include "VariableDeclaration.h" +#include "src/storage/pgcl/Statement.h" +#include "src/storage/pgcl/StatementPrinterVisitor.h" +#include "src/storage/expressions/ExpressionManager.h" + +namespace storm { + namespace pgcl { + + + /** + * This class represents a complete and functional PGCL program. It + * contains an expression manager which keeps track of the current + * identifiers and variable valuations. Other than that, it basically + * wraps a std::vector of program statements and is intended to be used + * as such. + */ + class PgclProgram : public PgclBlock { + public: + PgclProgram() = default; + /** + * Constructs the PGCL program with the given sequence of statements + * (they may contain other PGCL programs). The expression manager + * handles the expressions and variables of the PGCL program. + * @param statements The sequence of statements representing the + * program. + * @param locationToStatements A vector containing the statement + * with location number i at the i-th position. + * @param parameters The list of parameters of the program. + * @param expressions The manager responsible for the expressions + * and variables of the program. + * @param hasLoop Whether the program contains a loop + * @param hasNondet Whether the program contains a nondeterministic + * statement. + * @param hasParam Whether the program is parameterized. + */ + PgclProgram(std::vector variables, vector const& statements, vector const& locationToStatement, std::vector const& parameters, std::shared_ptr expressions, bool hasLoop, bool hasNondet, bool hasObserve); + + PgclProgram(const PgclProgram & orig) = default; + + /** + * Returns a vector that has the statement with location number i at + * its i-th position. This allows for O(1)-access of statements if + * only the location number is given. + */ + vector getLocationToStatementVector(); + + std::vector getVariables() const; + std::vector const& getVariableDeclarations() const; + + + + private: + /** + * Contains the statement with location i at its i-th position. + * Imagine this as the "unrolled" sequence of statements, so the + * recursion is resolved here. + */ + vector locationToStatement; + std::vector variables; + }; + /** + * Prints every statement of the program along with their location + * numbers. + * @param stream The stream to print the program to. + * @param program The program to print. + */ + std::ostream& operator<<(std::ostream& stream, PgclProgram& program); + } +} + + diff --git a/src/storage/pgcl/ProbabilisticBranch.cpp b/src/storage/pgcl/ProbabilisticBranch.cpp new file mode 100755 index 000000000..405eed99e --- /dev/null +++ b/src/storage/pgcl/ProbabilisticBranch.cpp @@ -0,0 +1,21 @@ +#include "src/storage/pgcl/ProbabilisticBranch.h" +#include "src/storage/pgcl/AbstractStatementVisitor.h" + +namespace storm { + namespace pgcl { + ProbabilisticBranch::ProbabilisticBranch(storm::expressions::Expression const& probability, std::shared_ptr const& left, std::shared_ptr const& right) : + probability(probability) { + rightBranch = right; + leftBranch = left; + } + + storm::expressions::Expression const& ProbabilisticBranch::getProbability() const { + return this->probability; + } + + void ProbabilisticBranch::accept(storm::pgcl::AbstractStatementVisitor& visitor) { + visitor.visit(*this); + } + } +} + diff --git a/src/storage/pgcl/ProbabilisticBranch.h b/src/storage/pgcl/ProbabilisticBranch.h new file mode 100755 index 000000000..9937e6def --- /dev/null +++ b/src/storage/pgcl/ProbabilisticBranch.h @@ -0,0 +1,40 @@ +#pragma once + +#include "src/storage/pgcl/BranchStatement.h" + +namespace storm { + namespace pgcl { + /** + * This class represents a probabilistic branch. It branches into two + * subprograms. The first program is executed with the probability p + * given by the assigned expression, the second subprogram is executed + * with probability (p - 1). + */ + class ProbabilisticBranch : public BranchStatement { + public: + ProbabilisticBranch() = default; + /** + * Constructs a probabilistic branch initialized with the given + * probability and the left (first) and right (second) subprograms. + * Note that no verification is made whether the probability lies + * between 0 and 1 is made here. This is done at runtime of the PGCL + * program. + * @param probability The expression representing the probability of the branch. + * @param left The left (first) subprogram of the branch. + * @param right The right (second) subprogram of the branch. + */ + ProbabilisticBranch(storm::expressions::Expression const& probability, std::shared_ptr const& left, std::shared_ptr const& right); + ProbabilisticBranch(const ProbabilisticBranch& orig) = default; + virtual ~ProbabilisticBranch() = default; + /** + * Returns the expression representing the probability. + * @return The expression representing the probability. + */ + storm::expressions::Expression const& getProbability() const; + void accept(class AbstractStatementVisitor&); + private: + /// The expression represents the probability of the branch. + storm::expressions::Expression probability; + }; + } +} diff --git a/src/storage/pgcl/SimpleStatement.cpp b/src/storage/pgcl/SimpleStatement.cpp new file mode 100755 index 000000000..b628b5d90 --- /dev/null +++ b/src/storage/pgcl/SimpleStatement.cpp @@ -0,0 +1,15 @@ +/* + * File: SimpleStatement.cpp + * Author: Lukas Westhofen + * + * Created on 11. April 2015, 17:41 + */ + +#include "src/storage/pgcl/SimpleStatement.h" + +namespace storm { + namespace pgcl { + + } +} + diff --git a/src/storage/pgcl/SimpleStatement.h b/src/storage/pgcl/SimpleStatement.h new file mode 100755 index 000000000..252bc0b64 --- /dev/null +++ b/src/storage/pgcl/SimpleStatement.h @@ -0,0 +1,30 @@ +/* + * File: SimpleStatement.h + * Author: Lukas Westhofen + * + * Created on 11. April 2015, 17:41 + */ + +#ifndef SIMPLESTATEMENT_H +#define SIMPLESTATEMENT_H + +#include "src/storage/pgcl/Statement.h" +#include "src/storage/pgcl/AbstractStatementVisitor.h" + +namespace storm { + namespace pgcl { + /* + * Simple statements are statements not containing other PGCL programs. + * Exactly one variable can be part of that statement. + */ + class SimpleStatement : public Statement { + public: + SimpleStatement() = default; + SimpleStatement(const SimpleStatement& orig) = default; + virtual ~SimpleStatement() = default; + virtual void accept(class AbstractStatementVisitor& visitor) = 0; + }; + } +} +#endif /* SIMPLESTATEMENT_H */ + diff --git a/src/storage/pgcl/Statement.cpp b/src/storage/pgcl/Statement.cpp new file mode 100755 index 000000000..36d1ad5d6 --- /dev/null +++ b/src/storage/pgcl/Statement.cpp @@ -0,0 +1,51 @@ +#include "src/storage/pgcl/Statement.h" +#include "Block.h" + +namespace storm { + namespace pgcl { + const bool Statement::operator==(const Statement& other) const { + return (other.locationNumber == this->locationNumber); + } + + void Statement::setLineNumber(std::size_t lineNumber) { + this->lineNumber = lineNumber; + } + + std::size_t Statement::getLineNumber() const { + return this->lineNumber; + } + + std::size_t Statement::getLocationNumber() const { + return this->locationNumber; + } + + void Statement::setLocationNumber(std::size_t locationNumber) { + this->locationNumber = locationNumber; + } + + bool Statement::isLast() const { + return this->last; + } + + void Statement::setLast(bool isLast) { + this->last = isLast; + } + + bool Statement::isNondet() const { + return false; + } + + void Statement::setParentBlock(PgclBlock* b) { + this->parentBlock = b; + } + + PgclBlock* Statement::getParentBlock() { + return this->parentBlock; + } + + + std::size_t Statement::getNumberOfOutgoingTransitions() const { + return 1; + } + } +} \ No newline at end of file diff --git a/src/storage/pgcl/Statement.h b/src/storage/pgcl/Statement.h new file mode 100755 index 000000000..6a913a9bf --- /dev/null +++ b/src/storage/pgcl/Statement.h @@ -0,0 +1,94 @@ +#pragma once + +#include +#include +#include "boost/optional/optional.hpp" + +namespace storm { + namespace pgcl { + class PgclBlock; + /** + * A PGCL program consists of various statements. Statements can again + * save lists of statements as their children. To make life easier, the + * line number where that statement was parsed is stored. Additionaly, + * a unique non-negative index identifier (the location number) is + * saved. + */ + class Statement { + public: + Statement() = default; + Statement(const Statement& orig) = default; + virtual ~Statement() = default; + /** + * Returns true iff the statements are equal, thus having the same + * location number. + * @param other The other statement to check equality of. + * @return True iff the statements are equal. + */ + const bool operator==(const Statement& other) const; + /** + * Returns the line number inside the string where the PGCL program + * was parsed from. + * @return The line number of the statement. + */ + std::size_t getLineNumber() const; + /** + * Sets the line number during the parsing process. + * @param lineNumber The location number of the statement. + */ + void setLineNumber(std::size_t lineNumber); + /** + * Returns the unique location number of the statement. + * @return The line number of the statement. + */ + std::size_t getLocationNumber() const; + /** + * Sets the unique location number of the statement. + * @param lineNumber The location number of the statement. + */ + void setLocationNumber(std::size_t locationNumber); + /** + * Returns true if the statement is the last of its direct parent + * program. + * @return true Whether the statement is the last statement. + */ + bool isLast() const; + /** + * Sets the information whether the statement is the last of its + * direct parent program. + * @param isLast Whether the statement is the last statement. + */ + void setLast(bool isLast); + /** + * Returns wether the statements represents nondeterminism. + */ + virtual bool isNondet() const; + /** + * Returns the number of transitions this statement will produce. + */ + virtual std::size_t getNumberOfOutgoingTransitions() const; + virtual void accept(class AbstractStatementVisitor&) = 0; + /** + * Sets the parent program of the statement. + * @param parentProgram The parent program of the statement. + */ + void setParentBlock(PgclBlock* block); + /** + * Returns the parent program of the statement. + * @return The parent program of the statement. + */ + PgclBlock* getParentBlock(); + + protected: + /// The parent program of the statement. + PgclBlock* parentBlock; + /// Represents the line number of the statement. + std::size_t lineNumber = 0; + /// Represents the unique statement location. + std::size_t locationNumber = 0; + /// If set to true, the statement is the last one of its (sub)program. + bool last = false; + }; + } +} + diff --git a/src/storage/pgcl/StatementPrinterVisitor.cpp b/src/storage/pgcl/StatementPrinterVisitor.cpp new file mode 100755 index 000000000..523f47773 --- /dev/null +++ b/src/storage/pgcl/StatementPrinterVisitor.cpp @@ -0,0 +1,93 @@ +#include "src/storage/pgcl/StatementPrinterVisitor.h" + +#include "src/storage/pgcl/AssignmentStatement.h" +#include "src/storage/pgcl/ObserveStatement.h" +#include "src/storage/pgcl/IfStatement.h" +#include "src/storage/pgcl/LoopStatement.h" +#include "src/storage/pgcl/NondeterministicBranch.h" +#include "src/storage/pgcl/ProbabilisticBranch.h" + +namespace storm { + namespace pgcl { + StatementPrinterVisitor::StatementPrinterVisitor(std::ostream &stream) : stream(stream) { + } + + void StatementPrinterVisitor::visit(storm::pgcl::AssignmentStatement const& statement) { + this->stream << statement.getLocationNumber() << ": "; + if(statement.getExpression().which() == 0) { + storm::expressions::Expression const& expression = boost::get(statement.getExpression()); + this->stream << statement.getVariable().getType() << " " << statement.getVariable().getName() << " := " << expression << ";" << std::endl; + } else { + storm::pgcl::UniformExpression const& unif = boost::get(statement.getExpression()); + this->stream << statement.getVariable().getType() << " " << statement.getVariable().getName() << " := " << "unif(" << unif.getBegin() << ", " << unif.getEnd() << ");" << std::endl; + } + } + + void StatementPrinterVisitor::visit(storm::pgcl::ObserveStatement const& statement) { + this->stream << statement.getLocationNumber() << ": "; + this->stream << "observe(" << statement.getCondition().getBooleanExpression() << ");" << std::endl; + } + + void StatementPrinterVisitor::visit(storm::pgcl::IfStatement const& statement) { + this->stream << statement.getLocationNumber() << ": "; + this->stream << "if (" << statement.getCondition().getBooleanExpression() << ") {" << std::endl; + int i = 1; + for(iterator it = (*(statement.getIfBody())).begin(); it != (*(statement.getIfBody())).end(); ++it) { + (*(*it)).accept(*this); + i++; + } + this->stream << "}" << std::endl; + if(statement.hasElse()) { + this->stream << "else {" << std::endl; + for(iterator it = (*(statement.getElseBody())).begin(); it != (*(statement.getElseBody())).end(); ++it) { + (*(*it)).accept(*this); + i++; + } + this->stream << "}" << std::endl; + } + } + + void StatementPrinterVisitor::visit(storm::pgcl::LoopStatement const& statement) { + this->stream << statement.getLocationNumber() << ": "; + this->stream << "while (" << statement.getCondition().getBooleanExpression() << ") {" << std::endl; + int i = 1; + for(iterator it = (*(statement.getBody())).begin(); it != (*(statement.getBody())).end(); ++it) { + (*(*it)).accept(*this); + i++; + } + this->stream << "}" << std::endl; + } + + void StatementPrinterVisitor::visit(storm::pgcl::NondeterministicBranch const& statement) { + this->stream << statement.getLocationNumber() << ": "; + this->stream << "{" << std::endl; + int i = 1; + for(iterator it = (*(statement.getLeftBranch())).begin(); it != (*(statement.getLeftBranch())).end(); ++it) { + (*(*it)).accept(*this); + i++; + } + this->stream << "} [] {" << std::endl; + for(iterator it = (*(statement.getRightBranch())).begin(); it != (*(statement.getRightBranch())).end(); ++it) { + (*(*it)).accept(*this); + i++; + } + this->stream << "}" << std::endl; + } + + void StatementPrinterVisitor::visit(storm::pgcl::ProbabilisticBranch const& statement) { + this->stream << statement.getLocationNumber() << ": "; + this->stream << "{" << std::endl; + int i = 1; + for(iterator it = (*(statement.getLeftBranch())).begin(); it != (*(statement.getLeftBranch())).end(); ++it) { + (*(*it)).accept(*this); + i++; + } + this->stream << "} [" << statement.getProbability() << "] {" << std::endl; + for(iterator it = (*(statement.getRightBranch())).begin(); it != (*(statement.getRightBranch())).end(); ++it) { + (*(*it)).accept(*this); + i++; + } + this->stream << "}" << std::endl; + } + } +} \ No newline at end of file diff --git a/src/storage/pgcl/StatementPrinterVisitor.h b/src/storage/pgcl/StatementPrinterVisitor.h new file mode 100755 index 000000000..39656e7e2 --- /dev/null +++ b/src/storage/pgcl/StatementPrinterVisitor.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include "src/storage/pgcl/AbstractStatementVisitor.h" + +namespace storm { + namespace pgcl { + /** + * This is a sample implementation of a concrete visitor which interface + * is defined in AbstractStatementVisitor.h. It prints out various + * details of the given statements when the visit method is called. + */ + class StatementPrinterVisitor : public AbstractStatementVisitor { + public: + /** + * Constructs a statement printer which prints its output to the + * given stream. + * @param stream The stream to print to. + */ + StatementPrinterVisitor(std::ostream& stream); + void visit(AssignmentStatement const&); + void visit(ObserveStatement const&); + void visit(IfStatement const&); + void visit(LoopStatement const&); + void visit(NondeterministicBranch const&); + void visit(ProbabilisticBranch const&); + private: + std::ostream& stream; + }; + } +} diff --git a/src/storage/pgcl/UniformExpression.cpp b/src/storage/pgcl/UniformExpression.cpp new file mode 100644 index 000000000..17009c09b --- /dev/null +++ b/src/storage/pgcl/UniformExpression.cpp @@ -0,0 +1,17 @@ +#include "UniformExpression.h" + +namespace storm { + namespace pgcl { + UniformExpression::UniformExpression(int_fast64_t begin, int_fast64_t end) : begin(begin), end(end) { + // Intentionally left empty. + } + + int_fast64_t UniformExpression::getBegin() const { + return this->begin; + } + + int_fast64_t UniformExpression::getEnd() const { + return this->end; + } + } +} diff --git a/src/storage/pgcl/UniformExpression.h b/src/storage/pgcl/UniformExpression.h new file mode 100644 index 000000000..4fc833e36 --- /dev/null +++ b/src/storage/pgcl/UniformExpression.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +namespace storm { + namespace pgcl { + /** + * This class wraps a uniform distribution expression of the form + * unif(k,l) where k <= l are both integers. + */ + class UniformExpression { + public: + UniformExpression() = default; + /** + * Constructs a uniform expression with the given beginning and + * end. + * @param begin The begin of the uniform distribution. + * @param begin The end of the uniform distribution. + */ + UniformExpression(int_fast64_t begin, int_fast64_t end); + /** + * Returns the begin of the uniform distribution. + * @return The begin of the uniform distribution. + */ + int_fast64_t getBegin() const; + /** + * Returns the end of the uniform distribution. + * @return The end of the uniform distribution. + */ + int_fast64_t getEnd() const; + private: + int_fast64_t begin = 0; + int_fast64_t end = 0; + }; + } +} \ No newline at end of file diff --git a/src/storage/pgcl/VariableDeclaration.cpp b/src/storage/pgcl/VariableDeclaration.cpp new file mode 100644 index 000000000..241437821 --- /dev/null +++ b/src/storage/pgcl/VariableDeclaration.cpp @@ -0,0 +1 @@ +#include "VariableDeclaration.h" diff --git a/src/storage/pgcl/VariableDeclaration.h b/src/storage/pgcl/VariableDeclaration.h new file mode 100644 index 000000000..a2f7b8d37 --- /dev/null +++ b/src/storage/pgcl/VariableDeclaration.h @@ -0,0 +1,36 @@ +#pragma once + +#include "src/storage/expressions/Expression.h" +#include "src/storage/expressions/Variable.h" + +namespace storm { + namespace pgcl { + class VariableDeclaration { + public: + + VariableDeclaration(storm::expressions::Variable const& var, storm::expressions::Expression const& exp) + : variable(var), initialValue(exp) + { + // Not implemented. + } + + storm::expressions::Variable const& getVariable() const { + return variable; + } + + storm::expressions::Expression const& getInitialValueExpression() const { + return initialValue; + } + + private: + storm::expressions::Variable variable; + storm::expressions::Expression initialValue; + + }; + } +} + + + + + diff --git a/src/storage/ppg/ProgramAction.cpp b/src/storage/ppg/ProgramAction.cpp new file mode 100644 index 000000000..6b70607be --- /dev/null +++ b/src/storage/ppg/ProgramAction.cpp @@ -0,0 +1,19 @@ +#include "ProgramAction.h" +#include "ProgramGraph.h" + +namespace storm { + namespace ppg { + + ProbabilisticProgramAction::ProbabilisticProgramAction(ProgramGraph* graph, ProgramActionIdentifier actId, ProgramVariableIdentifier var, int64_t from, int64_t to) : ProgramAction(graph, actId), var(var) { + assert(from <= to); + storm::expressions::Expression prob = graph->getExpressionManager()->integer(1) / graph->getExpressionManager()->integer(to - from + 1); + for(int64_t i = from; i <= to; ++i) { + values.emplace_back(i, prob); + } + } + + std::string const& ProbabilisticProgramAction::getVariableName() const { + return getProgramGraph().getVariableName(var); + } + } +} \ No newline at end of file diff --git a/src/storage/ppg/ProgramAction.h b/src/storage/ppg/ProgramAction.h new file mode 100644 index 000000000..6241645b9 --- /dev/null +++ b/src/storage/ppg/ProgramAction.h @@ -0,0 +1,182 @@ +#pragma once +#include "defines.h" +#include "src/storage/IntegerInterval.h" +#include "src/storage/expressions/Expression.h" +#include "src/storage/expressions/Variable.h" +#include "src/storage/expressions/ExpressionManager.h" + +namespace storm { + namespace ppg { + + class ProgramAction { + public: + ProgramAction(ProgramGraph* graph, ProgramActionIdentifier id) : graph(graph), actId(id) { + + } + + ProgramActionIdentifier id() const { + return actId; + } + + ProgramGraph const& getProgramGraph() const { + return *graph; + } + + virtual bool isProbabilistic() const = 0; + private: + ProgramGraph* graph; + ProgramActionIdentifier actId; + }; + + + struct ValueProbabilityPair { + ValueProbabilityPair(int64_t value, storm::expressions::Expression const& probability) : value(value), probability(probability) { + // Intentionally left empty. + } + + int64_t value; + storm::expressions::Expression probability; + }; + + class ProbabilisticProgramAction : public ProgramAction { + public: + // TODO in the long run, we probably need own iterators for this. + using iterator = std::vector::iterator; + using const_iterator = std::vector::const_iterator; + + + + /** + * Constructs a uniform assignment operation to a variable; + * Action assigns a variable according to a uniform distribution [from, to] + */ + ProbabilisticProgramAction(ProgramGraph* graph, ProgramActionIdentifier actId, ProgramVariableIdentifier var, int64_t from, int64_t to); + + bool isProbabilistic() const override{ + return true; + } + + std::string const& getVariableName() const; + + ProgramVariableIdentifier getVariableIdentifier() const { + return var; + } + + storm::storage::IntegerInterval getSupportInterval() const { + assert(!values.empty()); + int64_t min = values.front().value; + int64_t max = values.front().value; + for (auto const& valEntry : values) { + if (valEntry.value < min) { + min = valEntry.value; + } else if (valEntry.value > max) { + max = valEntry.value; + } + } + return storm::storage::IntegerInterval(min, max); + } + + iterator begin() { + return values.begin(); + } + + iterator end() { + return values.end(); + } + + const_iterator begin() const { + return values.begin(); + } + + const_iterator end() const { + return values.end(); + } + + private: + // TODO not the smartest representation (but at least it is internal!) + std::vector values; + ProgramVariableIdentifier var; + + }; + + + struct AssignmentGroup { + using iterator = std::unordered_map::iterator; + using const_iterator = std::unordered_map::const_iterator; + + storm::expressions::Expression& operator[](uint64_t varIndex) { + return map[varIndex]; + } + + bool hasVariable(uint64_t varIndex) const { + return map.count(varIndex) > 0; + } + + iterator begin() { + return map.begin(); + } + + iterator end() { + return map.end(); + } + + const_iterator begin() const { + return map.begin(); + } + + const_iterator end() const { + return map.end(); + } + + private: + std::unordered_map map; + }; + + class DeterministicProgramAction : public ProgramAction { + + public: + using iterator = std::vector::iterator; + using const_iterator = std::vector::const_iterator; + + DeterministicProgramAction(ProgramGraph* graph, ProgramActionIdentifier actId) : ProgramAction(graph, actId) { + + } + + void addAssignment(ProgramVariableIdentifier varIndex, storm::expressions::Expression const& expr, uint64_t level=0) { + if(assignments.size() <= level) { + assignments.resize(level+1); + } + assert(!assignments[level].hasVariable(varIndex)); + assignments[level][varIndex] = expr; + } + + size_t nrLevels() const { + return assignments.size(); + } + + iterator begin() { + return assignments.begin(); + } + + iterator end() { + return assignments.end(); + } + + const_iterator begin() const { + return assignments.begin(); + } + + const_iterator end() const { + return assignments.end(); + } + + bool isProbabilistic() const override{ + return false; + } + + protected: + std::vector assignments; + }; + + } +} \ No newline at end of file diff --git a/src/storage/ppg/ProgramEdge.cpp b/src/storage/ppg/ProgramEdge.cpp new file mode 100644 index 000000000..e76a2649b --- /dev/null +++ b/src/storage/ppg/ProgramEdge.cpp @@ -0,0 +1,19 @@ +#include "ProgramEdge.h" +#include "ProgramGraph.h" + +namespace storm { + namespace ppg { + + ProgramLocationIdentifier ProgramEdge::getSourceId() const { + return group->getSourceId(); + } + + ProgramAction const& ProgramEdge::getAction() const { + return group->getGraph().getAction(action); + } + + bool ProgramEdge::hasNoAction() const { + return action == group->getGraph().getNoActionId(); + } + } +} \ No newline at end of file diff --git a/src/storage/ppg/ProgramEdge.h b/src/storage/ppg/ProgramEdge.h new file mode 100644 index 000000000..312e7b224 --- /dev/null +++ b/src/storage/ppg/ProgramEdge.h @@ -0,0 +1,51 @@ +#pragma once +#include "defines.h" + +#include "src/storage/expressions/Expression.h" + +namespace storm { + namespace ppg { + class ProgramAction; + + class ProgramEdge { + public: + ProgramEdge(ProgramEdgeGroup* group, ProgramEdgeIdentifier id, ProgramActionIdentifier action, storm::expressions::Expression const& condition, ProgramLocationIdentifier targetId) + : group(group), edgeId(id), target(targetId), action(action), condition(condition) + { + // Intentionally left empty. + } + + ProgramLocationIdentifier getSourceId() const; + ProgramLocationIdentifier getTargetId() const { + return target; + } + + storm::expressions::Expression const& getCondition() const { + return condition; + } + + bool hasNoAction() const; + ProgramAction const& getAction() const; + ProgramActionIdentifier getActionId() const { + return action; + } + + virtual ~ProgramEdge() { + // Intentionally left empty. + } + + private: + /// Pointer to the group; not owned + ProgramEdgeGroup* group; + /// Edge identifier + ProgramEdgeIdentifier edgeId; + /// Target location identifier + ProgramLocationIdentifier target; + /// Action identifier + ProgramActionIdentifier action; + /// Condition + storm::expressions::Expression condition; + + }; + } +} diff --git a/src/storage/ppg/ProgramEdgeGroup.cpp b/src/storage/ppg/ProgramEdgeGroup.cpp new file mode 100644 index 000000000..245837ae1 --- /dev/null +++ b/src/storage/ppg/ProgramEdgeGroup.cpp @@ -0,0 +1,14 @@ +#include "ProgramEdgeGroup.h" +#include "ProgramGraph.h" + +namespace storm { + namespace ppg { + ProgramEdge* ProgramEdgeGroup::addEdge(ProgramActionIdentifier action, ProgramLocationIdentifier target) { + return graph->addProgramEdge(*this, action, target); + } + ProgramEdge* ProgramEdgeGroup::addEdge(ProgramActionIdentifier action, storm::expressions::Expression const& condition, ProgramLocationIdentifier target) { + return graph->addProgramEdge(*this, action, condition, target); + } + + } +} \ No newline at end of file diff --git a/src/storage/ppg/ProgramEdgeGroup.h b/src/storage/ppg/ProgramEdgeGroup.h new file mode 100644 index 000000000..13d63df99 --- /dev/null +++ b/src/storage/ppg/ProgramEdgeGroup.h @@ -0,0 +1,87 @@ +#pragma once + +#include "defines.h" +#include "ProgramEdge.h" + +namespace storm { + namespace ppg { + + class ProgramEdgeGroup { + public: + using iterator = std::vector::iterator; + using const_iterator = std::vector::const_iterator; + + ProgramEdgeGroup(ProgramGraph* graph, ProgramEdgeGroupIdentifier id, ProgramLocationIdentifier sourceId, storm::expressions::Expression const& probability) + : graph(graph), groupId(id), sourceId(sourceId), probability(probability) + { + // Intentionally left empty. + } + + virtual ~ProgramEdgeGroup() { + for( auto const& e : edges) { + delete e; + } + } + + ProgramEdge* addEdge(ProgramActionIdentifier action, ProgramLocationIdentifier target); + ProgramEdge* addEdge(ProgramActionIdentifier action, storm::expressions::Expression const& condition, ProgramLocationIdentifier target); + + /** + * Constructs an outgoing edge in this edge group. + */ + ProgramEdge* emplaceEdge(ProgramEdgeIdentifier id, ProgramActionIdentifier action, storm::expressions::Expression const& condition, ProgramLocationIdentifier target) { + edges.emplace_back(new ProgramEdge(this, id, action, condition, target)); + return edges.back(); + } + + iterator begin() { + return edges.begin(); + } + + iterator end() { + return edges.end(); + } + + const_iterator begin() const { + return edges.begin(); + } + + const_iterator end() const { + return edges.end(); + } + + size_t nrEdges() const { + return edges.size(); + } + + storm::expressions::Expression const& getProbability() const { + return probability; + } + + ProgramGraph const& getGraph() const { + return *graph; + } + + ProgramLocationIdentifier getSourceId() const { + return sourceId; + } + + ProgramEdgeGroupIdentifier getId() const { + return groupId; + } + + private: + /// Pointer to the graph; not owned. + ProgramGraph* graph; + /// Own id (persistent over copy) + ProgramEdgeGroupIdentifier groupId; + /// Id of source location + ProgramLocationIdentifier sourceId; + /// Probability for this group + storm::expressions::Expression probability; + /// Outgoing edges + std::vector edges; + + }; + } +} diff --git a/src/storage/ppg/ProgramGraph.cpp b/src/storage/ppg/ProgramGraph.cpp new file mode 100644 index 000000000..ab094b273 --- /dev/null +++ b/src/storage/ppg/ProgramGraph.cpp @@ -0,0 +1,224 @@ + +#include "ProgramGraph.h" + + +namespace storm { + namespace ppg { + + std::vector ProgramGraph::noeffectVariables() const { + std::vector transientCandidates = variablesNotInGuards(); + bool removedCandidate = true; // tmp + while(removedCandidate && !transientCandidates.empty()) { + removedCandidate = false; + for (auto const& act : this->deterministicActions) { + for (auto const& group : act.second) { + for (auto const& assignment : group) { + if (std::find(transientCandidates.begin(), transientCandidates.end(), assignment.first) == transientCandidates.end()) { + for (auto const& vars : assignment.second.getVariables()) { + auto it = std::find(transientCandidates.begin(), transientCandidates.end(), vars.getIndex()); + if (it != transientCandidates.end()) { + transientCandidates.erase(it); + removedCandidate = true; + } + } + } + } + } + } + } + return transientCandidates; + } + + std::pair ProgramGraph::checkIfRewardVariableHelper(storm::expressions::Variable const& var, std::unordered_map const& detActions) const { + bool pos = true; + bool first = true; + for (auto const& act : detActions) { + for (auto const& group : act.second) { + for (auto const& assignment : group) { + if (assignment.first == var.getIndex()) { + //storm::expressions::Expression expr = (assignment.second - var.getExpression()).simplify(); + if(!assignment.second.isLinear()) { + return {false, true}; + } + auto const& vars = assignment.second.getVariables(); + if(vars.empty() || vars.size() > 1) { + return {false, true}; + } + if(vars.begin()->getIndex() == assignment.first) { + std::map eta0; + std::map eta1; + eta0.emplace(var, expManager->integer(0)); + eta1.emplace(var, expManager->integer(1)); + if(assignment.second.substitute(eta1).evaluateAsInt() - assignment.second.substitute(eta0).evaluateAsInt() != 1) { + return {false, true}; + } + if(assignment.second.substitute(eta0).evaluateAsInt() < 0) { + if(!first && pos) { + return {false, true}; + } + pos = false; + } + first = false; + } + } + } + } + } + return {true, pos}; + } + + + std::vector ProgramGraph::constantAssigned() const { + std::set contained; + for (auto const& act : deterministicActions) { + for (auto const& group : act.second) { + for (auto const& assignment : group) { + if (assignment.second.containsVariables()) { + contained.insert(assignment.first); + } + } + } + } + std::vector result; + for (auto const& varEntry : variables) { + if (contained.count(varEntry.second.getIndex()) == 0) { + // Currently we can only do this for integer assigned initials + if(initialValues.at(varEntry.second.getIndex()).containsVariables() || !varEntry.second.hasIntegerType()) { + continue; + } + result.push_back(varEntry.first); + } + } + return result; + } + + std::vector ProgramGraph::constants() const { + std::set contained; + for (auto const& act : deterministicActions) { + for (auto const& group : act.second) { + for (auto const& assignment : group) { + contained.insert(assignment.first); + } + } + } + for (auto const& act : probabilisticActions) { + contained.insert(act.second.getVariableIdentifier()); + } + std::vector result; + for (auto const& varEntry : variables) { + if (contained.count(varEntry.second.getIndex()) == 0) { + result.push_back(varEntry.first); + } + } + return result; + } + + storm::storage::IntegerInterval ProgramGraph::supportForConstAssignedVariable(ProgramVariableIdentifier i) const { + storm::storage::IntegerInterval support(initialValues.at(i).evaluateAsInt()); + for (auto const& act : deterministicActions) { + for (auto const& group : act.second) { + for (auto const& assignment : group) { + if (assignment.first == i) { + support.extend(assignment.second.evaluateAsInt()); + } + } + } + } + for (auto const& act : probabilisticActions) { + if(act.second.getVariableIdentifier() == i) { + support.extend(act.second.getSupportInterval()); + } + } + return support; + } + + + std::vector ProgramGraph::rewardVariables() const { + std::vector rewardCandidates = noeffectVariables(); + std::vector result; + for (auto const& var : rewardCandidates) { + if(variables.at(var).hasIntegerType()) { + + // TODO add some checks here; refine the evaluate as int stuff. + if(initialValues.at(var).evaluateAsInt() == 0 && checkIfRewardVariableHelper(variables.at(var), this->deterministicActions).first) { + result.push_back(var); + } + } + } + return result; + } + + std::vector ProgramGraph::variablesNotInGuards() const { + std::vector result; + std::set contained; + for (auto const& loc : locations) { + for (auto const& edgegroup : loc.second) { + for (auto const& edge : *edgegroup) { + auto conditionVars = edge->getCondition().getVariables(); + contained.insert(conditionVars.begin(), conditionVars.end()); + } + } + } + for (auto const& varEntry : variables) { + if (contained.count(varEntry.second) == 0) { + result.push_back(varEntry.first); + } + } + + return result; + } + +// void ProgramGraph::mergeActions() { +// auto initialLocs = initialLocations(); +// assert(initialLocs.size() == 1); +// // For now, we only follow the unique path. +// ProgramLocationIdentifier currentLocId = initialLocs.front(); +// while(locations.at(currentLocId).hasUniqueSuccessor()) { +// auto& edgeGroup = **locations.at(currentLocId()).begin(); +// auto& edge = **edgeGroup.begin(); +// +// } +// } + + void ProgramGraph::printDot(std::ostream& os) const { + os << "digraph ppg {" << std::endl; + + for (auto const& loc : locations) { + os << "\tl" << loc.first << "[label=" << loc.first << "];"<< std::endl; + } + os << std::endl; + for (auto const& loc : locations) { + if (loc.second.nrOutgoingEdgeGroups() > 1) { + for (auto const& edgegroup : loc.second) { + os << "\teg" << edgegroup->getId() << "[shape=circle];"<< std::endl; + } + } + } + os << std::endl; + for (auto const& loc : locations) { + for (auto const& edgegroup : loc.second) { + + if (loc.second.nrOutgoingEdgeGroups() > 1) { + os << "\tl" << loc.first << " -> eg" << edgegroup->getId() << ";" << std::endl; + for (auto const& edge : *edgegroup) { + os << "\teg" << edgegroup->getId() << " -> l" << edge->getTargetId(); + if (!edge->hasNoAction()) { + os << " [label=\"" << edge->getActionId() << "\"]"; + } + os << ";" << std::endl; + } + } else { + for (auto const& edge : *edgegroup) { + os << "\tl" << loc.first << " -> l" << edge->getTargetId(); + if (!edge->hasNoAction()) { + os << " [label=\"" << edge->getActionId() << "\"]"; + } + os << ";" << std::endl; + } + } + } + } + os << "}" << std::endl; + } + } +} \ No newline at end of file diff --git a/src/storage/ppg/ProgramGraph.h b/src/storage/ppg/ProgramGraph.h new file mode 100644 index 000000000..864a54c1a --- /dev/null +++ b/src/storage/ppg/ProgramGraph.h @@ -0,0 +1,319 @@ +#pragma once + +#include "defines.h" +#include "src/storage/expressions/Expression.h" +#include "src/storage/expressions/Variable.h" +#include "src/storage/expressions/ExpressionManager.h" + +#include "ProgramLocation.h" +#include "ProgramEdge.h" +#include "ProgramEdgeGroup.h" +#include "ProgramAction.h" + +#include "src/storage/pgcl/VariableDeclaration.h" + +namespace storm { + namespace ppg { + /** + * Program graph as based on Principles of Model Checking, Def 2.13 + * Action effects are part of the action. + */ + class ProgramGraph { + public: + using EdgeGroupIterator = ProgramLocation::EdgeGroupIterator; + using ConstLocationIterator = std::unordered_map::const_iterator; + + ProgramGraph(std::shared_ptr const& expManager, std::vector const& variables) : variables(), expManager(expManager) { + for(auto const& v : variables) { + this->variables.emplace(v.getVariable().getIndex(), v.getVariable()); + this->initialValues.emplace(v.getVariable().getIndex(), v.getInitialValueExpression()); + } + // No Action: + deterministicActions.emplace(noActionId, DeterministicProgramAction(this, noActionId)); + } + + ProgramGraph(ProgramGraph const&) = delete; + + virtual ~ProgramGraph() { + } + + DeterministicProgramAction* addDeterministicAction() { + ProgramActionIdentifier newId = freeActionIndex(); + assert(!hasAction(newId)); + return &(deterministicActions.emplace(newId, DeterministicProgramAction(this, newId)).first->second); + } + + ProbabilisticProgramAction* addUniformProbabilisticAction(ProgramVariableIdentifier var, int64_t from, int64_t to) { + ProgramActionIdentifier newId = freeActionIndex(); + assert(!hasAction(newId)); + return &(probabilisticActions.emplace(newId, ProbabilisticProgramAction(this, newId, var, from, to)).first->second); + } + + ProgramLocation* addLocation(bool isInitial = false, bool successfulTermination = false, bool observeViolated = false, bool aborted = false, std::vector const& labels = {}) { + ProgramLocationIdentifier newId = freeLocationIndex(); + assert(!hasLocation(newId)); + locationLabels[newId] = labels; + if (successfulTermination) { + locationLabels[newId].push_back(succesfulTerminationLabel); + } + if (observeViolated) { + locationLabels[newId].push_back(observeViolatedLabel); + } + if (aborted) { + locationLabels[newId].push_back(abortLabel); + } + return &(locations.emplace(newId, ProgramLocation(this, newId, isInitial)).first->second); + } + + + ProgramEdgeGroup* addProgramEdgeGroup(ProgramLocation& source, storm::expressions::Expression const& probability) { + ProgramEdgeGroupIdentifier newId = freeEdgeGroupIndex(); + return source.emplaceEdgeGroup(newId, probability); + } + + ProgramEdgeGroup* addProgramEdgeGroup(ProgramLocationIdentifier sourceId, storm::expressions::Expression const& probability) { + assert(hasLocation(sourceId)); + return addProgramEdgeGroup(getLocation(sourceId), probability); + } + + ProgramEdge* addProgramEdge(ProgramEdgeGroup& group, ProgramActionIdentifier action, ProgramLocationIdentifier targetId) { + return addProgramEdge(group, action, expManager->boolean(true), targetId); + } + + ProgramEdge* addProgramEdge(ProgramEdgeGroup& group, ProgramActionIdentifier action, storm::expressions::Expression const& condition, ProgramLocationIdentifier targetId) { + ProgramEdgeIdentifier newId = freeEdgeIndex(); + return group.emplaceEdge(newId, action, condition, targetId); + } + + std::vector addProgramEdgeToAllGroups(ProgramLocation& source, ProgramActionIdentifier action, ProgramLocationIdentifier targetId) { + return addProgramEdgeToAllGroups(source, action, expManager->boolean(true), targetId); + } + + std::vector addProgramEdgeToAllGroups(ProgramLocation& source, ProgramActionIdentifier action, storm::expressions::Expression const& condition, ProgramLocationIdentifier targetId) { + assert(hasLocation(targetId)); + assert(hasAction(action)); + + if(source.nrOutgoingEdgeGroups() == 0) { + addProgramEdgeGroup(source, expManager->rational(1)); + } + + std::vector res; + for(EdgeGroupIterator eg = source.getOutgoingEdgeGroupBegin(); eg != source.getOutgoingEdgeGroupEnd(); ++eg) { + ProgramEdgeIdentifier newId = freeEdgeIndex(); + res.push_back((*eg)->emplaceEdge(newId, action, condition, targetId)); + + } + + return res; + } + + std::set getLabels() const { + std::set result; + for(auto const& locEntry : locationLabels) { + for(auto const& label : locEntry.second) { + result.insert(label); + } + } + return result; + } + + std::vector getLabels(ProgramLocationIdentifier loc) const { + return locationLabels.at(loc); + } + + bool hasLabel(ProgramLocationIdentifier loc, std::string const& label) const { + return std::find(locationLabels.at(loc).begin(), locationLabels.at(loc).end(), label) != locationLabels.at(loc).end(); + } + + bool hasSuccessfulTerminationLabel(ProgramLocationIdentifier loc) const { + return hasLabel(loc, succesfulTerminationLabel); + } + + bool hasAbortLabel(ProgramLocationIdentifier loc) const { + return hasLabel(loc, abortLabel); + } + + bool hasTerminationLabel(ProgramLocationIdentifier loc) const { + return hasSuccessfulTerminationLabel(loc) || hasAbortLabel(loc); + } + + ProgramActionIdentifier getNoActionId() const { + return noActionId; + } + + std::vector addProgramEdgeToAllGroups(ProgramLocationIdentifier sourceId, ProgramActionIdentifier action, storm::expressions::Expression const& condition, ProgramLocationIdentifier targetId) { + assert(hasLocation(sourceId)); + return addProgramEdgeToAllGroups(getLocation(sourceId), action, condition, targetId); + } + + + ProgramVariableIdentifier getVariableId(std::string const& varName) const { + // TODO consider holding a map for this. + for(auto const& v : variables) { + if(v.second.getName() == varName) { + return v.first; + } + } + assert(false); + } + + std::string const& getVariableName(ProgramVariableIdentifier id) const { + return variables.at(id).getName(); + } + + bool hasVariable(std::string const& varName) const { + for(auto const& v : variables) { + if(v.second.getName() == varName) { + return true; + } + } + return false; + } + + bool hasLocation(ProgramLocationIdentifier id) const { + return locations.count(id) == 1; + } + + bool hasAction(ProgramActionIdentifier id) const { + return deterministicActions.count(id) == 1 || probabilisticActions.count(id); + } + + ProgramAction const& getAction(ProgramActionIdentifier id) const { + assert(hasAction(id)); + if(isDeterministicAction(id)) { + return deterministicActions.at(id); + } else { + return probabilisticActions.at(id); + } + } + + bool isDeterministicAction(ProgramActionIdentifier id) const { + assert(hasAction(id)); + return probabilisticActions.count(id) == 0; + } + + size_t nrLocations() const { + return locations.size(); + } + + size_t nrVariables() const { + return variables.size(); + } + + size_t nrActions() const { + return variables.size(); + } + + storm::expressions::Expression getInitialValue(ProgramVariableIdentifier v) const { + return initialValues.at(v); + } + + void collectInitialValues(); + + ConstLocationIterator locationBegin() const { + return locations.begin(); + } + + ConstLocationIterator locationEnd() const { + return locations.end(); + } + + std::unordered_map const& getVariables() const { + return variables; + } + + std::shared_ptr const& getExpressionManager() const { + return expManager; + } + + std::vector noeffectVariables() const; + + std::vector rewardVariables() const; + + std::vector constantAssigned() const; + + std::vector constants() const; + + storm::storage::IntegerInterval supportForConstAssignedVariable(ProgramVariableIdentifier i) const; + + + void checkValid() { + + } + + void printInfo(std::ostream& os) const { + os << "Number of variables: " << nrVariables() << std::endl; + os << "Number of locations: " << nrLocations() << std::endl; + os << "Number of actions: " << nrActions() << std::endl; + } + + void printDot(std::ostream& os) const; + protected: + + + std::vector initialLocationIdentifiers() const { + std::vector result; + for (auto const& loc : locations) { + if(loc.second.isInitial()) { + result.push_back(loc.first); + } + } + return result; + } + + /** + * Returns the set of variables which do not occur in guards. + */ + std::vector variablesNotInGuards() const; + + std::pair checkIfRewardVariableHelper(storm::expressions::Variable const& var, std::unordered_map const& detActions) const; + + + ProgramLocation& getLocation(ProgramLocationIdentifier id) { + return locations.at(id); + } + + /** + * Gets a free location index (based on whatever scheme we are using). + */ + ProgramLocationIdentifier freeLocationIndex() { + return newLocationId++; + } + + ProgramActionIdentifier freeActionIndex() { + return newActionId++; + } + + ProgramEdgeIdentifier freeEdgeIndex() { + return newEdgeId++; + } + + ProgramEdgeGroupIdentifier freeEdgeGroupIndex() { + return newEdgeGroupId++; + } + + std::unordered_map deterministicActions; + std::unordered_map probabilisticActions; + std::unordered_map locations; + storm::expressions::Expression initialValueRestriction; + std::unordered_map variables; + /// + std::unordered_map initialValues; + // If heavily used, then it might be better to use a bitvector and a seperate list for the names. + std::unordered_map> locationLabels; + std::shared_ptr expManager; + private: + // Helper for IDs, may be changed later. + ProgramEdgeGroupIdentifier newEdgeGroupId = 0; + ProgramLocationIdentifier newLocationId = 0; + ProgramEdgeIdentifier newEdgeId = 0; + ProgramActionIdentifier newActionId = 1; + ProgramActionIdentifier noActionId = 0; + std::string succesfulTerminationLabel = "_ret0_"; + std::string abortLabel = "_ret1_"; + std::string observeViolatedLabel = "_viol_"; + + + }; + } +} \ No newline at end of file diff --git a/src/storage/ppg/ProgramLocation.cpp b/src/storage/ppg/ProgramLocation.cpp new file mode 100644 index 000000000..76ac643e5 --- /dev/null +++ b/src/storage/ppg/ProgramLocation.cpp @@ -0,0 +1,21 @@ + +#include "ProgramLocation.h" +#include "ProgramGraph.h" + +namespace storm { + namespace ppg { + + std::vector ProgramLocation::addProgramEdgeToAllGroups(ProgramActionIdentifier action, storm::expressions::Expression const& condition, ProgramLocationIdentifier targetId) { + return graph->addProgramEdgeToAllGroups(*this, action, condition, targetId); + } + + std::vector ProgramLocation::addProgramEdgeToAllGroups(ProgramActionIdentifier action, ProgramLocationIdentifier targetId) { + return graph->addProgramEdgeToAllGroups(*this, action, targetId); + } + + ProgramEdgeGroup* ProgramLocation::addProgramEdgeGroup(storm::expressions::Expression const& probability) { + return graph->addProgramEdgeGroup(*this, probability); + } + + } +} \ No newline at end of file diff --git a/src/storage/ppg/ProgramLocation.h b/src/storage/ppg/ProgramLocation.h new file mode 100644 index 000000000..48b92dfed --- /dev/null +++ b/src/storage/ppg/ProgramLocation.h @@ -0,0 +1,84 @@ +#pragma once + +#include "defines.h" +#include "ProgramEdgeGroup.h" + +namespace storm { + namespace ppg { + class ProgramLocation { + public: + using EdgeGroupIterator = std::vector::iterator; + using const_iterator = std::vector::const_iterator; + + ProgramLocation(ProgramGraph* graph, ProgramLocationIdentifier id, bool initial) : graph(graph), locId(id), init(initial){ + // Intentionally left empty + } + + virtual ~ProgramLocation() { + for( auto const& e : edgeGroups) { + delete e; + } + } + + + std::vector addProgramEdgeToAllGroups(ProgramActionIdentifier action, storm::expressions::Expression const& condition, ProgramLocationIdentifier targetId); + std::vector addProgramEdgeToAllGroups(ProgramActionIdentifier action, ProgramLocationIdentifier targetId); + ProgramEdgeGroup* addProgramEdgeGroup(storm::expressions::Expression const& probability); + + + ProgramEdgeGroup* emplaceEdgeGroup(ProgramEdgeGroupIdentifier id, storm::expressions::Expression const& probability) { + edgeGroups.emplace_back(new ProgramEdgeGroup(graph, id, locId, probability)); + return edgeGroups.back(); + } + + bool isInitial() const { + return init; + } + + size_t nrOutgoingEdgeGroups() const { + return edgeGroups.size(); + } + + bool hasNonDeterminism() const { + for(auto const& eg : edgeGroups) { + if(eg->nrEdges() > 1) return true; + } + return false; + } + + bool hasUniqueSuccessor() const { + return nrOutgoingEdgeGroups() == 1 && !hasNonDeterminism(); + } + + const_iterator begin() const { + return edgeGroups.begin(); + } + + const_iterator end() const { + return edgeGroups.end(); + } + + // Todo rename? + EdgeGroupIterator getOutgoingEdgeGroupBegin() { + return edgeGroups.begin(); + } + + // Todo rename? + EdgeGroupIterator getOutgoingEdgeGroupEnd() { + return edgeGroups.end(); + } + + ProgramLocationIdentifier id() const { + return locId; + } + + private: + ProgramGraph* graph; + ProgramLocationIdentifier locId; + bool init; + std::vector edgeGroups; + + + }; + } +} diff --git a/src/storage/ppg/defines.h b/src/storage/ppg/defines.h new file mode 100644 index 000000000..d993e633e --- /dev/null +++ b/src/storage/ppg/defines.h @@ -0,0 +1,18 @@ +#pragma once +#include +#include +#include + +namespace storm { + namespace ppg { + class ProgramGraph; + class ProgramEdgeGroup; + class ProgramLocation; + using ProgramLocationIdentifier = uint64_t; + using ProgramActionIdentifier = uint64_t; + using ProgramEdgeGroupIdentifier = uint64_t; + using ProgramEdgeIdentifier = uint64_t; + using ProgramVariableIdentifier = uint64_t; + + } +} \ No newline at end of file diff --git a/src/storage/prism/CompositionToJaniVisitor.cpp b/src/storage/prism/CompositionToJaniVisitor.cpp index 173a70bdc..d5a6ee9a1 100644 --- a/src/storage/prism/CompositionToJaniVisitor.cpp +++ b/src/storage/prism/CompositionToJaniVisitor.cpp @@ -2,13 +2,15 @@ #include "src/storage/prism/Compositions.h" #include "src/storage/jani/Compositions.h" +#include "src/storage/jani/CompositionInformationVisitor.h" #include "src/storage/jani/Model.h" namespace storm { namespace prism { std::shared_ptr CompositionToJaniVisitor::toJani(Composition const& composition, storm::jani::Model const& model) { - return boost::any_cast>(composition.accept(*this, model)); + auto result = boost::any_cast>(composition.accept(*this, model)); + return result; } boost::any CompositionToJaniVisitor::visit(ModuleComposition const& composition, boost::any const& data) { @@ -17,22 +19,20 @@ namespace storm { } boost::any CompositionToJaniVisitor::visit(RenamingComposition const& composition, boost::any const& data) { - std::map> newRenaming; + std::vector synchronizationVectors; for (auto const& renamingPair : composition.getActionRenaming()) { - newRenaming.emplace(renamingPair.first, renamingPair.second); + synchronizationVectors.push_back(storm::jani::SynchronizationVector({renamingPair.first}, renamingPair.second)); } - auto subcomposition = boost::any_cast>(composition.getSubcomposition().accept(*this, data)); - std::shared_ptr result = std::make_shared(subcomposition, newRenaming); + std::shared_ptr result = std::make_shared(boost::any_cast>(composition.getSubcomposition().accept(*this, data)), synchronizationVectors); return result; } boost::any CompositionToJaniVisitor::visit(HidingComposition const& composition, boost::any const& data) { - std::map> newRenaming; + std::vector synchronizationVectors; for (auto const& action : composition.getActionsToHide()) { - newRenaming.emplace(action, boost::none); + synchronizationVectors.push_back(storm::jani::SynchronizationVector({action}, storm::jani::Model::SILENT_ACTION_NAME)); } - auto subcomposition = boost::any_cast>(composition.getSubcomposition().accept(*this, data)); - std::shared_ptr result = std::make_shared(subcomposition, newRenaming); + std::shared_ptr result = std::make_shared(boost::any_cast>(composition.getSubcomposition().accept(*this, data)), synchronizationVectors); return result; } @@ -41,11 +41,22 @@ namespace storm { auto rightSubcomposition = boost::any_cast>(composition.getRightSubcomposition().accept(*this, data)); storm::jani::Model const& model = boost::any_cast(data); - std::set allActions; - for (auto const& action : model.getActions()) { - allActions.insert(action.getName()); + storm::jani::CompositionInformation leftActionInformation = storm::jani::CompositionInformationVisitor(model, *leftSubcomposition).getInformation(); + storm::jani::CompositionInformation rightActionInformation = storm::jani::CompositionInformationVisitor(model, *rightSubcomposition).getInformation(); + + std::set leftActions; + for (auto const& actionIndex : leftActionInformation.getNonSilentActionIndices()) { + leftActions.insert(leftActionInformation.getActionName(actionIndex)); + } + std::set rightActions; + for (auto const& actionIndex : rightActionInformation.getNonSilentActionIndices()) { + rightActions.insert(rightActionInformation.getActionName(actionIndex)); } - std::shared_ptr result = std::make_shared(leftSubcomposition, rightSubcomposition, allActions); + + std::set commonActions; + std::set_intersection(leftActions.begin(), leftActions.end(), rightActions.begin(), rightActions.end(), std::inserter(commonActions, commonActions.begin())); + + std::shared_ptr result = std::make_shared(leftSubcomposition, rightSubcomposition, commonActions); return result; } @@ -63,4 +74,4 @@ namespace storm { return result; } } -} \ No newline at end of file +} diff --git a/src/storage/prism/Module.cpp b/src/storage/prism/Module.cpp index 095ac3e11..0a4347396 100644 --- a/src/storage/prism/Module.cpp +++ b/src/storage/prism/Module.cpp @@ -196,12 +196,12 @@ namespace storm { bool Module::containsVariablesOnlyInUpdateProbabilities(std::set const& undefinedConstantVariables) const { for (auto const& booleanVariable : this->getBooleanVariables()) { - if (booleanVariable.getInitialValueExpression().containsVariable(undefinedConstantVariables)) { + if (booleanVariable.hasInitialValue() && booleanVariable.getInitialValueExpression().containsVariable(undefinedConstantVariables)) { return false; } } for (auto const& integerVariable : this->getIntegerVariables()) { - if (integerVariable.getInitialValueExpression().containsVariable(undefinedConstantVariables)) { + if (integerVariable.hasInitialValue() && integerVariable.getInitialValueExpression().containsVariable(undefinedConstantVariables)) { return false; } if (integerVariable.getLowerBoundExpression().containsVariable(undefinedConstantVariables)) { diff --git a/src/storage/prism/Program.cpp b/src/storage/prism/Program.cpp index 3f50c3d12..fb624742b 100644 --- a/src/storage/prism/Program.cpp +++ b/src/storage/prism/Program.cpp @@ -20,7 +20,7 @@ #include "src/storage/prism/CompositionVisitor.h" #include "src/storage/prism/Compositions.h" -#include "src/storage/prism/CompositionToJaniVisitor.h" +#include "src/storage/prism/ToJaniConverter.h" namespace storm { namespace prism { @@ -148,34 +148,15 @@ namespace storm { // Start by creating the necessary mappings from the given ones. this->createMappings(); - // Set the initial construct. + // Set the initial construct if given. if (initialConstruct) { this->initialConstruct = initialConstruct.get(); } else { - // First, add all missing initial values. + // Otherwise, we create the missing initial values. this->createMissingInitialValues(); for (auto& modules : this->modules) { modules.createMissingInitialValues(); } - - // Create a new initial construct if none was given. - storm::expressions::Expression newInitialExpression = manager->boolean(true); - - for (auto& booleanVariable : this->getGlobalBooleanVariables()) { - newInitialExpression = newInitialExpression && storm::expressions::iff(booleanVariable.getExpression(), booleanVariable.getInitialValueExpression()); - } - for (auto& integerVariable : this->getGlobalIntegerVariables()) { - newInitialExpression = newInitialExpression && integerVariable.getExpression() == integerVariable.getInitialValueExpression(); - } - for (auto& module : this->getModules()) { - for (auto& booleanVariable : module.getBooleanVariables()) { - newInitialExpression = newInitialExpression && storm::expressions::iff(booleanVariable.getExpression(), booleanVariable.getInitialValueExpression()); - } - for (auto& integerVariable : module.getIntegerVariables()) { - newInitialExpression = newInitialExpression && integerVariable.getExpression() == integerVariable.getInitialValueExpression(); - } - } - this->initialConstruct = storm::prism::InitialConstruct(newInitialExpression, this->getInitialConstruct().getFilename(), this->getInitialConstruct().getLineNumber()); } if (finalModel) { @@ -219,7 +200,7 @@ namespace storm { return false; } - bool Program::hasUndefinedConstantsOnlyInUpdateProbabilitiesAndRewards() const { + bool Program::undefinedConstantsAreGraphPreserving() const { if (!this->hasUndefinedConstants()) { return true; } @@ -231,10 +212,7 @@ namespace storm { undefinedConstantVariables.insert(constant.getExpressionVariable()); } } - - // Now it remains to check that the intersection of the variables used in the program with the undefined - // constants' variables is empty (except for the update probabilities). - + // Start by checking the defining expressions of all defined constants. If it contains a currently undefined // constant, we need to mark the target constant as undefined as well. for (auto const& constant : this->getConstants()) { @@ -245,7 +223,7 @@ namespace storm { } } - // Now check initial value expressions of global variables. + // Now check initial value and range expressions of global variables. for (auto const& booleanVariable : this->getGlobalBooleanVariables()) { if (booleanVariable.hasInitialValue()) { if (booleanVariable.getInitialValueExpression().containsVariable(undefinedConstantVariables)) { @@ -287,8 +265,10 @@ namespace storm { } // Initial construct. - if (this->getInitialConstruct().getInitialStatesExpression().containsVariable(undefinedConstantVariables)) { - return false; + if (this->hasInitialConstruct()) { + if (this->getInitialConstruct().getInitialStatesExpression().containsVariable(undefinedConstantVariables)) { + return false; + } } // Labels. @@ -349,7 +329,6 @@ namespace storm { return constantsSubstitution; } - std::size_t Program::getNumberOfConstants() const { return this->getConstants().size(); } @@ -458,10 +437,61 @@ namespace storm { return actionToIndexMap; } + bool Program::hasInitialConstruct() const { + return static_cast(initialConstruct); + } + storm::prism::InitialConstruct const& Program::getInitialConstruct() const { + return this->initialConstruct.get(); + } + + boost::optional const& Program::getOptionalInitialConstruct() const { return this->initialConstruct; } + storm::expressions::Expression Program::getInitialStatesExpression() const { + // If there is an initial construct, return its expression. If not, we construct the expression from the + // initial values of the variables (which have to exist). + if (this->hasInitialConstruct()) { + return this->getInitialConstruct().getInitialStatesExpression(); + } else { + storm::expressions::Expression result; + + for (auto const& variable : this->getGlobalBooleanVariables()) { + if (result.isInitialized()) { + result = result && storm::expressions::iff(variable.getExpressionVariable(), variable.getInitialValueExpression()); + } else { + result = storm::expressions::iff(variable.getExpressionVariable(), variable.getInitialValueExpression()); + } + } + for (auto const& variable : this->getGlobalIntegerVariables()) { + if (result.isInitialized()) { + result = result && variable.getExpressionVariable() == variable.getInitialValueExpression(); + } else { + result = variable.getExpressionVariable() == variable.getInitialValueExpression(); + } + } + for (auto const& module : this->getModules()) { + for (auto const& variable : module.getBooleanVariables()) { + if (result.isInitialized()) { + result = result && storm::expressions::iff(variable.getExpressionVariable(), variable.getInitialValueExpression()); + } else { + result = storm::expressions::iff(variable.getExpressionVariable(), variable.getInitialValueExpression()); + } + } + for (auto const& variable : module.getIntegerVariables()) { + if (result.isInitialized()) { + result = result && variable.getExpressionVariable() == variable.getInitialValueExpression(); + } else { + result = variable.getExpressionVariable() == variable.getInitialValueExpression(); + } + } + } + + return result; + } + } + bool Program::specifiesSystemComposition() const { return static_cast(systemCompositionConstruct); } @@ -623,7 +653,7 @@ namespace storm { newModules.push_back(module.restrictCommands(indexSet)); } - return Program(this->manager, this->getModelType(), this->getConstants(), this->getGlobalBooleanVariables(), this->getGlobalIntegerVariables(), this->getFormulas(), newModules, this->getActionNameToIndexMapping(), this->getRewardModels(), this->getLabels(), this->getInitialConstruct(), this->getOptionalSystemCompositionConstruct()); + return Program(this->manager, this->getModelType(), this->getConstants(), this->getGlobalBooleanVariables(), this->getGlobalIntegerVariables(), this->getFormulas(), newModules, this->getActionNameToIndexMapping(), this->getRewardModels(), this->getLabels(), this->getOptionalInitialConstruct(), this->getOptionalSystemCompositionConstruct()); } void Program::createMappings() { @@ -723,7 +753,7 @@ namespace storm { STORM_LOG_THROW(definedUndefinedConstants.find(constantExpressionPair.first) != definedUndefinedConstants.end(), storm::exceptions::InvalidArgumentException, "Unable to define non-existant constant."); } - return Program(this->manager, this->getModelType(), newConstants, this->getGlobalBooleanVariables(), this->getGlobalIntegerVariables(), this->getFormulas(), this->getModules(), this->getActionNameToIndexMapping(), this->getRewardModels(), this->getLabels(), this->getInitialConstruct(), this->getOptionalSystemCompositionConstruct()); + return Program(this->manager, this->getModelType(), newConstants, this->getGlobalBooleanVariables(), this->getGlobalIntegerVariables(), this->getFormulas(), this->getModules(), this->getActionNameToIndexMapping(), this->getRewardModels(), this->getLabels(), this->getOptionalInitialConstruct(), this->getOptionalSystemCompositionConstruct()); } Program Program::substituteConstants() const { @@ -775,7 +805,10 @@ namespace storm { newRewardModels.emplace_back(rewardModel.substitute(constantSubstitution)); } - storm::prism::InitialConstruct newInitialConstruct = this->getInitialConstruct().substitute(constantSubstitution); + boost::optional newInitialConstruct; + if (this->hasInitialConstruct()) { + newInitialConstruct = this->getInitialConstruct().substitute(constantSubstitution); + } std::vector